137da2899SCharles.Forsyth typedef unsigned long size_t; 237da2899SCharles.Forsyth 337da2899SCharles.Forsyth #define nelem(x) (sizeof(x)/sizeof((x)[0])) 437da2899SCharles.Forsyth #define offsetof(s, m) (ulong)(&(((s*)0)->m)) 537da2899SCharles.Forsyth #define assert(x) if(x){}else _assert("x") 637da2899SCharles.Forsyth 737da2899SCharles.Forsyth /* 837da2899SCharles.Forsyth * mem routines 937da2899SCharles.Forsyth */ 1037da2899SCharles.Forsyth extern void* memccpy(void*, void*, int, ulong); 1137da2899SCharles.Forsyth extern void* memset(void*, int, ulong); 1237da2899SCharles.Forsyth extern int memcmp(void*, void*, ulong); 1337da2899SCharles.Forsyth extern void* memcpy(void*, void*, ulong); 1437da2899SCharles.Forsyth extern void* memmove(void*, void*, ulong); 1537da2899SCharles.Forsyth extern void* memchr(void*, int, ulong); 1637da2899SCharles.Forsyth 1737da2899SCharles.Forsyth /* 1837da2899SCharles.Forsyth * string routines 1937da2899SCharles.Forsyth */ 2037da2899SCharles.Forsyth extern char* strcat(char*, char*); 2137da2899SCharles.Forsyth extern char* strchr(char*, int); 2237da2899SCharles.Forsyth extern int strcmp(char*, char*); 2337da2899SCharles.Forsyth extern char* strcpy(char*, char*); 2437da2899SCharles.Forsyth extern char* strecpy(char*, char*, char*); 2537da2899SCharles.Forsyth extern char* strdup(char*); 2637da2899SCharles.Forsyth extern char* strncat(char*, char*, long); 2737da2899SCharles.Forsyth extern char* strncpy(char*, char*, long); 2837da2899SCharles.Forsyth extern int strncmp(char*, char*, long); 2937da2899SCharles.Forsyth extern char* strpbrk(char*, char*); 3037da2899SCharles.Forsyth extern char* strrchr(char*, int); 3137da2899SCharles.Forsyth extern char* strtok(char*, char*); 3237da2899SCharles.Forsyth extern long strlen(char*); 3337da2899SCharles.Forsyth extern long strspn(char*, char*); 3437da2899SCharles.Forsyth extern long strcspn(char*, char*); 3537da2899SCharles.Forsyth extern char* strstr(char*, char*); 3637da2899SCharles.Forsyth extern int cistrncmp(char*, char*, int); 3737da2899SCharles.Forsyth extern int cistrcmp(char*, char*); 3837da2899SCharles.Forsyth extern char* cistrstr(char*, char*); 3937da2899SCharles.Forsyth extern int tokenize(char*, char**, int); 4037da2899SCharles.Forsyth 4137da2899SCharles.Forsyth enum 4237da2899SCharles.Forsyth { 43*1f303b33SCharles Forsyth UTFmax = 4, /* maximum bytes per rune */ 4437da2899SCharles.Forsyth Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 4537da2899SCharles.Forsyth Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 46*1f303b33SCharles Forsyth Runeerror = 0xFFFD, /* decoding error in UTF */ 47*1f303b33SCharles Forsyth Runemax = 0x10FFFF, /* 21-bit rune */ 48*1f303b33SCharles Forsyth Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 4937da2899SCharles.Forsyth }; 5037da2899SCharles.Forsyth 5137da2899SCharles.Forsyth /* 5237da2899SCharles.Forsyth * rune routines 5337da2899SCharles.Forsyth */ 5437da2899SCharles.Forsyth extern int runetochar(char*, Rune*); 5537da2899SCharles.Forsyth extern int chartorune(Rune*, char*); 5637da2899SCharles.Forsyth extern int runelen(long); 5737da2899SCharles.Forsyth extern int runenlen(Rune*, int); 5837da2899SCharles.Forsyth extern int fullrune(char*, int); 5937da2899SCharles.Forsyth extern int utflen(char*); 6037da2899SCharles.Forsyth extern int utfnlen(char*, long); 6137da2899SCharles.Forsyth extern char* utfrune(char*, long); 6237da2899SCharles.Forsyth extern char* utfrrune(char*, long); 6337da2899SCharles.Forsyth extern char* utfutf(char*, char*); 6437da2899SCharles.Forsyth extern char* utfecpy(char*, char*, char*); 6537da2899SCharles.Forsyth 6637da2899SCharles.Forsyth extern Rune* runestrcat(Rune*, Rune*); 6737da2899SCharles.Forsyth extern Rune* runestrchr(Rune*, Rune); 6837da2899SCharles.Forsyth extern int runestrcmp(Rune*, Rune*); 6937da2899SCharles.Forsyth extern Rune* runestrcpy(Rune*, Rune*); 7037da2899SCharles.Forsyth extern Rune* runestrncpy(Rune*, Rune*, long); 7137da2899SCharles.Forsyth extern Rune* runestrecpy(Rune*, Rune*, Rune*); 7237da2899SCharles.Forsyth extern Rune* runestrdup(Rune*); 7337da2899SCharles.Forsyth extern Rune* runestrncat(Rune*, Rune*, long); 7437da2899SCharles.Forsyth extern int runestrncmp(Rune*, Rune*, long); 7537da2899SCharles.Forsyth extern Rune* runestrrchr(Rune*, Rune); 7637da2899SCharles.Forsyth extern long runestrlen(Rune*); 7737da2899SCharles.Forsyth extern Rune* runestrstr(Rune*, Rune*); 7837da2899SCharles.Forsyth 7937da2899SCharles.Forsyth extern Rune tolowerrune(Rune); 8037da2899SCharles.Forsyth extern Rune totitlerune(Rune); 8137da2899SCharles.Forsyth extern Rune toupperrune(Rune); 8237da2899SCharles.Forsyth extern int isalpharune(Rune); 8337da2899SCharles.Forsyth extern int islowerrune(Rune); 8437da2899SCharles.Forsyth extern int isspacerune(Rune); 8537da2899SCharles.Forsyth extern int istitlerune(Rune); 8637da2899SCharles.Forsyth extern int isupperrune(Rune); 8737da2899SCharles.Forsyth 8837da2899SCharles.Forsyth /* 8937da2899SCharles.Forsyth * malloc 9037da2899SCharles.Forsyth */ 9137da2899SCharles.Forsyth extern void* malloc(ulong); 9237da2899SCharles.Forsyth extern void* mallocz(ulong, int); 9337da2899SCharles.Forsyth extern void free(void*); 9437da2899SCharles.Forsyth extern ulong msize(void*); 9537da2899SCharles.Forsyth extern void* calloc(ulong, ulong); 9637da2899SCharles.Forsyth extern void* realloc(void*, ulong); 9737da2899SCharles.Forsyth extern void setmalloctag(void*, ulong); 9837da2899SCharles.Forsyth extern void setrealloctag(void*, ulong); 9937da2899SCharles.Forsyth extern ulong getmalloctag(void*); 10037da2899SCharles.Forsyth extern ulong getrealloctag(void*); 10137da2899SCharles.Forsyth extern void* malloctopoolblock(void*); 10237da2899SCharles.Forsyth 10337da2899SCharles.Forsyth /* 10437da2899SCharles.Forsyth * print routines 10537da2899SCharles.Forsyth */ 10637da2899SCharles.Forsyth typedef struct Fmt Fmt; 10737da2899SCharles.Forsyth struct Fmt{ 10837da2899SCharles.Forsyth uchar runes; /* output buffer is runes or chars? */ 10937da2899SCharles.Forsyth void *start; /* of buffer */ 11037da2899SCharles.Forsyth void *to; /* current place in the buffer */ 11137da2899SCharles.Forsyth void *stop; /* end of the buffer; overwritten if flush fails */ 11237da2899SCharles.Forsyth int (*flush)(Fmt *); /* called when to == stop */ 11337da2899SCharles.Forsyth void *farg; /* to make flush a closure */ 11437da2899SCharles.Forsyth int nfmt; /* num chars formatted so far */ 11537da2899SCharles.Forsyth va_list args; /* args passed to dofmt */ 11637da2899SCharles.Forsyth int r; /* % format Rune */ 11737da2899SCharles.Forsyth int width; 11837da2899SCharles.Forsyth int prec; 11937da2899SCharles.Forsyth ulong flags; 12037da2899SCharles.Forsyth }; 12137da2899SCharles.Forsyth 12237da2899SCharles.Forsyth enum{ 12337da2899SCharles.Forsyth FmtWidth = 1, 12437da2899SCharles.Forsyth FmtLeft = FmtWidth << 1, 12537da2899SCharles.Forsyth FmtPrec = FmtLeft << 1, 12637da2899SCharles.Forsyth FmtSharp = FmtPrec << 1, 12737da2899SCharles.Forsyth FmtSpace = FmtSharp << 1, 12837da2899SCharles.Forsyth FmtSign = FmtSpace << 1, 12937da2899SCharles.Forsyth FmtZero = FmtSign << 1, 13037da2899SCharles.Forsyth FmtUnsigned = FmtZero << 1, 13137da2899SCharles.Forsyth FmtShort = FmtUnsigned << 1, 13237da2899SCharles.Forsyth FmtLong = FmtShort << 1, 13337da2899SCharles.Forsyth FmtVLong = FmtLong << 1, 13437da2899SCharles.Forsyth FmtComma = FmtVLong << 1, 13537da2899SCharles.Forsyth FmtByte = FmtComma << 1, 13637da2899SCharles.Forsyth 13737da2899SCharles.Forsyth FmtFlag = FmtByte << 1 13837da2899SCharles.Forsyth }; 13937da2899SCharles.Forsyth 14037da2899SCharles.Forsyth extern int print(char*, ...); 14137da2899SCharles.Forsyth extern char* seprint(char*, char*, char*, ...); 14237da2899SCharles.Forsyth extern char* vseprint(char*, char*, char*, va_list); 14337da2899SCharles.Forsyth extern int snprint(char*, int, char*, ...); 14437da2899SCharles.Forsyth extern int vsnprint(char*, int, char*, va_list); 14537da2899SCharles.Forsyth extern char* smprint(char*, ...); 14637da2899SCharles.Forsyth extern char* vsmprint(char*, va_list); 14737da2899SCharles.Forsyth extern int sprint(char*, char*, ...); 14837da2899SCharles.Forsyth extern int fprint(int, char*, ...); 14937da2899SCharles.Forsyth extern int vfprint(int, char*, va_list); 15037da2899SCharles.Forsyth 15137da2899SCharles.Forsyth extern int runesprint(Rune*, char*, ...); 15237da2899SCharles.Forsyth extern int runesnprint(Rune*, int, char*, ...); 15337da2899SCharles.Forsyth extern int runevsnprint(Rune*, int, char*, va_list); 15437da2899SCharles.Forsyth extern Rune* runeseprint(Rune*, Rune*, char*, ...); 15537da2899SCharles.Forsyth extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 15637da2899SCharles.Forsyth extern Rune* runesmprint(char*, ...); 15737da2899SCharles.Forsyth extern Rune* runevsmprint(char*, va_list); 15837da2899SCharles.Forsyth 15937da2899SCharles.Forsyth extern int fmtfdinit(Fmt*, int, char*, int); 16037da2899SCharles.Forsyth extern int fmtfdflush(Fmt*); 16137da2899SCharles.Forsyth extern int fmtstrinit(Fmt*); 16237da2899SCharles.Forsyth extern char* fmtstrflush(Fmt*); 16337da2899SCharles.Forsyth extern int runefmtstrinit(Fmt*); 16437da2899SCharles.Forsyth extern Rune* runefmtstrflush(Fmt*); 16537da2899SCharles.Forsyth 16637da2899SCharles.Forsyth #pragma varargck argpos fmtprint 2 16737da2899SCharles.Forsyth #pragma varargck argpos fprint 2 16837da2899SCharles.Forsyth #pragma varargck argpos print 1 16937da2899SCharles.Forsyth #pragma varargck argpos runeseprint 3 17037da2899SCharles.Forsyth #pragma varargck argpos runesmprint 1 17137da2899SCharles.Forsyth #pragma varargck argpos runesnprint 3 17237da2899SCharles.Forsyth #pragma varargck argpos runesprint 2 17337da2899SCharles.Forsyth #pragma varargck argpos seprint 3 17437da2899SCharles.Forsyth #pragma varargck argpos smprint 1 17537da2899SCharles.Forsyth #pragma varargck argpos snprint 3 17637da2899SCharles.Forsyth #pragma varargck argpos sprint 2 17737da2899SCharles.Forsyth #pragma varargck argpos vseprint 3 17837da2899SCharles.Forsyth #pragma varargck argpos vsnprint 3 17937da2899SCharles.Forsyth 18037da2899SCharles.Forsyth #pragma varargck type "lld" vlong 18137da2899SCharles.Forsyth #pragma varargck type "llx" vlong 18237da2899SCharles.Forsyth #pragma varargck type "lld" uvlong 18337da2899SCharles.Forsyth #pragma varargck type "llx" uvlong 18437da2899SCharles.Forsyth #pragma varargck type "ld" long 18537da2899SCharles.Forsyth #pragma varargck type "lx" long 18637da2899SCharles.Forsyth #pragma varargck type "ld" ulong 18737da2899SCharles.Forsyth #pragma varargck type "lx" ulong 18837da2899SCharles.Forsyth #pragma varargck type "d" int 18937da2899SCharles.Forsyth #pragma varargck type "x" int 19037da2899SCharles.Forsyth #pragma varargck type "c" int 19137da2899SCharles.Forsyth #pragma varargck type "C" int 19237da2899SCharles.Forsyth #pragma varargck type "d" uint 19337da2899SCharles.Forsyth #pragma varargck type "x" uint 19437da2899SCharles.Forsyth #pragma varargck type "c" uint 19537da2899SCharles.Forsyth #pragma varargck type "C" uint 19637da2899SCharles.Forsyth #pragma varargck type "f" double 19737da2899SCharles.Forsyth #pragma varargck type "e" double 19837da2899SCharles.Forsyth #pragma varargck type "g" double 19937da2899SCharles.Forsyth #pragma varargck type "s" char* 20037da2899SCharles.Forsyth #pragma varargck type "q" char* 20137da2899SCharles.Forsyth #pragma varargck type "S" Rune* 20237da2899SCharles.Forsyth #pragma varargck type "Q" Rune* 20337da2899SCharles.Forsyth #pragma varargck type "r" void 20437da2899SCharles.Forsyth #pragma varargck type "%" void 20537da2899SCharles.Forsyth #pragma varargck type "n" int* 20637da2899SCharles.Forsyth #pragma varargck type "p" void* 2076b2e3235Sforsyth #pragma varargck type "p" uintptr 20837da2899SCharles.Forsyth #pragma varargck flag ',' 20937da2899SCharles.Forsyth #pragma varargck type "<" void* 21037da2899SCharles.Forsyth #pragma varargck type "[" void* 21137da2899SCharles.Forsyth #pragma varargck type "H" void* 21237da2899SCharles.Forsyth 21337da2899SCharles.Forsyth extern int fmtinstall(int, int (*)(Fmt*)); 21437da2899SCharles.Forsyth extern int dofmt(Fmt*, char*); 21537da2899SCharles.Forsyth extern int dorfmt(Fmt*, Rune*); 21637da2899SCharles.Forsyth extern int fmtprint(Fmt*, char*, ...); 21737da2899SCharles.Forsyth extern int fmtvprint(Fmt*, char*, va_list); 21837da2899SCharles.Forsyth extern int fmtrune(Fmt*, int); 21937da2899SCharles.Forsyth extern int fmtstrcpy(Fmt*, char*); 22037da2899SCharles.Forsyth extern int fmtrunestrcpy(Fmt*, Rune*); 22137da2899SCharles.Forsyth /* 22237da2899SCharles.Forsyth * error string for %r 22337da2899SCharles.Forsyth * supplied on per os basis, not part of fmt library 22437da2899SCharles.Forsyth */ 22537da2899SCharles.Forsyth extern int errfmt(Fmt *f); 22637da2899SCharles.Forsyth 22737da2899SCharles.Forsyth /* 22837da2899SCharles.Forsyth * quoted strings 22937da2899SCharles.Forsyth */ 23037da2899SCharles.Forsyth extern char *unquotestrdup(char*); 23137da2899SCharles.Forsyth extern Rune *unquoterunestrdup(Rune*); 23237da2899SCharles.Forsyth extern char *quotestrdup(char*); 23337da2899SCharles.Forsyth extern Rune *quoterunestrdup(Rune*); 23437da2899SCharles.Forsyth extern int quotestrfmt(Fmt*); 23537da2899SCharles.Forsyth extern int quoterunestrfmt(Fmt*); 23637da2899SCharles.Forsyth extern void quotefmtinstall(void); 23737da2899SCharles.Forsyth extern int (*doquote)(int); 23837da2899SCharles.Forsyth 23937da2899SCharles.Forsyth /* 24037da2899SCharles.Forsyth * random number 24137da2899SCharles.Forsyth */ 24237da2899SCharles.Forsyth extern void srand(long); 24337da2899SCharles.Forsyth extern int rand(void); 24437da2899SCharles.Forsyth extern int nrand(int); 24537da2899SCharles.Forsyth extern long lrand(void); 24637da2899SCharles.Forsyth extern long lnrand(long); 24737da2899SCharles.Forsyth extern double frand(void); 24837da2899SCharles.Forsyth extern ulong truerand(void); 24937da2899SCharles.Forsyth extern ulong ntruerand(ulong); 25037da2899SCharles.Forsyth 25137da2899SCharles.Forsyth /* 25237da2899SCharles.Forsyth * math 25337da2899SCharles.Forsyth */ 25437da2899SCharles.Forsyth extern ulong getfcr(void); 25537da2899SCharles.Forsyth extern void setfsr(ulong); 25637da2899SCharles.Forsyth extern ulong getfsr(void); 25737da2899SCharles.Forsyth extern void setfcr(ulong); 25837da2899SCharles.Forsyth extern double NaN(void); 25937da2899SCharles.Forsyth extern double Inf(int); 26037da2899SCharles.Forsyth extern int isNaN(double); 26137da2899SCharles.Forsyth extern int isInf(double, int); 26237da2899SCharles.Forsyth 26337da2899SCharles.Forsyth extern double pow(double, double); 26437da2899SCharles.Forsyth extern double atan2(double, double); 26537da2899SCharles.Forsyth extern double fabs(double); 26637da2899SCharles.Forsyth extern double atan(double); 26737da2899SCharles.Forsyth extern double log(double); 26837da2899SCharles.Forsyth extern double log10(double); 26937da2899SCharles.Forsyth extern double exp(double); 27037da2899SCharles.Forsyth extern double floor(double); 27137da2899SCharles.Forsyth extern double ceil(double); 27237da2899SCharles.Forsyth extern double hypot(double, double); 27337da2899SCharles.Forsyth extern double sin(double); 27437da2899SCharles.Forsyth extern double cos(double); 27537da2899SCharles.Forsyth extern double tan(double); 27637da2899SCharles.Forsyth extern double asin(double); 27737da2899SCharles.Forsyth extern double acos(double); 27837da2899SCharles.Forsyth extern double sinh(double); 27937da2899SCharles.Forsyth extern double cosh(double); 28037da2899SCharles.Forsyth extern double tanh(double); 28137da2899SCharles.Forsyth extern double sqrt(double); 28237da2899SCharles.Forsyth extern double fmod(double, double); 28337da2899SCharles.Forsyth 28437da2899SCharles.Forsyth #define HUGE 3.4028234e38 28537da2899SCharles.Forsyth #define PIO2 1.570796326794896619231e0 28637da2899SCharles.Forsyth #define PI (PIO2+PIO2) 28737da2899SCharles.Forsyth 28837da2899SCharles.Forsyth /* 28937da2899SCharles.Forsyth * Time-of-day 29037da2899SCharles.Forsyth */ 29137da2899SCharles.Forsyth 29237da2899SCharles.Forsyth typedef 29337da2899SCharles.Forsyth struct Tm 29437da2899SCharles.Forsyth { 29537da2899SCharles.Forsyth int sec; 29637da2899SCharles.Forsyth int min; 29737da2899SCharles.Forsyth int hour; 29837da2899SCharles.Forsyth int mday; 29937da2899SCharles.Forsyth int mon; 30037da2899SCharles.Forsyth int year; 30137da2899SCharles.Forsyth int wday; 30237da2899SCharles.Forsyth int yday; 30337da2899SCharles.Forsyth char zone[4]; 30437da2899SCharles.Forsyth int tzoff; 30537da2899SCharles.Forsyth } Tm; 30637da2899SCharles.Forsyth 30737da2899SCharles.Forsyth extern Tm* gmtime(long); 30837da2899SCharles.Forsyth extern Tm* localtime(long); 30937da2899SCharles.Forsyth extern char* asctime(Tm*); 31037da2899SCharles.Forsyth extern char* ctime(long); 31137da2899SCharles.Forsyth extern double cputime(void); 31237da2899SCharles.Forsyth extern long times(long*); 31337da2899SCharles.Forsyth extern long tm2sec(Tm*); 31437da2899SCharles.Forsyth extern vlong nsec(void); 31537da2899SCharles.Forsyth 31637da2899SCharles.Forsyth /* 31737da2899SCharles.Forsyth * one-of-a-kind 31837da2899SCharles.Forsyth */ 31937da2899SCharles.Forsyth enum 32037da2899SCharles.Forsyth { 32137da2899SCharles.Forsyth PNPROC = 1, 32237da2899SCharles.Forsyth PNGROUP = 2, 32337da2899SCharles.Forsyth }; 32437da2899SCharles.Forsyth extern vlong nsec(void); 32537da2899SCharles.Forsyth 32637da2899SCharles.Forsyth extern void _assert(char*); 32737da2899SCharles.Forsyth extern int abs(int); 32837da2899SCharles.Forsyth extern int atexit(void(*)(void)); 32937da2899SCharles.Forsyth extern void atexitdont(void(*)(void)); 33037da2899SCharles.Forsyth extern int atnotify(int(*)(void*, char*), int); 33137da2899SCharles.Forsyth extern double atof(char*); 33237da2899SCharles.Forsyth extern int atoi(char*); 33337da2899SCharles.Forsyth extern long atol(char*); 33437da2899SCharles.Forsyth extern double charstod(int(*)(void*), void*); 33537da2899SCharles.Forsyth extern char* cleanname(char*); 33637da2899SCharles.Forsyth extern int decrypt(void*, void*, int); 33737da2899SCharles.Forsyth extern int encrypt(void*, void*, int); 33837da2899SCharles.Forsyth extern int dec64(uchar*, int, char*, int); 33937da2899SCharles.Forsyth extern int enc64(char*, int, uchar*, int); 34037da2899SCharles.Forsyth extern int dec32(uchar*, int, char*, int); 34137da2899SCharles.Forsyth extern int enc32(char*, int, uchar*, int); 34237da2899SCharles.Forsyth extern int dec16(uchar*, int, char*, int); 34337da2899SCharles.Forsyth extern int enc16(char*, int, uchar*, int); 34437da2899SCharles.Forsyth extern int encodefmt(Fmt*); 34537da2899SCharles.Forsyth extern void exits(char*); 34637da2899SCharles.Forsyth extern double frexp(double, int*); 3476b2e3235Sforsyth extern uintptr getcallerpc(void*); 34837da2899SCharles.Forsyth extern char* getenv(char*); 34937da2899SCharles.Forsyth extern int getfields(char*, char**, int, int, char*); 35037da2899SCharles.Forsyth extern char* getuser(void); 35137da2899SCharles.Forsyth extern char* getwd(char*, int); 35237da2899SCharles.Forsyth extern long labs(long); 35337da2899SCharles.Forsyth extern double ldexp(double, int); 35437da2899SCharles.Forsyth /*extern void longjmp(jmp_buf, int);*/ 35537da2899SCharles.Forsyth extern char* mktemp(char*); 35637da2899SCharles.Forsyth extern double modf(double, double*); 35737da2899SCharles.Forsyth extern int netcrypt(void*, void*); 35837da2899SCharles.Forsyth /*extern void notejmp(void*, jmp_buf, int);*/ 35937da2899SCharles.Forsyth extern void perror(char*); 36037da2899SCharles.Forsyth extern int postnote(int, int, char *); 36137da2899SCharles.Forsyth extern double pow10(int); 36237da2899SCharles.Forsyth extern double ipow10(int); 36337da2899SCharles.Forsyth extern int putenv(char*, char*); 36437da2899SCharles.Forsyth extern void qsort(void*, long, long, int (*)(void*, void*)); 36537da2899SCharles.Forsyth /*extern int setjmp(jmp_buf);*/ 36637da2899SCharles.Forsyth extern double strtod(char*, char**); 36737da2899SCharles.Forsyth extern long strtol(char*, char**, int); 36837da2899SCharles.Forsyth extern ulong strtoul(char*, char**, int); 36937da2899SCharles.Forsyth extern vlong strtoll(char*, char**, int); 37037da2899SCharles.Forsyth extern uvlong strtoull(char*, char**, int); 37137da2899SCharles.Forsyth extern void sysfatal(char*, ...); 37237da2899SCharles.Forsyth #pragma varargck argpos sysfatal 1 37337da2899SCharles.Forsyth extern void syslog(int, char*, char*, ...); 37437da2899SCharles.Forsyth #pragma varargck argpos syslog 3 37513c8260fSCharles.Forsyth extern int _tas(int*); 37637da2899SCharles.Forsyth extern long time(long*); 37737da2899SCharles.Forsyth extern int tolower(int); 37837da2899SCharles.Forsyth extern int toupper(int); 37937da2899SCharles.Forsyth 38037da2899SCharles.Forsyth /* 38137da2899SCharles.Forsyth * network dialing 38237da2899SCharles.Forsyth */ 38337da2899SCharles.Forsyth #define NETPATHLEN 40 38437da2899SCharles.Forsyth extern int accept(int, char*); 38537da2899SCharles.Forsyth extern int announce(char*, char*); 38637da2899SCharles.Forsyth extern int dial(char*, char*, char*, int*); 38737da2899SCharles.Forsyth extern void setnetmtpt(char*, int, char*); 38837da2899SCharles.Forsyth extern int hangup(int); 38937da2899SCharles.Forsyth extern int listen(char*, char*); 39037da2899SCharles.Forsyth extern char* netmkaddr(char*, char*, char*); 39137da2899SCharles.Forsyth extern int reject(int, char*, char*); 39237da2899SCharles.Forsyth 39337da2899SCharles.Forsyth /* 39437da2899SCharles.Forsyth * system calls 39537da2899SCharles.Forsyth * 39637da2899SCharles.Forsyth */ 39737da2899SCharles.Forsyth #define STATMAX 65535U /* max length of machine-independent stat structure */ 39837da2899SCharles.Forsyth #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ 39937da2899SCharles.Forsyth #define ERRMAX 128 /* max length of error string */ 40037da2899SCharles.Forsyth 40137da2899SCharles.Forsyth #define MORDER 0x0003 /* mask for bits defining order of mounting */ 40237da2899SCharles.Forsyth #define MREPL 0x0000 /* mount replaces object */ 40337da2899SCharles.Forsyth #define MBEFORE 0x0001 /* mount goes before others in union directory */ 40437da2899SCharles.Forsyth #define MAFTER 0x0002 /* mount goes after others in union directory */ 40537da2899SCharles.Forsyth #define MCREATE 0x0004 /* permit creation in mounted directory */ 40637da2899SCharles.Forsyth #define MCACHE 0x0010 /* cache some data */ 40737da2899SCharles.Forsyth #define MMASK 0x0017 /* all bits on */ 40837da2899SCharles.Forsyth 40937da2899SCharles.Forsyth #define OREAD 0 /* open for read */ 41037da2899SCharles.Forsyth #define OWRITE 1 /* write */ 41137da2899SCharles.Forsyth #define ORDWR 2 /* read and write */ 41237da2899SCharles.Forsyth #define OEXEC 3 /* execute, == read but check execute permission */ 41337da2899SCharles.Forsyth #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 41437da2899SCharles.Forsyth #define OCEXEC 32 /* or'ed in, close on exec */ 41537da2899SCharles.Forsyth #define ORCLOSE 64 /* or'ed in, remove on close */ 41637da2899SCharles.Forsyth #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ 41737da2899SCharles.Forsyth 41837da2899SCharles.Forsyth #define AEXIST 0 /* accessible: exists */ 41937da2899SCharles.Forsyth #define AEXEC 1 /* execute access */ 42037da2899SCharles.Forsyth #define AWRITE 2 /* write access */ 42137da2899SCharles.Forsyth #define AREAD 4 /* read access */ 42237da2899SCharles.Forsyth 42337da2899SCharles.Forsyth /* Segattch */ 42437da2899SCharles.Forsyth #define SG_RONLY 0040 /* read only */ 42537da2899SCharles.Forsyth #define SG_CEXEC 0100 /* detach on exec */ 42637da2899SCharles.Forsyth 42737da2899SCharles.Forsyth #define NCONT 0 /* continue after note */ 42837da2899SCharles.Forsyth #define NDFLT 1 /* terminate after note */ 42937da2899SCharles.Forsyth #define NSAVE 2 /* clear note but hold state */ 43037da2899SCharles.Forsyth #define NRSTR 3 /* restore saved state */ 43137da2899SCharles.Forsyth 43237da2899SCharles.Forsyth /* rfork */ 43337da2899SCharles.Forsyth enum 43437da2899SCharles.Forsyth { 43537da2899SCharles.Forsyth RFNAMEG = (1<<0), 43637da2899SCharles.Forsyth RFENVG = (1<<1), 43737da2899SCharles.Forsyth RFFDG = (1<<2), 43837da2899SCharles.Forsyth RFNOTEG = (1<<3), 43937da2899SCharles.Forsyth RFPROC = (1<<4), 44037da2899SCharles.Forsyth RFMEM = (1<<5), 44137da2899SCharles.Forsyth RFNOWAIT = (1<<6), 44237da2899SCharles.Forsyth RFCNAMEG = (1<<10), 44337da2899SCharles.Forsyth RFCENVG = (1<<11), 44437da2899SCharles.Forsyth RFCFDG = (1<<12), 44537da2899SCharles.Forsyth RFREND = (1<<13), 44637da2899SCharles.Forsyth RFNOMNT = (1<<14) 44737da2899SCharles.Forsyth }; 44837da2899SCharles.Forsyth 44937da2899SCharles.Forsyth /* bits in Qid.type */ 45037da2899SCharles.Forsyth #define QTDIR 0x80 /* type bit for directories */ 45137da2899SCharles.Forsyth #define QTAPPEND 0x40 /* type bit for append only files */ 45237da2899SCharles.Forsyth #define QTEXCL 0x20 /* type bit for exclusive use files */ 45337da2899SCharles.Forsyth #define QTMOUNT 0x10 /* type bit for mounted channel */ 45437da2899SCharles.Forsyth #define QTAUTH 0x08 /* type bit for authentication file */ 45537da2899SCharles.Forsyth #define QTFILE 0x00 /* plain file */ 45637da2899SCharles.Forsyth 45737da2899SCharles.Forsyth /* bits in Dir.mode */ 45837da2899SCharles.Forsyth #define DMDIR 0x80000000 /* mode bit for directories */ 45937da2899SCharles.Forsyth #define DMAPPEND 0x40000000 /* mode bit for append only files */ 46037da2899SCharles.Forsyth #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 46137da2899SCharles.Forsyth #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 46237da2899SCharles.Forsyth #define DMAUTH 0x08000000 /* mode bit for authentication file */ 46337da2899SCharles.Forsyth #define DMREAD 0x4 /* mode bit for read permission */ 46437da2899SCharles.Forsyth #define DMWRITE 0x2 /* mode bit for write permission */ 46537da2899SCharles.Forsyth #define DMEXEC 0x1 /* mode bit for execute permission */ 46637da2899SCharles.Forsyth 46737da2899SCharles.Forsyth typedef 46837da2899SCharles.Forsyth struct Qid 46937da2899SCharles.Forsyth { 47037da2899SCharles.Forsyth uvlong path; 47137da2899SCharles.Forsyth ulong vers; 47237da2899SCharles.Forsyth uchar type; 47337da2899SCharles.Forsyth } Qid; 47437da2899SCharles.Forsyth 47537da2899SCharles.Forsyth typedef 47637da2899SCharles.Forsyth struct Dir { 47737da2899SCharles.Forsyth 47837da2899SCharles.Forsyth /* system-modified data */ 47937da2899SCharles.Forsyth ushort type; /* server type */ 48037da2899SCharles.Forsyth uint dev; /* server subtype */ 48137da2899SCharles.Forsyth /* file data */ 48237da2899SCharles.Forsyth Qid qid; /* unique id from server */ 48337da2899SCharles.Forsyth ulong mode; /* permissions */ 48437da2899SCharles.Forsyth ulong atime; /* last read time */ 48537da2899SCharles.Forsyth ulong mtime; /* last write time */ 48637da2899SCharles.Forsyth vlong length; /* file length */ 48737da2899SCharles.Forsyth char *name; /* last element of path */ 48837da2899SCharles.Forsyth char *uid; /* owner name */ 48937da2899SCharles.Forsyth char *gid; /* group name */ 49037da2899SCharles.Forsyth char *muid; /* last modifier name */ 49137da2899SCharles.Forsyth } Dir; 49237da2899SCharles.Forsyth 49337da2899SCharles.Forsyth extern Dir* dirstat(char*); 49437da2899SCharles.Forsyth extern Dir* dirfstat(int); 49537da2899SCharles.Forsyth extern int dirwstat(char*, Dir*); 49637da2899SCharles.Forsyth extern int dirfwstat(int, Dir*); 49737da2899SCharles.Forsyth extern long dirread(int, Dir**); 49837da2899SCharles.Forsyth extern void nulldir(Dir*); 49937da2899SCharles.Forsyth extern long dirreadall(int, Dir**); 50037da2899SCharles.Forsyth 50137da2899SCharles.Forsyth #define CHDIR 0x80000000 /* mode bit for directories */ 50237da2899SCharles.Forsyth #define CHAPPEND 0x40000000 /* mode bit for append only files */ 50337da2899SCharles.Forsyth #define CHEXCL 0x20000000 /* mode bit for exclusive use files */ 50437da2899SCharles.Forsyth #define CHMOUNT 0x10000000 /* mode bit for mounted channel */ 50537da2899SCharles.Forsyth #define CHREAD 0x4 /* mode bit for read permission */ 50637da2899SCharles.Forsyth #define CHWRITE 0x2 /* mode bit for write permission */ 50737da2899SCharles.Forsyth #define CHEXEC 0x1 /* mode bit for execute permission */ 50837da2899SCharles.Forsyth 50937da2899SCharles.Forsyth 51037da2899SCharles.Forsyth typedef 51137da2899SCharles.Forsyth struct Waitmsg 51237da2899SCharles.Forsyth { 51337da2899SCharles.Forsyth char pid[12]; /* of loved one */ 51437da2899SCharles.Forsyth char time[3*12]; /* of loved one & descendants */ 51537da2899SCharles.Forsyth char *msg; 51637da2899SCharles.Forsyth } Waitmsg; 51737da2899SCharles.Forsyth 51837da2899SCharles.Forsyth typedef 51937da2899SCharles.Forsyth struct IOchunk 52037da2899SCharles.Forsyth { 52137da2899SCharles.Forsyth void *addr; 52237da2899SCharles.Forsyth ulong len; 52337da2899SCharles.Forsyth } IOchunk; 52437da2899SCharles.Forsyth 52537da2899SCharles.Forsyth extern void _exits(char*); 52637da2899SCharles.Forsyth 52737da2899SCharles.Forsyth extern void abort(void); 52837da2899SCharles.Forsyth extern int access(char*, int); 52937da2899SCharles.Forsyth extern long alarm(ulong); 53037da2899SCharles.Forsyth extern int await(char*, int); 53137da2899SCharles.Forsyth extern int bind(char*, char*, int); 53237da2899SCharles.Forsyth extern int brk(void*); 53337da2899SCharles.Forsyth extern int chdir(char*); 53437da2899SCharles.Forsyth extern int close(int); 53537da2899SCharles.Forsyth extern int create(char*, int, ulong); 53637da2899SCharles.Forsyth extern int dup(int, int); 53737da2899SCharles.Forsyth extern int errstr(char*, uint); 53837da2899SCharles.Forsyth extern int exec(char*, char*[]); 53937da2899SCharles.Forsyth extern int execl(char*, ...); 54037da2899SCharles.Forsyth extern int filsys(int, int, char*); 54137da2899SCharles.Forsyth extern int fork(void); 54237da2899SCharles.Forsyth extern int rfork(int); 54337da2899SCharles.Forsyth extern int fauth(int, char*); 54437da2899SCharles.Forsyth extern int fstat(int, uchar*, int); 54537da2899SCharles.Forsyth extern int fwstat(int, uchar*, int); 54637da2899SCharles.Forsyth extern int fversion(int, int, char*, int); 54737da2899SCharles.Forsyth extern int mount(int, int, char*, int, char*); 54837da2899SCharles.Forsyth extern int unmount(char*, char*); 54937da2899SCharles.Forsyth extern int noted(int); 55037da2899SCharles.Forsyth extern int notify(void(*)(void*, char*)); 55137da2899SCharles.Forsyth extern int open(char*, int); 55237da2899SCharles.Forsyth extern int fd2path(int, char*, int); 55337da2899SCharles.Forsyth extern int pipe(int*); 55437da2899SCharles.Forsyth extern long pread(int, void*, long, vlong); 55537da2899SCharles.Forsyth extern long pwrite(int, void*, long, vlong); 55637da2899SCharles.Forsyth extern long read(int, void*, long); 55737da2899SCharles.Forsyth extern long readn(int, void*, long); 55837da2899SCharles.Forsyth extern int remove(char*); 55937da2899SCharles.Forsyth extern void* sbrk(ulong); 56037da2899SCharles.Forsyth extern vlong seek(int, vlong, int); 56137da2899SCharles.Forsyth extern long segattach(int, char*, void*, ulong); 56237da2899SCharles.Forsyth extern int segbrk(void*, void*); 56337da2899SCharles.Forsyth extern int segdetach(void*); 56437da2899SCharles.Forsyth extern int segflush(void*, ulong); 56537da2899SCharles.Forsyth extern int segfree(void*, ulong); 56637da2899SCharles.Forsyth extern int sleep(long); 56737da2899SCharles.Forsyth extern int stat(char*, uchar*, int); 56837da2899SCharles.Forsyth extern Waitmsg* wait(void); 56937da2899SCharles.Forsyth extern int waitpid(void); 57037da2899SCharles.Forsyth extern long write(int, void*, long); 57137da2899SCharles.Forsyth extern long write9p(int, void*, long); 57237da2899SCharles.Forsyth extern int wstat(char*, char*); 57337da2899SCharles.Forsyth extern ulong rendezvous(ulong, ulong); 57437da2899SCharles.Forsyth 57537da2899SCharles.Forsyth extern int getpid(void); 57637da2899SCharles.Forsyth extern int getppid(void); 57737da2899SCharles.Forsyth extern void rerrstr(char*, uint); 57837da2899SCharles.Forsyth extern char* sysname(void); 57937da2899SCharles.Forsyth extern void werrstr(char*, ...); 58037da2899SCharles.Forsyth #pragma varargck argpos werrstr 1 58137da2899SCharles.Forsyth 58237da2899SCharles.Forsyth extern char *argv0; 58337da2899SCharles.Forsyth #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ 58437da2899SCharles.Forsyth argv[0] && argv[0][0]=='-' && argv[0][1];\ 58537da2899SCharles.Forsyth argc--, argv++) {\ 58637da2899SCharles.Forsyth char *_args, *_argt;\ 58737da2899SCharles.Forsyth Rune _argc;\ 58837da2899SCharles.Forsyth _args = &argv[0][1];\ 58937da2899SCharles.Forsyth if(_args[0]=='-' && _args[1]==0){\ 59037da2899SCharles.Forsyth argc--; argv++; break;\ 59137da2899SCharles.Forsyth }\ 59237da2899SCharles.Forsyth _argc = 0;\ 59337da2899SCharles.Forsyth while(*_args && (_args += chartorune(&_argc, _args)))\ 59437da2899SCharles.Forsyth switch(_argc) 59537da2899SCharles.Forsyth #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); 59637da2899SCharles.Forsyth #define ARGF() (_argt=_args, _args="",\ 59737da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 59837da2899SCharles.Forsyth #define EARGF(x) (_argt=_args, _args="",\ 59937da2899SCharles.Forsyth (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) 60037da2899SCharles.Forsyth 60137da2899SCharles.Forsyth #define ARGC() _argc 602