1 /* 2 * functions (possibly) linked in, complete, from libc. 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* memmove(void*, void*, ulong); 15 extern void* memchr(void*, int, ulong); 16 17 /* 18 * string routines 19 */ 20 extern char* strcat(char*, char*); 21 extern char* strchr(char*, int); 22 extern int strcmp(char*, char*); 23 extern char* strcpy(char*, char*); 24 extern char* strecpy(char*, char*, char*); 25 extern char* strncat(char*, char*, long); 26 extern char* strncpy(char*, char*, long); 27 extern int strncmp(char*, char*, long); 28 extern char* strrchr(char*, int); 29 extern long strlen(char*); 30 extern char* strstr(char*, char*); 31 extern int cistrncmp(char*, char*, int); 32 extern int cistrcmp(char*, char*); 33 extern int tokenize(char*, char**, int); 34 35 enum 36 { 37 UTFmax = 4, /* maximum bytes per rune */ 38 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */ 39 Runeself = 0x80, /* rune and UTF sequences are the same (<) */ 40 Runeerror = 0xFFFD, /* decoding error in UTF */ 41 Runemax = 0x10FFFF, /* 24 bit rune */ 42 Runemask = 0x1FFFFF, /* bits used by runes (see grep) */ 43 }; 44 45 /* 46 * rune routines 47 */ 48 extern int runetochar(char*, Rune*); 49 extern int chartorune(Rune*, char*); 50 extern int runelen(long); 51 extern int fullrune(char*, int); 52 extern int utflen(char*); 53 extern int utfnlen(char*, long); 54 extern char* utfrune(char*, long); 55 56 /* 57 * malloc 58 */ 59 extern void* malloc(ulong); 60 extern void* mallocz(ulong, int); 61 extern void free(void*); 62 extern void* mallocalign(ulong, ulong, long, ulong); 63 extern void* realloc(void*, ulong); 64 extern void setmalloctag(void*, ulong); 65 extern void setrealloctag(void*, ulong); 66 extern ulong getmalloctag(void*); 67 extern ulong getrealloctag(void*); 68 69 /* 70 * print routines 71 */ 72 typedef struct Fmt Fmt; 73 struct Fmt{ 74 uchar runes; /* output buffer is runes or chars? */ 75 void *start; /* of buffer */ 76 void *to; /* current place in the buffer */ 77 void *stop; /* end of the buffer; overwritten if flush fails */ 78 int (*flush)(Fmt *); /* called when to == stop */ 79 void *farg; /* to make flush a closure */ 80 int nfmt; /* num chars formatted so far */ 81 va_list args; /* args passed to dofmt */ 82 int r; /* % format Rune */ 83 int width; 84 int prec; 85 ulong flags; 86 }; 87 88 enum { 89 FmtWidth = 1, 90 FmtLeft = FmtWidth<<1, 91 FmtPrec = FmtLeft<<1, 92 FmtSharp = FmtPrec<<1, 93 FmtSpace = FmtSharp<<1, 94 FmtSign = FmtSpace<<1, 95 FmtZero = FmtSign<<1, 96 FmtUnsigned = FmtZero<<1, 97 FmtShort = FmtUnsigned<<1, 98 FmtLong = FmtShort<<1, 99 FmtVLong = FmtLong<<1, 100 FmtComma = FmtVLong<<1, 101 FmtByte = FmtComma<<1, 102 103 FmtFlag = FmtByte<<1 104 }; 105 106 extern int print(char*, ...); 107 extern char* seprint(char*, char*, char*, ...); 108 extern char* vseprint(char*, char*, char*, va_list); 109 extern int snprint(char*, int, char*, ...); 110 extern int vsnprint(char*, int, char*, va_list); 111 extern int sprint(char*, char*, ...); 112 113 #pragma varargck argpos fmtprint 2 114 #pragma varargck argpos print 1 115 #pragma varargck argpos seprint 3 116 #pragma varargck argpos snprint 3 117 #pragma varargck argpos sprint 2 118 119 #pragma varargck type "lld" vlong 120 #pragma varargck type "llx" vlong 121 #pragma varargck type "lld" uvlong 122 #pragma varargck type "llx" uvlong 123 #pragma varargck type "ld" long 124 #pragma varargck type "lx" long 125 #pragma varargck type "ld" ulong 126 #pragma varargck type "lx" ulong 127 #pragma varargck type "d" int 128 #pragma varargck type "x" int 129 #pragma varargck type "c" int 130 #pragma varargck type "C" int 131 #pragma varargck type "d" uint 132 #pragma varargck type "x" uint 133 #pragma varargck type "c" uint 134 #pragma varargck type "C" uint 135 #pragma varargck type "s" char* 136 #pragma varargck type "q" char* 137 #pragma varargck type "S" Rune* 138 #pragma varargck type "%" void 139 #pragma varargck type "p" uintptr 140 #pragma varargck type "p" void* 141 #pragma varargck flag ',' 142 143 extern int fmtinstall(int, int (*)(Fmt*)); 144 extern int fmtprint(Fmt*, char*, ...); 145 extern int fmtstrcpy(Fmt*, char*); 146 extern char* fmtstrflush(Fmt*); 147 extern int fmtstrinit(Fmt*); 148 149 /* 150 * quoted strings 151 */ 152 extern void quotefmtinstall(void); 153 154 /* 155 * Time-of-day 156 */ 157 extern void cycles(uvlong*); /* 64-bit value of the cycle counter if there is one, 0 if there isn't */ 158 159 /* 160 * one-of-a-kind 161 */ 162 extern int abs(int); 163 extern int atoi(char*); 164 extern char* cleanname(char*); 165 extern int dec64(uchar*, int, char*, int); 166 extern uintptr getcallerpc(void*); 167 extern int getfields(char*, char**, int, int, char*); 168 extern int gettokens(char *, char **, int, char *); 169 extern void qsort(void*, long, long, int (*)(void*, void*)); 170 extern long strtol(char*, char**, int); 171 extern ulong strtoul(char*, char**, int); 172 extern vlong strtoll(char*, char**, int); 173 extern uvlong strtoull(char*, char**, int); 174 175 /* 176 * Syscall data structures 177 */ 178 #define MORDER 0x0003 /* mask for bits defining order of mounting */ 179 #define MREPL 0x0000 /* mount replaces object */ 180 #define MBEFORE 0x0001 /* mount goes before others in union directory */ 181 #define MAFTER 0x0002 /* mount goes after others in union directory */ 182 #define MCREATE 0x0004 /* permit creation in mounted directory */ 183 #define MCACHE 0x0010 /* cache some data */ 184 #define MMASK 0x0017 /* all bits on */ 185 186 #define OREAD 0 /* open for read */ 187 #define OWRITE 1 /* write */ 188 #define ORDWR 2 /* read and write */ 189 #define OEXEC 3 /* execute, == read but check execute permission */ 190 #define OTRUNC 16 /* or'ed in (except for exec), truncate file first */ 191 #define OCEXEC 32 /* or'ed in, close on exec */ 192 #define ORCLOSE 64 /* or'ed in, remove on close */ 193 #define OEXCL 0x1000 /* or'ed in, exclusive create */ 194 195 #define NCONT 0 /* continue after note */ 196 #define NDFLT 1 /* terminate after note */ 197 #define NSAVE 2 /* clear note but hold state */ 198 #define NRSTR 3 /* restore saved state */ 199 200 typedef struct Qid Qid; 201 typedef struct Dir Dir; 202 typedef struct OWaitmsg OWaitmsg; 203 typedef struct Waitmsg Waitmsg; 204 205 #define ERRMAX 128 /* max length of error string */ 206 #define KNAMELEN 28 /* max length of name held in kernel */ 207 208 /* bits in Qid.type */ 209 #define QTDIR 0x80 /* type bit for directories */ 210 #define QTAPPEND 0x40 /* type bit for append only files */ 211 #define QTEXCL 0x20 /* type bit for exclusive use files */ 212 #define QTMOUNT 0x10 /* type bit for mounted channel */ 213 #define QTAUTH 0x08 /* type bit for authentication file */ 214 #define QTFILE 0x00 /* plain file */ 215 216 /* bits in Dir.mode */ 217 #define DMDIR 0x80000000 /* mode bit for directories */ 218 #define DMAPPEND 0x40000000 /* mode bit for append only files */ 219 #define DMEXCL 0x20000000 /* mode bit for exclusive use files */ 220 #define DMMOUNT 0x10000000 /* mode bit for mounted channel */ 221 #define DMREAD 0x4 /* mode bit for read permission */ 222 #define DMWRITE 0x2 /* mode bit for write permission */ 223 #define DMEXEC 0x1 /* mode bit for execute permission */ 224 225 struct Qid 226 { 227 uvlong path; 228 ulong vers; 229 uchar type; 230 }; 231 232 struct Dir { 233 /* system-modified data */ 234 ushort type; /* server type */ 235 uint dev; /* server subtype */ 236 /* file data */ 237 Qid qid; /* unique id from server */ 238 ulong mode; /* permissions */ 239 ulong atime; /* last read time */ 240 ulong mtime; /* last write time */ 241 vlong length; /* file length: see <u.h> */ 242 char *name; /* last element of path */ 243 char *uid; /* owner name */ 244 char *gid; /* group name */ 245 char *muid; /* last modifier name */ 246 }; 247 248 struct OWaitmsg 249 { 250 char pid[12]; /* of loved one */ 251 char time[3*12]; /* of loved one and descendants */ 252 char msg[64]; /* compatibility BUG */ 253 }; 254 255 struct Waitmsg 256 { 257 int pid; /* of loved one */ 258 ulong time[3]; /* of loved one and descendants */ 259 char msg[ERRMAX]; /* actually variable-size in user mode */ 260 }; 261 262 extern char etext[]; 263 extern char edata[]; 264 extern char end[]; 265