Unified · Split
Binary file not shown.
| @@ -0,0 +1,680 @@ | |||
| 1 | #include <u.h> | ||
| 2 | typedef unsigned long size_t; | ||
| 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* memccpy(void*, void*, int, ulong); | ||
| 12 | extern void* memset(void*, int, ulong); | ||
| 13 | extern int memcmp(void*, void*, ulong); | ||
| 14 | extern void* memcpy(void*, void*, ulong); | ||
| 15 | extern void* memmove(void*, void*, ulong); | ||
| 16 | extern void* memchr(void*, int, ulong); | ||
| 17 | |||
| 18 | /* | ||
| 19 | * string routines | ||
| 20 | */ | ||
| 21 | extern char* strcat(char*, char*); | ||
| 22 | extern char* strchr(char*, int); | ||
| 23 | extern int strcmp(char*, char*); | ||
| 24 | extern char* strcpy(char*, char*); | ||
| 25 | extern char* strecpy(char*, char*, char*); | ||
| 26 | extern char* strdup(char*); | ||
| 27 | extern char* strncat(char*, char*, long); | ||
| 28 | extern char* strncpy(char*, char*, long); | ||
| 29 | extern int strncmp(char*, char*, long); | ||
| 30 | extern char* strpbrk(char*, char*); | ||
| 31 | extern char* strrchr(char*, int); | ||
| 32 | extern char* strtok(char*, char*); | ||
| 33 | extern long strlen(char*); | ||
| 34 | extern long strspn(char*, char*); | ||
| 35 | extern long strcspn(char*, char*); | ||
| 36 | extern char* strstr(char*, char*); | ||
| 37 | extern int cistrncmp(char*, char*, int); | ||
| 38 | extern int cistrcmp(char*, char*); | ||
| 39 | extern char* cistrstr(char*, char*); | ||
| 40 | extern int tokenize(char*, char**, int); | ||
| 41 | |||
| 42 | enum | ||
| 43 | { | ||
| 44 | UTFmax = 3, /* maximum bytes per rune */ | ||
| 45 | Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ | ||
| 46 | Runeself = 0x80, /* rune and UTF sequences are the same (<) */ | ||
| 47 | Runeerror = 0x80, /* decoding error in UTF */ | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* | ||
| 51 | * rune routines | ||
| 52 | */ | ||
| 53 | extern int runetochar(char*, Rune*); | ||
| 54 | extern int chartorune(Rune*, char*); | ||
| 55 | extern int runelen(long); | ||
| 56 | extern int runenlen(Rune*, int); | ||
| 57 | extern int fullrune(char*, int); | ||
| 58 | extern int utflen(char*); | ||
| 59 | extern int utfnlen(char*, long); | ||
| 60 | extern char* utfrune(char*, long); | ||
| 61 | extern char* utfrrune(char*, long); | ||
| 62 | extern char* utfutf(char*, char*); | ||
| 63 | extern char* utfecpy(char*, char*, char*); | ||
| 64 | |||
| 65 | extern Rune* runestrcat(Rune*, Rune*); | ||
| 66 | extern Rune* runestrchr(Rune*, Rune); | ||
| 67 | extern int runestrcmp(Rune*, Rune*); | ||
| 68 | extern Rune* runestrcpy(Rune*, Rune*); | ||
| 69 | extern Rune* runestrncpy(Rune*, Rune*, long); | ||
| 70 | extern Rune* runestrecpy(Rune*, Rune*, Rune*); | ||
| 71 | extern Rune* runestrdup(Rune*); | ||
| 72 | extern Rune* runestrncat(Rune*, Rune*, long); | ||
| 73 | extern int runestrncmp(Rune*, Rune*, long); | ||
| 74 | extern Rune* runestrrchr(Rune*, Rune); | ||
| 75 | extern long runestrlen(Rune*); | ||
| 76 | extern Rune* runestrstr(Rune*, Rune*); | ||
| 77 | |||
| 78 | extern Rune tolowerrune(Rune); | ||
| 79 | extern Rune totitlerune(Rune); | ||
| 80 | extern Rune toupperrune(Rune); | ||
| 81 | extern int isalpharune(Rune); | ||
| 82 | extern int islowerrune(Rune); | ||
| 83 | extern int isspacerune(Rune); | ||
| 84 | extern int istitlerune(Rune); | ||
| 85 | extern int isupperrune(Rune); | ||
| 86 | |||
| 87 | /* | ||
| 88 | * malloc | ||
| 89 | */ | ||
| 90 | extern void* malloc(ulong); | ||
| 91 | extern void* mallocz(ulong, int); | ||
| 92 | extern void free(void*); | ||
| 93 | extern ulong msize(void*); | ||
| 94 | extern void* calloc(ulong, ulong); | ||
| 95 | extern void* realloc(void*, ulong); | ||
| 96 | extern void setmalloctag(void*, ulong); | ||
| 97 | extern void setrealloctag(void*, ulong); | ||
| 98 | extern ulong getmalloctag(void*); | ||
| 99 | extern ulong getrealloctag(void*); | ||
| 100 | extern void* malloctopoolblock(void*); | ||
| 101 | |||
| 102 | /* | ||
| 103 | * print routines | ||
| 104 | */ | ||
| 105 | typedef struct Fmt Fmt; | ||
| 106 | struct Fmt{ | ||
| 107 | uchar runes; /* output buffer is runes or chars? */ | ||
| 108 | void *start; /* of buffer */ | ||
| 109 | void *to; /* current place in the buffer */ | ||
| 110 | void *stop; /* end of the buffer; overwritten if flush fails */ | ||
| 111 | int (*flush)(Fmt *); /* called when to == stop */ | ||
| 112 | void *farg; /* to make flush a closure */ | ||
| 113 | int nfmt; /* num chars formatted so far */ | ||
| 114 | va_list args; /* args passed to dofmt */ | ||
| 115 | int r; /* % format Rune */ | ||
| 116 | int width; | ||
| 117 | int prec; | ||
| 118 | ulong flags; | ||
| 119 | }; | ||
| 120 | |||
| 121 | enum{ | ||
| 122 | FmtWidth = 1, | ||
| 123 | FmtLeft = FmtWidth << 1, | ||
| 124 | FmtPrec = FmtLeft << 1, | ||
| 125 | FmtSharp = FmtPrec << 1, | ||
| 126 | FmtSpace = FmtSharp << 1, | ||
| 127 | FmtSign = FmtSpace << 1, | ||
| 128 | FmtZero = FmtSign << 1, | ||
| 129 | FmtUnsigned = FmtZero << 1, | ||
| 130 | FmtShort = FmtUnsigned << 1, | ||
| 131 | FmtLong = FmtShort << 1, | ||
| 132 | FmtVLong = FmtLong << 1, | ||
| 133 | FmtComma = FmtVLong << 1, | ||
| 134 | FmtByte = FmtComma << 1, | ||
| 135 | |||
| 136 | FmtFlag = FmtByte << 1 | ||
| 137 | }; | ||
| 138 | |||
| 139 | extern int print(char*, ...); | ||
| 140 | extern char* seprint(char*, char*, char*, ...); | ||
| 141 | extern char* vseprint(char*, char*, char*, va_list); | ||
| 142 | extern int snprint(char*, int, char*, ...); | ||
| 143 | extern int vsnprint(char*, int, char*, va_list); | ||
| 144 | extern char* smprint(char*, ...); | ||
| 145 | extern char* vsmprint(char*, va_list); | ||
| 146 | extern int sprint(char*, char*, ...); | ||
| 147 | extern int fprint(int, char*, ...); | ||
| 148 | extern int vfprint(int, char*, va_list); | ||
| 149 | |||
| 150 | extern int runesprint(Rune*, char*, ...); | ||
| 151 | extern int runesnprint(Rune*, int, char*, ...); | ||
| 152 | extern int runevsnprint(Rune*, int, char*, va_list); | ||
| 153 | extern Rune* runeseprint(Rune*, Rune*, char*, ...); | ||
| 154 | extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | ||
| 155 | extern Rune* runesmprint(char*, ...); | ||
| 156 | extern Rune* runevsmprint(char*, va_list); | ||
| 157 | |||
| 158 | extern int fmtfdinit(Fmt*, int, char*, int); | ||
| 159 | extern int fmtfdflush(Fmt*); | ||
| 160 | extern int fmtstrinit(Fmt*); | ||
| 161 | extern char* fmtstrflush(Fmt*); | ||
| 162 | extern int runefmtstrinit(Fmt*); | ||
| 163 | extern Rune* runefmtstrflush(Fmt*); | ||
| 164 | |||
| 165 | #pragma varargck argpos fmtprint 2 | ||
| 166 | #pragma varargck argpos fprint 2 | ||
| 167 | #pragma varargck argpos print 1 | ||
| 168 | #pragma varargck argpos runeseprint 3 | ||
| 169 | #pragma varargck argpos runesmprint 1 | ||
| 170 | #pragma varargck argpos runesnprint 3 | ||
| 171 | #pragma varargck argpos runesprint 2 | ||
| 172 | #pragma varargck argpos seprint 3 | ||
| 173 | #pragma varargck argpos smprint 1 | ||
| 174 | #pragma varargck argpos snprint 3 | ||
| 175 | #pragma varargck argpos sprint 2 | ||
| 176 | #pragma varargck argpos vseprint 3 | ||
| 177 | #pragma varargck argpos vsnprint 3 | ||
| 178 | |||
| 179 | #pragma varargck type "lld" vlong | ||
| 180 | #pragma varargck type "llx" vlong | ||
| 181 | #pragma varargck type "lld" uvlong | ||
| 182 | #pragma varargck type "llx" uvlong | ||
| 183 | #pragma varargck type "ld" long | ||
| 184 | #pragma varargck type "lx" long | ||
| 185 | #pragma varargck type "ld" ulong | ||
| 186 | #pragma varargck type "lx" ulong | ||
| 187 | #pragma varargck type "d" int | ||
| 188 | #pragma varargck type "x" int | ||
| 189 | #pragma varargck type "c" int | ||
| 190 | #pragma varargck type "C" int | ||
| 191 | #pragma varargck type "d" uint | ||
| 192 | #pragma varargck type "x" uint | ||
| 193 | #pragma varargck type "c" uint | ||
| 194 | #pragma varargck type "C" uint | ||
| 195 | #pragma varargck type "f" double | ||
| 196 | #pragma varargck type "e" double | ||
| 197 | #pragma varargck type "g" double | ||
| 198 | #pragma varargck type "s" char* | ||
| 199 | #pragma varargck type "q" char* | ||
| 200 | #pragma varargck type "S" Rune* | ||
| 201 | #pragma varargck type "Q" Rune* | ||
| 202 | #pragma varargck type "r" void | ||
| 203 | #pragma varargck type "%" void | ||
| 204 | #pragma varargck type "n" int* | ||
| 205 | #pragma varargck type "p" void* | ||
| 206 | #pragma varargck flag ',' | ||
| 207 | #pragma varargck type "<" void* | ||
| 208 | #pragma varargck type "[" void* | ||
| 209 | #pragma varargck type "H" void* | ||
| 210 | |||
| 211 | extern int fmtinstall(int, int (*)(Fmt*)); | ||
| 212 | extern int dofmt(Fmt*, char*); | ||
| 213 | extern int dorfmt(Fmt*, Rune*); | ||
| 214 | extern int fmtprint(Fmt*, char*, ...); | ||
| 215 | extern int fmtvprint(Fmt*, char*, va_list); | ||
| 216 | extern int fmtrune(Fmt*, int); | ||
| 217 | extern int fmtstrcpy(Fmt*, char*); | ||
| 218 | extern int fmtrunestrcpy(Fmt*, Rune*); | ||
| 219 | /* | ||
| 220 | * error string for %r | ||
| 221 | * supplied on per os basis, not part of fmt library | ||
| 222 | */ | ||
| 223 | extern int errfmt(Fmt *f); | ||
| 224 | |||
| 225 | /* | ||
| 226 | * quoted strings | ||
| 227 | */ | ||
| 228 | extern char *unquotestrdup(char*); | ||
| 229 | extern Rune *unquoterunestrdup(Rune*); | ||
| 230 | extern char *quotestrdup(char*); | ||
| 231 | extern Rune *quoterunestrdup(Rune*); | ||
| 232 | extern int quotestrfmt(Fmt*); | ||
| 233 | extern int quoterunestrfmt(Fmt*); | ||
| 234 | extern void quotefmtinstall(void); | ||
| 235 | extern int (*doquote)(int); | ||
| 236 | |||
| 237 | /* | ||
| 238 | * random number | ||
| 239 | */ | ||
| 240 | extern void srand(long); | ||
| 241 | extern int rand(void); | ||
| 242 | extern int nrand(int); | ||
| 243 | extern long lrand(void); | ||
| 244 | extern long lnrand(long); | ||
| 245 | extern double frand(void); | ||
| 246 | extern ulong truerand(void); | ||
| 247 | extern ulong ntruerand(ulong); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * math | ||
| 251 | */ | ||
| 252 | extern ulong getfcr(void); | ||
| 253 | extern void setfsr(ulong); | ||
| 254 | extern ulong getfsr(void); | ||
| 255 | extern void setfcr(ulong); | ||
| 256 | extern double NaN(void); | ||
| 257 | extern double Inf(int); | ||
| 258 | extern int isNaN(double); | ||
| 259 | extern int isInf(double, int); | ||
| 260 | |||
| 261 | extern double pow(double, double); | ||
| 262 | extern double atan2(double, double); | ||
| 263 | extern double fabs(double); | ||
| 264 | extern double atan(double); | ||
| 265 | extern double log(double); | ||
| 266 | extern double log10(double); | ||
| 267 | extern double exp(double); | ||
| 268 | extern double floor(double); | ||
| 269 | extern double ceil(double); | ||
| 270 | extern double hypot(double, double); | ||
| 271 | extern double sin(double); | ||
| 272 | extern double cos(double); | ||
| 273 | extern double tan(double); | ||
| 274 | extern double asin(double); | ||
| 275 | extern double acos(double); | ||
| 276 | extern double sinh(double); | ||
| 277 | extern double cosh(double); | ||
| 278 | extern double tanh(double); | ||
| 279 | extern double sqrt(double); | ||
| 280 | extern double fmod(double, double); | ||
| 281 | |||
| 282 | #define HUGE 3.4028234e38 | ||
| 283 | #define PIO2 1.570796326794896619231e0 | ||
| 284 | #define PI (PIO2+PIO2) | ||
| 285 | |||
| 286 | /* | ||
| 287 | * Time-of-day | ||
| 288 | */ | ||
| 289 | |||
| 290 | typedef | ||
| 291 | struct Tm | ||
| 292 | { | ||
| 293 | int sec; | ||
| 294 | int min; | ||
| 295 | int hour; | ||
| 296 | int mday; | ||
| 297 | int mon; | ||
| 298 | int year; | ||
| 299 | int wday; | ||
| 300 | int yday; | ||
| 301 | char zone[4]; | ||
| 302 | int tzoff; | ||
| 303 | } Tm; | ||
| 304 | |||
| 305 | extern Tm* gmtime(long); | ||
| 306 | extern Tm* localtime(long); | ||
| 307 | extern char* asctime(Tm*); | ||
| 308 | extern char* ctime(long); | ||
| 309 | extern double cputime(void); | ||
| 310 | extern long times(long*); | ||
| 311 | extern long tm2sec(Tm*); | ||
| 312 | extern vlong nsec(void); | ||
| 313 | |||
| 314 | /* | ||
| 315 | * one-of-a-kind | ||
| 316 | */ | ||
| 317 | enum | ||
| 318 | { | ||
| 319 | PNPROC = 1, | ||
| 320 | PNGROUP = 2, | ||
| 321 | }; | ||
| 322 | |||
| 323 | extern void _assert(char*); | ||
| 324 | extern int abs(int); | ||
| 325 | extern int atexit(void(*)(void)); | ||
| 326 | extern void atexitdont(void(*)(void)); | ||
| 327 | extern int atnotify(int(*)(void*, char*), int); | ||
| 328 | extern double atof(char*); | ||
| 329 | extern int atoi(char*); | ||
| 330 | extern long atol(char*); | ||
| 331 | extern double charstod(int(*)(void*), void*); | ||
| 332 | extern char* cleanname(char*); | ||
| 333 | extern int decrypt(void*, void*, int); | ||
| 334 | extern int encrypt(void*, void*, int); | ||
| 335 | extern int dec64(uchar*, int, char*, int); | ||
| 336 | extern int enc64(char*, int, uchar*, int); | ||
| 337 | extern int dec32(uchar*, int, char*, int); | ||
| 338 | extern int enc32(char*, int, uchar*, int); | ||
| 339 | extern int dec16(uchar*, int, char*, int); | ||
| 340 | extern int enc16(char*, int, uchar*, int); | ||
| 341 | extern int encodefmt(Fmt*); | ||
| 342 | extern void exits(char*); | ||
| 343 | extern double frexp(double, int*); | ||
| 344 | extern ulong getcallerpc(void*); | ||
| 345 | extern char* getenv(char*); | ||
| 346 | extern int getfields(char*, char**, int, int, char*); | ||
| 347 | extern char* getuser(void); | ||
| 348 | extern char* getwd(char*, int); | ||
| 349 | extern int iounit(int); | ||
| 350 | extern long labs(long); | ||
| 351 | extern double ldexp(double, int); | ||
| 352 | extern void longjmp(jmp_buf, int); | ||
| 353 | extern char* mktemp(char*); | ||
| 354 | extern double modf(double, double*); | ||
| 355 | extern int netcrypt(void*, void*); | ||
| 356 | extern void notejmp(void*, jmp_buf, int); | ||
| 357 | extern void perror(char*); | ||
| 358 | extern int postnote(int, int, char *); | ||
| 359 | extern double pow10(int); | ||
| 360 | extern double ipow10(int); | ||
| 361 | extern int putenv(char*, char*); | ||
| 362 | extern void qsort(void*, long, long, int (*)(void*, void*)); | ||
| 363 | extern void* sbrk(ulong); | ||
| 364 | extern int setjmp(jmp_buf); | ||
| 365 | extern double strtod(char*, char**); | ||
| 366 | extern long strtol(char*, char**, int); | ||
| 367 | extern ulong strtoul(char*, char**, int); | ||
| 368 | extern vlong strtoll(char*, char**, int); | ||
| 369 | extern uvlong strtoull(char*, char**, int); | ||
| 370 | extern void sysfatal(char*, ...); | ||
| 371 | #pragma varargck argpos sysfatal 1 | ||
| 372 | extern void syslog(int, char*, char*, ...); | ||
| 373 | #pragma varargck argpos syslog 3 | ||
| 374 | extern long time(long*); | ||
| 375 | extern int tolower(int); | ||
| 376 | extern int toupper(int); | ||
| 377 | |||
| 378 | /* | ||
| 379 | * synchronization | ||
| 380 | */ | ||
| 381 | typedef | ||
| 382 | struct Lock { | ||
| 383 | int val; | ||
| 384 | } Lock; | ||
| 385 | |||
| 386 | extern int _tas(int*); | ||
| 387 | |||
| 388 | extern void lock(Lock*); | ||
| 389 | extern void unlock(Lock*); | ||
| 390 | extern int canlock(Lock*); | ||
| 391 | |||
| 392 | typedef struct QLp QLp; | ||
| 393 | struct QLp | ||
| 394 | { | ||
| 395 | int inuse; | ||
| 396 | QLp *next; | ||
| 397 | char state; | ||
| 398 | }; | ||
| 399 | |||
| 400 | typedef | ||
| 401 | struct QLock | ||
| 402 | { | ||
| 403 | Lock lock; | ||
| 404 | int locked; | ||
| 405 | QLp *head; | ||
| 406 | QLp *tail; | ||
| 407 | } QLock; | ||
| 408 | |||
| 409 | extern void qlock(QLock*); | ||
| 410 | extern void qunlock(QLock*); | ||
| 411 | extern int canqlock(QLock*); | ||
| 412 | extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ | ||
| 413 | |||
| 414 | typedef | ||
| 415 | struct RWLock | ||
| 416 | { | ||
| 417 | Lock lock; | ||
| 418 | int readers; /* number of readers */ | ||
| 419 | int writer; /* number of writers */ | ||
| 420 | QLp *head; /* list of waiting processes */ | ||
| 421 | QLp *tail; | ||
| 422 | } RWLock; | ||
| 423 | |||
| 424 | extern int canrlock(RWLock*); | ||
| 425 | extern int canwlock(RWLock*); | ||
| 426 | extern void rlock(RWLock*); | ||
| 427 | extern void runlock(RWLock*); | ||
| 428 | extern void wlock(RWLock*); | ||
| 429 | extern void wunlock(RWLock*); | ||
| 430 | |||
| 431 | extern void** privalloc(void); | ||
| 432 | extern void privfree(void**); | ||
| 433 | |||
| 434 | /* | ||
| 435 | * network dialing | ||
| 436 | */ | ||
| 437 | #define NETPATHLEN 40 | ||
| 438 | extern int accept(int, char*); | ||
| 439 | extern int announce(char*, char*); | ||
| 440 | extern int dial(char*, char*, char*, int*); | ||
| 441 | extern void setnetmtpt(char*, int, char*); | ||
| 442 | extern int hangup(int); | ||
| 443 | extern int listen(char*, char*); | ||
| 444 | extern char* netmkaddr(char*, char*, char*); | ||
| 445 | extern int reject(int, char*, char*); | ||
| 446 | |||
| 447 | /* | ||
| 448 | * system calls | ||
| 449 | * | ||
| 450 | */ | ||
| 451 | #define STATMAX 65535U /* max length of machine-independent stat structure */ | ||
| 452 | #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ | ||
| 453 | #define ERRMAX 128 /* max length of error string */ | ||
| 454 | |||
| 455 | #define MORDER 0x0003 /* mask for bits defining order of mounting */ | ||
| 456 | #define MREPL 0x0000 /* mount replaces object */ | ||
| 457 | #define MBEFORE 0x0001 /* mount goes before others in union directory */ | ||
| 458 | #define MAFTER 0x0002 /* mount goes after others in union directory */ | ||
| 459 | #define MCREATE 0x0004 /* permit creation in mounted directory */ | ||
| 460 | #define MCACHE 0x0010 /* cache some data */ | ||
| 461 | #define MMASK 0x0017 /* all bits on */ | ||
| 462 | |||
| 463 | #define OREAD 0 /* open for read */ | ||
| 464 | #define OWRITE 1 /* write */ | ||
| 465 | #define ORDWR 2 /* read and write */ | ||
| 466 | #define OEXEC 3 /* execute, == read but check execute permission */ | ||
| 467 | #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ | ||
| 468 | #define OCEXEC 32 /* or'ed in, close on exec */ | ||
| 469 | #define ORCLOSE 64 /* or'ed in, remove on close */ | ||
| 470 | #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ | ||
| 471 | |||
| 472 | #define AEXIST 0 /* accessible: exists */ | ||
| 473 | #define AEXEC 1 /* execute access */ | ||
| 474 | #define AWRITE 2 /* write access */ | ||
| 475 | #define AREAD 4 /* read access */ | ||
| 476 | |||
| 477 | |||
| 478 | /* Segattch */ | ||
| 479 | #define SG_RONLY 0040 /* read only */ | ||
| 480 | #define SG_CEXEC 0100 /* detach on exec */ | ||
| 481 | |||
| 482 | #define NCONT 0 /* continue after note */ | ||
| 483 | #define NDFLT 1 /* terminate after note */ | ||
| 484 | #define NSAVE 2 /* clear note but hold state */ | ||
| 485 | #define NRSTR 3 /* restore saved state */ | ||
| 486 | |||
| 487 | /* rfork */ | ||
| 488 | enum | ||
| 489 | { | ||
| 490 | RFNAMEG = (1<<0), | ||
| 491 | RFENVG = (1<<1), | ||
| 492 | RFFDG = (1<<2), | ||
| 493 | RFNOTEG = (1<<3), | ||
| 494 | RFPROC = (1<<4), | ||
| 495 | RFMEM = (1<<5), | ||
| 496 | RFNOWAIT = (1<<6), | ||
| 497 | RFCNAMEG = (1<<10), | ||
| 498 | RFCENVG = (1<<11), | ||
| 499 | RFCFDG = (1<<12), | ||
| 500 | RFREND = (1<<13), | ||
| 501 | RFNOMNT = (1<<14) | ||
| 502 | }; | ||
| 503 | |||
| 504 | /* bits in Qid.type */ | ||
| 505 | #define QTDIR 0x80 /* type bit for directories */ | ||
| 506 | #define QTAPPEND 0x40 /* type bit for append only files */ | ||
| 507 | #define QTEXCL 0x20 /* type bit for exclusive use files */ | ||
| 508 | #define QTMOUNT 0x10 /* type bit for mounted channel */ | ||
| 509 | #define QTAUTH 0x08 /* type bit for authentication file */ | ||
| 510 | #define QTFILE 0x00 /* plain file */ | ||
| 511 | |||
| 512 | /* bits in Dir.mode */ | ||
| 513 | #define DMDIR 0x80000000 /* mode bit for directories */ | ||
| 514 | #define DMAPPEND 0x40000000 /* mode bit for append only files */ | ||
| 515 | #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ | ||
| 516 | #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ | ||
| 517 | #define DMAUTH 0x08000000 /* mode bit for authentication file */ | ||
| 518 | #define DMREAD 0x4 /* mode bit for read permission */ | ||
| 519 | #define DMWRITE 0x2 /* mode bit for write permission */ | ||
| 520 | #define DMEXEC 0x1 /* mode bit for execute permission */ | ||
| 521 | |||
| 522 | typedef | ||
| 523 | struct Qid | ||
| 524 | { | ||
| 525 | uvlong path; | ||
| 526 | ulong vers; | ||
| 527 | uchar type; | ||
| 528 | } Qid; | ||
| 529 | |||
| 530 | typedef | ||
| 531 | struct Dir { | ||
| 532 | /* system-modified data */ | ||
| 533 | ushort type; /* server type */ | ||
| 534 | uint dev; /* server subtype */ | ||
| 535 | /* file data */ | ||
| 536 | Qid qid; /* unique id from server */ | ||
| 537 | ulong mode; /* permissions */ | ||
| 538 | ulong atime; /* last read time */ | ||
| 539 | ulong mtime; /* last write time */ | ||
| 540 | vlong length; /* file length */ | ||
| 541 | char *name; /* last element of path */ | ||
| 542 | char *uid; /* owner name */ | ||
| 543 | char *gid; /* group name */ | ||
| 544 | char *muid; /* last modifier name */ | ||
| 545 | } Dir; | ||
| 546 | |||
| 547 | extern Dir* dirstat(char*); | ||
| 548 | extern Dir* dirfstat(int); | ||
| 549 | extern int dirwstat(char*, Dir*); | ||
| 550 | extern int dirfwstat(int, Dir*); | ||
| 551 | extern long dirread(int, Dir**); | ||
| 552 | extern void nulldir(Dir*); | ||
| 553 | extern long dirreadall(int, Dir**); | ||
| 554 | |||
| 555 | typedef | ||
| 556 | struct Waitmsg | ||
| 557 | { | ||
| 558 | int pid; /* of loved one */ | ||
| 559 | ulong time[3]; /* of loved one & descendants */ | ||
| 560 | char *msg; | ||
| 561 | } Waitmsg; | ||
| 562 | |||
| 563 | typedef | ||
| 564 | struct IOchunk | ||
| 565 | { | ||
| 566 | void *addr; | ||
| 567 | ulong len; | ||
| 568 | } IOchunk; | ||
| 569 | |||
| 570 | extern void _exits(char*); | ||
| 571 | |||
| 572 | extern void abort(void); | ||
| 573 | extern int access(char*, int); | ||
| 574 | extern long alarm(ulong); | ||
| 575 | extern int await(char*, int); | ||
| 576 | extern int bind(char*, char*, int); | ||
| 577 | extern int brk(void*); | ||
| 578 | extern int chdir(char*); | ||
| 579 | extern int close(int); | ||
| 580 | extern int create(char*, int, ulong); | ||
| 581 | extern int dup(int, int); | ||
| 582 | extern int errstr(char*, uint); | ||
| 583 | extern int exec(char*, char*[]); | ||
| 584 | extern int execl(char*, ...); | ||
| 585 | extern int fork(void); | ||
| 586 | extern int rfork(int); | ||
| 587 | extern int fauth(int, char*); | ||
| 588 | extern int fstat(int, uchar*, int); | ||
| 589 | extern int fwstat(int, uchar*, int); | ||
| 590 | extern int fversion(int, int, char*, int); | ||
| 591 | extern int mount(int, int, char*, int, char*); | ||
| 592 | extern int unmount(char*, char*); | ||
| 593 | extern int noted(int); | ||
| 594 | extern int notify(void(*)(void*, char*)); | ||
| 595 | extern int open(char*, int); | ||
| 596 | extern int fd2path(int, char*, int); | ||
| 597 | extern int pipe(int*); | ||
| 598 | extern long pread(int, void*, long, vlong); | ||
| 599 | extern long preadv(int, IOchunk*, int, vlong); | ||
| 600 | extern long pwrite(int, void*, long, vlong); | ||
| 601 | extern long pwritev(int, IOchunk*, int, vlong); | ||
| 602 | extern long read(int, void*, long); | ||
| 603 | extern long readn(int, void*, long); | ||
| 604 | extern long readv(int, IOchunk*, int); | ||
| 605 | extern int remove(char*); | ||
| 606 | extern void* sbrk(ulong); | ||
| 607 | extern long oseek(int, long, int); | ||
| 608 | extern vlong seek(int, vlong, int); | ||
| 609 | extern long segattach(int, char*, void*, ulong); | ||
| 610 | extern int segbrk(void*, void*); | ||
| 611 | extern int segdetach(void*); | ||
| 612 | extern int segflush(void*, ulong); | ||
| 613 | extern int segfree(void*, ulong); | ||
| 614 | extern int sleep(long); | ||
| 615 | extern int stat(char*, uchar*, int); | ||
| 616 | extern Waitmsg* wait(void); | ||
| 617 | extern int waitpid(void); | ||
| 618 | extern long write(int, void*, long); | ||
| 619 | extern long writev(int, IOchunk*, int); | ||
| 620 | extern int wstat(char*, uchar*, int); | ||
| 621 | extern void* rendezvous(void*, void*); | ||
| 622 | |||
| 623 | extern int getpid(void); | ||
| 624 | extern int getppid(void); | ||
| 625 | extern void rerrstr(char*, uint); | ||
| 626 | extern char* sysname(void); | ||
| 627 | extern void werrstr(char*, ...); | ||
| 628 | #pragma varargck argpos werrstr 1 | ||
| 629 | |||
| 630 | extern char *argv0; | ||
| 631 | #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ | ||
| 632 | argv[0] && argv[0][0]=='-' && argv[0][1];\ | ||
| 633 | argc--, argv++) {\ | ||
| 634 | char *_args, *_argt;\ | ||
| 635 | Rune _argc;\ | ||
| 636 | _args = &argv[0][1];\ | ||
| 637 | if(_args[0]=='-' && _args[1]==0){\ | ||
| 638 | argc--; argv++; break;\ | ||
| 639 | }\ | ||
| 640 | _argc = 0;\ | ||
| 641 | while(*_args && (_args += chartorune(&_argc, _args)))\ | ||
| 642 | switch(_argc) | ||
| 643 | #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); | ||
| 644 | #define ARGF() (_argt=_args, _args="",\ | ||
| 645 | (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) | ||
| 646 | #define EARGF(x) (_argt=_args, _args="",\ | ||
| 647 | (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) | ||
| 648 | |||
| 649 | #define ARGC() _argc | ||
| 650 | |||
| 651 | |||
| 652 | /* | ||
| 653 | * Extensions for Inferno to basic libc.h | ||
| 654 | */ | ||
| 655 | |||
| 656 | #define setbinmode() | ||
| 657 | #define __LITTLE_ENDIAN | ||
| 658 | |||
| 659 | /* | ||
| 660 | * Extensions for emu kernel emulation | ||
| 661 | */ | ||
| 662 | #ifdef EMU | ||
| 663 | |||
| 664 | extern Proc** Xup; | ||
| 665 | #define up (*Xup) | ||
| 666 | |||
| 667 | typedef struct FPU FPU; | ||
| 668 | |||
| 669 | /* | ||
| 670 | * This structure must agree with FPsave and FPrestore asm routines | ||
| 671 | */ | ||
| 672 | struct FPU | ||
| 673 | { | ||
| 674 | uchar env[28]; | ||
| 675 | }; | ||
| 676 | |||
| 677 | typedef jmp_buf osjmpbuf; | ||
| 678 | #define ossetjmp(buf) setjmp(buf) | ||
| 679 | |||
| 680 | #endif | ||
| @@ -0,0 +1,64 @@ | |||
| 1 | #define nil ((void*)0) | ||
| 2 | typedef unsigned short ushort; | ||
| 3 | typedef unsigned char uchar; | ||
| 4 | typedef unsigned long ulong; | ||
| 5 | typedef unsigned int uint; | ||
| 6 | typedef signed char schar; | ||
| 7 | typedef long long vlong; | ||
| 8 | typedef unsigned long long uvlong; | ||
| 9 | typedef unsigned long uintptr; | ||
| 10 | typedef ushort Rune; | ||
| 11 | typedef union FPdbleword FPdbleword; | ||
| 12 | typedef long jmp_buf[2]; | ||
| 13 | #define JMPBUFSP 0 | ||
| 14 | #define JMPBUFPC 1 | ||
| 15 | #define JMPBUFDPC 0 | ||
| 16 | typedef unsigned int mpdigit; /* for /sys/include/mp.h */ | ||
| 17 | typedef unsigned char u8int; | ||
| 18 | typedef unsigned short u16int; | ||
| 19 | typedef unsigned int u32int; | ||
| 20 | typedef unsigned long long u64int; | ||
| 21 | |||
| 22 | /* FCR */ | ||
| 23 | #define FPINEX (1<<5) | ||
| 24 | #define FPUNFL ((1<<4)|(1<<1)) | ||
| 25 | #define FPOVFL (1<<3) | ||
| 26 | #define FPZDIV (1<<2) | ||
| 27 | #define FPINVAL (1<<0) | ||
| 28 | #define FPRNR (0<<10) | ||
| 29 | #define FPRZ (3<<10) | ||
| 30 | #define FPRPINF (2<<10) | ||
| 31 | #define FPRNINF (1<<10) | ||
| 32 | #define FPRMASK (3<<10) | ||
| 33 | #define FPPEXT (3<<8) | ||
| 34 | #define FPPSGL (0<<8) | ||
| 35 | #define FPPDBL (2<<8) | ||
| 36 | #define FPPMASK (3<<8) | ||
| 37 | /* FSR */ | ||
| 38 | #define FPAINEX FPINEX | ||
| 39 | #define FPAOVFL FPOVFL | ||
| 40 | #define FPAUNFL FPUNFL | ||
| 41 | #define FPAZDIV FPZDIV | ||
| 42 | #define FPAINVAL FPINVAL | ||
| 43 | union FPdbleword | ||
| 44 | { | ||
| 45 | double x; | ||
| 46 | struct { /* little endian */ | ||
| 47 | ulong lo; | ||
| 48 | ulong hi; | ||
| 49 | }; | ||
| 50 | }; | ||
| 51 | |||
| 52 | typedef char* va_list; | ||
| 53 | #define va_start(list, start) list =\ | ||
| 54 | (sizeof(start) < 4?\ | ||
| 55 | (char*)((int*)&(start)+1):\ | ||
| 56 | (char*)(&(start)+1)) | ||
| 57 | #define va_end(list)\ | ||
| 58 | USED(list) | ||
| 59 | #define va_arg(list, mode)\ | ||
| 60 | ((sizeof(mode) == 1)?\ | ||
| 61 | ((mode*)(list += 4))[-4]:\ | ||
| 62 | (sizeof(mode) == 2)?\ | ||
| 63 | ((mode*)(list += 4))[-2]:\ | ||
| 64 | ((mode*)(list += sizeof(mode)))[-1]) | ||
| @@ -0,0 +1,680 @@ | |||
| 1 | #include <u.h> | ||
| 2 | typedef unsigned long size_t; | ||
| 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* memccpy(void*, void*, int, ulong); | ||
| 12 | extern void* memset(void*, int, ulong); | ||
| 13 | extern int memcmp(void*, void*, ulong); | ||
| 14 | extern void* memcpy(void*, void*, ulong); | ||
| 15 | extern void* memmove(void*, void*, ulong); | ||
| 16 | extern void* memchr(void*, int, ulong); | ||
| 17 | |||
| 18 | /* | ||
| 19 | * string routines | ||
| 20 | */ | ||
| 21 | extern char* strcat(char*, char*); | ||
| 22 | extern char* strchr(char*, int); | ||
| 23 | extern int strcmp(char*, char*); | ||
| 24 | extern char* strcpy(char*, char*); | ||
| 25 | extern char* strecpy(char*, char*, char*); | ||
| 26 | extern char* strdup(char*); | ||
| 27 | extern char* strncat(char*, char*, long); | ||
| 28 | extern char* strncpy(char*, char*, long); | ||
| 29 | extern int strncmp(char*, char*, long); | ||
| 30 | extern char* strpbrk(char*, char*); | ||
| 31 | extern char* strrchr(char*, int); | ||
| 32 | extern char* strtok(char*, char*); | ||
| 33 | extern long strlen(char*); | ||
| 34 | extern long strspn(char*, char*); | ||
| 35 | extern long strcspn(char*, char*); | ||
| 36 | extern char* strstr(char*, char*); | ||
| 37 | extern int cistrncmp(char*, char*, int); | ||
| 38 | extern int cistrcmp(char*, char*); | ||
| 39 | extern char* cistrstr(char*, char*); | ||
| 40 | extern int tokenize(char*, char**, int); | ||
| 41 | |||
| 42 | enum | ||
| 43 | { | ||
| 44 | UTFmax = 3, /* maximum bytes per rune */ | ||
| 45 | Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ | ||
| 46 | Runeself = 0x80, /* rune and UTF sequences are the same (<) */ | ||
| 47 | Runeerror = 0x80, /* decoding error in UTF */ | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* | ||
| 51 | * rune routines | ||
| 52 | */ | ||
| 53 | extern int runetochar(char*, Rune*); | ||
| 54 | extern int chartorune(Rune*, char*); | ||
| 55 | extern int runelen(long); | ||
| 56 | extern int runenlen(Rune*, int); | ||
| 57 | extern int fullrune(char*, int); | ||
| 58 | extern int utflen(char*); | ||
| 59 | extern int utfnlen(char*, long); | ||
| 60 | extern char* utfrune(char*, long); | ||
| 61 | extern char* utfrrune(char*, long); | ||
| 62 | extern char* utfutf(char*, char*); | ||
| 63 | extern char* utfecpy(char*, char*, char*); | ||
| 64 | |||
| 65 | extern Rune* runestrcat(Rune*, Rune*); | ||
| 66 | extern Rune* runestrchr(Rune*, Rune); | ||
| 67 | extern int runestrcmp(Rune*, Rune*); | ||
| 68 | extern Rune* runestrcpy(Rune*, Rune*); | ||
| 69 | extern Rune* runestrncpy(Rune*, Rune*, long); | ||
| 70 | extern Rune* runestrecpy(Rune*, Rune*, Rune*); | ||
| 71 | extern Rune* runestrdup(Rune*); | ||
| 72 | extern Rune* runestrncat(Rune*, Rune*, long); | ||
| 73 | extern int runestrncmp(Rune*, Rune*, long); | ||
| 74 | extern Rune* runestrrchr(Rune*, Rune); | ||
| 75 | extern long runestrlen(Rune*); | ||
| 76 | extern Rune* runestrstr(Rune*, Rune*); | ||
| 77 | |||
| 78 | extern Rune tolowerrune(Rune); | ||
| 79 | extern Rune totitlerune(Rune); | ||
| 80 | extern Rune toupperrune(Rune); | ||
| 81 | extern int isalpharune(Rune); | ||
| 82 | extern int islowerrune(Rune); | ||
| 83 | extern int isspacerune(Rune); | ||
| 84 | extern int istitlerune(Rune); | ||
| 85 | extern int isupperrune(Rune); | ||
| 86 | |||
| 87 | /* | ||
| 88 | * malloc | ||
| 89 | */ | ||
| 90 | extern void* malloc(ulong); | ||
| 91 | extern void* mallocz(ulong, int); | ||
| 92 | extern void free(void*); | ||
| 93 | extern ulong msize(void*); | ||
| 94 | extern void* calloc(ulong, ulong); | ||
| 95 | extern void* realloc(void*, ulong); | ||
| 96 | extern void setmalloctag(void*, ulong); | ||
| 97 | extern void setrealloctag(void*, ulong); | ||
| 98 | extern ulong getmalloctag(void*); | ||
| 99 | extern ulong getrealloctag(void*); | ||
| 100 | extern void* malloctopoolblock(void*); | ||
| 101 | |||
| 102 | /* | ||
| 103 | * print routines | ||
| 104 | */ | ||
| 105 | typedef struct Fmt Fmt; | ||
| 106 | struct Fmt{ | ||
| 107 | uchar runes; /* output buffer is runes or chars? */ | ||
| 108 | void *start; /* of buffer */ | ||
| 109 | void *to; /* current place in the buffer */ | ||
| 110 | void *stop; /* end of the buffer; overwritten if flush fails */ | ||
| 111 | int (*flush)(Fmt *); /* called when to == stop */ | ||
| 112 | void *farg; /* to make flush a closure */ | ||
| 113 | int nfmt; /* num chars formatted so far */ | ||
| 114 | va_list args; /* args passed to dofmt */ | ||
| 115 | int r; /* % format Rune */ | ||
| 116 | int width; | ||
| 117 | int prec; | ||
| 118 | ulong flags; | ||
| 119 | }; | ||
| 120 | |||
| 121 | enum{ | ||
| 122 | FmtWidth = 1, | ||
| 123 | FmtLeft = FmtWidth << 1, | ||
| 124 | FmtPrec = FmtLeft << 1, | ||
| 125 | FmtSharp = FmtPrec << 1, | ||
| 126 | FmtSpace = FmtSharp << 1, | ||
| 127 | FmtSign = FmtSpace << 1, | ||
| 128 | FmtZero = FmtSign << 1, | ||
| 129 | FmtUnsigned = FmtZero << 1, | ||
| 130 | FmtShort = FmtUnsigned << 1, | ||
| 131 | FmtLong = FmtShort << 1, | ||
| 132 | FmtVLong = FmtLong << 1, | ||
| 133 | FmtComma = FmtVLong << 1, | ||
| 134 | FmtByte = FmtComma << 1, | ||
| 135 | |||
| 136 | FmtFlag = FmtByte << 1 | ||
| 137 | }; | ||
| 138 | |||
| 139 | extern int print(char*, ...); | ||
| 140 | extern char* seprint(char*, char*, char*, ...); | ||
| 141 | extern char* vseprint(char*, char*, char*, va_list); | ||
| 142 | extern int snprint(char*, int, char*, ...); | ||
| 143 | extern int vsnprint(char*, int, char*, va_list); | ||
| 144 | extern char* smprint(char*, ...); | ||
| 145 | extern char* vsmprint(char*, va_list); | ||
| 146 | extern int sprint(char*, char*, ...); | ||
| 147 | extern int fprint(int, char*, ...); | ||
| 148 | extern int vfprint(int, char*, va_list); | ||
| 149 | |||
| 150 | extern int runesprint(Rune*, char*, ...); | ||
| 151 | extern int runesnprint(Rune*, int, char*, ...); | ||
| 152 | extern int runevsnprint(Rune*, int, char*, va_list); | ||
| 153 | extern Rune* runeseprint(Rune*, Rune*, char*, ...); | ||
| 154 | extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | ||
| 155 | extern Rune* runesmprint(char*, ...); | ||
| 156 | extern Rune* runevsmprint(char*, va_list); | ||
| 157 | |||
| 158 | extern int fmtfdinit(Fmt*, int, char*, int); | ||
| 159 | extern int fmtfdflush(Fmt*); | ||
| 160 | extern int fmtstrinit(Fmt*); | ||
| 161 | extern char* fmtstrflush(Fmt*); | ||
| 162 | extern int runefmtstrinit(Fmt*); | ||
| 163 | extern Rune* runefmtstrflush(Fmt*); | ||
| 164 | |||
| 165 | #pragma varargck argpos fmtprint 2 | ||
| 166 | #pragma varargck argpos fprint 2 | ||
| 167 | #pragma varargck argpos print 1 | ||
| 168 | #pragma varargck argpos runeseprint 3 | ||
| 169 | #pragma varargck argpos runesmprint 1 | ||
| 170 | #pragma varargck argpos runesnprint 3 | ||
| 171 | #pragma varargck argpos runesprint 2 | ||
| 172 | #pragma varargck argpos seprint 3 | ||
| 173 | #pragma varargck argpos smprint 1 | ||
| 174 | #pragma varargck argpos snprint 3 | ||
| 175 | #pragma varargck argpos sprint 2 | ||
| 176 | #pragma varargck argpos vseprint 3 | ||
| 177 | #pragma varargck argpos vsnprint 3 | ||
| 178 | |||
| 179 | #pragma varargck type "lld" vlong | ||
| 180 | #pragma varargck type "llx" vlong | ||
| 181 | #pragma varargck type "lld" uvlong | ||
| 182 | #pragma varargck type "llx" uvlong | ||
| 183 | #pragma varargck type "ld" long | ||
| 184 | #pragma varargck type "lx" long | ||
| 185 | #pragma varargck type "ld" ulong | ||
| 186 | #pragma varargck type "lx" ulong | ||
| 187 | #pragma varargck type "d" int | ||
| 188 | #pragma varargck type "x" int | ||
| 189 | #pragma varargck type "c" int | ||
| 190 | #pragma varargck type "C" int | ||
| 191 | #pragma varargck type "d" uint | ||
| 192 | #pragma varargck type "x" uint | ||
| 193 | #pragma varargck type "c" uint | ||
| 194 | #pragma varargck type "C" uint | ||
| 195 | #pragma varargck type "f" double | ||
| 196 | #pragma varargck type "e" double | ||
| 197 | #pragma varargck type "g" double | ||
| 198 | #pragma varargck type "s" char* | ||
| 199 | #pragma varargck type "q" char* | ||
| 200 | #pragma varargck type "S" Rune* | ||
| 201 | #pragma varargck type "Q" Rune* | ||
| 202 | #pragma varargck type "r" void | ||
| 203 | #pragma varargck type "%" void | ||
| 204 | #pragma varargck type "n" int* | ||
| 205 | #pragma varargck type "p" void* | ||
| 206 | #pragma varargck flag ',' | ||
| 207 | #pragma varargck type "<" void* | ||
| 208 | #pragma varargck type "[" void* | ||
| 209 | #pragma varargck type "H" void* | ||
| 210 | |||
| 211 | extern int fmtinstall(int, int (*)(Fmt*)); | ||
| 212 | extern int dofmt(Fmt*, char*); | ||
| 213 | extern int dorfmt(Fmt*, Rune*); | ||
| 214 | extern int fmtprint(Fmt*, char*, ...); | ||
| 215 | extern int fmtvprint(Fmt*, char*, va_list); | ||
| 216 | extern int fmtrune(Fmt*, int); | ||
| 217 | extern int fmtstrcpy(Fmt*, char*); | ||
| 218 | extern int fmtrunestrcpy(Fmt*, Rune*); | ||
| 219 | /* | ||
| 220 | * error string for %r | ||
| 221 | * supplied on per os basis, not part of fmt library | ||
| 222 | */ | ||
| 223 | extern int errfmt(Fmt *f); | ||
| 224 | |||
| 225 | /* | ||
| 226 | * quoted strings | ||
| 227 | */ | ||
| 228 | extern char *unquotestrdup(char*); | ||
| 229 | extern Rune *unquoterunestrdup(Rune*); | ||
| 230 | extern char *quotestrdup(char*); | ||
| 231 | extern Rune *quoterunestrdup(Rune*); | ||
| 232 | extern int quotestrfmt(Fmt*); | ||
| 233 | extern int quoterunestrfmt(Fmt*); | ||
| 234 | extern void quotefmtinstall(void); | ||
| 235 | extern int (*doquote)(int); | ||
| 236 | |||
| 237 | /* | ||
| 238 | * random number | ||
| 239 | */ | ||
| 240 | extern void srand(long); | ||
| 241 | extern int rand(void); | ||
| 242 | extern int nrand(int); | ||
| 243 | extern long lrand(void); | ||
| 244 | extern long lnrand(long); | ||
| 245 | extern double frand(void); | ||
| 246 | extern ulong truerand(void); | ||
| 247 | extern ulong ntruerand(ulong); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * math | ||
| 251 | */ | ||
| 252 | extern ulong getfcr(void); | ||
| 253 | extern void setfsr(ulong); | ||
| 254 | extern ulong getfsr(void); | ||
| 255 | extern void setfcr(ulong); | ||
| 256 | extern double NaN(void); | ||
| 257 | extern double Inf(int); | ||
| 258 | extern int isNaN(double); | ||
| 259 | extern int isInf(double, int); | ||
| 260 | |||
| 261 | extern double pow(double, double); | ||
| 262 | extern double atan2(double, double); | ||
| 263 | extern double fabs(double); | ||
| 264 | extern double atan(double); | ||
| 265 | extern double log(double); | ||
| 266 | extern double log10(double); | ||
| 267 | extern double exp(double); | ||
| 268 | extern double floor(double); | ||
| 269 | extern double ceil(double); | ||
| 270 | extern double hypot(double, double); | ||
| 271 | extern double sin(double); | ||
| 272 | extern double cos(double); | ||
| 273 | extern double tan(double); | ||
| 274 | extern double asin(double); | ||
| 275 | extern double acos(double); | ||
| 276 | extern double sinh(double); | ||
| 277 | extern double cosh(double); | ||
| 278 | extern double tanh(double); | ||
| 279 | extern double sqrt(double); | ||
| 280 | extern double fmod(double, double); | ||
| 281 | |||
| 282 | #define HUGE 3.4028234e38 | ||
| 283 | #define PIO2 1.570796326794896619231e0 | ||
| 284 | #define PI (PIO2+PIO2) | ||
| 285 | |||
| 286 | /* | ||
| 287 | * Time-of-day | ||
| 288 | */ | ||
| 289 | |||
| 290 | typedef | ||
| 291 | struct Tm | ||
| 292 | { | ||
| 293 | int sec; | ||
| 294 | int min; | ||
| 295 | int hour; | ||
| 296 | int mday; | ||
| 297 | int mon; | ||
| 298 | int year; | ||
| 299 | int wday; | ||
| 300 | int yday; | ||
| 301 | char zone[4]; | ||
| 302 | int tzoff; | ||
| 303 | } Tm; | ||
| 304 | |||
| 305 | extern Tm* gmtime(long); | ||
| 306 | extern Tm* localtime(long); | ||
| 307 | extern char* asctime(Tm*); | ||
| 308 | extern char* ctime(long); | ||
| 309 | extern double cputime(void); | ||
| 310 | extern long times(long*); | ||
| 311 | extern long tm2sec(Tm*); | ||
| 312 | extern vlong nsec(void); | ||
| 313 | |||
| 314 | /* | ||
| 315 | * one-of-a-kind | ||
| 316 | */ | ||
| 317 | enum | ||
| 318 | { | ||
| 319 | PNPROC = 1, | ||
| 320 | PNGROUP = 2, | ||
| 321 | }; | ||
| 322 | |||
| 323 | extern void _assert(char*); | ||
| 324 | extern int abs(int); | ||
| 325 | extern int atexit(void(*)(void)); | ||
| 326 | extern void atexitdont(void(*)(void)); | ||
| 327 | extern int atnotify(int(*)(void*, char*), int); | ||
| 328 | extern double atof(char*); | ||
| 329 | extern int atoi(char*); | ||
| 330 | extern long atol(char*); | ||
| 331 | extern double charstod(int(*)(void*), void*); | ||
| 332 | extern char* cleanname(char*); | ||
| 333 | extern int decrypt(void*, void*, int); | ||
| 334 | extern int encrypt(void*, void*, int); | ||
| 335 | extern int dec64(uchar*, int, char*, int); | ||
| 336 | extern int enc64(char*, int, uchar*, int); | ||
| 337 | extern int dec32(uchar*, int, char*, int); | ||
| 338 | extern int enc32(char*, int, uchar*, int); | ||
| 339 | extern int dec16(uchar*, int, char*, int); | ||
| 340 | extern int enc16(char*, int, uchar*, int); | ||
| 341 | extern int encodefmt(Fmt*); | ||
| 342 | extern void exits(char*); | ||
| 343 | extern double frexp(double, int*); | ||
| 344 | extern ulong getcallerpc(void*); | ||
| 345 | extern char* getenv(char*); | ||
| 346 | extern int getfields(char*, char**, int, int, char*); | ||
| 347 | extern char* getuser(void); | ||
| 348 | extern char* getwd(char*, int); | ||
| 349 | extern int iounit(int); | ||
| 350 | extern long labs(long); | ||
| 351 | extern double ldexp(double, int); | ||
| 352 | extern void longjmp(jmp_buf, int); | ||
| 353 | extern char* mktemp(char*); | ||
| 354 | extern double modf(double, double*); | ||
| 355 | extern int netcrypt(void*, void*); | ||
| 356 | extern void notejmp(void*, jmp_buf, int); | ||
| 357 | extern void perror(char*); | ||
| 358 | extern int postnote(int, int, char *); | ||
| 359 | extern double pow10(int); | ||
| 360 | extern double ipow10(int); | ||
| 361 | extern int putenv(char*, char*); | ||
| 362 | extern void qsort(void*, long, long, int (*)(void*, void*)); | ||
| 363 | extern void* sbrk(ulong); | ||
| 364 | extern int setjmp(jmp_buf); | ||
| 365 | extern double strtod(char*, char**); | ||
| 366 | extern long strtol(char*, char**, int); | ||
| 367 | extern ulong strtoul(char*, char**, int); | ||
| 368 | extern vlong strtoll(char*, char**, int); | ||
| 369 | extern uvlong strtoull(char*, char**, int); | ||
| 370 | extern void sysfatal(char*, ...); | ||
| 371 | #pragma varargck argpos sysfatal 1 | ||
| 372 | extern void syslog(int, char*, char*, ...); | ||
| 373 | #pragma varargck argpos syslog 3 | ||
| 374 | extern long time(long*); | ||
| 375 | extern int tolower(int); | ||
| 376 | extern int toupper(int); | ||
| 377 | |||
| 378 | /* | ||
| 379 | * synchronization | ||
| 380 | */ | ||
| 381 | typedef | ||
| 382 | struct Lock { | ||
| 383 | int val; | ||
| 384 | } Lock; | ||
| 385 | |||
| 386 | extern int _tas(int*); | ||
| 387 | |||
| 388 | extern void lock(Lock*); | ||
| 389 | extern void unlock(Lock*); | ||
| 390 | extern int canlock(Lock*); | ||
| 391 | |||
| 392 | typedef struct QLp QLp; | ||
| 393 | struct QLp | ||
| 394 | { | ||
| 395 | int inuse; | ||
| 396 | QLp *next; | ||
| 397 | char state; | ||
| 398 | }; | ||
| 399 | |||
| 400 | typedef | ||
| 401 | struct QLock | ||
| 402 | { | ||
| 403 | Lock lock; | ||
| 404 | int locked; | ||
| 405 | QLp *head; | ||
| 406 | QLp *tail; | ||
| 407 | } QLock; | ||
| 408 | |||
| 409 | extern void qlock(QLock*); | ||
| 410 | extern void qunlock(QLock*); | ||
| 411 | extern int canqlock(QLock*); | ||
| 412 | extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ | ||
| 413 | |||
| 414 | typedef | ||
| 415 | struct RWLock | ||
| 416 | { | ||
| 417 | Lock lock; | ||
| 418 | int readers; /* number of readers */ | ||
| 419 | int writer; /* number of writers */ | ||
| 420 | QLp *head; /* list of waiting processes */ | ||
| 421 | QLp *tail; | ||
| 422 | } RWLock; | ||
| 423 | |||
| 424 | extern int canrlock(RWLock*); | ||
| 425 | extern int canwlock(RWLock*); | ||
| 426 | extern void rlock(RWLock*); | ||
| 427 | extern void runlock(RWLock*); | ||
| 428 | extern void wlock(RWLock*); | ||
| 429 | extern void wunlock(RWLock*); | ||
| 430 | |||
| 431 | extern void** privalloc(void); | ||
| 432 | extern void privfree(void**); | ||
| 433 | |||
| 434 | /* | ||
| 435 | * network dialing | ||
| 436 | */ | ||
| 437 | #define NETPATHLEN 40 | ||
| 438 | extern int accept(int, char*); | ||
| 439 | extern int announce(char*, char*); | ||
| 440 | extern int dial(char*, char*, char*, int*); | ||
| 441 | extern void setnetmtpt(char*, int, char*); | ||
| 442 | extern int hangup(int); | ||
| 443 | extern int listen(char*, char*); | ||
| 444 | extern char* netmkaddr(char*, char*, char*); | ||
| 445 | extern int reject(int, char*, char*); | ||
| 446 | |||
| 447 | /* | ||
| 448 | * system calls | ||
| 449 | * | ||
| 450 | */ | ||
| 451 | #define STATMAX 65535U /* max length of machine-independent stat structure */ | ||
| 452 | #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ | ||
| 453 | #define ERRMAX 128 /* max length of error string */ | ||
| 454 | |||
| 455 | #define MORDER 0x0003 /* mask for bits defining order of mounting */ | ||
| 456 | #define MREPL 0x0000 /* mount replaces object */ | ||
| 457 | #define MBEFORE 0x0001 /* mount goes before others in union directory */ | ||
| 458 | #define MAFTER 0x0002 /* mount goes after others in union directory */ | ||
| 459 | #define MCREATE 0x0004 /* permit creation in mounted directory */ | ||
| 460 | #define MCACHE 0x0010 /* cache some data */ | ||
| 461 | #define MMASK 0x0017 /* all bits on */ | ||
| 462 | |||
| 463 | #define OREAD 0 /* open for read */ | ||
| 464 | #define OWRITE 1 /* write */ | ||
| 465 | #define ORDWR 2 /* read and write */ | ||
| 466 | #define OEXEC 3 /* execute, == read but check execute permission */ | ||
| 467 | #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ | ||
| 468 | #define OCEXEC 32 /* or'ed in, close on exec */ | ||
| 469 | #define ORCLOSE 64 /* or'ed in, remove on close */ | ||
| 470 | #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ | ||
| 471 | |||
| 472 | #define AEXIST 0 /* accessible: exists */ | ||
| 473 | #define AEXEC 1 /* execute access */ | ||
| 474 | #define AWRITE 2 /* write access */ | ||
| 475 | #define AREAD 4 /* read access */ | ||
| 476 | |||
| 477 | |||
| 478 | /* Segattch */ | ||
| 479 | #define SG_RONLY 0040 /* read only */ | ||
| 480 | #define SG_CEXEC 0100 /* detach on exec */ | ||
| 481 | |||
| 482 | #define NCONT 0 /* continue after note */ | ||
| 483 | #define NDFLT 1 /* terminate after note */ | ||
| 484 | #define NSAVE 2 /* clear note but hold state */ | ||
| 485 | #define NRSTR 3 /* restore saved state */ | ||
| 486 | |||
| 487 | /* rfork */ | ||
| 488 | enum | ||
| 489 | { | ||
| 490 | RFNAMEG = (1<<0), | ||
| 491 | RFENVG = (1<<1), | ||
| 492 | RFFDG = (1<<2), | ||
| 493 | RFNOTEG = (1<<3), | ||
| 494 | RFPROC = (1<<4), | ||
| 495 | RFMEM = (1<<5), | ||
| 496 | RFNOWAIT = (1<<6), | ||
| 497 | RFCNAMEG = (1<<10), | ||
| 498 | RFCENVG = (1<<11), | ||
| 499 | RFCFDG = (1<<12), | ||
| 500 | RFREND = (1<<13), | ||
| 501 | RFNOMNT = (1<<14) | ||
| 502 | }; | ||
| 503 | |||
| 504 | /* bits in Qid.type */ | ||
| 505 | #define QTDIR 0x80 /* type bit for directories */ | ||
| 506 | #define QTAPPEND 0x40 /* type bit for append only files */ | ||
| 507 | #define QTEXCL 0x20 /* type bit for exclusive use files */ | ||
| 508 | #define QTMOUNT 0x10 /* type bit for mounted channel */ | ||
| 509 | #define QTAUTH 0x08 /* type bit for authentication file */ | ||
| 510 | #define QTFILE 0x00 /* plain file */ | ||
| 511 | |||
| 512 | /* bits in Dir.mode */ | ||
| 513 | #define DMDIR 0x80000000 /* mode bit for directories */ | ||
| 514 | #define DMAPPEND 0x40000000 /* mode bit for append only files */ | ||
| 515 | #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ | ||
| 516 | #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ | ||
| 517 | #define DMAUTH 0x08000000 /* mode bit for authentication file */ | ||
| 518 | #define DMREAD 0x4 /* mode bit for read permission */ | ||
| 519 | #define DMWRITE 0x2 /* mode bit for write permission */ | ||
| 520 | #define DMEXEC 0x1 /* mode bit for execute permission */ | ||
| 521 | |||
| 522 | typedef | ||
| 523 | struct Qid | ||
| 524 | { | ||
| 525 | uvlong path; | ||
| 526 | ulong vers; | ||
| 527 | uchar type; | ||
| 528 | } Qid; | ||
| 529 | |||
| 530 | typedef | ||
| 531 | struct Dir { | ||
| 532 | /* system-modified data */ | ||
| 533 | ushort type; /* server type */ | ||
| 534 | uint dev; /* server subtype */ | ||
| 535 | /* file data */ | ||
| 536 | Qid qid; /* unique id from server */ | ||
| 537 | ulong mode; /* permissions */ | ||
| 538 | ulong atime; /* last read time */ | ||
| 539 | ulong mtime; /* last write time */ | ||
| 540 | vlong length; /* file length */ | ||
| 541 | char *name; /* last element of path */ | ||
| 542 | char *uid; /* owner name */ | ||
| 543 | char *gid; /* group name */ | ||
| 544 | char *muid; /* last modifier name */ | ||
| 545 | } Dir; | ||
| 546 | |||
| 547 | extern Dir* dirstat(char*); | ||
| 548 | extern Dir* dirfstat(int); | ||
| 549 | extern int dirwstat(char*, Dir*); | ||
| 550 | extern int dirfwstat(int, Dir*); | ||
| 551 | extern long dirread(int, Dir**); | ||
| 552 | extern void nulldir(Dir*); | ||
| 553 | extern long dirreadall(int, Dir**); | ||
| 554 | |||
| 555 | typedef | ||
| 556 | struct Waitmsg | ||
| 557 | { | ||
| 558 | int pid; /* of loved one */ | ||
| 559 | ulong time[3]; /* of loved one & descendants */ | ||
| 560 | char *msg; | ||
| 561 | } Waitmsg; | ||
| 562 | |||
| 563 | typedef | ||
| 564 | struct IOchunk | ||
| 565 | { | ||
| 566 | void *addr; | ||
| 567 | ulong len; | ||
| 568 | } IOchunk; | ||
| 569 | |||
| 570 | extern void _exits(char*); | ||
| 571 | |||
| 572 | extern void abort(void); | ||
| 573 | extern int access(char*, int); | ||
| 574 | extern long alarm(ulong); | ||
| 575 | extern int await(char*, int); | ||
| 576 | extern int bind(char*, char*, int); | ||
| 577 | extern int brk(void*); | ||
| 578 | extern int chdir(char*); | ||
| 579 | extern int close(int); | ||
| 580 | extern int create(char*, int, ulong); | ||
| 581 | extern int dup(int, int); | ||
| 582 | extern int errstr(char*, uint); | ||
| 583 | extern int exec(char*, char*[]); | ||
| 584 | extern int execl(char*, ...); | ||
| 585 | extern int fork(void); | ||
| 586 | extern int rfork(int); | ||
| 587 | extern int fauth(int, char*); | ||
| 588 | extern int fstat(int, uchar*, int); | ||
| 589 | extern int fwstat(int, uchar*, int); | ||
| 590 | extern int fversion(int, int, char*, int); | ||
| 591 | extern int mount(int, int, char*, int, char*); | ||
| 592 | extern int unmount(char*, char*); | ||
| 593 | extern int noted(int); | ||
| 594 | extern int notify(void(*)(void*, char*)); | ||
| 595 | extern int open(char*, int); | ||
| 596 | extern int fd2path(int, char*, int); | ||
| 597 | extern int pipe(int*); | ||
| 598 | extern long pread(int, void*, long, vlong); | ||
| 599 | extern long preadv(int, IOchunk*, int, vlong); | ||
| 600 | extern long pwrite(int, void*, long, vlong); | ||
| 601 | extern long pwritev(int, IOchunk*, int, vlong); | ||
| 602 | extern long read(int, void*, long); | ||
| 603 | extern long readn(int, void*, long); | ||
| 604 | extern long readv(int, IOchunk*, int); | ||
| 605 | extern int remove(char*); | ||
| 606 | extern void* sbrk(ulong); | ||
| 607 | extern long oseek(int, long, int); | ||
| 608 | extern vlong seek(int, vlong, int); | ||
| 609 | extern long segattach(int, char*, void*, ulong); | ||
| 610 | extern int segbrk(void*, void*); | ||
| 611 | extern int segdetach(void*); | ||
| 612 | extern int segflush(void*, ulong); | ||
| 613 | extern int segfree(void*, ulong); | ||
| 614 | extern int sleep(long); | ||
| 615 | extern int stat(char*, uchar*, int); | ||
| 616 | extern Waitmsg* wait(void); | ||
| 617 | extern int waitpid(void); | ||
| 618 | extern long write(int, void*, long); | ||
| 619 | extern long writev(int, IOchunk*, int); | ||
| 620 | extern int wstat(char*, uchar*, int); | ||
| 621 | extern void* rendezvous(void*, void*); | ||
| 622 | |||
| 623 | extern int getpid(void); | ||
| 624 | extern int getppid(void); | ||
| 625 | extern void rerrstr(char*, uint); | ||
| 626 | extern char* sysname(void); | ||
| 627 | extern void werrstr(char*, ...); | ||
| 628 | #pragma varargck argpos werrstr 1 | ||
| 629 | |||
| 630 | extern char *argv0; | ||
| 631 | #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ | ||
| 632 | argv[0] && argv[0][0]=='-' && argv[0][1];\ | ||
| 633 | argc--, argv++) {\ | ||
| 634 | char *_args, *_argt;\ | ||
| 635 | Rune _argc;\ | ||
| 636 | _args = &argv[0][1];\ | ||
| 637 | if(_args[0]=='-' && _args[1]==0){\ | ||
| 638 | argc--; argv++; break;\ | ||
| 639 | }\ | ||
| 640 | _argc = 0;\ | ||
| 641 | while(*_args && (_args += chartorune(&_argc, _args)))\ | ||
| 642 | switch(_argc) | ||
| 643 | #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); | ||
| 644 | #define ARGF() (_argt=_args, _args="",\ | ||
| 645 | (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) | ||
| 646 | #define EARGF(x) (_argt=_args, _args="",\ | ||
| 647 | (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) | ||
| 648 | |||
| 649 | #define ARGC() _argc | ||
| 650 | |||
| 651 | /* | ||
| 652 | * Extensions for Inferno to basic libc.h | ||
| 653 | */ | ||
| 654 | |||
| 655 | #define setbinmode() | ||
| 656 | #undef __LITTLE_ENDIAN | ||
| 657 | |||
| 658 | /* | ||
| 659 | * Extensions for emu kernel emulation | ||
| 660 | */ | ||
| 661 | #ifdef EMU | ||
| 662 | |||
| 663 | extern Proc** Xup; | ||
| 664 | #define up (*Xup) | ||
| 665 | |||
| 666 | typedef struct FPU FPU; | ||
| 667 | |||
| 668 | |||
| 669 | /* | ||
| 670 | * This structure must agree with FPsave and FPrestore asm routines | ||
| 671 | */ | ||
| 672 | struct FPU | ||
| 673 | { | ||
| 674 | uchar env[28]; | ||
| 675 | }; | ||
| 676 | |||
| 677 | typedef jmp_buf osjmpbuf; | ||
| 678 | #define ossetjmp(buf) setjmp(buf) | ||
| 679 | |||
| 680 | #endif | ||
| @@ -0,0 +1,65 @@ | |||
| 1 | #define nil ((void*)0) | ||
| 2 | typedef unsigned short ushort; | ||
| 3 | typedef unsigned char uchar; | ||
| 4 | typedef unsigned long ulong; | ||
| 5 | typedef unsigned int uint; | ||
| 6 | typedef signed char schar; | ||
| 7 | typedef long long vlong; | ||
| 8 | typedef unsigned long long uvlong; | ||
| 9 | typedef unsigned long uintptr; | ||
| 10 | typedef ushort Rune; | ||
| 11 | typedef union FPdbleword FPdbleword; | ||
| 12 | typedef long jmp_buf[2]; | ||
| 13 | #define JMPBUFSP 0 | ||
| 14 | #define JMPBUFPC 1 | ||
| 15 | #define JMPBUFDPC 0 | ||
| 16 | typedef unsigned int mpdigit; /* for /sys/include/mp.h */ | ||
| 17 | typedef unsigned char u8int; | ||
| 18 | typedef unsigned short u16int; | ||
| 19 | typedef unsigned int u32int; | ||
| 20 | typedef unsigned long long u64int; | ||
| 21 | |||
| 22 | /* FCR */ | ||
| 23 | #define FPINEX (1<<7) | ||
| 24 | #define FPUNFL (1<<8) | ||
| 25 | #define FPOVFL (1<<9) | ||
| 26 | #define FPZDIV (1<<10) | ||
| 27 | #define FPINVAL (1<<11) | ||
| 28 | #define FPRNR (0<<0) | ||
| 29 | #define FPRZ (1<<0) | ||
| 30 | #define FPRPINF (2<<0) | ||
| 31 | #define FPRNINF (3<<0) | ||
| 32 | #define FPRMASK (3<<0) | ||
| 33 | #define FPPEXT 0 | ||
| 34 | #define FPPSGL 0 | ||
| 35 | #define FPPDBL 0 | ||
| 36 | #define FPPMASK 0 | ||
| 37 | /* FSR */ | ||
| 38 | #define FPAINEX (1<<2) | ||
| 39 | #define FPAOVFL (1<<4) | ||
| 40 | #define FPAUNFL (1<<3) | ||
| 41 | #define FPAZDIV (1<<5) | ||
| 42 | #define FPAINVAL (1<<6) | ||
| 43 | union FPdbleword | ||
| 44 | { | ||
| 45 | double x; | ||
| 46 | struct { /* big endian */ | ||
| 47 | ulong hi; | ||
| 48 | ulong lo; | ||
| 49 | }; | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* stdarg */ | ||
| 53 | typedef char* va_list; | ||
| 54 | #define va_start(list, start) list =\ | ||
| 55 | (sizeof(start) < 4?\ | ||
| 56 | (char*)((int*)&(start)+1):\ | ||
| 57 | (char*)(&(start)+1)) | ||
| 58 | #define va_end(list)\ | ||
| 59 | USED(list) | ||
| 60 | #define va_arg(list, mode)\ | ||
| 61 | ((sizeof(mode) == 1)?\ | ||
| 62 | ((mode*)(list += 4))[-1]:\ | ||
| 63 | (sizeof(mode) == 2)?\ | ||
| 64 | ((mode*)(list += 4))[-1]:\ | ||
| 65 | ((mode*)(list += sizeof(mode)))[-1]) | ||
| @@ -0,0 +1,687 @@ | |||
| 1 | #include <u.h> | ||
| 2 | typedef unsigned long size_t; | ||
| 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* memccpy(void*, void*, int, ulong); | ||
| 12 | extern void* memset(void*, int, ulong); | ||
| 13 | extern int memcmp(void*, void*, ulong); | ||
| 14 | extern void* memcpy(void*, void*, ulong); | ||
| 15 | extern void* memmove(void*, void*, ulong); | ||
| 16 | extern void* memchr(void*, int, ulong); | ||
| 17 | |||
| 18 | /* | ||
| 19 | * string routines | ||
| 20 | */ | ||
| 21 | extern char* strcat(char*, char*); | ||
| 22 | extern char* strchr(char*, int); | ||
| 23 | extern int strcmp(char*, char*); | ||
| 24 | extern char* strcpy(char*, char*); | ||
| 25 | extern char* strecpy(char*, char*, char*); | ||
| 26 | extern char* strdup(char*); | ||
| 27 | extern char* strncat(char*, char*, long); | ||
| 28 | extern char* strncpy(char*, char*, long); | ||
| 29 | extern int strncmp(char*, char*, long); | ||
| 30 | extern char* strpbrk(char*, char*); | ||
| 31 | extern char* strrchr(char*, int); | ||
| 32 | extern char* strtok(char*, char*); | ||
| 33 | extern long strlen(char*); | ||
| 34 | extern long strspn(char*, char*); | ||
| 35 | extern long strcspn(char*, char*); | ||
| 36 | extern char* strstr(char*, char*); | ||
| 37 | extern int cistrncmp(char*, char*, int); | ||
| 38 | extern int cistrcmp(char*, char*); | ||
| 39 | extern char* cistrstr(char*, char*); | ||
| 40 | extern int tokenize(char*, char**, int); | ||
| 41 | |||
| 42 | enum | ||
| 43 | { | ||
| 44 | UTFmax = 3, /* maximum bytes per rune */ | ||
| 45 | Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ | ||
| 46 | Runeself = 0x80, /* rune and UTF sequences are the same (<) */ | ||
| 47 | Runeerror = 0x80, /* decoding error in UTF */ | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* | ||
| 51 | * rune routines | ||
| 52 | */ | ||
| 53 | extern int runetochar(char*, Rune*); | ||
| 54 | extern int chartorune(Rune*, char*); | ||
| 55 | extern int runelen(long); | ||
| 56 | extern int runenlen(Rune*, int); | ||
| 57 | extern int fullrune(char*, int); | ||
| 58 | extern int utflen(char*); | ||
| 59 | extern int utfnlen(char*, long); | ||
| 60 | extern char* utfrune(char*, long); | ||
| 61 | extern char* utfrrune(char*, long); | ||
| 62 | extern char* utfutf(char*, char*); | ||
| 63 | extern char* utfecpy(char*, char*, char*); | ||
| 64 | |||
| 65 | extern Rune* runestrcat(Rune*, Rune*); | ||
| 66 | extern Rune* runestrchr(Rune*, Rune); | ||
| 67 | extern int runestrcmp(Rune*, Rune*); | ||
| 68 | extern Rune* runestrcpy(Rune*, Rune*); | ||
| 69 | extern Rune* runestrncpy(Rune*, Rune*, long); | ||
| 70 | extern Rune* runestrecpy(Rune*, Rune*, Rune*); | ||
| 71 | extern Rune* runestrdup(Rune*); | ||
| 72 | extern Rune* runestrncat(Rune*, Rune*, long); | ||
| 73 | extern int runestrncmp(Rune*, Rune*, long); | ||
| 74 | extern Rune* runestrrchr(Rune*, Rune); | ||
| 75 | extern long runestrlen(Rune*); | ||
| 76 | extern Rune* runestrstr(Rune*, Rune*); | ||
| 77 | |||
| 78 | extern Rune tolowerrune(Rune); | ||
| 79 | extern Rune totitlerune(Rune); | ||
| 80 | extern Rune toupperrune(Rune); | ||
| 81 | extern int isalpharune(Rune); | ||
| 82 | extern int islowerrune(Rune); | ||
| 83 | extern int isspacerune(Rune); | ||
| 84 | extern int istitlerune(Rune); | ||
| 85 | extern int isupperrune(Rune); | ||
| 86 | |||
| 87 | /* | ||
| 88 | * malloc | ||
| 89 | */ | ||
| 90 | extern void* malloc(ulong); | ||
| 91 | extern void* mallocz(ulong, int); | ||
| 92 | extern void free(void*); | ||
| 93 | extern ulong msize(void*); | ||
| 94 | extern void* calloc(ulong, ulong); | ||
| 95 | extern void* realloc(void*, ulong); | ||
| 96 | extern void setmalloctag(void*, ulong); | ||
| 97 | extern void setrealloctag(void*, ulong); | ||
| 98 | extern ulong getmalloctag(void*); | ||
| 99 | extern ulong getrealloctag(void*); | ||
| 100 | extern void* malloctopoolblock(void*); | ||
| 101 | |||
| 102 | /* | ||
| 103 | * print routines | ||
| 104 | */ | ||
| 105 | typedef struct Fmt Fmt; | ||
| 106 | struct Fmt{ | ||
| 107 | uchar runes; /* output buffer is runes or chars? */ | ||
| 108 | void *start; /* of buffer */ | ||
| 109 | void *to; /* current place in the buffer */ | ||
| 110 | void *stop; /* end of the buffer; overwritten if flush fails */ | ||
| 111 | int (*flush)(Fmt *); /* called when to == stop */ | ||
| 112 | void *farg; /* to make flush a closure */ | ||
| 113 | int nfmt; /* num chars formatted so far */ | ||
| 114 | va_list args; /* args passed to dofmt */ | ||
| 115 | int r; /* % format Rune */ | ||
| 116 | int width; | ||
| 117 | int prec; | ||
| 118 | ulong flags; | ||
| 119 | }; | ||
| 120 | |||
| 121 | enum{ | ||
| 122 | FmtWidth = 1, | ||
| 123 | FmtLeft = FmtWidth << 1, | ||
| 124 | FmtPrec = FmtLeft << 1, | ||
| 125 | FmtSharp = FmtPrec << 1, | ||
| 126 | FmtSpace = FmtSharp << 1, | ||
| 127 | FmtSign = FmtSpace << 1, | ||
| 128 | FmtZero = FmtSign << 1, | ||
| 129 | FmtUnsigned = FmtZero << 1, | ||
| 130 | FmtShort = FmtUnsigned << 1, | ||
| 131 | FmtLong = FmtShort << 1, | ||
| 132 | FmtVLong = FmtLong << 1, | ||
| 133 | FmtComma = FmtVLong << 1, | ||
| 134 | FmtByte = FmtComma << 1, | ||
| 135 | |||
| 136 | FmtFlag = FmtByte << 1 | ||
| 137 | }; | ||
| 138 | |||
| 139 | extern int print(char*, ...); | ||
| 140 | extern char* seprint(char*, char*, char*, ...); | ||
| 141 | extern char* vseprint(char*, char*, char*, va_list); | ||
| 142 | extern int snprint(char*, int, char*, ...); | ||
| 143 | extern int vsnprint(char*, int, char*, va_list); | ||
| 144 | extern char* smprint(char*, ...); | ||
| 145 | extern char* vsmprint(char*, va_list); | ||
| 146 | extern int sprint(char*, char*, ...); | ||
| 147 | extern int fprint(int, char*, ...); | ||
| 148 | extern int vfprint(int, char*, va_list); | ||
| 149 | |||
| 150 | extern int runesprint(Rune*, char*, ...); | ||
| 151 | extern int runesnprint(Rune*, int, char*, ...); | ||
| 152 | extern int runevsnprint(Rune*, int, char*, va_list); | ||
| 153 | extern Rune* runeseprint(Rune*, Rune*, char*, ...); | ||
| 154 | extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | ||
| 155 | extern Rune* runesmprint(char*, ...); | ||
| 156 | extern Rune* runevsmprint(char*, va_list); | ||
| 157 | |||
| 158 | extern int fmtfdinit(Fmt*, int, char*, int); | ||
| 159 | extern int fmtfdflush(Fmt*); | ||
| 160 | extern int fmtstrinit(Fmt*); | ||
| 161 | extern char* fmtstrflush(Fmt*); | ||
| 162 | extern int runefmtstrinit(Fmt*); | ||
| 163 | extern Rune* runefmtstrflush(Fmt*); | ||
| 164 | |||
| 165 | #pragma varargck argpos fmtprint 2 | ||
| 166 | #pragma varargck argpos fprint 2 | ||
| 167 | #pragma varargck argpos print 1 | ||
| 168 | #pragma varargck argpos runeseprint 3 | ||
| 169 | #pragma varargck argpos runesmprint 1 | ||
| 170 | #pragma varargck argpos runesnprint 3 | ||
| 171 | #pragma varargck argpos runesprint 2 | ||
| 172 | #pragma varargck argpos seprint 3 | ||
| 173 | #pragma varargck argpos smprint 1 | ||
| 174 | #pragma varargck argpos snprint 3 | ||
| 175 | #pragma varargck argpos sprint 2 | ||
| 176 | #pragma varargck argpos vseprint 3 | ||
| 177 | #pragma varargck argpos vsnprint 3 | ||
| 178 | |||
| 179 | #pragma varargck type "lld" vlong | ||
| 180 | #pragma varargck type "llx" vlong | ||
| 181 | #pragma varargck type "lld" uvlong | ||
| 182 | #pragma varargck type "llx" uvlong | ||
| 183 | #pragma varargck type "ld" long | ||
| 184 | #pragma varargck type "lx" long | ||
| 185 | #pragma varargck type "ld" ulong | ||
| 186 | #pragma varargck type "lx" ulong | ||
| 187 | #pragma varargck type "d" int | ||
| 188 | #pragma varargck type "x" int | ||
| 189 | #pragma varargck type "c" int | ||
| 190 | #pragma varargck type "C" int | ||
| 191 | #pragma varargck type "d" uint | ||
| 192 | #pragma varargck type "x" uint | ||
| 193 | #pragma varargck type "c" uint | ||
| 194 | #pragma varargck type "C" uint | ||
| 195 | #pragma varargck type "f" double | ||
| 196 | #pragma varargck type "e" double | ||
| 197 | #pragma varargck type "g" double | ||
| 198 | #pragma varargck type "s" char* | ||
| 199 | #pragma varargck type "q" char* | ||
| 200 | #pragma varargck type "S" Rune* | ||
| 201 | #pragma varargck type "Q" Rune* | ||
| 202 | #pragma varargck type "r" void | ||
| 203 | #pragma varargck type "%" void | ||
| 204 | #pragma varargck type "n" int* | ||
| 205 | #pragma varargck type "p" void* | ||
| 206 | #pragma varargck flag ',' | ||
| 207 | #pragma varargck type "<" void* | ||
| 208 | #pragma varargck type "[" void* | ||
| 209 | #pragma varargck type "H" void* | ||
| 210 | |||
| 211 | extern int fmtinstall(int, int (*)(Fmt*)); | ||
| 212 | extern int dofmt(Fmt*, char*); | ||
| 213 | extern int dorfmt(Fmt*, Rune*); | ||
| 214 | extern int fmtprint(Fmt*, char*, ...); | ||
| 215 | extern int fmtvprint(Fmt*, char*, va_list); | ||
| 216 | extern int fmtrune(Fmt*, int); | ||
| 217 | extern int fmtstrcpy(Fmt*, char*); | ||
| 218 | extern int fmtrunestrcpy(Fmt*, Rune*); | ||
| 219 | /* | ||
| 220 | * error string for %r | ||
| 221 | * supplied on per os basis, not part of fmt library | ||
| 222 | */ | ||
| 223 | extern int errfmt(Fmt *f); | ||
| 224 | |||
| 225 | /* | ||
| 226 | * quoted strings | ||
| 227 | */ | ||
| 228 | extern char *unquotestrdup(char*); | ||
| 229 | extern Rune *unquoterunestrdup(Rune*); | ||
| 230 | extern char *quotestrdup(char*); | ||
| 231 | extern Rune *quoterunestrdup(Rune*); | ||
| 232 | extern int quotestrfmt(Fmt*); | ||
| 233 | extern int quoterunestrfmt(Fmt*); | ||
| 234 | extern void quotefmtinstall(void); | ||
| 235 | extern int (*doquote)(int); | ||
| 236 | |||
| 237 | /* | ||
| 238 | * random number | ||
| 239 | */ | ||
| 240 | extern void srand(long); | ||
| 241 | extern int rand(void); | ||
| 242 | extern int nrand(int); | ||
| 243 | extern long lrand(void); | ||
| 244 | extern long lnrand(long); | ||
| 245 | extern double frand(void); | ||
| 246 | extern ulong truerand(void); | ||
| 247 | extern ulong ntruerand(ulong); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * math | ||
| 251 | */ | ||
| 252 | extern ulong getfcr(void); | ||
| 253 | extern void setfsr(ulong); | ||
| 254 | extern ulong getfsr(void); | ||
| 255 | extern void setfcr(ulong); | ||
| 256 | extern double NaN(void); | ||
| 257 | extern double Inf(int); | ||
| 258 | extern int isNaN(double); | ||
| 259 | extern int isInf(double, int); | ||
| 260 | |||
| 261 | extern double pow(double, double); | ||
| 262 | extern double atan2(double, double); | ||
| 263 | extern double fabs(double); | ||
| 264 | extern double atan(double); | ||
| 265 | extern double log(double); | ||
| 266 | extern double log10(double); | ||
| 267 | extern double exp(double); | ||
| 268 | extern double floor(double); | ||
| 269 | extern double ceil(double); | ||
| 270 | extern double hypot(double, double); | ||
| 271 | extern double sin(double); | ||
| 272 | extern double cos(double); | ||
| 273 | extern double tan(double); | ||
| 274 | extern double asin(double); | ||
| 275 | extern double acos(double); | ||
| 276 | extern double sinh(double); | ||
| 277 | extern double cosh(double); | ||
| 278 | extern double tanh(double); | ||
| 279 | extern double sqrt(double); | ||
| 280 | extern double fmod(double, double); | ||
| 281 | |||
| 282 | #define HUGE 3.4028234e38 | ||
| 283 | #define PIO2 1.570796326794896619231e0 | ||
| 284 | #define PI (PIO2+PIO2) | ||
| 285 | |||
| 286 | /* | ||
| 287 | * Time-of-day | ||
| 288 | */ | ||
| 289 | |||
| 290 | typedef | ||
| 291 | struct Tm | ||
| 292 | { | ||
| 293 | int sec; | ||
| 294 | int min; | ||
| 295 | int hour; | ||
| 296 | int mday; | ||
| 297 | int mon; | ||
| 298 | int year; | ||
| 299 | int wday; | ||
| 300 | int yday; | ||
| 301 | char zone[4]; | ||
| 302 | int tzoff; | ||
| 303 | } Tm; | ||
| 304 | |||
| 305 | extern Tm* gmtime(long); | ||
| 306 | extern Tm* localtime(long); | ||
| 307 | extern char* asctime(Tm*); | ||
| 308 | extern char* ctime(long); | ||
| 309 | extern double cputime(void); | ||
| 310 | extern long times(long*); | ||
| 311 | extern long tm2sec(Tm*); | ||
| 312 | extern vlong nsec(void); | ||
| 313 | |||
| 314 | /* | ||
| 315 | * one-of-a-kind | ||
| 316 | */ | ||
| 317 | enum | ||
| 318 | { | ||
| 319 | PNPROC = 1, | ||
| 320 | PNGROUP = 2, | ||
| 321 | }; | ||
| 322 | |||
| 323 | extern void _assert(char*); | ||
| 324 | extern int abs(int); | ||
| 325 | extern int atexit(void(*)(void)); | ||
| 326 | extern void atexitdont(void(*)(void)); | ||
| 327 | extern int atnotify(int(*)(void*, char*), int); | ||
| 328 | extern double atof(char*); | ||
| 329 | extern int atoi(char*); | ||
| 330 | extern long atol(char*); | ||
| 331 | extern double charstod(int(*)(void*), void*); | ||
| 332 | extern char* cleanname(char*); | ||
| 333 | extern int decrypt(void*, void*, int); | ||
| 334 | extern int encrypt(void*, void*, int); | ||
| 335 | extern int dec64(uchar*, int, char*, int); | ||
| 336 | extern int enc64(char*, int, uchar*, int); | ||
| 337 | extern int dec32(uchar*, int, char*, int); | ||
| 338 | extern int enc32(char*, int, uchar*, int); | ||
| 339 | extern int dec16(uchar*, int, char*, int); | ||
| 340 | extern int enc16(char*, int, uchar*, int); | ||
| 341 | extern int encodefmt(Fmt*); | ||
| 342 | extern void exits(char*); | ||
| 343 | extern double frexp(double, int*); | ||
| 344 | extern ulong getcallerpc(void*); | ||
| 345 | extern char* getenv(char*); | ||
| 346 | extern int getfields(char*, char**, int, int, char*); | ||
| 347 | extern char* getuser(void); | ||
| 348 | extern char* getwd(char*, int); | ||
| 349 | extern int iounit(int); | ||
| 350 | extern long labs(long); | ||
| 351 | extern double ldexp(double, int); | ||
| 352 | extern void longjmp(jmp_buf, int); | ||
| 353 | extern char* mktemp(char*); | ||
| 354 | extern double modf(double, double*); | ||
| 355 | extern int netcrypt(void*, void*); | ||
| 356 | extern void notejmp(void*, jmp_buf, int); | ||
| 357 | extern void perror(char*); | ||
| 358 | extern int postnote(int, int, char *); | ||
| 359 | extern double pow10(int); | ||
| 360 | extern double ipow10(int); | ||
| 361 | extern int putenv(char*, char*); | ||
| 362 | extern void qsort(void*, long, long, int (*)(void*, void*)); | ||
| 363 | extern void* sbrk(ulong); | ||
| 364 | extern int setjmp(jmp_buf); | ||
| 365 | extern double strtod(char*, char**); | ||
| 366 | extern long strtol(char*, char**, int); | ||
| 367 | extern ulong strtoul(char*, char**, int); | ||
| 368 | extern vlong strtoll(char*, char**, int); | ||
| 369 | extern uvlong strtoull(char*, char**, int); | ||
| 370 | extern void sysfatal(char*, ...); | ||
| 371 | #pragma varargck argpos sysfatal 1 | ||
| 372 | extern void syslog(int, char*, char*, ...); | ||
| 373 | #pragma varargck argpos syslog 3 | ||
| 374 | extern long time(long*); | ||
| 375 | extern int tolower(int); | ||
| 376 | extern int toupper(int); | ||
| 377 | |||
| 378 | /* | ||
| 379 | * synchronization | ||
| 380 | */ | ||
| 381 | typedef | ||
| 382 | struct Lock { | ||
| 383 | int val; | ||
| 384 | } Lock; | ||
| 385 | |||
| 386 | extern int _tas(int*); | ||
| 387 | |||
| 388 | extern void lock(Lock*); | ||
| 389 | extern void unlock(Lock*); | ||
| 390 | extern int canlock(Lock*); | ||
| 391 | |||
| 392 | typedef struct QLp QLp; | ||
| 393 | struct QLp | ||
| 394 | { | ||
| 395 | int inuse; | ||
| 396 | QLp *next; | ||
| 397 | char state; | ||
| 398 | }; | ||
| 399 | |||
| 400 | typedef | ||
| 401 | struct QLock | ||
| 402 | { | ||
| 403 | Lock lock; | ||
| 404 | int locked; | ||
| 405 | QLp *head; | ||
| 406 | QLp *tail; | ||
| 407 | } QLock; | ||
| 408 | |||
| 409 | extern void qlock(QLock*); | ||
| 410 | extern void qunlock(QLock*); | ||
| 411 | extern int canqlock(QLock*); | ||
| 412 | extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ | ||
| 413 | |||
| 414 | typedef | ||
| 415 | struct RWLock | ||
| 416 | { | ||
| 417 | Lock lock; | ||
| 418 | int readers; /* number of readers */ | ||
| 419 | int writer; /* number of writers */ | ||
| 420 | QLp *head; /* list of waiting processes */ | ||
| 421 | QLp *tail; | ||
| 422 | } RWLock; | ||
| 423 | |||
| 424 | extern int canrlock(RWLock*); | ||
| 425 | extern int canwlock(RWLock*); | ||
| 426 | extern void rlock(RWLock*); | ||
| 427 | extern void runlock(RWLock*); | ||
| 428 | extern void wlock(RWLock*); | ||
| 429 | extern void wunlock(RWLock*); | ||
| 430 | |||
| 431 | extern void** privalloc(void); | ||
| 432 | extern void privfree(void**); | ||
| 433 | |||
| 434 | /* | ||
| 435 | * network dialing | ||
| 436 | */ | ||
| 437 | #define NETPATHLEN 40 | ||
| 438 | extern int accept(int, char*); | ||
| 439 | extern int announce(char*, char*); | ||
| 440 | extern int dial(char*, char*, char*, int*); | ||
| 441 | extern void setnetmtpt(char*, int, char*); | ||
| 442 | extern int hangup(int); | ||
| 443 | extern int listen(char*, char*); | ||
| 444 | extern char* netmkaddr(char*, char*, char*); | ||
| 445 | extern int reject(int, char*, char*); | ||
| 446 | |||
| 447 | /* | ||
| 448 | * system calls | ||
| 449 | * | ||
| 450 | */ | ||
| 451 | #define STATMAX 65535U /* max length of machine-independent stat structure */ | ||
| 452 | #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ | ||
| 453 | #define ERRMAX 128 /* max length of error string */ | ||
| 454 | |||
| 455 | #define MORDER 0x0003 /* mask for bits defining order of mounting */ | ||
| 456 | #define MREPL 0x0000 /* mount replaces object */ | ||
| 457 | #define MBEFORE 0x0001 /* mount goes before others in union directory */ | ||
| 458 | #define MAFTER 0x0002 /* mount goes after others in union directory */ | ||
| 459 | #define MCREATE 0x0004 /* permit creation in mounted directory */ | ||
| 460 | #define MCACHE 0x0010 /* cache some data */ | ||
| 461 | #define MMASK 0x0017 /* all bits on */ | ||
| 462 | |||
| 463 | #define OREAD 0 /* open for read */ | ||
| 464 | #define OWRITE 1 /* write */ | ||
| 465 | #define ORDWR 2 /* read and write */ | ||
| 466 | #define OEXEC 3 /* execute, == read but check execute permission */ | ||
| 467 | #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ | ||
| 468 | #define OCEXEC 32 /* or'ed in, close on exec */ | ||
| 469 | #define ORCLOSE 64 /* or'ed in, remove on close */ | ||
| 470 | #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ | ||
| 471 | |||
| 472 | #define AEXIST 0 /* accessible: exists */ | ||
| 473 | #define AEXEC 1 /* execute access */ | ||
| 474 | #define AWRITE 2 /* write access */ | ||
| 475 | #define AREAD 4 /* read access */ | ||
| 476 | |||
| 477 | |||
| 478 | /* Segattch */ | ||
| 479 | #define SG_RONLY 0040 /* read only */ | ||
| 480 | #define SG_CEXEC 0100 /* detach on exec */ | ||
| 481 | |||
| 482 | #define NCONT 0 /* continue after note */ | ||
| 483 | #define NDFLT 1 /* terminate after note */ | ||
| 484 | #define NSAVE 2 /* clear note but hold state */ | ||
| 485 | #define NRSTR 3 /* restore saved state */ | ||
| 486 | |||
| 487 | /* rfork */ | ||
| 488 | enum | ||
| 489 | { | ||
| 490 | RFNAMEG = (1<<0), | ||
| 491 | RFENVG = (1<<1), | ||
| 492 | RFFDG = (1<<2), | ||
| 493 | RFNOTEG = (1<<3), | ||
| 494 | RFPROC = (1<<4), | ||
| 495 | RFMEM = (1<<5), | ||
| 496 | RFNOWAIT = (1<<6), | ||
| 497 | RFCNAMEG = (1<<10), | ||
| 498 | RFCENVG = (1<<11), | ||
| 499 | RFCFDG = (1<<12), | ||
| 500 | RFREND = (1<<13), | ||
| 501 | RFNOMNT = (1<<14) | ||
| 502 | }; | ||
| 503 | |||
| 504 | /* bits in Qid.type */ | ||
| 505 | #define QTDIR 0x80 /* type bit for directories */ | ||
| 506 | #define QTAPPEND 0x40 /* type bit for append only files */ | ||
| 507 | #define QTEXCL 0x20 /* type bit for exclusive use files */ | ||
| 508 | #define QTMOUNT 0x10 /* type bit for mounted channel */ | ||
| 509 | #define QTAUTH 0x08 /* type bit for authentication file */ | ||
| 510 | #define QTFILE 0x00 /* plain file */ | ||
| 511 | |||
| 512 | /* bits in Dir.mode */ | ||
| 513 | #define DMDIR 0x80000000 /* mode bit for directories */ | ||
| 514 | #define DMAPPEND 0x40000000 /* mode bit for append only files */ | ||
| 515 | #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ | ||
| 516 | #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ | ||
| 517 | #define DMAUTH 0x08000000 /* mode bit for authentication file */ | ||
| 518 | #define DMREAD 0x4 /* mode bit for read permission */ | ||
| 519 | #define DMWRITE 0x2 /* mode bit for write permission */ | ||
| 520 | #define DMEXEC 0x1 /* mode bit for execute permission */ | ||
| 521 | |||
| 522 | typedef | ||
| 523 | struct Qid | ||
| 524 | { | ||
| 525 | uvlong path; | ||
| 526 | ulong vers; | ||
| 527 | uchar type; | ||
| 528 | } Qid; | ||
| 529 | |||
| 530 | typedef | ||
| 531 | struct Dir { | ||
| 532 | /* system-modified data */ | ||
| 533 | ushort type; /* server type */ | ||
| 534 | uint dev; /* server subtype */ | ||
| 535 | /* file data */ | ||
| 536 | Qid qid; /* unique id from server */ | ||
| 537 | ulong mode; /* permissions */ | ||
| 538 | ulong atime; /* last read time */ | ||
| 539 | ulong mtime; /* last write time */ | ||
| 540 | vlong length; /* file length */ | ||
| 541 | char *name; /* last element of path */ | ||
| 542 | char *uid; /* owner name */ | ||
| 543 | char *gid; /* group name */ | ||
| 544 | char *muid; /* last modifier name */ | ||
| 545 | } Dir; | ||
| 546 | |||
| 547 | extern Dir* dirstat(char*); | ||
| 548 | extern Dir* dirfstat(int); | ||
| 549 | extern int dirwstat(char*, Dir*); | ||
| 550 | extern int dirfwstat(int, Dir*); | ||
| 551 | extern long dirread(int, Dir**); | ||
| 552 | extern void nulldir(Dir*); | ||
| 553 | extern long dirreadall(int, Dir**); | ||
| 554 | |||
| 555 | typedef | ||
| 556 | struct Waitmsg | ||
| 557 | { | ||
| 558 | int pid; /* of loved one */ | ||
| 559 | ulong time[3]; /* of loved one & descendants */ | ||
| 560 | char *msg; | ||
| 561 | } Waitmsg; | ||
| 562 | |||
| 563 | typedef | ||
| 564 | struct IOchunk | ||
| 565 | { | ||
| 566 | void *addr; | ||
| 567 | ulong len; | ||
| 568 | } IOchunk; | ||
| 569 | |||
| 570 | extern void _exits(char*); | ||
| 571 | |||
| 572 | extern void abort(void); | ||
| 573 | extern int access(char*, int); | ||
| 574 | extern long alarm(ulong); | ||
| 575 | extern int await(char*, int); | ||
| 576 | extern int bind(char*, char*, int); | ||
| 577 | extern int brk(void*); | ||
| 578 | extern int chdir(char*); | ||
| 579 | extern int close(int); | ||
| 580 | extern int create(char*, int, ulong); | ||
| 581 | extern int dup(int, int); | ||
| 582 | extern int errstr(char*, uint); | ||
| 583 | extern int exec(char*, char*[]); | ||
| 584 | extern int execl(char*, ...); | ||
| 585 | extern int fork(void); | ||
| 586 | extern int rfork(int); | ||
| 587 | extern int fauth(int, char*); | ||
| 588 | extern int fstat(int, uchar*, int); | ||
| 589 | extern int fwstat(int, uchar*, int); | ||
| 590 | extern int fversion(int, int, char*, int); | ||
| 591 | extern int mount(int, int, char*, int, char*); | ||
| 592 | extern int unmount(char*, char*); | ||
| 593 | extern int noted(int); | ||
| 594 | extern int notify(void(*)(void*, char*)); | ||
| 595 | extern int open(char*, int); | ||
| 596 | extern int fd2path(int, char*, int); | ||
| 597 | extern int pipe(int*); | ||
| 598 | extern long pread(int, void*, long, vlong); | ||
| 599 | extern long preadv(int, IOchunk*, int, vlong); | ||
| 600 | extern long pwrite(int, void*, long, vlong); | ||
| 601 | extern long pwritev(int, IOchunk*, int, vlong); | ||
| 602 | extern long read(int, void*, long); | ||
| 603 | extern long readn(int, void*, long); | ||
| 604 | extern long readv(int, IOchunk*, int); | ||
| 605 | extern int remove(char*); | ||
| 606 | extern void* sbrk(ulong); | ||
| 607 | extern long oseek(int, long, int); | ||
| 608 | extern vlong seek(int, vlong, int); | ||
| 609 | extern long segattach(int, char*, void*, ulong); | ||
| 610 | extern int segbrk(void*, void*); | ||
| 611 | extern int segdetach(void*); | ||
| 612 | extern int segflush(void*, ulong); | ||
| 613 | extern int segfree(void*, ulong); | ||
| 614 | extern int sleep(long); | ||
| 615 | extern int stat(char*, uchar*, int); | ||
| 616 | extern Waitmsg* wait(void); | ||
| 617 | extern int waitpid(void); | ||
| 618 | extern long write(int, void*, long); | ||
| 619 | extern long writev(int, IOchunk*, int); | ||
| 620 | extern int wstat(char*, uchar*, int); | ||
| 621 | extern void* rendezvous(void*, void*); | ||
| 622 | |||
| 623 | extern int getpid(void); | ||
| 624 | extern int getppid(void); | ||
| 625 | extern void rerrstr(char*, uint); | ||
| 626 | extern char* sysname(void); | ||
| 627 | extern void werrstr(char*, ...); | ||
| 628 | #pragma varargck argpos werrstr 1 | ||
| 629 | |||
| 630 | extern char *argv0; | ||
| 631 | #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ | ||
| 632 | argv[0] && argv[0][0]=='-' && argv[0][1];\ | ||
| 633 | argc--, argv++) {\ | ||
| 634 | char *_args, *_argt;\ | ||
| 635 | Rune _argc;\ | ||
| 636 | _args = &argv[0][1];\ | ||
| 637 | if(_args[0]=='-' && _args[1]==0){\ | ||
| 638 | argc--; argv++; break;\ | ||
| 639 | }\ | ||
| 640 | _argc = 0;\ | ||
| 641 | while(*_args && (_args += chartorune(&_argc, _args)))\ | ||
| 642 | switch(_argc) | ||
| 643 | #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); | ||
| 644 | #define ARGF() (_argt=_args, _args="",\ | ||
| 645 | (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) | ||
| 646 | #define EARGF(x) (_argt=_args, _args="",\ | ||
| 647 | (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) | ||
| 648 | |||
| 649 | #define ARGC() _argc | ||
| 650 | |||
| 651 | /* | ||
| 652 | * Extensions for Inferno to basic libc.h | ||
| 653 | */ | ||
| 654 | |||
| 655 | #define setbinmode() | ||
| 656 | #undef __LITTLE_ENDIAN | ||
| 657 | |||
| 658 | /* | ||
| 659 | * Extensions for emu kernel emulation | ||
| 660 | */ | ||
| 661 | #ifdef EMU | ||
| 662 | |||
| 663 | extern Proc** Xup; | ||
| 664 | #define up (*Xup) | ||
| 665 | |||
| 666 | typedef struct FPU FPU; | ||
| 667 | |||
| 668 | /* | ||
| 669 | * This structure must agree with FPsave and FPrestore asm routines | ||
| 670 | */ | ||
| 671 | typedef struct FPU FPU; | ||
| 672 | struct FPU | ||
| 673 | { | ||
| 674 | double fpreg[32]; | ||
| 675 | union { | ||
| 676 | double fpscrd; | ||
| 677 | struct { | ||
| 678 | ulong pad; | ||
| 679 | ulong fpscr; | ||
| 680 | }; | ||
| 681 | }; | ||
| 682 | }; | ||
| 683 | |||
| 684 | typedef jmp_buf osjmpbuf; | ||
| 685 | #define ossetjmp(buf) setjmp(buf) | ||
| 686 | |||
| 687 | #endif | ||
| @@ -0,0 +1,84 @@ | |||
| 1 | #define nil ((void*)0) | ||
| 2 | typedef unsigned short ushort; | ||
| 3 | typedef unsigned char uchar; | ||
| 4 | typedef unsigned long ulong; | ||
| 5 | typedef unsigned int uint; | ||
| 6 | typedef signed char schar; | ||
| 7 | typedef long long vlong; | ||
| 8 | typedef unsigned long long uvlong; | ||
| 9 | typedef unsigned long uintptr; | ||
| 10 | typedef ushort Rune; | ||
| 11 | typedef union FPdbleword FPdbleword; | ||
| 12 | typedef long jmp_buf[2]; | ||
| 13 | #define JMPBUFSP 0 | ||
| 14 | #define JMPBUFPC 1 | ||
| 15 | #define JMPBUFDPC 0 | ||
| 16 | typedef unsigned int mpdigit; /* for /sys/include/mp.h */ | ||
| 17 | typedef unsigned char u8int; | ||
| 18 | typedef unsigned short u16int; | ||
| 19 | typedef unsigned int u32int; | ||
| 20 | typedef unsigned long long u64int; | ||
| 21 | |||
| 22 | /* FPSCR */ | ||
| 23 | #define FPSFX (1<<31) /* exception summary (sticky) */ | ||
| 24 | #define FPSEX (1<<30) /* enabled exception summary */ | ||
| 25 | #define FPSVX (1<<29) /* invalid operation exception summary */ | ||
| 26 | #define FPSOX (1<<28) /* overflow exception OX (sticky) */ | ||
| 27 | #define FPSUX (1<<27) /* underflow exception UX (sticky) */ | ||
| 28 | #define FPSZX (1<<26) /* zero divide exception ZX (sticky) */ | ||
| 29 | #define FPSXX (1<<25) /* inexact exception XX (sticky) */ | ||
| 30 | #define FPSVXSNAN (1<<24) /* invalid operation exception for SNaN (sticky) */ | ||
| 31 | #define FPSVXISI (1<<23) /* invalid operation exception for ∞-∞ (sticky) */ | ||
| 32 | #define FPSVXIDI (1<<22) /* invalid operation exception for ∞/∞ (sticky) */ | ||
| 33 | #define FPSVXZDZ (1<<21) /* invalid operation exception for 0/0 (sticky) */ | ||
| 34 | #define FPSVXIMZ (1<<20) /* invalid operation exception for ∞*0 (sticky) */ | ||
| 35 | #define FPSVXVC (1<<19) /* invalid operation exception for invalid compare (sticky) */ | ||
| 36 | #define FPSFR (1<<18) /* fraction rounded */ | ||
| 37 | #define FPSFI (1<<17) /* fraction inexact */ | ||
| 38 | #define FPSFPRF (1<<16) /* floating point result class */ | ||
| 39 | #define FPSFPCC (0xF<<12) /* <, >, =, unordered */ | ||
| 40 | #define FPVXCVI (1<<8) /* enable exception for invalid integer convert (sticky) */ | ||
| 41 | #define FPVE (1<<7) /* invalid operation exception enable */ | ||
| 42 | #define FPOVFL (1<<6) /* enable overflow exceptions */ | ||
| 43 | #define FPUNFL (1<<5) /* enable underflow */ | ||
| 44 | #define FPZDIV (1<<4) /* enable zero divide */ | ||
| 45 | #define FPINEX (1<<3) /* enable inexact exceptions */ | ||
| 46 | #define FPRMASK (3<<0) /* rounding mode */ | ||
| 47 | #define FPRNR (0<<0) | ||
| 48 | #define FPRZ (1<<0) | ||
| 49 | #define FPRPINF (2<<0) | ||
| 50 | #define FPRNINF (3<<0) | ||
| 51 | #define FPPEXT 0 | ||
| 52 | #define FPPSGL 0 | ||
| 53 | #define FPPDBL 0 | ||
| 54 | #define FPPMASK 0 | ||
| 55 | #define FPINVAL FPVE | ||
| 56 | |||
| 57 | #define FPAOVFL FPSOX | ||
| 58 | #define FPAINEX FPSXX | ||
| 59 | #define FPAUNFL FPSUX | ||
| 60 | #define FPAZDIV FPSZX | ||
| 61 | #define FPAINVAL FPSVX | ||
| 62 | |||
| 63 | union FPdbleword | ||
| 64 | { | ||
| 65 | double x; | ||
| 66 | struct { /* big endian */ | ||
| 67 | ulong hi; | ||
| 68 | ulong lo; | ||
| 69 | }; | ||
| 70 | }; | ||
| 71 | |||
| 72 | typedef char* va_list; | ||
| 73 | #define va_start(list, start) list =\ | ||
| 74 | (sizeof(start) < 4?\ | ||
| 75 | (char*)((int*)&(start)+1):\ | ||
| 76 | (char*)(&(start)+1)) | ||
| 77 | #define va_end(list)\ | ||
| 78 | USED(list) | ||
| 79 | #define va_arg(list, mode)\ | ||
| 80 | ((sizeof(mode) == 1)?\ | ||
| 81 | ((mode*)(list += 4))[-1]:\ | ||
| 82 | (sizeof(mode) == 2)?\ | ||
| 83 | ((mode*)(list += 4))[-1]:\ | ||
| 84 | ((mode*)(list += sizeof(mode)))[-1]) | ||
| @@ -0,0 +1,679 @@ | |||
| 1 | #include <u.h> | ||
| 2 | typedef unsigned long size_t; | ||
| 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* memccpy(void*, void*, int, ulong); | ||
| 12 | extern void* memset(void*, int, ulong); | ||
| 13 | extern int memcmp(void*, void*, ulong); | ||
| 14 | extern void* memcpy(void*, void*, ulong); | ||
| 15 | extern void* memmove(void*, void*, ulong); | ||
| 16 | extern void* memchr(void*, int, ulong); | ||
| 17 | |||
| 18 | /* | ||
| 19 | * string routines | ||
| 20 | */ | ||
| 21 | extern char* strcat(char*, char*); | ||
| 22 | extern char* strchr(char*, int); | ||
| 23 | extern int strcmp(char*, char*); | ||
| 24 | extern char* strcpy(char*, char*); | ||
| 25 | extern char* strecpy(char*, char*, char*); | ||
| 26 | extern char* strdup(char*); | ||
| 27 | extern char* strncat(char*, char*, long); | ||
| 28 | extern char* strncpy(char*, char*, long); | ||
| 29 | extern int strncmp(char*, char*, long); | ||
| 30 | extern char* strpbrk(char*, char*); | ||
| 31 | extern char* strrchr(char*, int); | ||
| 32 | extern char* strtok(char*, char*); | ||
| 33 | extern long strlen(char*); | ||
| 34 | extern long strspn(char*, char*); | ||
| 35 | extern long strcspn(char*, char*); | ||
| 36 | extern char* strstr(char*, char*); | ||
| 37 | extern int cistrncmp(char*, char*, int); | ||
| 38 | extern int cistrcmp(char*, char*); | ||
| 39 | extern char* cistrstr(char*, char*); | ||
| 40 | extern int tokenize(char*, char**, int); | ||
| 41 | |||
| 42 | enum | ||
| 43 | { | ||
| 44 | UTFmax = 3, /* maximum bytes per rune */ | ||
| 45 | Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ | ||
| 46 | Runeself = 0x80, /* rune and UTF sequences are the same (<) */ | ||
| 47 | Runeerror = 0x80, /* decoding error in UTF */ | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* | ||
| 51 | * rune routines | ||
| 52 | */ | ||
| 53 | extern int runetochar(char*, Rune*); | ||
| 54 | extern int chartorune(Rune*, char*); | ||
| 55 | extern int runelen(long); | ||
| 56 | extern int runenlen(Rune*, int); | ||
| 57 | extern int fullrune(char*, int); | ||
| 58 | extern int utflen(char*); | ||
| 59 | extern int utfnlen(char*, long); | ||
| 60 | extern char* utfrune(char*, long); | ||
| 61 | extern char* utfrrune(char*, long); | ||
| 62 | extern char* utfutf(char*, char*); | ||
| 63 | extern char* utfecpy(char*, char*, char*); | ||
| 64 | |||
| 65 | extern Rune* runestrcat(Rune*, Rune*); | ||
| 66 | extern Rune* runestrchr(Rune*, Rune); | ||
| 67 | extern int runestrcmp(Rune*, Rune*); | ||
| 68 | extern Rune* runestrcpy(Rune*, Rune*); | ||
| 69 | extern Rune* runestrncpy(Rune*, Rune*, long); | ||
| 70 | extern Rune* runestrecpy(Rune*, Rune*, Rune*); | ||
| 71 | extern Rune* runestrdup(Rune*); | ||
| 72 | extern Rune* runestrncat(Rune*, Rune*, long); | ||
| 73 | extern int runestrncmp(Rune*, Rune*, long); | ||
| 74 | extern Rune* runestrrchr(Rune*, Rune); | ||
| 75 | extern long runestrlen(Rune*); | ||
| 76 | extern Rune* runestrstr(Rune*, Rune*); | ||
| 77 | |||
| 78 | extern Rune tolowerrune(Rune); | ||
| 79 | extern Rune totitlerune(Rune); | ||
| 80 | extern Rune toupperrune(Rune); | ||
| 81 | extern int isalpharune(Rune); | ||
| 82 | extern int islowerrune(Rune); | ||
| 83 | extern int isspacerune(Rune); | ||
| 84 | extern int istitlerune(Rune); | ||
| 85 | extern int isupperrune(Rune); | ||
| 86 | |||
| 87 | /* | ||
| 88 | * malloc | ||
| 89 | */ | ||
| 90 | extern void* malloc(ulong); | ||
| 91 | extern void* mallocz(ulong, int); | ||
| 92 | extern void free(void*); | ||
| 93 | extern ulong msize(void*); | ||
| 94 | extern void* calloc(ulong, ulong); | ||
| 95 | extern void* realloc(void*, ulong); | ||
| 96 | extern void setmalloctag(void*, ulong); | ||
| 97 | extern void setrealloctag(void*, ulong); | ||
| 98 | extern ulong getmalloctag(void*); | ||
| 99 | extern ulong getrealloctag(void*); | ||
| 100 | extern void* malloctopoolblock(void*); | ||
| 101 | |||
| 102 | /* | ||
| 103 | * print routines | ||
| 104 | */ | ||
| 105 | typedef struct Fmt Fmt; | ||
| 106 | struct Fmt{ | ||
| 107 | uchar runes; /* output buffer is runes or chars? */ | ||
| 108 | void *start; /* of buffer */ | ||
| 109 | void *to; /* current place in the buffer */ | ||
| 110 | void *stop; /* end of the buffer; overwritten if flush fails */ | ||
| 111 | int (*flush)(Fmt *); /* called when to == stop */ | ||
| 112 | void *farg; /* to make flush a closure */ | ||
| 113 | int nfmt; /* num chars formatted so far */ | ||
| 114 | va_list args; /* args passed to dofmt */ | ||
| 115 | int r; /* % format Rune */ | ||
| 116 | int width; | ||
| 117 | int prec; | ||
| 118 | ulong flags; | ||
| 119 | }; | ||
| 120 | |||
| 121 | enum{ | ||
| 122 | FmtWidth = 1, | ||
| 123 | FmtLeft = FmtWidth << 1, | ||
| 124 | FmtPrec = FmtLeft << 1, | ||
| 125 | FmtSharp = FmtPrec << 1, | ||
| 126 | FmtSpace = FmtSharp << 1, | ||
| 127 | FmtSign = FmtSpace << 1, | ||
| 128 | FmtZero = FmtSign << 1, | ||
| 129 | FmtUnsigned = FmtZero << 1, | ||
| 130 | FmtShort = FmtUnsigned << 1, | ||
| 131 | FmtLong = FmtShort << 1, | ||
| 132 | FmtVLong = FmtLong << 1, | ||
| 133 | FmtComma = FmtVLong << 1, | ||
| 134 | FmtByte = FmtComma << 1, | ||
| 135 | |||
| 136 | FmtFlag = FmtByte << 1 | ||
| 137 | }; | ||
| 138 | |||
| 139 | extern int print(char*, ...); | ||
| 140 | extern char* seprint(char*, char*, char*, ...); | ||
| 141 | extern char* vseprint(char*, char*, char*, va_list); | ||
| 142 | extern int snprint(char*, int, char*, ...); | ||
| 143 | extern int vsnprint(char*, int, char*, va_list); | ||
| 144 | extern char* smprint(char*, ...); | ||
| 145 | extern char* vsmprint(char*, va_list); | ||
| 146 | extern int sprint(char*, char*, ...); | ||
| 147 | extern int fprint(int, char*, ...); | ||
| 148 | extern int vfprint(int, char*, va_list); | ||
| 149 | |||
| 150 | extern int runesprint(Rune*, char*, ...); | ||
| 151 | extern int runesnprint(Rune*, int, char*, ...); | ||
| 152 | extern int runevsnprint(Rune*, int, char*, va_list); | ||
| 153 | extern Rune* runeseprint(Rune*, Rune*, char*, ...); | ||
| 154 | extern Rune* runevseprint(Rune*, Rune*, char*, va_list); | ||
| 155 | extern Rune* runesmprint(char*, ...); | ||
| 156 | extern Rune* runevsmprint(char*, va_list); | ||
| 157 | |||
| 158 | extern int fmtfdinit(Fmt*, int, char*, int); | ||
| 159 | extern int fmtfdflush(Fmt*); | ||
| 160 | extern int fmtstrinit(Fmt*); | ||
| 161 | extern char* fmtstrflush(Fmt*); | ||
| 162 | extern int runefmtstrinit(Fmt*); | ||
| 163 | extern Rune* runefmtstrflush(Fmt*); | ||
| 164 | |||
| 165 | #pragma varargck argpos fmtprint 2 | ||
| 166 | #pragma varargck argpos fprint 2 | ||
| 167 | #pragma varargck argpos print 1 | ||
| 168 | #pragma varargck argpos runeseprint 3 | ||
| 169 | #pragma varargck argpos runesmprint 1 | ||
| 170 | #pragma varargck argpos runesnprint 3 | ||
| 171 | #pragma varargck argpos runesprint 2 | ||
| 172 | #pragma varargck argpos seprint 3 | ||
| 173 | #pragma varargck argpos smprint 1 | ||
| 174 | #pragma varargck argpos snprint 3 | ||
| 175 | #pragma varargck argpos sprint 2 | ||
| 176 | #pragma varargck argpos vseprint 3 | ||
| 177 | #pragma varargck argpos vsnprint 3 | ||
| 178 | |||
| 179 | #pragma varargck type "lld" vlong | ||
| 180 | #pragma varargck type "llx" vlong | ||
| 181 | #pragma varargck type "lld" uvlong | ||
| 182 | #pragma varargck type "llx" uvlong | ||
| 183 | #pragma varargck type "ld" long | ||
| 184 | #pragma varargck type "lx" long | ||
| 185 | #pragma varargck type "ld" ulong | ||
| 186 | #pragma varargck type "lx" ulong | ||
| 187 | #pragma varargck type "d" int | ||
| 188 | #pragma varargck type "x" int | ||
| 189 | #pragma varargck type "c" int | ||
| 190 | #pragma varargck type "C" int | ||
| 191 | #pragma varargck type "d" uint | ||
| 192 | #pragma varargck type "x" uint | ||
| 193 | #pragma varargck type "c" uint | ||
| 194 | #pragma varargck type "C" uint | ||
| 195 | #pragma varargck type "f" double | ||
| 196 | #pragma varargck type "e" double | ||
| 197 | #pragma varargck type "g" double | ||
| 198 | #pragma varargck type "s" char* | ||
| 199 | #pragma varargck type "q" char* | ||
| 200 | #pragma varargck type "S" Rune* | ||
| 201 | #pragma varargck type "Q" Rune* | ||
| 202 | #pragma varargck type "r" void | ||
| 203 | #pragma varargck type "%" void | ||
| 204 | #pragma varargck type "n" int* | ||
| 205 | #pragma varargck type "p" void* | ||
| 206 | #pragma varargck flag ',' | ||
| 207 | #pragma varargck type "<" void* | ||
| 208 | #pragma varargck type "[" void* | ||
| 209 | #pragma varargck type "H" void* | ||
| 210 | |||
| 211 | extern int fmtinstall(int, int (*)(Fmt*)); | ||
| 212 | extern int dofmt(Fmt*, char*); | ||
| 213 | extern int dorfmt(Fmt*, Rune*); | ||
| 214 | extern int fmtprint(Fmt*, char*, ...); | ||
| 215 | extern int fmtvprint(Fmt*, char*, va_list); | ||
| 216 | extern int fmtrune(Fmt*, int); | ||
| 217 | extern int fmtstrcpy(Fmt*, char*); | ||
| 218 | extern int fmtrunestrcpy(Fmt*, Rune*); | ||
| 219 | /* | ||
| 220 | * error string for %r | ||
| 221 | * supplied on per os basis, not part of fmt library | ||
| 222 | */ | ||
| 223 | extern int errfmt(Fmt *f); | ||
| 224 | |||
| 225 | /* | ||
| 226 | * quoted strings | ||
| 227 | */ | ||
| 228 | extern char *unquotestrdup(char*); | ||
| 229 | extern Rune *unquoterunestrdup(Rune*); | ||
| 230 | extern char *quotestrdup(char*); | ||
| 231 | extern Rune *quoterunestrdup(Rune*); | ||
| 232 | extern int quotestrfmt(Fmt*); | ||
| 233 | extern int quoterunestrfmt(Fmt*); | ||
| 234 | extern void quotefmtinstall(void); | ||
| 235 | extern int (*doquote)(int); | ||
| 236 | |||
| 237 | /* | ||
| 238 | * random number | ||
| 239 | */ | ||
| 240 | extern void srand(long); | ||
| 241 | extern int rand(void); | ||
| 242 | extern int nrand(int); | ||
| 243 | extern long lrand(void); | ||
| 244 | extern long lnrand(long); | ||
| 245 | extern double frand(void); | ||
| 246 | extern ulong truerand(void); | ||
| 247 | extern ulong ntruerand(ulong); | ||
| 248 | |||
| 249 | /* | ||
| 250 | * math | ||
| 251 | */ | ||
| 252 | extern ulong getfcr(void); | ||
| 253 | extern void setfsr(ulong); | ||
| 254 | extern ulong getfsr(void); | ||
| 255 | extern void setfcr(ulong); | ||
| 256 | extern double NaN(void); | ||
| 257 | extern double Inf(int); | ||
| 258 | extern int isNaN(double); | ||
| 259 | extern int isInf(double, int); | ||
| 260 | |||
| 261 | extern double pow(double, double); | ||
| 262 | extern double atan2(double, double); | ||
| 263 | extern double fabs(double); | ||
| 264 | extern double atan(double); | ||
| 265 | extern double log(double); | ||
| 266 | extern double log10(double); | ||
| 267 | extern double exp(double); | ||
| 268 | extern double floor(double); | ||
| 269 | extern double ceil(double); | ||
| 270 | extern double hypot(double, double); | ||
| 271 | extern double sin(double); | ||
| 272 | extern double cos(double); | ||
| 273 | extern double tan(double); | ||
| 274 | extern double asin(double); | ||
| 275 | extern double acos(double); | ||
| 276 | extern double sinh(double); | ||
| 277 | extern double cosh(double); | ||
| 278 | extern double tanh(double); | ||
| 279 | extern double sqrt(double); | ||
| 280 | extern double fmod(double, double); | ||
| 281 | |||
| 282 | #define HUGE 3.4028234e38 | ||
| 283 | #define PIO2 1.570796326794896619231e0 | ||
| 284 | #define PI (PIO2+PIO2) | ||
| 285 | |||
| 286 | /* | ||
| 287 | * Time-of-day | ||
| 288 | */ | ||
| 289 | |||
| 290 | typedef | ||
| 291 | struct Tm | ||
| 292 | { | ||
| 293 | int sec; | ||
| 294 | int min; | ||
| 295 | int hour; | ||
| 296 | int mday; | ||
| 297 | int mon; | ||
| 298 | int year; | ||
| 299 | int wday; | ||
| 300 | int yday; | ||
| 301 | char zone[4]; | ||
| 302 | int tzoff; | ||
| 303 | } Tm; | ||
| 304 | |||
| 305 | extern Tm* gmtime(long); | ||
| 306 | extern Tm* localtime(long); | ||
| 307 | extern char* asctime(Tm*); | ||
| 308 | extern char* ctime(long); | ||
| 309 | extern double cputime(void); | ||
| 310 | extern long times(long*); | ||
| 311 | extern long tm2sec(Tm*); | ||
| 312 | extern vlong nsec(void); | ||
| 313 | |||
| 314 | /* | ||
| 315 | * one-of-a-kind | ||
| 316 | */ | ||
| 317 | enum | ||
| 318 | { | ||
| 319 | PNPROC = 1, | ||
| 320 | PNGROUP = 2, | ||
| 321 | }; | ||
| 322 | |||
| 323 | extern void _assert(char*); | ||
| 324 | extern int abs(int); | ||
| 325 | extern int atexit(void(*)(void)); | ||
| 326 | extern void atexitdont(void(*)(void)); | ||
| 327 | extern int atnotify(int(*)(void*, char*), int); | ||
| 328 | extern double atof(char*); | ||
| 329 | extern int atoi(char*); | ||
| 330 | extern long atol(char*); | ||
| 331 | extern double charstod(int(*)(void*), void*); | ||
| 332 | extern char* cleanname(char*); | ||
| 333 | extern int decrypt(void*, void*, int); | ||
| 334 | extern int encrypt(void*, void*, int); | ||
| 335 | extern int dec64(uchar*, int, char*, int); | ||
| 336 | extern int enc64(char*, int, uchar*, int); | ||
| 337 | extern int dec32(uchar*, int, char*, int); | ||
| 338 | extern int enc32(char*, int, uchar*, int); | ||
| 339 | extern int dec16(uchar*, int, char*, int); | ||
| 340 | extern int enc16(char*, int, uchar*, int); | ||
| 341 | extern int encodefmt(Fmt*); | ||
| 342 | extern void exits(char*); | ||
| 343 | extern double frexp(double, int*); | ||
| 344 | extern ulong getcallerpc(void*); | ||
| 345 | extern char* getenv(char*); | ||
| 346 | extern int getfields(char*, char**, int, int, char*); | ||
| 347 | extern char* getuser(void); | ||
| 348 | extern char* getwd(char*, int); | ||
| 349 | extern int iounit(int); | ||
| 350 | extern long labs(long); | ||
| 351 | extern double ldexp(double, int); | ||
| 352 | extern void longjmp(jmp_buf, int); | ||
| 353 | extern char* mktemp(char*); | ||
| 354 | extern double modf(double, double*); | ||
| 355 | extern int netcrypt(void*, void*); | ||
| 356 | extern void notejmp(void*, jmp_buf, int); | ||
| 357 | extern void perror(char*); | ||
| 358 | extern int postnote(int, int, char *); | ||
| 359 | extern double pow10(int); | ||
| 360 | extern double ipow10(int); | ||
| 361 | extern int putenv(char*, char*); | ||
| 362 | extern void qsort(void*, long, long, int (*)(void*, void*)); | ||
| 363 | extern void* sbrk(ulong); | ||
| 364 | extern int setjmp(jmp_buf); | ||
| 365 | extern double strtod(char*, char**); | ||
| 366 | extern long strtol(char*, char**, int); | ||
| 367 | extern ulong strtoul(char*, char**, int); | ||
| 368 | extern vlong strtoll(char*, char**, int); | ||
| 369 | extern uvlong strtoull(char*, char**, int); | ||
| 370 | extern void sysfatal(char*, ...); | ||
| 371 | #pragma varargck argpos sysfatal 1 | ||
| 372 | extern void syslog(int, char*, char*, ...); | ||
| 373 | #pragma varargck argpos syslog 3 | ||
| 374 | extern long time(long*); | ||
| 375 | extern int tolower(int); | ||
| 376 | extern int toupper(int); | ||
| 377 | |||
| 378 | /* | ||
| 379 | * synchronization | ||
| 380 | */ | ||
| 381 | typedef | ||
| 382 | struct Lock { | ||
| 383 | int val; | ||
| 384 | } Lock; | ||
| 385 | |||
| 386 | extern int _tas(int*); | ||
| 387 | |||
| 388 | extern void lock(Lock*); | ||
| 389 | extern void unlock(Lock*); | ||
| 390 | extern int canlock(Lock*); | ||
| 391 | |||
| 392 | typedef struct QLp QLp; | ||
| 393 | struct QLp | ||
| 394 | { | ||
| 395 | int inuse; | ||
| 396 | QLp *next; | ||
| 397 | char state; | ||
| 398 | }; | ||
| 399 | |||
| 400 | typedef | ||
| 401 | struct QLock | ||
| 402 | { | ||
| 403 | Lock lock; | ||
| 404 | int locked; | ||
| 405 | QLp *head; | ||
| 406 | QLp *tail; | ||
| 407 | } QLock; | ||
| 408 | |||
| 409 | extern void qlock(QLock*); | ||
| 410 | extern void qunlock(QLock*); | ||
| 411 | extern int canqlock(QLock*); | ||
| 412 | extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ | ||
| 413 | |||
| 414 | typedef | ||
| 415 | struct RWLock | ||
| 416 | { | ||
| 417 | Lock lock; | ||
| 418 | int readers; /* number of readers */ | ||
| 419 | int writer; /* number of writers */ | ||
| 420 | QLp *head; /* list of waiting processes */ | ||
| 421 | QLp *tail; | ||
| 422 | } RWLock; | ||
| 423 | |||
| 424 | extern int canrlock(RWLock*); | ||
| 425 | extern int canwlock(RWLock*); | ||
| 426 | extern void rlock(RWLock*); | ||
| 427 | extern void runlock(RWLock*); | ||
| 428 | extern void wlock(RWLock*); | ||
| 429 | extern void wunlock(RWLock*); | ||
| 430 | |||
| 431 | extern void** privalloc(void); | ||
| 432 | extern void privfree(void**); | ||
| 433 | |||
| 434 | /* | ||
| 435 | * network dialing | ||
| 436 | */ | ||
| 437 | #define NETPATHLEN 40 | ||
| 438 | extern int accept(int, char*); | ||
| 439 | extern int announce(char*, char*); | ||
| 440 | extern int dial(char*, char*, char*, int*); | ||
| 441 | extern void setnetmtpt(char*, int, char*); | ||
| 442 | extern int hangup(int); | ||
| 443 | extern int listen(char*, char*); | ||
| 444 | extern char* netmkaddr(char*, char*, char*); | ||
| 445 | extern int reject(int, char*, char*); | ||
| 446 | |||
| 447 | /* | ||
| 448 | * system calls | ||
| 449 | * | ||
| 450 | */ | ||
| 451 | #define STATMAX 65535U /* max length of machine-independent stat structure */ | ||
| 452 | #define DIRMAX (sizeof(Dir)+STATMAX) /* max length of Dir structure */ | ||
| 453 | #define ERRMAX 128 /* max length of error string */ | ||
| 454 | |||
| 455 | #define MORDER 0x0003 /* mask for bits defining order of mounting */ | ||
| 456 | #define MREPL 0x0000 /* mount replaces object */ | ||
| 457 | #define MBEFORE 0x0001 /* mount goes before others in union directory */ | ||
| 458 | #define MAFTER 0x0002 /* mount goes after others in union directory */ | ||
| 459 | #define MCREATE 0x0004 /* permit creation in mounted directory */ | ||
| 460 | #define MCACHE 0x0010 /* cache some data */ | ||
| 461 | #define MMASK 0x0017 /* all bits on */ | ||
| 462 | |||
| 463 | #define OREAD 0 /* open for read */ | ||
| 464 | #define OWRITE 1 /* write */ | ||
| 465 | #define ORDWR 2 /* read and write */ | ||
| 466 | #define OEXEC 3 /* execute, == read but check execute permission */ | ||
| 467 | #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ | ||
| 468 | #define OCEXEC 32 /* or'ed in, close on exec */ | ||
| 469 | #define ORCLOSE 64 /* or'ed in, remove on close */ | ||
| 470 | #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ | ||
| 471 | |||
| 472 | #define AEXIST 0 /* accessible: exists */ | ||
| 473 | #define AEXEC 1 /* execute access */ | ||
| 474 | #define AWRITE 2 /* write access */ | ||
| 475 | #define AREAD 4 /* read access */ | ||
| 476 | |||
| 477 | |||
| 478 | /* Segattch */ | ||
| 479 | #define SG_RONLY 0040 /* read only */ | ||
| 480 | #define SG_CEXEC 0100 /* detach on exec */ | ||
| 481 | |||
| 482 | #define NCONT 0 /* continue after note */ | ||
| 483 | #define NDFLT 1 /* terminate after note */ | ||
| 484 | #define NSAVE 2 /* clear note but hold state */ | ||
| 485 | #define NRSTR 3 /* restore saved state */ | ||
| 486 | |||
| 487 | /* rfork */ | ||
| 488 | enum | ||
| 489 | { | ||
| 490 | RFNAMEG = (1<<0), | ||
| 491 | RFENVG = (1<<1), | ||
| 492 | RFFDG = (1<<2), | ||
| 493 | RFNOTEG = (1<<3), | ||
| 494 | RFPROC = (1<<4), | ||
| 495 | RFMEM = (1<<5), | ||
| 496 | RFNOWAIT = (1<<6), | ||
| 497 | RFCNAMEG = (1<<10), | ||
| 498 | RFCENVG = (1<<11), | ||
| 499 | RFCFDG = (1<<12), | ||
| 500 | RFREND = (1<<13), | ||
| 501 | RFNOMNT = (1<<14) | ||
| 502 | }; | ||
| 503 | |||
| 504 | /* bits in Qid.type */ | ||
| 505 | #define QTDIR 0x80 /* type bit for directories */ | ||
| 506 | #define QTAPPEND 0x40 /* type bit for append only files */ | ||
| 507 | #define QTEXCL 0x20 /* type bit for exclusive use files */ | ||
| 508 | #define QTMOUNT 0x10 /* type bit for mounted channel */ | ||
| 509 | #define QTAUTH 0x08 /* type bit for authentication file */ | ||
| 510 | #define QTFILE 0x00 /* plain file */ | ||
| 511 | |||
| 512 | /* bits in Dir.mode */ | ||
| 513 | #define DMDIR 0x80000000 /* mode bit for directories */ | ||
| 514 | #define DMAPPEND 0x40000000 /* mode bit for append only files */ | ||
| 515 | #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ | ||
| 516 | #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ | ||
| 517 | #define DMAUTH 0x08000000 /* mode bit for authentication file */ | ||
| 518 | #define DMREAD 0x4 /* mode bit for read permission */ | ||
| 519 | #define DMWRITE 0x2 /* mode bit for write permission */ | ||
| 520 | #define DMEXEC 0x1 /* mode bit for execute permission */ | ||
| 521 | |||
| 522 | typedef | ||
| 523 | struct Qid | ||
| 524 | { | ||
| 525 | uvlong path; | ||
| 526 | ulong vers; | ||
| 527 | uchar type; | ||
| 528 | } Qid; | ||
| 529 | |||
| 530 | typedef | ||
| 531 | struct Dir { | ||
| 532 | /* system-modified data */ | ||
| 533 | ushort type; /* server type */ | ||
| 534 | uint dev; /* server subtype */ | ||
| 535 | /* file data */ | ||
| 536 | Qid qid; /* unique id from server */ | ||
| 537 | ulong mode; /* permissions */ | ||
| 538 | ulong atime; /* last read time */ | ||
| 539 | ulong mtime; /* last write time */ | ||
| 540 | vlong length; /* file length */ | ||
| 541 | char *name; /* last element of path */ | ||
| 542 | char *uid; /* owner name */ | ||
| 543 | char *gid; /* group name */ | ||
| 544 | char *muid; /* last modifier name */ | ||
| 545 | } Dir; | ||
| 546 | |||
| 547 | extern Dir* dirstat(char*); | ||
| 548 | extern Dir* dirfstat(int); | ||
| 549 | extern int dirwstat(char*, Dir*); | ||
| 550 | extern int dirfwstat(int, Dir*); | ||
| 551 | extern long dirread(int, Dir**); | ||
| 552 | extern void nulldir(Dir*); | ||
| 553 | extern long dirreadall(int, Dir**); | ||
| 554 | |||
| 555 | typedef | ||
| 556 | struct Waitmsg | ||
| 557 | { | ||
| 558 | int pid; /* of loved one */ | ||
| 559 | ulong time[3]; /* of loved one & descendants */ | ||
| 560 | char *msg; | ||
| 561 | } Waitmsg; | ||
| 562 | |||
| 563 | typedef | ||
| 564 | struct IOchunk | ||
| 565 | { | ||
| 566 | void *addr; | ||
| 567 | ulong len; | ||
| 568 | } IOchunk; | ||
| 569 | |||
| 570 | extern void _exits(char*); | ||
| 571 | |||
| 572 | extern void abort(void); | ||
| 573 | extern int access(char*, int); | ||
| 574 | extern long alarm(ulong); | ||
| 575 | extern int await(char*, int); | ||
| 576 | extern int bind(char*, char*, int); | ||
| 577 | extern int brk(void*); | ||
| 578 | extern int chdir(char*); | ||
| 579 | extern int close(int); | ||
| 580 | extern int create(char*, int, ulong); | ||
| 581 | extern int dup(int, int); | ||
| 582 | extern int errstr(char*, uint); | ||
| 583 | extern int exec(char*, char*[]); | ||
| 584 | extern int execl(char*, ...); | ||
| 585 | extern int fork(void); | ||
| 586 | extern int rfork(int); | ||
| 587 | extern int fauth(int, char*); | ||
| 588 | extern int fstat(int, uchar*, int); | ||
| 589 | extern int fwstat(int, uchar*, int); | ||
| 590 | extern int fversion(int, int, char*, int); | ||
| 591 | extern int mount(int, int, char*, int, char*); | ||
| 592 | extern int unmount(char*, char*); | ||
| 593 | extern int noted(int); | ||
| 594 | extern int notify(void(*)(void*, char*)); | ||
| 595 | extern int open(char*, int); | ||
| 596 | extern int fd2path(int, char*, int); | ||
| 597 | extern int pipe(int*); | ||
| 598 | extern long pread(int, void*, long, vlong); | ||
| 599 | extern long preadv(int, IOchunk*, int, vlong); | ||
| 600 | extern long pwrite(int, void*, long, vlong); | ||
| 601 | extern long pwritev(int, IOchunk*, int, vlong); | ||
| 602 | extern long read(int, void*, long); | ||
| 603 | extern long readn(int, void*, long); | ||
| 604 | extern long readv(int, IOchunk*, int); | ||
| 605 | extern int remove(char*); | ||
| 606 | extern void* sbrk(ulong); | ||
| 607 | extern long oseek(int, long, int); | ||
| 608 | extern vlong seek(int, vlong, int); | ||
| 609 | extern long segattach(int, char*, void*, ulong); | ||
| 610 | extern int segbrk(void*, void*); | ||
| 611 | extern int segdetach(void*); | ||
| 612 | extern int segflush(void*, ulong); | ||
| 613 | extern int segfree(void*, ulong); | ||
| 614 | extern int sleep(long); | ||
| 615 | extern int stat(char*, uchar*, int); | ||
| 616 | extern Waitmsg* wait(void); | ||
| 617 | extern int waitpid(void); | ||
| 618 | extern long write(int, void*, long); | ||
| 619 | extern long writev(int, IOchunk*, int); | ||
| 620 | extern int wstat(char*, uchar*, int); | ||
| 621 | extern void* rendezvous(void*, void*); | ||
| 622 | |||
| 623 | extern int getpid(void); | ||
| 624 | extern int getppid(void); | ||
| 625 | extern void rerrstr(char*, uint); | ||
| 626 | extern char* sysname(void); | ||
| 627 | extern void werrstr(char*, ...); | ||
| 628 | #pragma varargck argpos werrstr 1 | ||
| 629 | |||
| 630 | extern char *argv0; | ||
| 631 | #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\ | ||
| 632 | argv[0] && argv[0][0]=='-' && argv[0][1];\ | ||
| 633 | argc--, argv++) {\ | ||
| 634 | char *_args, *_argt;\ | ||
| 635 | Rune _argc;\ | ||
| 636 | _args = &argv[0][1];\ | ||
| 637 | if(_args[0]=='-' && _args[1]==0){\ | ||
| 638 | argc--; argv++; break;\ | ||
| 639 | }\ | ||
| 640 | _argc = 0;\ | ||
| 641 | while(*_args && (_args += chartorune(&_argc, _args)))\ | ||
| 642 | switch(_argc) | ||
| 643 | #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); | ||
| 644 | #define ARGF() (_argt=_args, _args="",\ | ||
| 645 | (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) | ||
| 646 | #define EARGF(x) (_argt=_args, _args="",\ | ||
| 647 | (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0))) | ||
| 648 | |||
| 649 | #define ARGC() _argc | ||
| 650 | |||
| 651 | /* | ||
| 652 | * Extensions for Inferno to basic libc.h | ||
| 653 | */ | ||
| 654 | |||
| 655 | #define setbinmode() | ||
| 656 | #undef __LITTLE_ENDIAN | ||
| 657 | |||
| 658 | /* | ||
| 659 | * Extensions for emu kernel emulation | ||
| 660 | */ | ||
| 661 | #ifdef EMU | ||
| 662 | |||
| 663 | extern Proc** Xup; | ||
| 664 | #define up (*Xup) | ||
| 665 | |||
| 666 | typedef struct FPU FPU; | ||
| 667 | |||
| 668 | /* | ||
| 669 | * This structure must agree with FPsave and FPrestore asm routines | ||
| 670 | */ | ||
| 671 | struct FPU | ||
| 672 | { | ||
| 673 | ulong fsr; | ||
| 674 | }; | ||
| 675 | |||
| 676 | typedef jmp_buf osjmpbuf; | ||
| 677 | #define ossetjmp(buf) setjmp(buf) | ||
| 678 | |||
| 679 | #endif | ||
| @@ -0,0 +1,17 @@ | |||
| 1 | /* | ||
| 2 | * Solaris 2.5/sparc | ||
| 3 | */ | ||
| 4 | |||
| 5 | /* | ||
| 6 | * This structure must agree with FPsave and FPrestore asm routines | ||
| 7 | */ | ||
| 8 | typedef struct FPU FPU; | ||
| 9 | struct FPU | ||
| 10 | { | ||
| 11 | ulong fsr; | ||
| 12 | }; | ||
| 13 | |||
| 14 | extern Proc *getup(); | ||
| 15 | #define up (getup()) | ||
| 16 | |||
| 17 | #define BIGEND | ||
| @@ -0,0 +1,64 @@ | |||
| 1 | #define nil ((void*)0) | ||
| 2 | typedef unsigned short ushort; | ||
| 3 | typedef unsigned char uchar; | ||
| 4 | typedef unsigned long ulong; | ||
| 5 | typedef unsigned int uint; | ||
| 6 | typedef signed char schar; | ||
| 7 | typedef long long vlong; | ||
| 8 | typedef unsigned long long uvlong; | ||
| 9 | typedef unsigned long uintptr; | ||
| 10 | typedef ushort Rune; | ||
| 11 | typedef union FPdbleword FPdbleword; | ||
| 12 | typedef long jmp_buf[2]; | ||
| 13 | #define JMPBUFSP 0 | ||
| 14 | #define JMPBUFPC 1 | ||
| 15 | #define JMPBUFDPC (-8) | ||
| 16 | typedef unsigned int mpdigit; /* for /sys/include/mp.h */ | ||
| 17 | typedef unsigned char u8int; | ||
| 18 | typedef unsigned short u16int; | ||
| 19 | typedef unsigned int u32int; | ||
| 20 | typedef unsigned long long u64int; | ||
| 21 | |||
| 22 | /* FCR */ | ||
| 23 | #define FPINEX (1<<23) | ||
| 24 | #define FPOVFL (1<<26) | ||
| 25 | #define FPUNFL (1<<25) | ||
| 26 | #define FPZDIV (1<<24) | ||
| 27 | #define FPRNR (0<<30) | ||
| 28 | #define FPRZ (1<<30) | ||
| 29 | #define FPINVAL (1<<27) | ||
| 30 | #define FPRPINF (2<<30) | ||
| 31 | #define FPRNINF (3<<30) | ||
| 32 | #define FPRMASK (3<<30) | ||
| 33 | #define FPPEXT 0 | ||
| 34 | #define FPPSGL 0 | ||
| 35 | #define FPPDBL 0 | ||
| 36 | #define FPPMASK 0 | ||
| 37 | /* FSR */ | ||
| 38 | #define FPAINEX (1<<5) | ||
| 39 | #define FPAZDIV (1<<6) | ||
| 40 | #define FPAUNFL (1<<7) | ||
| 41 | #define FPAOVFL (1<<8) | ||
| 42 | #define FPAINVAL (1<<9) | ||
| 43 | union FPdbleword | ||
| 44 | { | ||
| 45 | double x; | ||
| 46 | struct { /* big endian */ | ||
| 47 | ulong hi; | ||
| 48 | ulong lo; | ||
| 49 | }; | ||
| 50 | }; | ||
| 51 | |||
| 52 | typedef char* va_list; | ||
| 53 | #define va_start(list, start) list =\ | ||
| 54 | (sizeof(start) < 4?\ | ||
| 55 | (char*)((int*)&(start)+1):\ | ||
| 56 | (char*)(&(start)+1)) | ||
| 57 | #define va_end(list)\ | ||
| 58 | USED(list) | ||
| 59 | #define va_arg(list, mode)\ | ||
| 60 | ((sizeof(mode) == 1)?\ | ||
| 61 | ((mode*)(list += 4))[-1]:\ | ||
| 62 | (sizeof(mode) == 2)?\ | ||
| 63 | ((mode*)(list += 4))[-1]:\ | ||
| 64 | ((mode*)(list += sizeof(mode)))[-1]) | ||