xref: /plan9-contrib/sys/src/cmd/rc/unix.h (revision c6df144405f586b73992827d584728dc975dff14)
1 /* mostly plan 9 compatibility */
2 
3 #undef _BSD_EXTENSION		/* avoid multiple def'n if predefined */
4 #undef _PLAN9_SOURCE
5 #undef _POSIX_SOURCE
6 #undef _RESEARCH_SOURCE
7 #undef _SUSV2_SOURCE
8 
9 #define _BSD_EXTENSION
10 #define _PLAN9_SOURCE
11 #define _POSIX_SOURCE
12 #define _RESEARCH_SOURCE
13 #define _SUSV2_SOURCE
14 
15 #include <stdlib.h>
16 #include <stdarg.h>
17 #include <string.h>
18 #include <unistd.h>
19 #include <fcntl.h>
20 #include <signal.h>
21 #include <inttypes.h>
22 
23 #ifndef NSIG
24 #define NSIG 32
25 #endif
26 
27 #define RFPROC 1
28 #define RFFDG 1
29 #define RFNOTEG 1
30 
31 #define OREAD	O_RDONLY
32 #define OWRITE	O_WRONLY
33 #define ORDWR	O_RDWR
34 #define OCEXEC	0
35 
36 #define ERRMAX 128
37 
38 #define uintptr uintptr_t
39 #define nil ((void*)0)
40 
41 #define assert(cond)
42 #define seek lseek
43 #define print printf
44 #define fprint fprintf
45 #define snprint snprintf
46 
47 char *strdup(const char *);
48 void unixclsexec(int);
49 
50 /* in case uchar, etc. are built-in types */
51 #define uchar	_fmtuchar
52 #define ushort	_fmtushort
53 #define uint	_fmtuint
54 #define ulong	_fmtulong
55 #define vlong	_fmtvlong
56 #define uvlong	_fmtuvlong
57 
58 typedef unsigned char		uchar;
59 typedef unsigned short		ushort;
60 typedef unsigned int		uint;
61 typedef unsigned long		ulong;
62 typedef unsigned long long	uvlong;
63 
64 typedef ulong Rune;
65 
66 enum
67 {
68 	UTFmax		= 4,		/* maximum bytes per rune */
69 	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
70 	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
71 	Runeerror	= 0xFFFD,	/* decoding error in UTF */
72 	Runemax		= 0x10FFFF,	/* 21-bit rune */
73 	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
74 };
75 
76 /*
77  * rune routines
78  */
79 extern	int	runetochar(char*, Rune*);
80 extern	int	chartorune(Rune*, char*);
81 extern	int	runelen(long);
82 extern	int	runenlen(Rune*, int);
83 extern	int	fullrune(char*, int);
84 extern	int	utflen(char*);
85 extern	int	utfnlen(char*, long);
86 extern	char*	utfrune(char*, long);
87 extern	char*	utfrrune(char*, long);
88 extern	char*	utfutf(char*, char*);
89 extern	char*	utfecpy(char*, char*, char*);
90 
91 extern char *argv0;
92 #define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
93 			    argv[0] && argv[0][0]=='-' && argv[0][1];\
94 			    argc--, argv++) {\
95 				char *_args, *_argt;\
96 				Rune _argc;\
97 				_args = &argv[0][1];\
98 				if(_args[0]=='-' && _args[1]==0){\
99 					argc--; argv++; break;\
100 				}\
101 				_argc = 0;\
102 				while(*_args && (_args += chartorune(&_argc, _args)))\
103 				switch(_argc)
104 #define	ARGEND		SET(_argt);USED(_argt,_argc,_args);}USED(argv, argc);
105 #define	ARGF()		(_argt=_args, _args="",\
106 				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
107 #define	EARGF(x)	(_argt=_args, _args="",\
108 				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
109 
110 #define	ARGC()		_argc
111 
112 #define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
113