1*8a8c2d74SCharles.Forsyth #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 2*8a8c2d74SCharles.Forsyth 374a4d8c2SCharles.Forsyth /* 474a4d8c2SCharles.Forsyth * functions (possibly) linked in, complete, from libc. 574a4d8c2SCharles.Forsyth */ 674a4d8c2SCharles.Forsyth 774a4d8c2SCharles.Forsyth /* 874a4d8c2SCharles.Forsyth * mem routines 974a4d8c2SCharles.Forsyth */ 10*8a8c2d74SCharles.Forsyth extern void* memccpy(void*, void*, int, ulong); 11*8a8c2d74SCharles.Forsyth extern void* memset(void*, int, ulong); 12*8a8c2d74SCharles.Forsyth extern int memcmp(void*, void*, ulong); 13*8a8c2d74SCharles.Forsyth extern void* memmove(void*, void*, ulong); 14*8a8c2d74SCharles.Forsyth extern void* memchr(void*, int, ulong); 1574a4d8c2SCharles.Forsyth 1674a4d8c2SCharles.Forsyth /* 1774a4d8c2SCharles.Forsyth * string routines 1874a4d8c2SCharles.Forsyth */ 1974a4d8c2SCharles.Forsyth extern char* strcat(char*, char*); 20*8a8c2d74SCharles.Forsyth extern char* strchr(char*, int); 2174a4d8c2SCharles.Forsyth extern int strcmp(char*, char*); 2274a4d8c2SCharles.Forsyth extern char* strcpy(char*, char*); 2374a4d8c2SCharles.Forsyth extern char* strncat(char*, char*, long); 2474a4d8c2SCharles.Forsyth extern char* strncpy(char*, char*, long); 2574a4d8c2SCharles.Forsyth extern int strncmp(char*, char*, long); 2674a4d8c2SCharles.Forsyth extern long strlen(char*); 2774a4d8c2SCharles.Forsyth extern char* strrchr(char*, char); 2874a4d8c2SCharles.Forsyth extern char* strstr(char*, char*); 2974a4d8c2SCharles.Forsyth 3074a4d8c2SCharles.Forsyth 3174a4d8c2SCharles.Forsyth /* 3274a4d8c2SCharles.Forsyth * print routines 3374a4d8c2SCharles.Forsyth */ 3474a4d8c2SCharles.Forsyth typedef struct Fmt Fmt; 3574a4d8c2SCharles.Forsyth typedef int (*Fmts)(Fmt*); 3674a4d8c2SCharles.Forsyth struct Fmt{ 3774a4d8c2SCharles.Forsyth uchar runes; /* output buffer is runes or chars? */ 3874a4d8c2SCharles.Forsyth void *start; /* of buffer */ 3974a4d8c2SCharles.Forsyth void *to; /* current place in the buffer */ 4074a4d8c2SCharles.Forsyth void *stop; /* end of the buffer; overwritten if flush fails */ 4174a4d8c2SCharles.Forsyth int (*flush)(Fmt *); /* called when to == stop */ 4274a4d8c2SCharles.Forsyth void *farg; /* to make flush a closure */ 4374a4d8c2SCharles.Forsyth int nfmt; /* num chars formatted so far */ 4474a4d8c2SCharles.Forsyth va_list args; /* args passed to dofmt */ 4574a4d8c2SCharles.Forsyth int r; /* % format Rune */ 4674a4d8c2SCharles.Forsyth int width; 4774a4d8c2SCharles.Forsyth int prec; 4874a4d8c2SCharles.Forsyth ulong flags; 4974a4d8c2SCharles.Forsyth }; 5074a4d8c2SCharles.Forsyth extern int print(char*, ...); 5174a4d8c2SCharles.Forsyth extern char* vseprint(char*, char*, char*, va_list); 5274a4d8c2SCharles.Forsyth extern int sprint(char*, char*, ...); 5374a4d8c2SCharles.Forsyth extern int snprint(char*, int, char*, ...); 5474a4d8c2SCharles.Forsyth extern int fmtinstall(int, int (*)(Fmt*)); 5574a4d8c2SCharles.Forsyth 56*8a8c2d74SCharles.Forsyth #pragma varargck argpos addconf 1 5774a4d8c2SCharles.Forsyth #pragma varargck argpos fmtprint 2 5874a4d8c2SCharles.Forsyth #pragma varargck argpos print 1 5974a4d8c2SCharles.Forsyth #pragma varargck argpos seprint 3 6074a4d8c2SCharles.Forsyth #pragma varargck argpos snprint 3 6174a4d8c2SCharles.Forsyth #pragma varargck argpos sprint 2 6274a4d8c2SCharles.Forsyth #pragma varargck type "H" void* 6374a4d8c2SCharles.Forsyth 6474a4d8c2SCharles.Forsyth #pragma varargck type "lld" vlong 6574a4d8c2SCharles.Forsyth #pragma varargck type "llx" vlong 6674a4d8c2SCharles.Forsyth #pragma varargck type "lld" uvlong 6774a4d8c2SCharles.Forsyth #pragma varargck type "llx" uvlong 6874a4d8c2SCharles.Forsyth #pragma varargck type "ld" long 6974a4d8c2SCharles.Forsyth #pragma varargck type "lx" long 7074a4d8c2SCharles.Forsyth #pragma varargck type "ld" ulong 7174a4d8c2SCharles.Forsyth #pragma varargck type "lx" ulong 7274a4d8c2SCharles.Forsyth #pragma varargck type "d" int 7374a4d8c2SCharles.Forsyth #pragma varargck type "x" int 7474a4d8c2SCharles.Forsyth #pragma varargck type "c" int 7574a4d8c2SCharles.Forsyth #pragma varargck type "C" int 7674a4d8c2SCharles.Forsyth #pragma varargck type "d" uint 7774a4d8c2SCharles.Forsyth #pragma varargck type "x" uint 7874a4d8c2SCharles.Forsyth #pragma varargck type "c" uint 7974a4d8c2SCharles.Forsyth #pragma varargck type "C" uint 8074a4d8c2SCharles.Forsyth #pragma varargck type "f" double 8174a4d8c2SCharles.Forsyth #pragma varargck type "e" double 8274a4d8c2SCharles.Forsyth #pragma varargck type "g" double 8374a4d8c2SCharles.Forsyth #pragma varargck type "s" char* 8474a4d8c2SCharles.Forsyth #pragma varargck type "q" char* 8574a4d8c2SCharles.Forsyth #pragma varargck type "S" Rune* 8674a4d8c2SCharles.Forsyth #pragma varargck type "Q" Rune* 8774a4d8c2SCharles.Forsyth #pragma varargck type "r" void 8874a4d8c2SCharles.Forsyth #pragma varargck type "%" void 8974a4d8c2SCharles.Forsyth #pragma varargck type "|" int 9074a4d8c2SCharles.Forsyth #pragma varargck type "p" void* 9174a4d8c2SCharles.Forsyth #pragma varargck type "lux" void* 9274a4d8c2SCharles.Forsyth #pragma varargck type "E" uchar* 9374a4d8c2SCharles.Forsyth 9474a4d8c2SCharles.Forsyth #define PRINTSIZE 256 9574a4d8c2SCharles.Forsyth 9674a4d8c2SCharles.Forsyth /* 9774a4d8c2SCharles.Forsyth * one-of-a-kind 9874a4d8c2SCharles.Forsyth */ 9974a4d8c2SCharles.Forsyth extern int atoi(char*); 100*8a8c2d74SCharles.Forsyth extern uintptr getcallerpc(void*); 10174a4d8c2SCharles.Forsyth extern long strtol(char*, char**, int); 10274a4d8c2SCharles.Forsyth extern ulong strtoul(char*, char**, int); 103*8a8c2d74SCharles.Forsyth extern uvlong strtoull(char*, char**, int); 10474a4d8c2SCharles.Forsyth extern long end; 10574a4d8c2SCharles.Forsyth 10674a4d8c2SCharles.Forsyth #define NAMELEN 28 107