13e12c5d1SDavid du Colombier #pragma lib "libc.a" 2*219b2ee8SDavid du Colombier #pragma src "/sys/src/libc" 3*219b2ee8SDavid du Colombier 4*219b2ee8SDavid du Colombier #define nelem(x) (sizeof(x)/sizeof((x)[0])) 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier /* 73e12c5d1SDavid du Colombier * mem routines 83e12c5d1SDavid du Colombier */ 93e12c5d1SDavid du Colombier extern void* memccpy(void*, void*, int, ulong); 103e12c5d1SDavid du Colombier extern void* memset(void*, int, ulong); 113e12c5d1SDavid du Colombier extern int memcmp(void*, void*, ulong); 123e12c5d1SDavid du Colombier extern void* memcpy(void*, void*, ulong); 133e12c5d1SDavid du Colombier extern void* memmove(void*, void*, ulong); 143e12c5d1SDavid du Colombier extern void* memchr(void*, int, ulong); 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier /* 173e12c5d1SDavid du Colombier * string routines 183e12c5d1SDavid du Colombier */ 193e12c5d1SDavid du Colombier extern char* strcat(char*, char*); 203e12c5d1SDavid du Colombier extern char* strchr(char*, char); 213e12c5d1SDavid du Colombier extern int strcmp(char*, char*); 223e12c5d1SDavid du Colombier extern char* strcpy(char*, char*); 233e12c5d1SDavid du Colombier extern char* strdup(char*); 243e12c5d1SDavid du Colombier extern char* strncat(char*, char*, long); 253e12c5d1SDavid du Colombier extern char* strncpy(char*, char*, long); 263e12c5d1SDavid du Colombier extern int strncmp(char*, char*, long); 273e12c5d1SDavid du Colombier extern char* strpbrk(char*, char*); 283e12c5d1SDavid du Colombier extern char* strrchr(char*, char); 293e12c5d1SDavid du Colombier extern char* strtok(char*, char*); 303e12c5d1SDavid du Colombier extern long strlen(char*); 313e12c5d1SDavid du Colombier extern long strspn(char*, char*); 323e12c5d1SDavid du Colombier extern long strcspn(char*, char*); 333e12c5d1SDavid du Colombier extern char* strstr(char*, char*); 34*219b2ee8SDavid du Colombier extern int tokenize(char*, char**, int); 353e12c5d1SDavid du Colombier 363e12c5d1SDavid du Colombier enum 373e12c5d1SDavid du Colombier { 383e12c5d1SDavid du Colombier UTFmax = 3, /* maximum bytes per rune */ 393e12c5d1SDavid du Colombier Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 403e12c5d1SDavid du Colombier Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 413e12c5d1SDavid du Colombier Runeerror = 0x80, /* decoding error in UTF */ 423e12c5d1SDavid du Colombier }; 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier /* 453e12c5d1SDavid du Colombier * new rune routines 463e12c5d1SDavid du Colombier */ 473e12c5d1SDavid du Colombier extern int runetochar(char*, Rune*); 483e12c5d1SDavid du Colombier extern int chartorune(Rune*, char*); 493e12c5d1SDavid du Colombier extern int runelen(long); 503e12c5d1SDavid du Colombier extern int fullrune(char*, int); 513e12c5d1SDavid du Colombier 523e12c5d1SDavid du Colombier /* 533e12c5d1SDavid du Colombier * rune routines from converted str routines 543e12c5d1SDavid du Colombier */ 553e12c5d1SDavid du Colombier extern int utflen(char*); 563e12c5d1SDavid du Colombier extern char* utfrune(char*, long); 573e12c5d1SDavid du Colombier extern char* utfrrune(char*, long); 583e12c5d1SDavid du Colombier extern char* utfutf(char*, char*); 593e12c5d1SDavid du Colombier 603e12c5d1SDavid du Colombier /* 613e12c5d1SDavid du Colombier * malloc 623e12c5d1SDavid du Colombier */ 633e12c5d1SDavid du Colombier extern void* malloc(long); 643e12c5d1SDavid du Colombier extern void free(void*); 653e12c5d1SDavid du Colombier extern void* calloc(long, long); 663e12c5d1SDavid du Colombier extern void* realloc(void*, long); 673e12c5d1SDavid du Colombier 683e12c5d1SDavid du Colombier /* 693e12c5d1SDavid du Colombier * print routines 703e12c5d1SDavid du Colombier */ 71bd389b36SDavid du Colombier typedef struct Fconv Fconv; 72bd389b36SDavid du Colombier struct Fconv 73bd389b36SDavid du Colombier { 74bd389b36SDavid du Colombier char* out; /* pointer to next output */ 75bd389b36SDavid du Colombier char* eout; /* pointer to end */ 76bd389b36SDavid du Colombier int f1; 77bd389b36SDavid du Colombier int f2; 78bd389b36SDavid du Colombier int f3; 79bd389b36SDavid du Colombier int chr; 80bd389b36SDavid du Colombier }; 813e12c5d1SDavid du Colombier extern char* doprint(char*, char*, char*, void*); 823e12c5d1SDavid du Colombier extern int print(char*, ...); 83bd389b36SDavid du Colombier extern int snprint(char*, int, char*, ...); 843e12c5d1SDavid du Colombier extern int sprint(char*, char*, ...); 853e12c5d1SDavid du Colombier extern int fprint(int, char*, ...); 863e12c5d1SDavid du Colombier 87bd389b36SDavid du Colombier extern int fmtinstall(int, int (*)(void*, Fconv*)); 88bd389b36SDavid du Colombier extern int numbconv(void*, Fconv*); 89bd389b36SDavid du Colombier extern void strconv(char*, Fconv*); 90bd389b36SDavid du Colombier extern int fltconv(void*, Fconv*); 913e12c5d1SDavid du Colombier /* 923e12c5d1SDavid du Colombier * random number 933e12c5d1SDavid du Colombier */ 943e12c5d1SDavid du Colombier extern void srand(long); 953e12c5d1SDavid du Colombier extern int rand(void); 963e12c5d1SDavid du Colombier extern int nrand(int); 973e12c5d1SDavid du Colombier extern long lrand(void); 983e12c5d1SDavid du Colombier extern long lnrand(long); 993e12c5d1SDavid du Colombier extern double frand(void); 1003e12c5d1SDavid du Colombier 1013e12c5d1SDavid du Colombier /* 1023e12c5d1SDavid du Colombier * math 1033e12c5d1SDavid du Colombier */ 1043e12c5d1SDavid du Colombier extern ulong getfcr(void); 1053e12c5d1SDavid du Colombier extern void setfsr(ulong); 1063e12c5d1SDavid du Colombier extern ulong getfsr(void); 1073e12c5d1SDavid du Colombier extern void setfcr(ulong); 1083e12c5d1SDavid du Colombier extern double NaN(void); 1093e12c5d1SDavid du Colombier extern double Inf(int); 1103e12c5d1SDavid du Colombier extern int isNaN(double); 1113e12c5d1SDavid du Colombier extern int isInf(double, int); 1123e12c5d1SDavid du Colombier 1133e12c5d1SDavid du Colombier extern double pow(double, double); 1143e12c5d1SDavid du Colombier extern double atan2(double, double); 1153e12c5d1SDavid du Colombier extern double fabs(double); 1163e12c5d1SDavid du Colombier extern double atan(double); 1173e12c5d1SDavid du Colombier extern double log(double); 1183e12c5d1SDavid du Colombier extern double log10(double); 1193e12c5d1SDavid du Colombier extern double exp(double); 1203e12c5d1SDavid du Colombier extern double floor(double); 1213e12c5d1SDavid du Colombier extern double ceil(double); 1223e12c5d1SDavid du Colombier extern double hypot(double, double); 1233e12c5d1SDavid du Colombier extern double sin(double); 1243e12c5d1SDavid du Colombier extern double cos(double); 1253e12c5d1SDavid du Colombier extern double tan(double); 1263e12c5d1SDavid du Colombier extern double asin(double); 1273e12c5d1SDavid du Colombier extern double acos(double); 1283e12c5d1SDavid du Colombier extern double sinh(double); 1293e12c5d1SDavid du Colombier extern double cosh(double); 1303e12c5d1SDavid du Colombier extern double tanh(double); 1313e12c5d1SDavid du Colombier extern double sqrt(double); 1323e12c5d1SDavid du Colombier extern double fmod(double, double); 1333e12c5d1SDavid du Colombier 1343e12c5d1SDavid du Colombier #define HUGE 3.4028234e38 1353e12c5d1SDavid du Colombier #define PIO2 1.570796326794896619231e0 1363e12c5d1SDavid du Colombier #define PI (PIO2+PIO2) 1373e12c5d1SDavid du Colombier 1383e12c5d1SDavid du Colombier /* 1393e12c5d1SDavid du Colombier * Time-of-day 1403e12c5d1SDavid du Colombier */ 1413e12c5d1SDavid du Colombier 1423e12c5d1SDavid du Colombier typedef 1433e12c5d1SDavid du Colombier struct Tm 1443e12c5d1SDavid du Colombier { 1453e12c5d1SDavid du Colombier int sec; 1463e12c5d1SDavid du Colombier int min; 1473e12c5d1SDavid du Colombier int hour; 1483e12c5d1SDavid du Colombier int mday; 1493e12c5d1SDavid du Colombier int mon; 1503e12c5d1SDavid du Colombier int year; 1513e12c5d1SDavid du Colombier int wday; 1523e12c5d1SDavid du Colombier int yday; 1533e12c5d1SDavid du Colombier char zone[4]; 1543e12c5d1SDavid du Colombier } Tm; 1553e12c5d1SDavid du Colombier 1563e12c5d1SDavid du Colombier extern Tm* gmtime(long); 1573e12c5d1SDavid du Colombier extern Tm* localtime(long); 1583e12c5d1SDavid du Colombier extern char* asctime(Tm*); 1593e12c5d1SDavid du Colombier extern char* ctime(long); 1603e12c5d1SDavid du Colombier extern double cputime(void); 1613e12c5d1SDavid du Colombier extern long times(long*); 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier /* 1643e12c5d1SDavid du Colombier * one-of-a-kind 1653e12c5d1SDavid du Colombier */ 166*219b2ee8SDavid du Colombier enum 167*219b2ee8SDavid du Colombier { 168*219b2ee8SDavid du Colombier PNPROC = 1, 169*219b2ee8SDavid du Colombier PNGROUP = 2, 170*219b2ee8SDavid du Colombier }; 1713e12c5d1SDavid du Colombier 1723e12c5d1SDavid du Colombier extern int abs(int); 1733e12c5d1SDavid du Colombier extern int atexit(void(*)(void)); 1743e12c5d1SDavid du Colombier extern void atexitdont(void(*)(void)); 1753e12c5d1SDavid du Colombier extern int atnotify(int(*)(void*, char*), int); 1763e12c5d1SDavid du Colombier extern double atof(char*); 1773e12c5d1SDavid du Colombier extern int atoi(char*); 1783e12c5d1SDavid du Colombier extern long atol(char*); 1793e12c5d1SDavid du Colombier extern double charstod(int(*)(void*), void*); 1803e12c5d1SDavid du Colombier extern int decrypt(void*, void*, int); 1813e12c5d1SDavid du Colombier extern int encrypt(void*, void*, int); 1823e12c5d1SDavid du Colombier extern void exits(char*); 1833e12c5d1SDavid du Colombier extern double frexp(double, int*); 1843e12c5d1SDavid du Colombier extern char* getenv(char*); 1853e12c5d1SDavid du Colombier extern int getfields(char*, char**, int); 1863e12c5d1SDavid du Colombier extern int getmfields(char*, char**, int); 1873e12c5d1SDavid du Colombier extern char* getuser(void); 1883e12c5d1SDavid du Colombier extern char* getwd(char*, int); 1893e12c5d1SDavid du Colombier extern long labs(long); 1903e12c5d1SDavid du Colombier extern double ldexp(double, int); 1913e12c5d1SDavid du Colombier extern void longjmp(jmp_buf, int); 1923e12c5d1SDavid du Colombier extern char* mktemp(char*); 1933e12c5d1SDavid du Colombier extern double modf(double, double*); 1943e12c5d1SDavid du Colombier extern int netcrypt(void*, void*); 1953e12c5d1SDavid du Colombier extern void notejmp(void*, jmp_buf, int); 1963e12c5d1SDavid du Colombier extern void perror(char*); 197*219b2ee8SDavid du Colombier extern int postnote(int, int, char *); 1983e12c5d1SDavid du Colombier extern double pow10(int); 1993e12c5d1SDavid du Colombier extern int putenv(char*, char*); 2003e12c5d1SDavid du Colombier extern void qsort(void*, long, long, int (*)(void*, void*)); 2013e12c5d1SDavid du Colombier extern char* setfields(char*); 2023e12c5d1SDavid du Colombier extern int setjmp(jmp_buf); 2033e12c5d1SDavid du Colombier extern double strtod(char*, char**); 2043e12c5d1SDavid du Colombier extern long strtol(char*, char**, int); 2053e12c5d1SDavid du Colombier extern ulong strtoul(char*, char**, int); 2063e12c5d1SDavid du Colombier extern void syslog(int, char*, char*, ...); 2073e12c5d1SDavid du Colombier extern long time(long*); 2083e12c5d1SDavid du Colombier extern int tolower(int); 2093e12c5d1SDavid du Colombier extern int toupper(int); 2103e12c5d1SDavid du Colombier 2113e12c5d1SDavid du Colombier 2123e12c5d1SDavid du Colombier /* 2133e12c5d1SDavid du Colombier * network dialing and authentication 2143e12c5d1SDavid du Colombier */ 2153e12c5d1SDavid du Colombier #define NETPATHLEN 40 2163e12c5d1SDavid du Colombier extern int accept(int, char*); 2173e12c5d1SDavid du Colombier extern int announce(char*, char*); 2183e12c5d1SDavid du Colombier extern int dial(char*, char*, char*, int*); 2193e12c5d1SDavid du Colombier extern int hangup(int); 2203e12c5d1SDavid du Colombier extern int listen(char*, char*); 2213e12c5d1SDavid du Colombier extern char* netmkaddr(char*, char*, char*); 2223e12c5d1SDavid du Colombier extern int reject(int, char*, char*); 2233e12c5d1SDavid du Colombier 2243e12c5d1SDavid du Colombier /* 2253e12c5d1SDavid du Colombier * system calls 2263e12c5d1SDavid du Colombier * 2273e12c5d1SDavid du Colombier */ 2283e12c5d1SDavid du Colombier #define NAMELEN 28 /* length of path element, including '\0' */ 2293e12c5d1SDavid du Colombier #define DIRLEN 116 /* length of machine-independent Dir structure */ 2303e12c5d1SDavid du Colombier #define ERRLEN 64 /* length of error string */ 2313e12c5d1SDavid du Colombier 2323e12c5d1SDavid du Colombier #define MORDER 0x0003 /* mask for bits defining order of mounting */ 2333e12c5d1SDavid du Colombier #define MREPL 0x0000 /* mount replaces object */ 2343e12c5d1SDavid du Colombier #define MBEFORE 0x0001 /* mount goes before others in union directory */ 2353e12c5d1SDavid du Colombier #define MAFTER 0x0002 /* mount goes after others in union directory */ 2363e12c5d1SDavid du Colombier #define MCREATE 0x0004 /* permit creation in mounted directory */ 2373e12c5d1SDavid du Colombier #define MMASK 0x0007 /* all bits on */ 2383e12c5d1SDavid du Colombier 2393e12c5d1SDavid du Colombier #define OREAD 0 /* open for read */ 2403e12c5d1SDavid du Colombier #define OWRITE 1 /* write */ 2413e12c5d1SDavid du Colombier #define ORDWR 2 /* read and write */ 2423e12c5d1SDavid du Colombier #define OEXEC 3 /* execute, == read but check execute permission */ 2433e12c5d1SDavid du Colombier #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 2443e12c5d1SDavid du Colombier #define OCEXEC 32 /* or'ed in, close on exec */ 2453e12c5d1SDavid du Colombier #define ORCLOSE 64 /* or'ed in, remove on close */ 2463e12c5d1SDavid du Colombier 247*219b2ee8SDavid du Colombier /* Segattch */ 248*219b2ee8SDavid du Colombier #define SG_RONLY 0040 /* read only */ 249*219b2ee8SDavid du Colombier #define SG_CEXEC 0100 /* detach on exec */ 250*219b2ee8SDavid du Colombier 2513e12c5d1SDavid du Colombier #define NCONT 0 /* continue after note */ 2523e12c5d1SDavid du Colombier #define NDFLT 1 /* terminate after note */ 253*219b2ee8SDavid du Colombier #define NSAVE 2 /* clear note but hold state */ 254*219b2ee8SDavid du Colombier #define NRSTR 3 /* restore saved state */ 2553e12c5d1SDavid du Colombier 2563e12c5d1SDavid du Colombier #define CHDIR 0x80000000 /* mode bit for directories */ 2573e12c5d1SDavid du Colombier #define CHAPPEND 0x40000000 /* mode bit for append only files */ 2583e12c5d1SDavid du Colombier #define CHEXCL 0x20000000 /* mode bit for exclusive use files */ 259*219b2ee8SDavid du Colombier #define CHMOUNT 0x10000000 /* mode bit for mounted channel */ 2603e12c5d1SDavid du Colombier #define CHREAD 0x4 /* mode bit for read permission */ 2613e12c5d1SDavid du Colombier #define CHWRITE 0x2 /* mode bit for write permission */ 2623e12c5d1SDavid du Colombier #define CHEXEC 0x1 /* mode bit for execute permission */ 2633e12c5d1SDavid du Colombier 2643e12c5d1SDavid du Colombier /* rfork */ 2653e12c5d1SDavid du Colombier enum 2663e12c5d1SDavid du Colombier { 2673e12c5d1SDavid du Colombier RFNAMEG = (1<<0), 2683e12c5d1SDavid du Colombier RFENVG = (1<<1), 2693e12c5d1SDavid du Colombier RFFDG = (1<<2), 2703e12c5d1SDavid du Colombier RFNOTEG = (1<<3), 2713e12c5d1SDavid du Colombier RFPROC = (1<<4), 2723e12c5d1SDavid du Colombier RFMEM = (1<<5), 2733e12c5d1SDavid du Colombier RFNOWAIT = (1<<6), 2743e12c5d1SDavid du Colombier RFCNAMEG = (1<<10), 2753e12c5d1SDavid du Colombier RFCENVG = (1<<11), 2763e12c5d1SDavid du Colombier RFCFDG = (1<<12) 2773e12c5d1SDavid du Colombier }; 2783e12c5d1SDavid du Colombier 2793e12c5d1SDavid du Colombier typedef 2803e12c5d1SDavid du Colombier struct Qid 2813e12c5d1SDavid du Colombier { 2823e12c5d1SDavid du Colombier ulong path; 2833e12c5d1SDavid du Colombier ulong vers; 2843e12c5d1SDavid du Colombier } Qid; 2853e12c5d1SDavid du Colombier 2863e12c5d1SDavid du Colombier typedef 2873e12c5d1SDavid du Colombier struct Dir 2883e12c5d1SDavid du Colombier { 2893e12c5d1SDavid du Colombier char name[NAMELEN]; 2903e12c5d1SDavid du Colombier char uid[NAMELEN]; 2913e12c5d1SDavid du Colombier char gid[NAMELEN]; 2923e12c5d1SDavid du Colombier Qid qid; 2933e12c5d1SDavid du Colombier ulong mode; 2943e12c5d1SDavid du Colombier int atime; 2953e12c5d1SDavid du Colombier int mtime; 2963e12c5d1SDavid du Colombier Length; 297bd389b36SDavid du Colombier ushort type; 298bd389b36SDavid du Colombier ushort dev; 2993e12c5d1SDavid du Colombier } Dir; 3003e12c5d1SDavid du Colombier 3013e12c5d1SDavid du Colombier typedef 3023e12c5d1SDavid du Colombier struct Waitmsg 3033e12c5d1SDavid du Colombier { 3043e12c5d1SDavid du Colombier char pid[12]; /* of loved one */ 3053e12c5d1SDavid du Colombier char time[3*12]; /* of loved one & descendants */ 3063e12c5d1SDavid du Colombier char msg[ERRLEN]; 3073e12c5d1SDavid du Colombier } Waitmsg; 3083e12c5d1SDavid du Colombier 3093e12c5d1SDavid du Colombier extern void _exits(char*); 3103e12c5d1SDavid du Colombier 3113e12c5d1SDavid du Colombier extern void abort(void); 3123e12c5d1SDavid du Colombier extern int access(char*, int); 3133e12c5d1SDavid du Colombier extern long alarm(ulong); 3143e12c5d1SDavid du Colombier extern int bind(char*, char*, int); 3153e12c5d1SDavid du Colombier extern int brk(void*); 3163e12c5d1SDavid du Colombier extern int chdir(char*); 3173e12c5d1SDavid du Colombier extern int close(int); 3183e12c5d1SDavid du Colombier extern int create(char*, int, ulong); 3193e12c5d1SDavid du Colombier extern int dup(int, int); 3203e12c5d1SDavid du Colombier extern int errstr(char*); 3213e12c5d1SDavid du Colombier extern int exec(char*, char*[]); 3223e12c5d1SDavid du Colombier extern int execl(char*, ...); 3233e12c5d1SDavid du Colombier extern int filsys(int, int, char*); 3243e12c5d1SDavid du Colombier extern int fork(void); 3253e12c5d1SDavid du Colombier extern int rfork(int); 326*219b2ee8SDavid du Colombier extern int fauth(int, char*); 327*219b2ee8SDavid du Colombier extern int fsession(int, char*); 3283e12c5d1SDavid du Colombier extern int fstat(int, char*); 3293e12c5d1SDavid du Colombier extern int fwstat(int, char*); 330*219b2ee8SDavid du Colombier extern int mount(int, char*, int, char*); 3313e12c5d1SDavid du Colombier extern int unmount(char*, char*); 3323e12c5d1SDavid du Colombier extern int noted(int); 3333e12c5d1SDavid du Colombier extern int notify(void(*)(void*, char*)); 3343e12c5d1SDavid du Colombier extern int open(char*, int); 3353e12c5d1SDavid du Colombier extern int pipe(int*); 3363e12c5d1SDavid du Colombier extern long read(int, void*, long); 337*219b2ee8SDavid du Colombier extern long readn(int, void*, long); 338*219b2ee8SDavid du Colombier #define read9p read 3393e12c5d1SDavid du Colombier extern int remove(char*); 3403e12c5d1SDavid du Colombier extern void* sbrk(ulong); 3413e12c5d1SDavid du Colombier extern long seek(int, long, int); 342*219b2ee8SDavid du Colombier extern long segattach(int, char*, void*, ulong); 3433e12c5d1SDavid du Colombier extern int segbrk(void*, void*); 3443e12c5d1SDavid du Colombier extern int segdetach(void*); 3453e12c5d1SDavid du Colombier extern int segflush(void*, ulong); 3463e12c5d1SDavid du Colombier extern int segfree(void*, ulong); 3473e12c5d1SDavid du Colombier extern int sleep(long); 3483e12c5d1SDavid du Colombier extern int stat(char*, char*); 3493e12c5d1SDavid du Colombier extern int wait(Waitmsg*); 3503e12c5d1SDavid du Colombier extern long write(int, void*, long); 351*219b2ee8SDavid du Colombier #define write9p write 3523e12c5d1SDavid du Colombier extern int wstat(char*, char*); 3533e12c5d1SDavid du Colombier extern int rendezvous(ulong, ulong); 3543e12c5d1SDavid du Colombier 3553e12c5d1SDavid du Colombier extern int dirstat(char*, Dir*); 3563e12c5d1SDavid du Colombier extern int dirfstat(int, Dir*); 3573e12c5d1SDavid du Colombier extern int dirwstat(char*, Dir*); 3583e12c5d1SDavid du Colombier extern int dirfwstat(int, Dir*); 3593e12c5d1SDavid du Colombier extern long dirread(int, Dir*, long); 3603e12c5d1SDavid du Colombier extern int getpid(void); 3613e12c5d1SDavid du Colombier extern int getppid(void); 362*219b2ee8SDavid du Colombier extern void werrstr(char*, ...); 3633e12c5d1SDavid du Colombier 3643e12c5d1SDavid du Colombier extern char *argv0; 3653e12c5d1SDavid du Colombier #define ARGBEGIN for((argv0? 0: (argv0=*argv)),argv++,argc--;\ 3663e12c5d1SDavid du Colombier argv[0] && argv[0][0]=='-' && argv[0][1];\ 3673e12c5d1SDavid du Colombier argc--, argv++) {\ 3683e12c5d1SDavid du Colombier char *_args, *_argt;\ 3693e12c5d1SDavid du Colombier Rune _argc;\ 3703e12c5d1SDavid du Colombier _args = &argv[0][1];\ 3713e12c5d1SDavid du Colombier if(_args[0]=='-' && _args[1]==0){\ 3723e12c5d1SDavid du Colombier argc--; argv++; break;\ 3733e12c5d1SDavid du Colombier }\ 3743e12c5d1SDavid du Colombier _argc = 0;\ 3753e12c5d1SDavid du Colombier while(*_args && (_args += chartorune(&_argc, _args)))\ 3763e12c5d1SDavid du Colombier switch(_argc) 3773e12c5d1SDavid du Colombier #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); 3783e12c5d1SDavid du Colombier #define ARGF() (_argt=_args, _args="",\ 3793e12c5d1SDavid du Colombier (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 3803e12c5d1SDavid du Colombier #define ARGC() _argc 381