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