| |
| /* |
| * The authors of this software are Rob Pike and Ken Thompson. |
| * Copyright (c) 2002 by Lucent Technologies. |
| * Permission to use, copy, modify, and distribute this software for any |
| * purpose without fee is hereby granted, provided that this entire notice |
| * is included in all copies of any software which is or includes a copy |
| * or modification of this software and in all copies of the supporting |
| * documentation for such software. |
| * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED |
| * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY |
| * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY |
| * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. |
| */ |
| |
| #ifndef _FMTH_ |
| #define _FMTH_ 1 |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <stdarg.h> |
| |
| #ifndef _UTFH_ |
| #include <utf.h> |
| #endif |
| |
| typedef struct Fmt Fmt; |
| struct Fmt{ |
| unsigned char runes; /* output buffer is runes or chars? */ |
| void *start; /* of buffer */ |
| void *to; /* current place in the buffer */ |
| void *stop; /* end of the buffer; overwritten if flush fails */ |
| int (*flush)(Fmt *); /* called when to == stop */ |
| void *farg; /* to make flush a closure */ |
| int nfmt; /* num chars formatted so far */ |
| va_list args; /* args passed to dofmt */ |
| int r; /* % format Rune */ |
| int width; |
| int prec; |
| unsigned long flags; |
| }; |
| |
| enum{ |
| FmtWidth = 1, |
| FmtLeft = FmtWidth << 1, |
| FmtPrec = FmtLeft << 1, |
| FmtSharp = FmtPrec << 1, |
| FmtSpace = FmtSharp << 1, |
| FmtSign = FmtSpace << 1, |
| FmtZero = FmtSign << 1, |
| FmtUnsigned = FmtZero << 1, |
| FmtShort = FmtUnsigned << 1, |
| FmtLong = FmtShort << 1, |
| FmtVLong = FmtLong << 1, |
| FmtComma = FmtVLong << 1, |
| FmtByte = FmtComma << 1, |
| FmtLDouble = FmtByte << 1, |
| |
| FmtFlag = FmtLDouble << 1 |
| }; |
| |
| extern int print(char*, ...); |
| extern char* seprint(char*, char*, char*, ...); |
| extern char* vseprint(char*, char*, char*, va_list); |
| extern int snprint(char*, int, char*, ...); |
| extern int vsnprint(char*, int, char*, va_list); |
| extern char* smprint(char*, ...); |
| extern char* vsmprint(char*, va_list); |
| extern int sprint(char*, char*, ...); |
| extern int fprint(int, char*, ...); |
| extern int vfprint(int, char*, va_list); |
| |
| extern int runesprint(Rune*, char*, ...); |
| extern int runesnprint(Rune*, int, char*, ...); |
| extern int runevsnprint(Rune*, int, char*, va_list); |
| extern Rune* runeseprint(Rune*, Rune*, char*, ...); |
| extern Rune* runevseprint(Rune*, Rune*, char*, va_list); |
| extern Rune* runesmprint(char*, ...); |
| extern Rune* runevsmprint(char*, va_list); |
| |
| extern int fmtfdinit(Fmt*, int, char*, int); |
| extern int fmtfdflush(Fmt*); |
| extern int fmtstrinit(Fmt*); |
| extern char* fmtstrflush(Fmt*); |
| extern int runefmtstrinit(Fmt*); |
| |
| extern int quotestrfmt(Fmt *f); |
| extern void quotefmtinstall(void); |
| extern int (*fmtdoquote)(int); |
| |
| |
| extern int fmtinstall(int, int (*)(Fmt*)); |
| extern int dofmt(Fmt*, char*); |
| extern int fmtprint(Fmt*, char*, ...); |
| extern int fmtvprint(Fmt*, char*, va_list); |
| extern int fmtrune(Fmt*, int); |
| extern int fmtstrcpy(Fmt*, char*); |
| |
| extern double fmtstrtod(const char *, char **); |
| extern double fmtcharstod(int(*)(void*), void*); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |