xref: /plan9/sys/include/ape/fmt.h (revision 363b328d5e77ac1e503119274823363e6b14b616)
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