fmt.h (4045B)
1 /* 2 * The authors of this software are Rob Pike and Ken Thompson, 3 * with contributions from Mike Burrows and Sean Dorward. 4 * 5 * Copyright (c) 2002-2006 by Lucent Technologies. 6 * Portions Copyright (c) 2004 Google Inc. 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose without fee is hereby granted, provided that this entire notice 10 * is included in all copies of any software which is or includes a copy 11 * or modification of this software and in all copies of the supporting 12 * documentation for such software. 13 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 14 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES 15 * NOR GOOGLE INC MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING 16 * THE MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 17 */ 18 #ifndef _FMT_H_ 19 #define _FMT_H_ 1 20 #if defined(__cplusplus) 21 extern "C" { 22 #endif 23 24 #include <stdarg.h> 25 #include "utf.h" 26 27 typedef struct Fmt Fmt; 28 struct Fmt{ 29 unsigned char runes; /* output buffer is runes or chars? */ 30 void *start; /* of buffer */ 31 void *to; /* current place in the buffer */ 32 void *stop; /* end of the buffer; overwritten if flush fails */ 33 int (*flush)(Fmt *); /* called when to == stop */ 34 void *farg; /* to make flush a closure */ 35 int nfmt; /* num chars formatted so far */ 36 va_list args; /* args passed to dofmt */ 37 int r; /* % format Rune */ 38 int width; 39 int prec; 40 unsigned long flags; 41 char *decimal; /* decimal point; cannot be "" */ 42 43 /* For %'d */ 44 char *thousands; /* separator for thousands */ 45 46 /* 47 * Each char is an integer indicating #digits before next separator. Values: 48 * \xFF: no more grouping (or \x7F; defined to be CHAR_MAX in POSIX) 49 * \x00: repeat previous indefinitely 50 * \x**: count that many 51 */ 52 char *grouping; /* descriptor of separator placement */ 53 }; 54 55 enum{ 56 FmtWidth = 1, 57 FmtLeft = FmtWidth << 1, 58 FmtPrec = FmtLeft << 1, 59 FmtSharp = FmtPrec << 1, 60 FmtSpace = FmtSharp << 1, 61 FmtSign = FmtSpace << 1, 62 FmtApost = FmtSign << 1, 63 FmtZero = FmtApost << 1, 64 FmtUnsigned = FmtZero << 1, 65 FmtShort = FmtUnsigned << 1, 66 FmtLong = FmtShort << 1, 67 FmtVLong = FmtLong << 1, 68 FmtComma = FmtVLong << 1, 69 FmtByte = FmtComma << 1, 70 FmtLDouble = FmtByte << 1, 71 72 FmtFlag = FmtLDouble << 1 73 }; 74 75 extern int (*fmtdoquote)(int); 76 77 /* Edit .+1,/^$/ | cfn $PLAN9/src/lib9/fmt/?*.c | grep -v static |grep -v __ */ 78 int dofmt(Fmt *f, char *fmt); 79 int dorfmt(Fmt *f, const Rune *fmt); 80 double fmtcharstod(int(*f)(void*), void *vp); 81 int fmtfdflush(Fmt *f); 82 int fmtfdinit(Fmt *f, int fd, char *buf, int size); 83 int fmtinstall(int c, int (*f)(Fmt*)); 84 int fmtnullinit(Fmt*); 85 void fmtlocaleinit(Fmt*, char*, char*, char*); 86 int fmtprint(Fmt *f, char *fmt, ...); 87 int fmtrune(Fmt *f, int r); 88 int fmtrunestrcpy(Fmt *f, Rune *s); 89 int fmtstrcpy(Fmt *f, char *s); 90 char* fmtstrflush(Fmt *f); 91 int fmtstrinit(Fmt *f); 92 double fmtstrtod(const char *as, char **aas); 93 int fmtvprint(Fmt *f, char *fmt, va_list args); 94 int fprint(int fd, char *fmt, ...); 95 int print(char *fmt, ...); 96 void quotefmtinstall(void); 97 int quoterunestrfmt(Fmt *f); 98 int quotestrfmt(Fmt *f); 99 Rune* runefmtstrflush(Fmt *f); 100 int runefmtstrinit(Fmt *f); 101 Rune* runeseprint(Rune *buf, Rune *e, char *fmt, ...); 102 Rune* runesmprint(char *fmt, ...); 103 int runesnprint(Rune *buf, int len, char *fmt, ...); 104 int runesprint(Rune *buf, char *fmt, ...); 105 Rune* runevseprint(Rune *buf, Rune *e, char *fmt, va_list args); 106 Rune* runevsmprint(char *fmt, va_list args); 107 int runevsnprint(Rune *buf, int len, char *fmt, va_list args); 108 char* seprint(char *buf, char *e, char *fmt, ...); 109 char* smprint(char *fmt, ...); 110 int snprint(char *buf, int len, char *fmt, ...); 111 int sprint(char *buf, char *fmt, ...); 112 int vfprint(int fd, char *fmt, va_list args); 113 char* vseprint(char *buf, char *e, char *fmt, va_list args); 114 char* vsmprint(char *fmt, va_list args); 115 int vsnprint(char *buf, int len, char *fmt, va_list args); 116 117 #if defined(__cplusplus) 118 } 119 #endif 120 #endif