123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- * 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.
- */
- /*
- * dofmt -- format to a buffer
- * the number of characters formatted is returned,
- * or -1 if there was an error.
- * if the buffer is ever filled, flush is called.
- * it should reset the buffer and return whether formatting should continue.
- */
- #define uchar _fmtuchar
- #define ushort _fmtushort
- #define uint _fmtuint
- #define ulong _fmtulong
- #define vlong _fmtvlong
- #define uvlong _fmtuvlong
- #define USED(x) if(x);else
- typedef unsigned char uchar;
- typedef unsigned short ushort;
- typedef unsigned int uint;
- typedef unsigned long ulong;
- #ifndef NOVLONGS
- typedef unsigned long long uvlong;
- typedef long long vlong;
- #endif
- #define nil 0 /* cannot be ((void*)0) because used for function pointers */
- typedef int (*Fmts)(Fmt*);
- typedef struct Quoteinfo Quoteinfo;
- struct Quoteinfo
- {
- int quoted; /* if set, string must be quoted */
- int nrunesin; /* number of input runes that can be accepted */
- int nbytesin; /* number of input bytes that can be accepted */
- int nrunesout; /* number of runes that will be generated */
- int nbytesout; /* number of bytes that will be generated */
- };
- void *__fmtflush(Fmt*, void*, int);
- void *__fmtdispatch(Fmt*, void*, int);
- int __floatfmt(Fmt*, double);
- int __fmtpad(Fmt*, int);
- int __rfmtpad(Fmt*, int);
- int __fmtFdFlush(Fmt*);
- int __efgfmt(Fmt*);
- int __charfmt(Fmt*);
- int __runefmt(Fmt*);
- int __runesfmt(Fmt*);
- int __countfmt(Fmt*);
- int __flagfmt(Fmt*);
- int __percentfmt(Fmt*);
- int __ifmt(Fmt*);
- int __strfmt(Fmt*);
- int __badfmt(Fmt*);
- int __fmtcpy(Fmt*, const void*, int, int);
- int __fmtrcpy(Fmt*, const void*, int n);
- int __errfmt(Fmt *f);
- double __fmtpow10(int);
- void __fmtlock(void);
- void __fmtunlock(void);
- #define FMTCHAR(f, t, s, c)\
- do{\
- if(t + 1 > (char*)s){\
- t = __fmtflush(f, t, 1);\
- if(t != nil)\
- s = f->stop;\
- else\
- return -1;\
- }\
- *t++ = c;\
- }while(0)
- #define FMTRCHAR(f, t, s, c)\
- do{\
- if(t + 1 > (Rune*)s){\
- t = __fmtflush(f, t, sizeof(Rune));\
- if(t != nil)\
- s = f->stop;\
- else\
- return -1;\
- }\
- *t++ = c;\
- }while(0)
- #define FMTRUNE(f, t, s, r)\
- do{\
- Rune _rune;\
- int _runelen;\
- if(t + UTFmax > (char*)s && t + (_runelen = runelen(r)) > (char*)s){\
- t = __fmtflush(f, t, _runelen);\
- if(t != nil)\
- s = f->stop;\
- else\
- return -1;\
- }\
- if(r < Runeself)\
- *t++ = r;\
- else{\
- _rune = r;\
- t += runetochar(t, &_rune);\
- }\
- }while(0)
|