Blob


1 /*
2 * Lib9 is miscellany from the Plan 9 C library that doesn't
3 * fit into libutf or into libfmt, but is still missing from traditional
4 * Unix C libraries.
5 */
6 #ifndef _LIB9H_
7 #define _LIB9H_ 1
9 #if defined(__cplusplus)
10 extern "C" {
11 #endif
14 #include <unistd.h>
15 #include <string.h>
16 #include <stdlib.h>
17 #include <stdarg.h>
18 #include <fcntl.h>
19 #include <assert.h>
20 #include <setjmp.h>
22 #ifndef _FMTH_
23 # include <fmt.h>
24 #endif
26 #define nil ((void*)0)
27 #define nelem(x) (sizeof(x)/sizeof((x)[0]))
29 #define _NEEDUCHAR 1
30 #define _NEEDUSHORT 1
31 #define _NEEDUINT 1
32 #define _NEEDULONG 1
34 #if defined(__linux__)
35 # include <sys/types.h>
36 # if defined(__USE_MISC)
37 # undef _NEEDUSHORT
38 # undef _NEEDUINT
39 # undef _NEEDULONG
40 # endif
41 #endif
42 #if defined(__FreeBSD__)
43 # include <sys/types.h>
44 # if !defined(_POSIX_SOURCE)
45 # undef _NEEDUSHORT
46 # undef _NEEDUINT
47 # endif
48 #endif
50 typedef signed char schar;
51 typedef unsigned int u32int;
52 #ifdef _NEEDUCHAR
53 typedef unsigned char uchar;
54 #endif
55 #ifdef _NEEDUSHORT
56 typedef unsigned short ushort;
57 #endif
58 #ifdef _NEEDUINT
59 typedef unsigned int uint;
60 #endif
61 #ifdef _NEEDULONG
62 typedef unsigned long ulong;
63 #endif
64 typedef unsigned long long uvlong;
65 typedef long long vlong;
67 /* rfork to create new process running fn(arg) */
69 #if defined(__FreeBSD__)
70 #undef RFFDG
71 #undef RFNOTEG
72 #undef RFPROC
73 #undef RFMEM
74 #undef RFNOWAIT
75 #undef RFCFDG
76 #endif
78 enum
79 {
80 /* RFNAMEG = (1<<0), */
81 /* RFENVG = (1<<1), */
82 RFFDG = (1<<2),
83 RFNOTEG = (1<<3),
84 RFPROC = (1<<4),
85 RFMEM = (1<<5),
86 RFNOWAIT = (1<<6),
87 /* RFCNAMEG = (1<<10), */
88 /* RFCENVG = (1<<11), */
89 RFCFDG = (1<<12),
90 /* RFREND = (1<<13), */
91 /* RFNOMNT = (1<<14) */
92 };
93 extern int ffork(int, void(*)(void*), void*);
95 /* wait for processes */
96 #define wait _p9wait
97 typedef struct Waitmsg Waitmsg;
98 struct Waitmsg
99 {
100 int pid; /* of loved one */
101 ulong time[3]; /* of loved one & descendants */
102 char *msg;
103 };
104 extern int await(char*, int);
105 extern Waitmsg* wait(void);
107 /* synchronization */
108 typedef struct Lock Lock;
109 struct Lock
111 int val;
112 };
114 extern int _tas(void*);
115 extern void lock(Lock*);
116 extern void unlock(Lock*);
117 extern int canlock(Lock*);
119 typedef struct QLp QLp;
120 struct QLp
122 int inuse;
123 QLp *next;
124 int state;
125 };
127 typedef struct QLock QLock;
128 struct QLock
130 Lock lock;
131 int locked;
132 QLp *head;
133 QLp *tail;
134 };
136 extern void qlock(QLock*);
137 extern void qunlock(QLock*);
138 extern int canqlock(QLock*);
139 extern void _qlockinit(ulong (*)(ulong, ulong));
141 typedef struct RWLock RWLock;
142 struct RWLock
144 Lock lock;
145 int readers;
146 int writer;
147 QLp *head;
148 QLp *tail;
149 };
151 extern void rlock(RWLock*);
152 extern void runlock(RWLock*);
153 extern int canrlock(RWLock*);
154 extern void wlock(RWLock*);
155 extern void wunlock(RWLock*);
156 extern int canwlock(RWLock*);
158 typedef struct Rendez Rendez;
159 struct Rendez
161 QLock *l;
162 QLp *head;
163 QLp *tail;
164 };
166 extern void rsleep(Rendez*);
167 extern int rwakeup(Rendez*);
168 extern int rwakeupall(Rendez*);
170 extern ulong rendezvous(ulong, ulong);
172 /* one of a kind */
173 extern void sysfatal(char*, ...);
174 extern int nrand(int);
175 extern void setmalloctag(void*, ulong);
176 extern void setrealloctag(void*, ulong);
177 extern void *mallocz(ulong, int);
178 extern long readn(int, void*, long);
179 extern void exits(char*);
180 extern void _exits(char*);
181 extern ulong getcallerpc(void*);
183 /* string routines */
184 extern char* strecpy(char*, char*, char*);
185 extern int tokenize(char*, char**, int);
186 extern int cistrncmp(char*, char*, int);
187 extern int cistrcmp(char*, char*);
188 extern char* cistrstr(char*, char*);
189 extern int getfields(char*, char**, int, int, char*);
190 extern int gettokens(char *, char **, int, char *);
192 /* formatting helpers */
193 extern int dec64(uchar*, int, char*, int);
194 extern int enc64(char*, int, uchar*, int);
195 extern int dec32(uchar*, int, char*, int);
196 extern int enc32(char*, int, uchar*, int);
197 extern int dec16(uchar*, int, char*, int);
198 extern int enc16(char*, int, uchar*, int);
199 extern int encodefmt(Fmt*);
201 /* error string */
202 enum
204 ERRMAX = 128
205 };
206 extern void rerrstr(char*, uint);
207 extern void werrstr(char*, ...);
208 extern int errstr(char*, uint);
210 /* compiler directives on plan 9 */
211 #define USED(x) if(x){}else{}
212 #define SET(x) ((x)=0)
214 /* command line */
215 extern char *argv0;
216 #define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\
217 argv[0] && argv[0][0]=='-' && argv[0][1];\
218 argc--, argv++) {\
219 char *_args, *_argt;\
220 Rune _argc;\
221 _args = &argv[0][1];\
222 if(_args[0]=='-' && _args[1]==0){\
223 argc--; argv++; break;\
224 }\
225 _argc = 0;\
226 while(*_args && (_args += chartorune(&_argc, _args)))\
227 switch(_argc)
228 #define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
229 #define ARGF() (_argt=_args, _args="",\
230 (*_argt? _argt: argv[1]? (argc--, *++argv): 0))
231 #define EARGF(x) (_argt=_args, _args="",\
232 (*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
234 #define ARGC() _argc
236 #define OREAD O_RDONLY
237 #define OWRITE O_WRONLY
238 #define AEXIST 0
239 #define AREAD 4
240 #define AWRITE 2
241 #define AEXEC 1
242 #define ORCLOSE 8
243 #define OCEXEC 16
245 #define dup dup2
246 #define exec execv
247 #define seek lseek
248 #define getwd getcwd
250 #if defined(__cplusplus)
252 #endif
254 #endif /* _LIB9H_ */