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