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