1 2 /* 3 * The authors of this software are Rob Pike and Ken Thompson. 4 * Copyright (c) 2002 by Lucent Technologies. 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose without fee is hereby granted, provided that this entire notice 7 * is included in all copies of any software which is or includes a copy 8 * or modification of this software and in all copies of the supporting 9 * documentation for such software. 10 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 11 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY 12 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY 13 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 14 */ 15 16 #ifndef _FMTH_ 17 #define _FMTH_ 1 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 #include <stdarg.h> 23 24 #ifndef _UTFH_ 25 #include <utf.h> 26 #endif 27 28 typedef struct Fmt Fmt; 29 struct Fmt{ 30 unsigned char runes; /* output buffer is runes or chars? */ 31 void *start; /* of buffer */ 32 void *to; /* current place in the buffer */ 33 void *stop; /* end of the buffer; overwritten if flush fails */ 34 int (*flush)(Fmt *); /* called when to == stop */ 35 void *farg; /* to make flush a closure */ 36 int nfmt; /* num chars formatted so far */ 37 va_list args; /* args passed to dofmt */ 38 int r; /* % format Rune */ 39 int width; 40 int prec; 41 unsigned long flags; 42 }; 43 44 enum{ 45 FmtWidth = 1, 46 FmtLeft = FmtWidth << 1, 47 FmtPrec = FmtLeft << 1, 48 FmtSharp = FmtPrec << 1, 49 FmtSpace = FmtSharp << 1, 50 FmtSign = FmtSpace << 1, 51 FmtZero = FmtSign << 1, 52 FmtUnsigned = FmtZero << 1, 53 FmtShort = FmtUnsigned << 1, 54 FmtLong = FmtShort << 1, 55 FmtVLong = FmtLong << 1, 56 FmtComma = FmtVLong << 1, 57 FmtByte = FmtComma << 1, 58 FmtLDouble = FmtByte << 1, 59 60 FmtFlag = FmtLDouble << 1 61 }; 62 63 extern int print(char*, ...); 64 extern char* seprint(char*, char*, char*, ...); 65 extern char* vseprint(char*, char*, char*, va_list); 66 extern int snprint(char*, int, char*, ...); 67 extern int vsnprint(char*, int, char*, va_list); 68 extern char* smprint(char*, ...); 69 extern char* vsmprint(char*, va_list); 70 extern int sprint(char*, char*, ...); 71 extern int fprint(int, char*, ...); 72 extern int vfprint(int, char*, va_list); 73 74 extern int runesprint(Rune*, char*, ...); 75 extern int runesnprint(Rune*, int, char*, ...); 76 extern int runevsnprint(Rune*, int, char*, va_list); 77 extern Rune* runeseprint(Rune*, Rune*, char*, ...); 78 extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 79 extern Rune* runesmprint(char*, ...); 80 extern Rune* runevsmprint(char*, va_list); 81 82 extern int fmtfdinit(Fmt*, int, char*, int); 83 extern int fmtfdflush(Fmt*); 84 extern int fmtstrinit(Fmt*); 85 extern char* fmtstrflush(Fmt*); 86 extern int runefmtstrinit(Fmt*); 87 88 extern int quotestrfmt(Fmt *f); 89 extern void quotefmtinstall(void); 90 extern int (*fmtdoquote)(int); 91 92 93 extern int fmtinstall(int, int (*)(Fmt*)); 94 extern int dofmt(Fmt*, char*); 95 extern int fmtprint(Fmt*, char*, ...); 96 extern int fmtvprint(Fmt*, char*, va_list); 97 extern int fmtrune(Fmt*, int); 98 extern int fmtstrcpy(Fmt*, char*); 99 100 extern double fmtstrtod(const char *, char **); 101 extern double fmtcharstod(int(*)(void*), void*); 102 103 #ifdef __cplusplus 104 } 105 #endif 106 #endif 107