1 #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 2 3 /* 4 * functions (possibly) linked in, complete, from libc. 5 */ 6 7 /* 8 * mem routines 9 */ 10 extern void* memccpy(void*, void*, int, ulong); 11 extern void* memset(void*, int, ulong); 12 extern int memcmp(void*, void*, ulong); 13 extern void* memmove(void*, void*, ulong); 14 extern void* memchr(void*, int, ulong); 15 16 /* 17 * string routines 18 */ 19 extern char* strcat(char*, char*); 20 extern char* strchr(char*, int); 21 extern int strcmp(char*, char*); 22 extern char* strcpy(char*, char*); 23 extern char* strncat(char*, char*, long); 24 extern char* strncpy(char*, char*, long); 25 extern int strncmp(char*, char*, long); 26 extern long strlen(char*); 27 extern char* strrchr(char*, char); 28 extern char* strstr(char*, char*); 29 30 31 /* 32 * print routines 33 */ 34 typedef struct Fmt Fmt; 35 typedef int (*Fmts)(Fmt*); 36 struct Fmt{ 37 uchar runes; /* output buffer is runes or chars? */ 38 void *start; /* of buffer */ 39 void *to; /* current place in the buffer */ 40 void *stop; /* end of the buffer; overwritten if flush fails */ 41 int (*flush)(Fmt *); /* called when to == stop */ 42 void *farg; /* to make flush a closure */ 43 int nfmt; /* num chars formatted so far */ 44 va_list args; /* args passed to dofmt */ 45 int r; /* % format Rune */ 46 int width; 47 int prec; 48 ulong flags; 49 }; 50 extern int print(char*, ...); 51 extern char* vseprint(char*, char*, char*, va_list); 52 extern int sprint(char*, char*, ...); 53 extern int snprint(char*, int, char*, ...); 54 extern int fmtinstall(int, int (*)(Fmt*)); 55 56 #pragma varargck argpos addconf 1 57 #pragma varargck argpos fmtprint 2 58 #pragma varargck argpos print 1 59 #pragma varargck argpos seprint 3 60 #pragma varargck argpos snprint 3 61 #pragma varargck argpos sprint 2 62 #pragma varargck type "H" void* 63 64 #pragma varargck type "lld" vlong 65 #pragma varargck type "llx" vlong 66 #pragma varargck type "lld" uvlong 67 #pragma varargck type "llx" uvlong 68 #pragma varargck type "ld" long 69 #pragma varargck type "lx" long 70 #pragma varargck type "ld" ulong 71 #pragma varargck type "lx" ulong 72 #pragma varargck type "d" int 73 #pragma varargck type "x" int 74 #pragma varargck type "c" int 75 #pragma varargck type "C" int 76 #pragma varargck type "d" uint 77 #pragma varargck type "x" uint 78 #pragma varargck type "c" uint 79 #pragma varargck type "C" uint 80 #pragma varargck type "f" double 81 #pragma varargck type "e" double 82 #pragma varargck type "g" double 83 #pragma varargck type "s" char* 84 #pragma varargck type "q" char* 85 #pragma varargck type "S" Rune* 86 #pragma varargck type "Q" Rune* 87 #pragma varargck type "r" void 88 #pragma varargck type "%" void 89 #pragma varargck type "|" int 90 #pragma varargck type "p" void* 91 #pragma varargck type "lux" void* 92 #pragma varargck type "E" uchar* 93 94 #define PRINTSIZE 256 95 96 /* 97 * one-of-a-kind 98 */ 99 extern int atoi(char*); 100 extern uintptr getcallerpc(void*); 101 extern long strtol(char*, char**, int); 102 extern ulong strtoul(char*, char**, int); 103 extern uvlong strtoull(char*, char**, int); 104 extern long end; 105 106 #define NAMELEN 28 107