github.com/reiver/go@v0.0.0-20150109200633-1d0c7792f172/include/fmt.h (about)

     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