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 #define assert(x) if(x){}else _assert("x") 7 8 /* 9 * mem routines 10 */ 11 extern void* memset(void*, int, ulong); 12 extern int memcmp(void*, void*, ulong); 13 extern void* memmove(void*, void*, ulong); 14 15 /* 16 * string routines 17 */ 18 extern int cistrcmp(char *, char *); 19 extern int cistrncmp(char *, char *, int); 20 extern char *strchr(char *, int); 21 extern int strcmp(char *, char *); 22 extern char* strecpy(char*, char*, char*); 23 extern long strlen(char*); 24 extern int strncmp(char *, char *, int); 25 extern char* strncpy(char*, char*, long); 26 extern char* strstr(char *, char *); 27 extern int tokenize(char*, char**, int); 28 29 /* 30 * malloc 31 */ 32 extern void free(void*); 33 extern void* malloc(ulong); 34 extern void* mallocalign(ulong, ulong, long, ulong); 35 extern int mallocinit(void*, ulong); 36 37 /* 38 * print routines 39 */ 40 typedef struct Fmt Fmt; 41 struct Fmt { 42 uchar runes; /* output buffer is runes or chars? */ 43 void* start; /* of buffer */ 44 void* to; /* current place in the buffer */ 45 void* stop; /* end of the buffer; overwritten if flush fails */ 46 int (*flush)(Fmt*); /* called when to == stop */ 47 void* farg; /* to make flush a closure */ 48 int nfmt; /* num chars formatted so far */ 49 va_list args; /* args passed to dofmt */ 50 int r; /* % format Rune */ 51 int width; 52 int prec; 53 ulong flags; 54 }; 55 56 extern int print(char*, ...); 57 extern char* seprint(char*, char*, char*, ...); 58 extern char* vseprint(char*, char*, char*, va_list); 59 60 #pragma varargck argpos print 1 61 #pragma varargck argpos seprint 3 62 63 #pragma varargck type "lld" vlong 64 #pragma varargck type "llx" vlong 65 #pragma varargck type "lld" uvlong 66 #pragma varargck type "llx" uvlong 67 #pragma varargck type "ld" long 68 #pragma varargck type "lx" long 69 #pragma varargck type "ld" ulong 70 #pragma varargck type "lx" ulong 71 #pragma varargck type "d" int 72 #pragma varargck type "x" int 73 #pragma varargck type "c" int 74 #pragma varargck type "C" int 75 #pragma varargck type "d" uint 76 #pragma varargck type "x" uint 77 #pragma varargck type "c" uint 78 #pragma varargck type "C" uint 79 #pragma varargck type "s" char* 80 #pragma varargck type "q" char* 81 #pragma varargck type "S" Rune* 82 #pragma varargck type "%" void 83 #pragma varargck type "p" uintptr 84 #pragma varargck type "p" void* 85 #pragma varargck flag ',' 86 #pragma varargck type "E" uchar* /* eipfmt */ 87 #pragma varargck type "V" uchar* /* eipfmt */ 88 89 extern int fmtinstall(int, int (*)(Fmt*)); 90 extern int dofmt(Fmt*, char*); 91 92 /* 93 * one-of-a-kind 94 */ 95 extern void _assert(char*); 96 extern uintptr getcallerpc(void*); 97 extern long strtol(char*, char**, int); 98 extern ulong strtoul(char*, char**, int); 99 extern void longjmp(jmp_buf, int); 100 extern int setjmp(jmp_buf); 101 102 extern char etext[], edata[], end[]; 103