Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef _PLAN9_SOURCE
  This header file is an extension to ANSI/POSIX
#endif

#ifndef __FMT_H_
#define __FMT_H_
#pragma src "/sys/src/ape/lib/fmt"
#pragma lib "/$M/lib/ape/libfmt.a"

#include <u.h>

/*
 * 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.
 */

#include <stdarg.h>
#include <utf.h>

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
};

#ifdef  __cplusplus
extern "C" { 
#endif

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*);

extern  void    werrstr(const char*, ...);

#ifdef  __cplusplus
}
#endif

#endif