1 #define _POSIX_SOURCE 2 #define _POSIX_C_SOURCE 1 3 #define _LARGEFILE64_SOURCE 1 4 #define _FILE_OFFSET_BITS 64 5 #include <stdlib.h> 6 #include <stdarg.h> 7 #include <errno.h> 8 #include <string.h> 9 #include "math.h" 10 #include <fcntl.h> 11 #include <setjmp.h> 12 #include <float.h> 13 14 #define getwd infgetwd 15 16 /* 17 * math/dtoa.c 18 */ 19 #define __LITTLE_ENDIAN 20 21 #define nil ((void*)0) 22 23 typedef unsigned char uchar; 24 typedef unsigned int uint; 25 typedef unsigned long ulong; 26 typedef signed char schar; 27 typedef unsigned short ushort; 28 typedef unsigned short Rune; 29 typedef long long int vlong; 30 typedef unsigned long long int uvlong; 31 typedef unsigned int mpdigit; /* for /sys/include/mp.h */ 32 typedef unsigned short u16int; 33 typedef unsigned char u8int; 34 typedef unsigned long uintptr; 35 36 #define USED(x) if(x);else 37 #define SET(x) 38 39 #define nelem(x) (sizeof(x)/sizeof((x)[0])) 40 41 /* 42 * mem and string routines are declared by ANSI/POSIX files above 43 */ 44 45 enum 46 { 47 UTFmax = 3, /* maximum bytes per rune */ 48 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 49 Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 50 Runeerror = 0x80 /* decoding error in UTF */ 51 }; 52 53 /* 54 * rune routines 55 */ 56 extern int runetochar(char*, Rune*); 57 extern int chartorune(Rune*, char*); 58 extern int runelen(long); 59 extern int runenlen(Rune*, int); 60 extern int fullrune(char*, int); 61 extern int utflen(char*); 62 extern int utfnlen(char*, long); 63 extern char* utfrune(char*, long); 64 extern char* utfrrune(char*, long); 65 extern char* utfutf(char*, char*); 66 extern char* utfecpy(char*, char*, char*); 67 68 extern Rune* runestrcat(Rune*, Rune*); 69 extern Rune* runestrchr(Rune*, Rune); 70 extern int runestrcmp(Rune*, Rune*); 71 extern Rune* runestrcpy(Rune*, Rune*); 72 extern Rune* runestrncpy(Rune*, Rune*, long); 73 extern Rune* runestrecpy(Rune*, Rune*, Rune*); 74 extern Rune* runestrdup(Rune*); 75 extern Rune* runestrncat(Rune*, Rune*, long); 76 extern int runestrncmp(Rune*, Rune*, long); 77 extern Rune* runestrrchr(Rune*, Rune); 78 extern long runestrlen(Rune*); 79 extern Rune* runestrstr(Rune*, Rune*); 80 81 extern Rune tolowerrune(Rune); 82 extern Rune totitlerune(Rune); 83 extern Rune toupperrune(Rune); 84 extern int isalpharune(Rune); 85 extern int islowerrune(Rune); 86 extern int isspacerune(Rune); 87 extern int istitlerune(Rune); 88 extern int isupperrune(Rune); 89 90 /* 91 * malloc 92 */ 93 extern void* malloc(size_t); 94 extern void* mallocz(ulong, int); 95 extern void free(void*); 96 extern ulong msize(void*); 97 extern void* calloc(size_t, size_t); 98 extern void* realloc(void*, size_t); 99 extern void setmalloctag(void*, ulong); 100 extern void setrealloctag(void*, ulong); 101 extern ulong getmalloctag(void*); 102 extern ulong getrealloctag(void*); 103 extern void* malloctopoolblock(void*); 104 105 extern int getfields(char*, char**, int, int, char*); 106 extern ulong getcallerpc(void*); 107 108 /* 109 * print routines 110 */ 111 typedef struct Fmt Fmt; 112 struct Fmt{ 113 uchar runes; /* output buffer is runes or chars? */ 114 void *start; /* of buffer */ 115 void *to; /* current place in the buffer */ 116 void *stop; /* end of the buffer; overwritten if flush fails */ 117 int (*flush)(Fmt *); /* called when to == stop */ 118 void *farg; /* to make flush a closure */ 119 int nfmt; /* num chars formatted so far */ 120 va_list args; /* args passed to dofmt */ 121 int r; /* % format Rune */ 122 int width; 123 int prec; 124 ulong flags; 125 }; 126 127 enum{ 128 FmtWidth = 1, 129 FmtLeft = FmtWidth << 1, 130 FmtPrec = FmtLeft << 1, 131 FmtSharp = FmtPrec << 1, 132 FmtSpace = FmtSharp << 1, 133 FmtSign = FmtSpace << 1, 134 FmtZero = FmtSign << 1, 135 FmtUnsigned = FmtZero << 1, 136 FmtShort = FmtUnsigned << 1, 137 FmtLong = FmtShort << 1, 138 FmtVLong = FmtLong << 1, 139 FmtComma = FmtVLong << 1, 140 FmtByte = FmtComma << 1, 141 142 FmtFlag = FmtByte << 1 143 }; 144 145 extern int print(char*, ...); 146 extern char* seprint(char*, char*, char*, ...); 147 extern char* vseprint(char*, char*, char*, va_list); 148 extern int snprint(char*, int, char*, ...); 149 extern int vsnprint(char*, int, char*, va_list); 150 extern char* smprint(char*, ...); 151 extern char* vsmprint(char*, va_list); 152 extern int sprint(char*, char*, ...); 153 extern int fprint(int, char*, ...); 154 extern int vfprint(int, char*, va_list); 155 156 extern int runesprint(Rune*, char*, ...); 157 extern int runesnprint(Rune*, int, char*, ...); 158 extern int runevsnprint(Rune*, int, char*, va_list); 159 extern Rune* runeseprint(Rune*, Rune*, char*, ...); 160 extern Rune* runevseprint(Rune*, Rune*, char*, va_list); 161 extern Rune* runesmprint(char*, ...); 162 extern Rune* runevsmprint(char*, va_list); 163 164 extern int fmtfdinit(Fmt*, int, char*, int); 165 extern int fmtfdflush(Fmt*); 166 extern int fmtstrinit(Fmt*); 167 extern char* fmtstrflush(Fmt*); 168 extern int runefmtstrinit(Fmt*); 169 extern Rune* runefmtstrflush(Fmt*); 170 171 extern int fmtinstall(int, int (*)(Fmt*)); 172 extern int dofmt(Fmt*, char*); 173 extern int dorfmt(Fmt*, Rune*); 174 extern int fmtprint(Fmt*, char*, ...); 175 extern int fmtvprint(Fmt*, char*, va_list); 176 extern int fmtrune(Fmt*, int); 177 extern int fmtstrcpy(Fmt*, char*); 178 extern int fmtrunestrcpy(Fmt*, Rune*); 179 /* 180 * error string for %r 181 * supplied on per os basis, not part of fmt library 182 */ 183 extern int errfmt(Fmt *f); 184 185 /* 186 * quoted strings 187 */ 188 extern char *unquotestrdup(char*); 189 extern Rune *unquoterunestrdup(Rune*); 190 extern char *quotestrdup(char*); 191 extern Rune *quoterunestrdup(Rune*); 192 extern int quotestrfmt(Fmt*); 193 extern int quoterunestrfmt(Fmt*); 194 extern void quotefmtinstall(void); 195 extern int (*doquote)(int); 196 197 extern char* strdup(const char*); 198 extern int tokenize(char*, char**, int); 199 extern vlong strtoll(const char*, char**, int); 200 201 extern int isNaN(double); 202 extern int isInf(double, int); 203 204 /* 205 * Time-of-day 206 */ 207 208 typedef struct Tm Tm; 209 struct Tm { 210 int sec; 211 int min; 212 int hour; 213 int mday; 214 int mon; 215 int year; 216 int wday; 217 int yday; 218 char zone[4]; 219 }; 220 221 /* 222 * one-of-a-kind 223 */ 224 extern int getfields(char*, char**, int, int, char*); 225 extern char* getuser(void); 226 extern char* getwd(char*, int); 227 extern double pow10(int); 228 extern double ipow10(int); 229 extern vlong strtoll(const char*, char**, int); 230 extern uvlong strtoull(const char*, char**, int); 231 extern void sysfatal(char*, ...); 232 extern int dec64(uchar*, int, char*, int); 233 extern int enc64(char*, int, uchar*, int); 234 extern int dec32(uchar*, int, char*, int); 235 extern int enc32(char*, int, uchar*, int); 236 extern int dec16(uchar*, int, char*, int); 237 extern int enc16(char*, int, uchar*, int); 238 extern int encodefmt(Fmt*); 239 240 /* 241 * synchronization 242 */ 243 typedef 244 struct Lock { 245 int val; 246 int pid; 247 } Lock; 248 249 extern int _tas(int*); 250 251 extern void lock(Lock*); 252 extern void unlock(Lock*); 253 extern int canlock(Lock*); 254 255 typedef struct QLock QLock; 256 struct QLock 257 { 258 Lock use; /* to access Qlock structure */ 259 Proc *head; /* next process waiting for object */ 260 Proc *tail; /* last process waiting for object */ 261 int locked; /* flag */ 262 }; 263 264 extern void qlock(QLock*); 265 extern void qunlock(QLock*); 266 extern int canqlock(QLock*); 267 extern void _qlockinit(ulong (*)(ulong, ulong)); /* called only by the thread library */ 268 269 typedef 270 struct RWLock 271 { 272 Lock l; /* Lock modify lock */ 273 QLock x; /* Mutual exclusion lock */ 274 QLock k; /* Lock for waiting writers */ 275 int readers; /* Count of readers in lock */ 276 } RWLock; 277 278 extern int canrlock(RWLock*); 279 extern int canwlock(RWLock*); 280 extern void rlock(RWLock*); 281 extern void runlock(RWLock*); 282 extern void wlock(RWLock*); 283 extern void wunlock(RWLock*); 284 285 /* 286 * system calls 287 * 288 */ 289 enum 290 { 291 NAMELEN = 28, 292 ERRLEN = 64, 293 ERRMAX = 128, 294 DIRLEN = 116 295 }; 296 297 #define CHDIR 0x80000000 /* mode bit for directories */ 298 #define CHAPPEND 0x40000000 /* mode bit for append only files */ 299 #define CHEXCL 0x20000000 /* mode bit for exclusive use files */ 300 #define CHMOUNT 0x10000000 /* mode bit for mounted channel */ 301 #define CHREAD 0x4 /* mode bit for read permission */ 302 #define CHWRITE 0x2 /* mode bit for write permission */ 303 #define CHEXEC 0x1 /* mode bit for execute permission */ 304 305 #define MORDER 0x0003 /* mask for bits defining order of mounting */ 306 #define MREPL 0x0000 /* mount replaces object */ 307 #define MBEFORE 0x0001 /* mount goes before others in union directory */ 308 #define MAFTER 0x0002 /* mount goes after others in union directory */ 309 #define MCREATE 0x0004 /* permit creation in mounted directory */ 310 #define MCACHE 0x0010 /* cache some data */ 311 #define MMASK 0x0007 /* all bits on */ 312 313 #define OREAD 0 /* open for read */ 314 #define OWRITE 1 /* write */ 315 #define ORDWR 2 /* read and write */ 316 #define OEXEC 3 /* execute, == read but check execute permission */ 317 #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 318 #define OCEXEC 32 /* or'ed in, close on exec */ 319 #define ORCLOSE 64 /* or'ed in, remove on close */ 320 #define OEXCL 0x1000 /* or'ed in, exclusive use (create only) */ 321 322 typedef 323 struct Qid 324 { 325 ulong path; 326 ulong vers; 327 } Qid; 328 329 typedef 330 struct Dir 331 { 332 char name[NAMELEN]; 333 char uid[NAMELEN]; 334 char gid[NAMELEN]; 335 Qid qid; 336 ulong mode; 337 int atime; 338 int mtime; 339 vlong length; 340 ushort type; 341 ushort dev; 342 } Dir; 343 344 extern int dirfstat(int, Dir*); 345 extern int dirstat(char*, Dir*); 346 extern int dirfwstat(int, Dir*); 347 extern int dirwstat(char*, Dir*); 348 349 extern char* cleanname(char*); 350 extern void exits(char*); 351 extern void _exits(char*); 352 extern int create(char*, int, int); 353 354 extern char* getuser(void); 355 extern char* getwd(char*, int); 356 357 extern int errstr(char*, uint); 358 extern void werrstr(char*, ...); 359 360 #define ARGBEGIN for(argv++,argc--;\ 361 argv[0] && argv[0][0]=='-' && argv[0][1];\ 362 argc--, argv++) {\ 363 char *_args, *_argt;\ 364 char _argc;\ 365 _args = &argv[0][1];\ 366 if(_args[0]=='-' && _args[1]==0){\ 367 argc--; argv++; break;\ 368 }\ 369 _argc = 0;\ 370 while((_argc = *_args++)!='\0')\ 371 switch(_argc) 372 #define ARGEND } 373 #define ARGF() (_argt=_args, _args="",\ 374 (*_argt? _argt: argv[1]? (argc--, *++argv): 0)) 375 #define ARGC() _argc 376 377 /* 378 * Extensions for Inferno to basic libc.h 379 */ 380 381 #define setbinmode() 382 383