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