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