vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

fmt.h (4045B)


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