1 #pragma lib "libc.a" 2 #pragma src "/sys/src/libc" 3 4 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 5 6 /* 7 * mem routines 8 */ 9 extern void* memccpy(void*, void*, int, ulong); 10 extern void* memset(void*, int, ulong); 11 extern int memcmp(void*, void*, ulong); 12 extern void* memcpy(void*, void*, ulong); 13 extern void* memmove(void*, void*, ulong); 14 extern void* memchr(void*, int, ulong); 15 16 /* 17 * string routines 18 */ 19 extern char* strcat(char*, char*); 20 extern char* strchr(char*, char); 21 extern int strcmp(char*, char*); 22 extern char* strcpy(char*, char*); 23 extern char* strdup(char*); 24 extern char* strncat(char*, char*, long); 25 extern char* strncpy(char*, char*, long); 26 extern int strncmp(char*, char*, long); 27 extern char* strpbrk(char*, char*); 28 extern char* strrchr(char*, char); 29 extern char* strtok(char*, char*); 30 extern long strlen(char*); 31 extern long strspn(char*, char*); 32 extern long strcspn(char*, char*); 33 extern char* strstr(char*, char*); 34 extern int tokenize(char*, char**, int); 35 36 enum 37 { 38 UTFmax = 3, /* maximum bytes per rune */ 39 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 40 Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 41 Runeerror = 0x80, /* decoding error in UTF */ 42 }; 43 44 /* 45 * new rune routines 46 */ 47 extern int runetochar(char*, Rune*); 48 extern int chartorune(Rune*, char*); 49 extern int runelen(long); 50 extern int fullrune(char*, int); 51 52 /* 53 * rune routines from converted str routines 54 */ 55 extern int utflen(char*); 56 extern char* utfrune(char*, long); 57 extern char* utfrrune(char*, long); 58 extern char* utfutf(char*, char*); 59 60 /* 61 * malloc 62 */ 63 extern void* malloc(long); 64 extern void free(void*); 65 extern void* calloc(long, long); 66 extern void* realloc(void*, long); 67 68 /* 69 * print routines 70 */ 71 typedef struct Fconv Fconv; 72 struct Fconv 73 { 74 char* out; /* pointer to next output */ 75 char* eout; /* pointer to end */ 76 int f1; 77 int f2; 78 int f3; 79 int chr; 80 }; 81 extern char* doprint(char*, char*, char*, void*); 82 extern int print(char*, ...); 83 extern int snprint(char*, int, char*, ...); 84 extern int sprint(char*, char*, ...); 85 extern int fprint(int, char*, ...); 86 87 extern int fmtinstall(int, int (*)(void*, Fconv*)); 88 extern int numbconv(void*, Fconv*); 89 extern void strconv(char*, Fconv*); 90 extern int fltconv(void*, Fconv*); 91 /* 92 * random number 93 */ 94 extern void srand(long); 95 extern int rand(void); 96 extern int nrand(int); 97 extern long lrand(void); 98 extern long lnrand(long); 99 extern double frand(void); 100 101 /* 102 * math 103 */ 104 extern ulong getfcr(void); 105 extern void setfsr(ulong); 106 extern ulong getfsr(void); 107 extern void setfcr(ulong); 108 extern double NaN(void); 109 extern double Inf(int); 110 extern int isNaN(double); 111 extern int isInf(double, int); 112 113 extern double pow(double, double); 114 extern double atan2(double, double); 115 extern double fabs(double); 116 extern double atan(double); 117 extern double log(double); 118 extern double log10(double); 119 extern double exp(double); 120 extern double floor(double); 121 extern double ceil(double); 122 extern double hypot(double, double); 123 extern double sin(double); 124 extern double cos(double); 125 extern double tan(double); 126 extern double asin(double); 127 extern double acos(double); 128 extern double sinh(double); 129 extern double cosh(double); 130 extern double tanh(double); 131 extern double sqrt(double); 132 extern double fmod(double, double); 133 134 #define HUGE 3.4028234e38 135 #define PIO2 1.570796326794896619231e0 136 #define PI (PIO2+PIO2) 137 138 /* 139 * Time-of-day 140 */ 141 142 typedef 143 struct Tm 144 { 145 int sec; 146 int min; 147 int hour; 148 int mday; 149 int mon; 150 int year; 151 int wday; 152 int yday; 153 char zone[4]; 154 } Tm; 155 156 extern Tm* gmtime(long); 157 extern Tm* localtime(long); 158 extern char* asctime(Tm*); 159 extern char* ctime(long); 160 extern double cputime(void); 161 extern long times(long*); 162 163 /* 164 * one-of-a-kind 165 */ 166 enum 167 { 168 PNPROC = 1, 169 PNGROUP = 2, 170 }; 171 172 extern int abs(int); 173 extern int atexit(void(*)(void)); 174 extern void atexitdont(void(*)(void)); 175 extern int atnotify(int(*)(void*, char*), int); 176 extern double atof(char*); 177 extern int atoi(char*); 178 extern long atol(char*); 179 extern double charstod(int(*)(void*), void*); 180 extern int decrypt(void*, void*, int); 181 extern int encrypt(void*, void*, int); 182 extern void exits(char*); 183 extern double frexp(double, int*); 184 extern char* getenv(char*); 185 extern int getfields(char*, char**, int); 186 extern int getmfields(char*, char**, int); 187 extern char* getuser(void); 188 extern char* getwd(char*, int); 189 extern long labs(long); 190 extern double ldexp(double, int); 191 extern void longjmp(jmp_buf, int); 192 extern char* mktemp(char*); 193 extern double modf(double, double*); 194 extern int netcrypt(void*, void*); 195 extern void notejmp(void*, jmp_buf, int); 196 extern void perror(char*); 197 extern int postnote(int, int, char *); 198 extern double pow10(int); 199 extern int putenv(char*, char*); 200 extern void qsort(void*, long, long, int (*)(void*, void*)); 201 extern char* setfields(char*); 202 extern int setjmp(jmp_buf); 203 extern double strtod(char*, char**); 204 extern long strtol(char*, char**, int); 205 extern ulong strtoul(char*, char**, int); 206 extern void syslog(int, char*, char*, ...); 207 extern long time(long*); 208 extern int tolower(int); 209 extern int toupper(int); 210 211 212 /* 213 * network dialing and authentication 214 */ 215 #define NETPATHLEN 40 216 extern int accept(int, char*); 217 extern int announce(char*, char*); 218 extern int dial(char*, char*, char*, int*); 219 extern int hangup(int); 220 extern int listen(char*, char*); 221 extern char* netmkaddr(char*, char*, char*); 222 extern int reject(int, char*, char*); 223 224 /* 225 * system calls 226 * 227 */ 228 #define NAMELEN 28 /* length of path element, including '\0' */ 229 #define DIRLEN 116 /* length of machine-independent Dir structure */ 230 #define ERRLEN 64 /* length of error string */ 231 232 #define MORDER 0x0003 /* mask for bits defining order of mounting */ 233 #define MREPL 0x0000 /* mount replaces object */ 234 #define MBEFORE 0x0001 /* mount goes before others in union directory */ 235 #define MAFTER 0x0002 /* mount goes after others in union directory */ 236 #define MCREATE 0x0004 /* permit creation in mounted directory */ 237 #define MMASK 0x0007 /* all bits on */ 238 239 #define OREAD 0 /* open for read */ 240 #define OWRITE 1 /* write */ 241 #define ORDWR 2 /* read and write */ 242 #define OEXEC 3 /* execute, == read but check execute permission */ 243 #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 244 #define OCEXEC 32 /* or'ed in, close on exec */ 245 #define ORCLOSE 64 /* or'ed in, remove on close */ 246 247 /* Segattch */ 248 #define SG_RONLY 0040 /* read only */ 249 #define SG_CEXEC 0100 /* detach on exec */ 250 251 #define NCONT 0 /* continue after note */ 252 #define NDFLT 1 /* terminate after note */ 253 #define NSAVE 2 /* clear note but hold state */ 254 #define NRSTR 3 /* restore saved state */ 255 256 #define CHDIR 0x80000000 /* mode bit for directories */ 257 #define CHAPPEND 0x40000000 /* mode bit for append only files */ 258 #define CHEXCL 0x20000000 /* mode bit for exclusive use files */ 259 #define CHMOUNT 0x10000000 /* mode bit for mounted channel */ 260 #define CHREAD 0x4 /* mode bit for read permission */ 261 #define CHWRITE 0x2 /* mode bit for write permission */ 262 #define CHEXEC 0x1 /* mode bit for execute permission */ 263 264 /* rfork */ 265 enum 266 { 267 RFNAMEG = (1<<0), 268 RFENVG = (1<<1), 269 RFFDG = (1<<2), 270 RFNOTEG = (1<<3), 271 RFPROC = (1<<4), 272 RFMEM = (1<<5), 273 RFNOWAIT = (1<<6), 274 RFCNAMEG = (1<<10), 275 RFCENVG = (1<<11), 276 RFCFDG = (1<<12) 277 }; 278 279 typedef 280 struct Qid 281 { 282 ulong path; 283 ulong vers; 284 } Qid; 285 286 typedef 287 struct Dir 288 { 289 char name[NAMELEN]; 290 char uid[NAMELEN]; 291 char gid[NAMELEN]; 292 Qid qid; 293 ulong mode; 294 int atime; 295 int mtime; 296 Length; 297 ushort type; 298 ushort dev; 299 } Dir; 300 301 typedef 302 struct Waitmsg 303 { 304 char pid[12]; /* of loved one */ 305 char time[3*12]; /* of loved one & descendants */ 306 char msg[ERRLEN]; 307 } Waitmsg; 308 309 extern void _exits(char*); 310 311 extern void abort(void); 312 extern int access(char*, int); 313 extern long alarm(ulong); 314 extern int bind(char*, char*, int); 315 extern int brk(void*); 316 extern int chdir(char*); 317 extern int close(int); 318 extern int create(char*, int, ulong); 319 extern int dup(int, int); 320 extern int errstr(char*); 321 extern int exec(char*, char*[]); 322 extern int execl(char*, ...); 323 extern int filsys(int, int, char*); 324 extern int fork(void); 325 extern int rfork(int); 326 extern int fauth(int, char*); 327 extern int fsession(int, char*); 328 extern int fstat(int, char*); 329 extern int fwstat(int, char*); 330 extern int mount(int, char*, int, char*); 331 extern int unmount(char*, char*); 332 extern int noted(int); 333 extern int notify(void(*)(void*, char*)); 334 extern int open(char*, int); 335 extern int pipe(int*); 336 extern long read(int, void*, long); 337 extern long readn(int, void*, long); 338 #define read9p read 339 extern int remove(char*); 340 extern void* sbrk(ulong); 341 extern long seek(int, long, int); 342 extern long segattach(int, char*, void*, ulong); 343 extern int segbrk(void*, void*); 344 extern int segdetach(void*); 345 extern int segflush(void*, ulong); 346 extern int segfree(void*, ulong); 347 extern int sleep(long); 348 extern int stat(char*, char*); 349 extern int wait(Waitmsg*); 350 extern long write(int, void*, long); 351 #define write9p write 352 extern int wstat(char*, char*); 353 extern int rendezvous(ulong, ulong); 354 355 extern int dirstat(char*, Dir*); 356 extern int dirfstat(int, Dir*); 357 extern int dirwstat(char*, Dir*); 358 extern int dirfwstat(int, Dir*); 359 extern long dirread(int, Dir*, long); 360 extern int getpid(void); 361 extern int getppid(void); 362 extern void werrstr(char*, ...); 363 364 extern char *argv0; 365 #define ARGBEGIN for((argv0? 0: (argv0=*argv)),argv++,argc--;\ 366 argv[0] && argv[0][0]=='-' && argv[0][1];\ 367 argc--, argv++) {\ 368 char *_args, *_argt;\ 369 Rune _argc;\ 370 _args = &argv[0][1];\ 371 if(_args[0]=='-' && _args[1]==0){\ 372 argc--; argv++; break;\ 373 }\ 374 _argc = 0;\ 375 while(*_args && (_args += chartorune(&_argc, _args)))\ 376 switch(_argc) 377 #define ARGEND SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc); 378 #define ARGF() (_argt=_args, _args="",\ 379 (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 380 #define ARGC() _argc 381