lib.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * functions (possibly) linked in, complete, from libc.
  3. */
  4. #define nelem(x) (sizeof(x)/sizeof((x)[0]))
  5. #define offsetof(s, m) (ulong)(&(((s*)0)->m))
  6. /*
  7. * mem routines
  8. */
  9. extern void* memset(void*, int, ulong);
  10. extern int memcmp(void*, void*, ulong);
  11. extern void* memmove(void*, void*, ulong);
  12. extern void* memchr(void*, int, ulong);
  13. /*
  14. * string routines
  15. */
  16. extern char* strcat(char*, char*);
  17. extern char* strchr(char*, int);
  18. extern char* strrchr(char*, int);
  19. extern int strcmp(char*, char*);
  20. extern char* strcpy(char*, char*);
  21. extern char* strncat(char*, char*, long);
  22. extern char* strncpy(char*, char*, long);
  23. extern int strncmp(char*, char*, long);
  24. extern long strlen(char*);
  25. enum
  26. {
  27. UTFmax = 3, /* maximum bytes per rune */
  28. Runesync = 0x80, /* cannot represent part of a UTF sequence */
  29. Runeself = 0x80, /* rune and UTF sequences are the same (<) */
  30. Runeerror = 0x80, /* decoding error in UTF */
  31. };
  32. /*
  33. * rune routines
  34. */
  35. extern int runetochar(char*, Rune*);
  36. extern int chartorune(Rune*, char*);
  37. extern char* utfrune(char*, long);
  38. extern char* utfrrune(char*, long);
  39. extern int utflen(char*);
  40. extern int runelen(long);
  41. /*
  42. * math
  43. */
  44. extern int abs(int);
  45. /*
  46. * print routines
  47. */
  48. typedef struct Fmt Fmt;
  49. typedef int (*Fmts)(Fmt*);
  50. struct Fmt{
  51. uchar runes; /* output buffer is runes or chars? */
  52. void *start; /* of buffer */
  53. void *to; /* current place in the buffer */
  54. void *stop; /* end of the buffer; overwritten if flush fails */
  55. int (*flush)(Fmt *); /* called when to == stop */
  56. void *farg; /* to make flush a closure */
  57. int nfmt; /* num chars formatted so far */
  58. va_list args; /* args passed to dofmt */
  59. int r; /* % format Rune */
  60. int width;
  61. int prec;
  62. ulong flags;
  63. };
  64. extern int print(char*, ...);
  65. extern char* seprint(char*, char*, char*, ...);
  66. extern char* vseprint(char*, char*, char*, va_list);
  67. extern int snprint(char*, int, char*, ...);
  68. extern int sprint(char*, char*, ...);
  69. extern int fmtinstall(int c, int (*f)(Fmt*));
  70. extern void quotefmtinstall(void);
  71. extern int fmtit(Fmt *f, char *fmt, ...);
  72. extern int fmtstrcpy(Fmt *f, char *s);
  73. #pragma varargck argpos fmtit 2
  74. #pragma varargck argpos print 1
  75. #pragma varargck argpos seprint 3
  76. #pragma varargck argpos snprint 3
  77. #pragma varargck argpos sprint 2
  78. #pragma varargck type "lld" vlong
  79. #pragma varargck type "llx" vlong
  80. #pragma varargck type "lld" uvlong
  81. #pragma varargck type "llx" uvlong
  82. #pragma varargck type "ld" long
  83. #pragma varargck type "lx" long
  84. #pragma varargck type "ld" ulong
  85. #pragma varargck type "lx" ulong
  86. #pragma varargck type "d" int
  87. #pragma varargck type "x" int
  88. #pragma varargck type "c" int
  89. #pragma varargck type "C" int
  90. #pragma varargck type "d" uint
  91. #pragma varargck type "x" uint
  92. #pragma varargck type "c" uint
  93. #pragma varargck type "C" uint
  94. /* no floating-point verbs */
  95. #pragma varargck type "s" char*
  96. #pragma varargck type "q" char*
  97. #pragma varargck type "S" Rune*
  98. #pragma varargck type "Q" Rune*
  99. #pragma varargck type "r" void
  100. #pragma varargck type "%" void
  101. #pragma varargck type "n" int*
  102. #pragma varargck type "p" void*
  103. #pragma varargck flag ','
  104. #pragma varargck type "<" void*
  105. #pragma varargck type "[" void*
  106. #pragma varargck type "H" void*
  107. #pragma varargck type "lH" void*
  108. /*
  109. * one-of-a-kind
  110. */
  111. extern void qsort(void*, long, long, int (*)(void*, void*));
  112. extern char end[];
  113. extern int decrypt(void*, void*, int);
  114. extern int encrypt(void*, void*, int);
  115. extern int nrand(int);
  116. extern void srand(long);
  117. #define OREAD 0 /* open for read */
  118. #define OWRITE 1 /* write */
  119. #define ORDWR 2 /* read and write */
  120. #define OEXEC 3 /* execute, == read but check execute permission */
  121. #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */
  122. #define OCEXEC 32 /* or'ed in, close on exec */
  123. #define ORCLOSE 64 /* or'ed in, remove on close */