fmt.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * The authors of this software are Rob Pike and Ken Thompson.
  3. * Copyright (c) 2002 by Lucent Technologies.
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose without fee is hereby granted, provided that this entire notice
  6. * is included in all copies of any software which is or includes a copy
  7. * or modification of this software and in all copies of the supporting
  8. * documentation for such software.
  9. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
  10. * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
  11. * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  12. * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  13. */
  14. #ifndef _FMTH_
  15. #define _FMTH_ 1
  16. #include <stdarg.h>
  17. #ifndef _UTFH_
  18. #include <utf.h>
  19. #endif
  20. typedef struct Fmt Fmt;
  21. struct Fmt{
  22. unsigned char runes; /* output buffer is runes or chars? */
  23. void *start; /* of buffer */
  24. void *to; /* current place in the buffer */
  25. void *stop; /* end of the buffer; overwritten if flush fails */
  26. int (*flush)(Fmt *); /* called when to == stop */
  27. void *farg; /* to make flush a closure */
  28. int nfmt; /* num chars formatted so far */
  29. va_list args; /* args passed to dofmt */
  30. int r; /* % format Rune */
  31. int width;
  32. int prec;
  33. unsigned long flags;
  34. };
  35. enum{
  36. FmtWidth = 1,
  37. FmtLeft = FmtWidth << 1,
  38. FmtPrec = FmtLeft << 1,
  39. FmtSharp = FmtPrec << 1,
  40. FmtSpace = FmtSharp << 1,
  41. FmtSign = FmtSpace << 1,
  42. FmtZero = FmtSign << 1,
  43. FmtUnsigned = FmtZero << 1,
  44. FmtShort = FmtUnsigned << 1,
  45. FmtLong = FmtShort << 1,
  46. FmtVLong = FmtLong << 1,
  47. FmtComma = FmtVLong << 1,
  48. FmtByte = FmtComma << 1,
  49. FmtLDouble = FmtByte << 1,
  50. FmtFlag = FmtLDouble << 1
  51. };
  52. extern int print(char*, ...);
  53. extern char* seprint(char*, char*, char*, ...);
  54. extern char* vseprint(char*, char*, char*, va_list);
  55. extern int snprint(char*, int, char*, ...);
  56. extern int vsnprint(char*, int, char*, va_list);
  57. extern char* smprint(char*, ...);
  58. extern char* vsmprint(char*, va_list);
  59. extern int sprint(char*, char*, ...);
  60. extern int fprint(int, char*, ...);
  61. extern int vfprint(int, char*, va_list);
  62. extern int runesprint(Rune*, char*, ...);
  63. extern int runesnprint(Rune*, int, char*, ...);
  64. extern int runevsnprint(Rune*, int, char*, va_list);
  65. extern Rune* runeseprint(Rune*, Rune*, char*, ...);
  66. extern Rune* runevseprint(Rune*, Rune*, char*, va_list);
  67. extern Rune* runesmprint(char*, ...);
  68. extern Rune* runevsmprint(char*, va_list);
  69. extern int fmtfdinit(Fmt*, int, char*, int);
  70. extern int fmtfdflush(Fmt*);
  71. extern int fmtstrinit(Fmt*);
  72. extern char* fmtstrflush(Fmt*);
  73. extern int quotestrfmt(Fmt *f);
  74. extern void quotefmtinstall(void);
  75. extern int (*fmtdoquote)(int);
  76. extern int fmtinstall(int, int (*)(Fmt*));
  77. extern int dofmt(Fmt*, char*);
  78. extern int fmtprint(Fmt*, char*, ...);
  79. extern int fmtvprint(Fmt*, char*, va_list);
  80. extern int fmtrune(Fmt*, int);
  81. extern int fmtstrcpy(Fmt*, char*);
  82. extern double fmtstrtod(const char *, char **);
  83. extern double fmtcharstod(int(*)(void*), void*);
  84. #endif