1*363b328dSDavid du Colombier #ifndef _PLAN9_SOURCE 2*363b328dSDavid du Colombier This header file is an extension to ANSI/POSIX 340ef9009SDavid du Colombier #endif 440ef9009SDavid du Colombier 5*363b328dSDavid du Colombier #ifndef __FMT_H_ 6*363b328dSDavid du Colombier #define __FMT_H_ 7*363b328dSDavid du Colombier #pragma src "/sys/src/ape/lib/fmt" 8*363b328dSDavid du Colombier #pragma lib "/$M/lib/ape/libfmt.a" 9*363b328dSDavid du Colombier 10*363b328dSDavid du Colombier #include <u.h> 11*363b328dSDavid du Colombier 1240ef9009SDavid du Colombier /* 1340ef9009SDavid du Colombier * The authors of this software are Rob Pike and Ken Thompson. 1440ef9009SDavid du Colombier * Copyright (c) 2002 by Lucent Technologies. 1540ef9009SDavid du Colombier * Permission to use, copy, modify, and distribute this software for any 1640ef9009SDavid du Colombier * purpose without fee is hereby granted, provided that this entire notice 1740ef9009SDavid du Colombier * is included in all copies of any software which is or includes a copy 1840ef9009SDavid du Colombier * or modification of this software and in all copies of the supporting 1940ef9009SDavid du Colombier * documentation for such software. 2040ef9009SDavid du Colombier * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED 2140ef9009SDavid du Colombier * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY 2240ef9009SDavid du Colombier * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY 2340ef9009SDavid du Colombier * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. 2440ef9009SDavid du Colombier */ 2540ef9009SDavid du Colombier 2640ef9009SDavid du Colombier #include <stdarg.h> 2740ef9009SDavid du Colombier #include <utf.h> 2840ef9009SDavid du Colombier 2940ef9009SDavid du Colombier typedef struct Fmt Fmt; 3040ef9009SDavid du Colombier struct Fmt{ 3140ef9009SDavid du Colombier unsigned char runes; /* output buffer is runes or chars? */ 3240ef9009SDavid du Colombier void *start; /* of buffer */ 3340ef9009SDavid du Colombier void *to; /* current place in the buffer */ 3440ef9009SDavid du Colombier void *stop; /* end of the buffer; overwritten if flush fails */ 3540ef9009SDavid du Colombier int (*flush)(Fmt *); /* called when to == stop */ 3640ef9009SDavid du Colombier void *farg; /* to make flush a closure */ 3740ef9009SDavid du Colombier int nfmt; /* num chars formatted so far */ 3840ef9009SDavid du Colombier va_list args; /* args passed to dofmt */ 3940ef9009SDavid du Colombier int r; /* % format Rune */ 4040ef9009SDavid du Colombier int width; 4140ef9009SDavid du Colombier int prec; 4240ef9009SDavid du Colombier unsigned long flags; 4340ef9009SDavid du Colombier }; 4440ef9009SDavid du Colombier 4540ef9009SDavid du Colombier enum{ 4640ef9009SDavid du Colombier FmtWidth = 1, 4740ef9009SDavid du Colombier FmtLeft = FmtWidth << 1, 4840ef9009SDavid du Colombier FmtPrec = FmtLeft << 1, 4940ef9009SDavid du Colombier FmtSharp = FmtPrec << 1, 5040ef9009SDavid du Colombier FmtSpace = FmtSharp << 1, 5140ef9009SDavid du Colombier FmtSign = FmtSpace << 1, 5240ef9009SDavid du Colombier FmtZero = FmtSign << 1, 5340ef9009SDavid du Colombier FmtUnsigned = FmtZero << 1, 5440ef9009SDavid du Colombier FmtShort = FmtUnsigned << 1, 5540ef9009SDavid du Colombier FmtLong = FmtShort << 1, 5640ef9009SDavid du Colombier FmtVLong = FmtLong << 1, 5740ef9009SDavid du Colombier FmtComma = FmtVLong << 1, 5840ef9009SDavid du Colombier FmtByte = FmtComma << 1, 5940ef9009SDavid du Colombier FmtLDouble = FmtByte << 1, 6040ef9009SDavid du Colombier 6140ef9009SDavid du Colombier FmtFlag = FmtLDouble << 1 6240ef9009SDavid du Colombier }; 6340ef9009SDavid du Colombier 64*363b328dSDavid du Colombier #ifdef __cplusplus 65*363b328dSDavid du Colombier extern "C" { 66*363b328dSDavid du Colombier #endif 67*363b328dSDavid du Colombier 6840ef9009SDavid du Colombier extern int print(char*, ...); 6940ef9009SDavid du Colombier extern char* seprint(char*, char*, char*, ...); 7040ef9009SDavid du Colombier extern char* vseprint(char*, char*, char*, va_list); 7140ef9009SDavid du Colombier extern int snprint(char*, int, char*, ...); 7240ef9009SDavid du Colombier extern int vsnprint(char*, int, char*, va_list); 7340ef9009SDavid du Colombier extern char* smprint(char*, ...); 7440ef9009SDavid du Colombier extern char* vsmprint(char*, va_list); 7540ef9009SDavid du Colombier extern int sprint(char*, char*, ...); 7640ef9009SDavid du Colombier extern int fprint(int, char*, ...); 7740ef9009SDavid du Colombier extern int vfprint(int, char*, va_list); 7840ef9009SDavid du Colombier 7940ef9009SDavid du Colombier extern int runesprint(Rune*, char*, ...); 8040ef9009SDavid du Colombier extern int runesnprint(Rune*, int, char*, ...); 8140ef9009SDavid du Colombier extern int runevsnprint(Rune*, int, char*, va_list); 8240ef9009SDavid du Colombier extern Rune* runeseprint(Rune*, Rune*, char*, ...); 8340ef9009SDavid du Colombier extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 8440ef9009SDavid du Colombier extern Rune* runesmprint(char*, ...); 8540ef9009SDavid du Colombier extern Rune* runevsmprint(char*, va_list); 8640ef9009SDavid du Colombier 8740ef9009SDavid du Colombier extern int fmtfdinit(Fmt*, int, char*, int); 8840ef9009SDavid du Colombier extern int fmtfdflush(Fmt*); 8940ef9009SDavid du Colombier extern int fmtstrinit(Fmt*); 9040ef9009SDavid du Colombier extern char* fmtstrflush(Fmt*); 9140ef9009SDavid du Colombier extern int runefmtstrinit(Fmt*); 9240ef9009SDavid du Colombier 9340ef9009SDavid du Colombier extern int quotestrfmt(Fmt *f); 9440ef9009SDavid du Colombier extern void quotefmtinstall(void); 9540ef9009SDavid du Colombier extern int (*fmtdoquote)(int); 9640ef9009SDavid du Colombier 9740ef9009SDavid du Colombier 9840ef9009SDavid du Colombier extern int fmtinstall(int, int (*)(Fmt*)); 9940ef9009SDavid du Colombier extern int dofmt(Fmt*, char*); 10040ef9009SDavid du Colombier extern int fmtprint(Fmt*, char*, ...); 10140ef9009SDavid du Colombier extern int fmtvprint(Fmt*, char*, va_list); 10240ef9009SDavid du Colombier extern int fmtrune(Fmt*, int); 10340ef9009SDavid du Colombier extern int fmtstrcpy(Fmt*, char*); 10440ef9009SDavid du Colombier 10540ef9009SDavid du Colombier extern double fmtstrtod(const char *, char **); 10640ef9009SDavid du Colombier extern double fmtcharstod(int(*)(void*), void*); 10740ef9009SDavid du Colombier 108cd1a0026SDavid du Colombier extern void werrstr(const char*, ...); 10940ef9009SDavid du Colombier 110*363b328dSDavid du Colombier #ifdef __cplusplus 11140ef9009SDavid du Colombier } 11240ef9009SDavid du Colombier #endif 113*363b328dSDavid du Colombier 11440ef9009SDavid du Colombier #endif 115