/* * CDE - Common Desktop Environment * * Copyright (c) 1993-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these libraries and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* $XConsortium: shipproto.c /main/5 1995/11/01 16:03:47 rswiston $ */ /*************************************************************** * * * AT&T - PROPRIETARY * * * * THIS IS PROPRIETARY SOURCE CODE LICENSED BY * * AT&T CORP. * * * * Copyright (c) 1995 AT&T Corp. * * All Rights Reserved * * * * This software is licensed by AT&T Corp. * * under the terms and conditions of the license in * * http://www.research.att.com/orgs/ssr/book/reuse * * * * This software was created by the * * Software Engineering Research Department * * AT&T Bell Laboratories * * * * For further information contact * * gsf@research.att.com * * * ***************************************************************/ /* : : generated by proto : : */ #if !defined(__PROTO__) #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus) #if defined(__cplusplus) #define __MANGLE__ "C" #else #define __MANGLE__ #endif #define __STDARG__ #define __PROTO__(x) x #define __OTORP__(x) #define __PARAM__(n,o) n #if !defined(__STDC__) && !defined(__cplusplus) #if !defined(c_plusplus) #define const #endif #define signed #define void int #define volatile #define __V_ char #else #define __V_ void #endif #else #define __PROTO__(x) () #define __OTORP__(x) x #define __PARAM__(n,o) o #define __MANGLE__ #define __V_ char #define const #define signed #define void int #define volatile #endif #if defined(__cplusplus) || defined(c_plusplus) #define __VARARG__ ... #else #define __VARARG__ #endif #if defined(__STDARG__) #define __VA_START__(p,a) va_start(p,a) #else #define __VA_START__(p,a) va_start(p) #endif #endif #line 1 "/home/gsf/src/cmd/proto/proto.c" #line 27 # define ctime _huh_ctime # include # include # include # include # undef ctime # define remove(x) unlink(x) # define rename(x,y) ((link(x,y)||remove(x))?-1:0) int replace __PARAM__((const char* newfile, const char* oldfile, int preserve), (newfile, oldfile, preserve)) __OTORP__(const char* newfile; const char* oldfile; int preserve;){ struct stat st; time_t ut[2]; if (preserve && stat(oldfile, &st) || remove(oldfile) || rename(newfile, oldfile)) return(-1); if (preserve) { ut[0] = st.st_atime; ut[1] = st.st_mtime; preserve = utime(oldfile, ut); } return(preserve); } #line 1 "../../lib/libpp/ppproto.c" static const char id[] = "\n@(#)proto (AT&T Bell Laboratories) 05/09/95\000\n"; #line 1 "../../lib/libpp/ppfsm.c" #line 1 "../../lib/libpp/pplib.h" struct ppsymbol; struct ppindex; typedef char* (*PPBUILTIN) __PROTO__((char*, const char*, const char*)); typedef void (*PPCOMMENT) __PROTO__((const char*, const char*, const char*, int)); typedef void (*PPINCREF) __PROTO__((const char*, const char*, int, int)); typedef void (*PPLINESYNC) __PROTO__((int, const char*)); typedef void (*PPMACREF) __PROTO__((struct ppsymbol*, const char*, int, int, unsigned long)); typedef int (*PPOPTARG) __PROTO__((int, int, const char*)); typedef void (*PPPRAGMA) __PROTO__((const char*, const char*, const char*, const char*, int)); struct ppinstk { char* nextchr; struct ppinstk* next; struct ppinstk* prev; long* control; char* buffer; char* file; char* prefix; struct ppsymbol* symbol; struct ppindex* index; int buflen; int line; short fd; short hide; short flags; char type; }; struct pplist { char* value; struct pplist* next; }; struct oplist { int op; char* value; struct oplist* next; }; struct pphide { struct ppmacro* macro; unsigned long flags; int level; }; struct ppmacstk { struct ppmacstk* next; struct ppmacstk* prev; int line; char* arg[1]; }; struct ppmember { struct ppdirs* archive; unsigned long offset; unsigned long size; }; struct counter { int candidate; int function; int macro; int pplex; int push; int terminal; int token; }; #line 228 #line 273 #line 287 #line 304 #line 1 "../../lib/libpp/pp.h" struct ppdirs { char* name; struct ppdirs* next; unsigned char c; unsigned char hosted; unsigned char index; unsigned char type; union { char* buffer; char* sp; struct ppdirs* subdir; } info; }; struct ppkeyword { char* name; int value; }; struct ppmacro { int arity; char* value; int size; char* formals; }; struct ppsymbol { int hash_header; unsigned long flags; struct ppmacro* macro; __V_* value; struct pphide* hidden; }; struct ppglobals { const char* version; char* lineid; char* outfile; char* pass; char* token; struct ppsymbol* symbol; char* outbuf; char* outp; unsigned long offset; struct ppdirs* lcldirs; struct ppdirs* stddirs; int flags; char* symtab; struct ppcontext* context; long state; long mode; long option; long test; char* filedeps; struct ppdirs* firstdir; struct ppdirs* lastdir; int hide; int column; int pending; char* firstfile; char* lastfile; char* ignore; char* probe; char* filtab; char* prdtab; char* date; char* time; char* maps; long ro_state; long ro_mode; long ro_option; char* cdir; char* hostdir; char* ppdefault; struct ppindex* firstindex; struct ppindex* lastindex; struct oplist* firstop; struct oplist* lastop; struct oplist* firsttx; struct oplist* lasttx; unsigned char arg_file; unsigned char arg_mode; unsigned char arg_style; unsigned char c; unsigned char hosted; unsigned char ignoresrc; unsigned char initialized; unsigned char standalone; unsigned char spare_1; char* checkpoint; int constack; struct ppinstk* in; char* addp; char* args; char* addbuf; char* catbuf; char* path; char* tmpbuf; char* valbuf; char* include; char* prefix; struct ppmember* member; int hidden; int hiding; int level; struct { int input; int output; } pool; int truncate; struct ppmacstk* macp; char* maxmac; char* mactop; char* toknxt; long* control; long* maxcon; struct oplist* chop; struct ppfile* insert; struct ppfile* original; char* dirtab; char* strtab; PPBUILTIN builtin; PPCOMMENT comment; PPINCREF incref; PPLINESYNC linesync; PPLINESYNC olinesync; PPMACREF macref; PPOPTARG optarg; PPPRAGMA pragma; struct counter counter; }; extern __MANGLE__ struct ppglobals pp; extern __MANGLE__ char _pp_ctype[]; extern __MANGLE__ int ppargs __PROTO__((char**, int)); extern __MANGLE__ void ppcpp __PROTO__((void)); extern __MANGLE__ void ppcomment __PROTO__((char*, char*, char*, int)); extern __MANGLE__ __V_* ppcontext __PROTO__((__V_*, int)); extern __MANGLE__ void pperror __PROTO__((int, ...)); extern __MANGLE__ void ppincref __PROTO__((char*, char*, int, int)); extern __MANGLE__ void ppinput __PROTO__((char*, char*, int)); extern __MANGLE__ int pplex __PROTO__((void)); extern __MANGLE__ void ppline __PROTO__((int, char*)); extern __MANGLE__ void ppmacref __PROTO__((struct ppsymbol*, char*, int, int)); extern __MANGLE__ void ppop __PROTO__((int, ...)); extern __MANGLE__ void pppragma __PROTO__((char*, char*, char*, char*, int)); extern __MANGLE__ int ppprintf __PROTO__((char*, ...)); #line 313 "../../lib/libpp/pplib.h" #line 1 "../../lib/libpp/ppdef.h" #line 14 #line 314 "../../lib/libpp/pplib.h" #line 1 "../../lib/libpp/ppkey.h" extern __MANGLE__ struct ppkeyword ppkey[]; #line 315 "../../lib/libpp/pplib.h" #line 367 #line 481 #line 496 #line 510 #line 529 #line 551 #line 563 struct ppcontext { struct ppdirs* lcldirs; struct ppdirs* stddirs; int flags; char* symtab; struct ppcontext* context; long state; long mode; long option; long test; char* filedeps; struct ppdirs* firstdir; struct ppdirs* lastdir; int hide; int column; int pending; char* firstfile; char* lastfile; char* ignore; char* probe; char* filtab; char* prdtab; char* date; char* time; char* maps; long ro_state; long ro_mode; long ro_option; char* cdir; char* hostdir; char* ppdefault; struct ppindex* firstindex; struct ppindex* lastindex; struct oplist* firstop; struct oplist* lastop; struct oplist* firsttx; struct oplist* lasttx; unsigned char arg_file; unsigned char arg_mode; unsigned char arg_style; unsigned char c; unsigned char hosted; unsigned char ignoresrc; unsigned char initialized; unsigned char standalone; unsigned char spare_1; }; struct ppfile { int hash_header; struct ppsymbol* guard; struct ppfile* bound[3]; int flags; }; struct ppindex { struct ppindex* next; struct ppfile* file; unsigned long begin; unsigned long end; }; struct ppsymkey { struct ppsymbol sym; int lex; }; extern __MANGLE__ int access __PROTO__((const char*, int)); extern __MANGLE__ __V_* calloc __PROTO__((size_t, size_t)); extern __MANGLE__ int close __PROTO__((int)); extern __MANGLE__ int creat __PROTO__((const char*, int)); extern __MANGLE__ char* ctime __PROTO__((time_t*)); extern __MANGLE__ void exit __PROTO__((int)); extern __MANGLE__ void free __PROTO__((__V_*)); extern __MANGLE__ int link __PROTO__((const char*, const char*)); extern __MANGLE__ int open __PROTO__((const char*, int, ...)); extern __MANGLE__ int read __PROTO__((int, __V_*, int)); extern __MANGLE__ int strncmp __PROTO__((const char*, const char*, size_t)); extern __MANGLE__ time_t time __PROTO__((time_t*)); extern __MANGLE__ int unlink __PROTO__((const char*)); extern __MANGLE__ int write __PROTO__((int, const __V_*, int)); #line 691 extern __MANGLE__ void ppassert __PROTO__((int, char*, char*)); extern __MANGLE__ void ppbuiltin __PROTO__((void)); extern __MANGLE__ int ppcall __PROTO__((struct ppsymbol*, int)); extern __MANGLE__ int ppcontrol __PROTO__((void)); extern __MANGLE__ void ppdump __PROTO__((void)); extern __MANGLE__ char* ppexpand __PROTO__((char*)); extern __MANGLE__ long ppexpr __PROTO__((int*)); extern __MANGLE__ void ppfsm __PROTO__((int, char*)); extern __MANGLE__ char* ppinstr __PROTO__((struct ppinstk*)); extern __MANGLE__ char* ppkeyname __PROTO__((int, int)); extern __MANGLE__ char* pplexstr __PROTO__((int)); extern __MANGLE__ void ppload __PROTO__((char*)); extern __MANGLE__ char* ppmodestr __PROTO__((long)); extern __MANGLE__ int ppmultiple __PROTO__((struct ppfile*, struct ppsymbol*)); extern __MANGLE__ void ppnest __PROTO__((void)); extern __MANGLE__ int ppoption __PROTO__((char*)); extern __MANGLE__ char* ppoptionstr __PROTO__((long)); extern __MANGLE__ void pppclose __PROTO__((char*)); extern __MANGLE__ int pppdrop __PROTO__((char*)); extern __MANGLE__ char* pppopen __PROTO__((char*, int, char*, int)); extern __MANGLE__ int pppread __PROTO__((char*)); extern __MANGLE__ int pppredargs __PROTO__((void)); extern __MANGLE__ void pppush __PROTO__((int, char*, char*, int)); extern __MANGLE__ struct ppsymbol* pprefmac __PROTO__((char*, int)); extern __MANGLE__ int ppsearch __PROTO__((char*, int, int)); extern __MANGLE__ char* ppstatestr __PROTO__((long)); extern __MANGLE__ char* pptokstr __PROTO__((char*, int)); extern __MANGLE__ void pptrace __PROTO__((int)); #line 11 "../../lib/libpp/ppfsm.c" #line 1 "../../lib/libpp/ppfsm.h" #line 106 #line 143 #line 220 extern __MANGLE__ short _pp_fsmtab[(0+26)+1][255+1]; extern __MANGLE__ char _pp_trigraph[255+1]; extern __MANGLE__ void _pp_refill __PROTO__((int)); #line 12 "../../lib/libpp/ppfsm.c" #line 49 struct fsminit { int state; unsigned char ch[4]; int nextstate; }; static struct fsminit fsminit[] = { { 0, { 6 }, ((0+26)+11), }, { 0, { 5 }, (0), }, { 0, { 2 }, (0+21), }, { 0, { '.' }, (0+23), }, { 0, { 1 }, (0+17), }, { 0, { 'L' }, (0+18), }, { 0, { 'd', 'e', 'f', 'i' }, (0+1), }, { 0, { 'r', 't', 'v', 'w' }, (0+1), }, { 0, { '"', '\'' }, ((0+26)+3), }, { 0, { '/' }, (0+10), }, { 0, { '\n' }, ((0+26)+7), }, { 0, { ' ','\t','\f','\013' }, (0+25), }, { (0+1), { 6 }, ((0+26)+6), }, { (0+1), { 1, 2 }, (0+17), }, { (0+1), { 'a' }, (0+2), }, { (0+1), { 'e' }, (0+3), }, { (0+1), { 'f' }, (0+4), }, { (0+1), { 'h' }, (0+5), }, { (0+1), { 'l' }, (0+6), }, { (0+1), { 'o' }, (0+7), }, { (0+1), { 'x' }, (0+8), }, { (0+1), { 'y' }, (0+9), }, { (0+2), { 6 }, (((0+26)+12)), }, { (0+2), { 1, 2 }, (0+17), }, { (0+2), { '_','s','t','a' }, (0+2), }, { (0+2), { 'r' }, (0+2), }, { (0+3), { 6 }, (((0+26)+12)), }, { (0+3), { 1, 2 }, (0+17), }, { (0+3), { 't','u','r','n' }, (0+3), }, { (0+4), { 6 }, (((0+26)+12)), }, { (0+4), { 1, 2 }, (0+17), }, { (0+5), { 6 }, (((0+26)+12)), }, { (0+5), { 1, 2 }, (0+17), }, { (0+5), { 'i','l','e' }, (0+5), }, { (0+6), { 6 }, (((0+26)+12)), }, { (0+6), { 1, 2 }, (0+17), }, { (0+6), { 's','e' }, (0+6), }, { (0+7), { 6 }, (((0+26)+12)), }, { (0+7), { 1, 2 }, (0+17), }, { (0+7), { 'r', 'i','d' }, (0+7), }, { (0+8), { 6 }, (((0+26)+12)), }, { (0+8), { 1, 2 }, (0+17), }, { (0+8), { 't','e','r','n' }, (0+8), }, { (0+9), { 6 }, (((0+26)+12)), }, { (0+9), { 1, 2 }, (0+17), }, { (0+9), { 'p','e','d','f' }, (0+9), }, { (0+10), { 6 }, ((0+26)+0), }, { (0+10), { '*' }, (0+11), }, { (0+10), { '/' }, (0+14), }, { (0+11), { 6 }, (0+11), }, { (0+11), { '\n', 5 }, ((0+26)+1), }, { (0+11), { '/' }, (0+13), }, { (0+11), { '*' }, (0+12), }, { (0+11), { '#', ';', ')' }, ((( (0+11))<<(7+1))|(((0+26)+8))), }, { (0+12), { 6 }, (0+11), }, { (0+12), { '\n', 5 }, ((0+26)+1), }, { (0+12), { '#', ';', ')' }, ((( (0+11))<<(7+1))|(((0+26)+8))), }, { (0+12), { '*' }, (0+12), }, { (0+12), { '/' }, ((0+26)+1), }, { (0+13), { 6 }, (0+11), }, { (0+13), { '*', '\n', 5 }, ((0+26)+1), }, { (0+13), { '/' }, (0+13), }, { (0+14), { 6 }, (0+14), }, { (0+14), { '\n', 5 }, ((0+26)+1), }, { (0+14), { '/' }, (0+15), }, { (0+14), { '*' }, (0+16), }, { (0+15), { 6 }, (0+14), }, { (0+15), { '*', '\n', 5 }, ((0+26)+1), }, { (0+15), { '/' }, (0+15), }, { (0+16), { 6 }, (0+14), }, { (0+16), { '\n', 5 }, ((0+26)+1), }, { (0+16), { '*' }, (0+16), }, { (0+16), { '/' }, ((0+26)+1), }, { (0+17), { 6 }, ((0+26)+6), }, { (0+17), { 1, 2 }, (0+17), }, { (0+23), { 6 }, ((0+26)+0), }, { (0+23), { '.' }, (0+24), }, { (0+23), { 2 }, (0+21), }, { (0+24), { 6 }, (((( (0401+1))-0401)<<(7+1))|( ((0+26)+14))), }, { (0+24), { '.' }, (((( (0401+29))-0401)<<(7+1))|( ((0+26)+13))), }, { (0+18), { 6 }, ((0+26)+6), }, { (0+18), { 1, 2 }, (0+17), }, { (0+18), { '"', '\'' }, ((( (0+19))<<(7+1))|(((0+26)+8))), }, { (0+19), { 6 }, (0+19), }, { (0+19), { '"', '\'' }, ((0+26)+4), }, { (0+19), { '\n', 5 }, ((0+26)+4), }, { (0+19), { '\\' }, (0+20), }, { (0+20), { 6 }, ((0+26)+5), }, { (0+20), { '\n', 5 }, ((0+26)+4), }, { (0+21), { 6 }, (((( (0401+1))-0401)<<(7+1))|( ((0+26)+14))), }, { (0+21), { 1, 2, '.' }, (0+21), }, { (0+21), { 'e', 'E' }, (0+22), }, { (0+22), { 6 }, (((( (0401+1))-0401)<<(7+1))|( ((0+26)+14))), }, { (0+22), { 1, 2, '.' }, (0+21), }, { (0+22), { '+', '-' }, (0+21), }, { (0+25), { 6 }, ((0+26)+15), }, { (0+25), { ' ', '\t' }, (0+25), }, { (0+25), { '\f', '\013' }, ((0+26)+10), }, { (-1), { 0 }, 0, } }; short _pp_fsmtab[(0+26)+1][255+1]; char _pp_trigraph[255+1]; static char spl[] = { '\\', '\r', 0 }; static char aln[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$@"; static char* let = &aln[10]; static char hex[] = "fedcbaFEDCBA9876543210"; static char* dec = &hex[12]; static char* oct = &hex[14]; void ppfsm __PARAM__((int op, char* s), (op, s)) __OTORP__(int op; char* s;){ int c; int n; int i; short* rp; struct fsminit* fp; switch (op) { case 4: for (fp = fsminit;; fp++) { if ((n = fp->nextstate) >= (0+26)) n = ~n; if (fp->state == (-1)) { break; } rp = _pp_fsmtab[fp->state]; for (i = 0; i < sizeof(fp->ch) && (c = fp->ch[i]); i++) { switch (c) { case 6: for (c = 0; c <= 255; c++) rp[c] = n; case 5: _pp_fsmtab[(0+26)][fp->state+1] = n < 0 ? ~n : n; continue; case 1: s = let; break; case 3: s = hex; break; case 2: s = dec; break; case 4: s = oct; break; default: rp[c] = n; continue; } while (c = *s++) rp[c] = n; } } for (i = 0; i < (0+26); i++) { rp = _pp_fsmtab[i]; s = spl; while (c = *s++) if (c != '@' || !(( rp)>=_pp_fsmtab[(0+11)]&&( rp)<=_pp_fsmtab[(0+13)]||(( rp)>=_pp_fsmtab[(0+14)]&&( rp)<=_pp_fsmtab[(0+16)]))) { if (rp[c] >= 0) rp[c] = ~rp[c]; rp[c] &= ~(1<<7); } rp[0] = ~((0+26)+2); for (c = 0; c <= 255; c++) if (rp[c] == i) rp[c] = 0; } _pp_fsmtab[(0+26)][0] = ~((0+26)+2); break; } } #line 18 "../../lib/libpp/ppproto.c" struct proto { int brace; int fd; char* file; long flags; int line; int test; char* tp; int iz; char* ib; char* ip; int oz; char* ob; char* op; char pushback[4]; char variadic[256]; }; static int errors; static int sstrlen __PARAM__((char* s), (s)) __OTORP__(char* s;){ char* b; for (b = s; *s; s++); return(s - b); } static int sstrncmp __PARAM__((char* s, char* t, int n), (s, t, n)) __OTORP__(char* s; char* t; int n;){ char* e = s + n; while (s < e) { if (*s != *t || !*s) return(*s - *t); s++; t++; } return(0); } static char* memcopy __PARAM__((char* s, char* t, int n), (s, t, n)) __OTORP__(char* s; char* t; int n;){ char* e = t + n; while (t < e) *s++ = *t++; return(s); } static char* strcopy __PARAM__((char* s, char* t), (s, t)) __OTORP__(char* s; char* t;){ while (*s++ = *t++); return(s - 1); } static char* comment __PARAM__((char* p, char* s, int n, int u), (p, s, n, u)) __OTORP__(char* p; char* s; int n; int u;){ char* e; char* m; if (!s) { if (n) { *p++ = (n > 0) ? '/' : '*'; e = p + 62; while (p < e) *p++ = '*'; *p++ = (n > 0) ? '*' : '/'; } else s = ""; } if (s) { if (n > 62) n = 62; *p++ = '*'; e = p + (62 - n) / 2; m = p + 62; while (p < e) *p++ = ' '; e = p + n; while (p < e) { n = *s++; if (u && n >= 'a' && n <= 'z') n = n - 'a' + 'A'; *p++ = n; } e = m; while (p < e) *p++ = ' '; *p++ = '*'; } *p++ = '\n'; return(p); } #line 285 typedef struct { char* data; int size; } Item_t; typedef struct { int type; Item_t item[5]; } Notice_t; static char* copyright __PARAM__((char* p, char* s), (p, s)) __OTORP__(char* p; char* s;){ char* v; char* x; int c; int i; int n; unsigned long h; time_t clock; char buf[(62+4)]; Notice_t notice; notice.type = 2; for (i = 0; i < 5; i++) notice.item[i].data = 0; i = 0; while (c = *s) { while (c == ' ' || c == '\t' || c == '\n' || c == '\r') c = *++s; x = s; n = 0; h = 0; while (c && c != '=' && c != ' ' && c != '\t' && c != '\n' && c != '\r') { if (n++ < 6) h = (h << 5) + c - 'a'; c = *++s; } if (c == '=') { n = (*++s == '"' || *s == '\'') ? *s++ : 0; v = s; while ((c = *s) && (n && c != n || !n && c != ' ' && c != '\t' && c != '\n' && c != '\r')) s++; switch (h) { case ((('c'-'a')<<25)|(('o'-'a')<<20)|(('m'-'a')<<15)|(('p'-'a')<<10)|(('a'-'a')<<5)|('n'-'a')): c = 0; break; case ((('c'-'a')<<25)|(('o'-'a')<<20)|(('n'-'a')<<15)|(('t'-'a')<<10)|(('a'-'a')<<5)|('c'-'a')): c = 2; break; case ((('c'-'a')<<25)|(('o'-'a')<<20)|(('r'-'a')<<15)|(('p'-'a')<<10)|(('o'-'a')<<5)|('r'-'a')): c = 3; break; case ((('l'-'a')<<25)|(('i'-'a')<<20)|(('c'-'a')<<15)|(('e'-'a')<<10)|(('n'-'a')<<5)|('s'-'a')): c = 4; break; case ((('o'-'a')<<25)|(('r'-'a')<<20)|(('g'-'a')<<15)|(('a'-'a')<<10)|(('n'-'a')<<5)|('i'-'a')): c = 1; break; case ((('t'-'a')<<15)|(('y'-'a')<<10)|(('p'-'a')<<5)|('e'-'a')): if (!sstrncmp( v, "proprietary", 11)) notice.type = 2; else if (!sstrncmp( v, "nonexclusive", 11)) notice.type = 1; default: c = -1; break; } if (c >= 0 && (notice.item[c].size = s - v)) notice.item[c].data = v; } else { while (c && c != '\n') c = *++s; if (notice.item[i].size = s - x) { notice.item[i].data = x; if (i == 0) { notice.item[3].data = v = x; while ((c = *x) && c != '\n' && c != ' ' && (c < 'a' || c > 'z')) x++; if ((c = (x - v)) >= 3) { notice.item[3].size = c++; notice.item[0].data += c; notice.item[0].size -= c; } else notice.item[3].data = 0; } } if (i++ >= 2) break; } if (*s) s++; } p = comment(p, ((char*)0), 1, 0); p = comment(p, ((char*)0), 0, 0); s = buf; if (notice.type == 2) { if ((x = notice.item[i = 3].data) || (x = notice.item[i = 0].data)) { s = memcopy(s, x, notice.item[i].size); *s++ = ' '; *s++ = '-'; *s++ = ' '; } s = strcopy(s, "Proprietary"); p = comment(p, buf, s - buf, 1); p = comment(p, ((char*)0), 0, 0); if (notice.item[4].data) { s = strcopy(buf, "This is proprietary source code"); if (notice.item[3].data || notice.item[0].data) s = strcopy(s, " licensed by"); p = comment(p, buf, s - buf, 1); if (x = notice.item[3].data) { s = memcopy(buf, x, notice.item[3].size); s = strcopy(s, " Corp."); p = comment(p, buf, s - buf, 1); } else if (x = notice.item[0].data) p = comment(p, x, notice.item[0].size, 1); } else { s = strcopy(buf, "This is unpublished proprietary source code"); if (x) s = strcopy(s, " of"); p = comment(p, buf, s - buf, 1); s = buf; if (x = notice.item[3].data) s = memcopy(s, x, notice.item[3].size); if (x = notice.item[0].data) { if (s > buf) *s++ = ' '; s = memcopy(s, x, notice.item[0].size); } if (s > buf) p = comment(p, buf, s - buf, 1); p = comment( p, "and is not to be disclosed or used except in",sizeof( "and is not to be disclosed or used except in")-1, 1); p = comment( p, "accordance with applicable agreements",sizeof( "accordance with applicable agreements")-1, 1); } p = comment(p, ((char*)0), 0, 0); } else if (notice.type == 1) { p = comment( p, "For nonexclusive individual use",sizeof( "For nonexclusive individual use")-1, 1); p = comment(p, ((char*)0), 0, 0); } s = strcopy(buf, "Copyright (c) "); time(&clock); s = memcopy(s, ctime(&clock) + 20, 4); if (x = notice.item[3].data) { *s++ = ' '; s = memcopy(s, x, notice.item[3].size); *s++ = ' '; s = strcopy(s, "Corp."); } else if (x = notice.item[0].data) { *s++ = ' '; s = memcopy(s, x, notice.item[0].size); } p = comment(p, buf, s - buf, 0); if (notice.type == 2) { if (!notice.item[4].data) p = comment( p, "Unpublished & Not for Publication",sizeof( "Unpublished & Not for Publication")-1, 0); p = comment( p, "All Rights Reserved",sizeof( "All Rights Reserved")-1, 0); } p = comment(p, ((char*)0), 0, 0); if (notice.item[4].data) { s = strcopy(buf, "This software is licensed"); if (x = notice.item[3].data) { s = strcopy(s, " by "); s = memcopy(s, x, notice.item[3].size); *s++ = ' '; s = strcopy(s, "Corp."); } else if (x = notice.item[0].data) { s = strcopy(s, " by "); s = memcopy(s, x, notice.item[0].size); } p = comment(p, buf, s - buf, 0); p = comment( p, "under the terms and conditions of the license in",sizeof( "under the terms and conditions of the license in")-1, 0); p = comment(p, notice.item[4].data, notice.item[4].size, 0); p = comment(p, ((char*)0), 0, 0); } else if (notice.type == 2) { p = comment( p, "The copyright notice above does not evidence any",sizeof( "The copyright notice above does not evidence any")-1, 0); p = comment( p, "actual or intended publication of such source code",sizeof( "actual or intended publication of such source code")-1, 0); p = comment(p, ((char*)0), 0, 0); } if (x = notice.item[1].data) { p = comment( p, "This software was created by the",sizeof( "This software was created by the")-1, 0); p = comment(p, x, notice.item[1].size, 0); s = buf; if (x = notice.item[3].data) s = memcopy(s, x, notice.item[3].size); if (x = notice.item[0].data) { if (s > buf) *s++ = ' '; s = memcopy(s, x, notice.item[0].size); } if (s > buf) p = comment(p, buf, s - buf, 0); p = comment(p, ((char*)0), 0, 0); } if (x = notice.item[2].data) { p = comment( p, "For further information contact",sizeof( "For further information contact")-1, 0); p = comment(p, x, notice.item[2].size, 0); p = comment(p, ((char*)0), 0, 0); } p = comment(p, ((char*)0), -1, 0); return(p); } static char* number __PARAM__((char* p, long n), (p, n)) __OTORP__(char* p; long n;){ long d; for (d = 1000000; d > 1; d /= 10) if (n >= d) *p++ = '0' + (n / d) % 10; *p++ = '0' + n % 10; return(p); } static void proto_error __PARAM__((char* iob, int level, char* msg, char* arg), (iob, level, msg, arg)) __OTORP__(char* iob; int level; char* msg; char* arg;){ char* p; char buf[1024]; p = strcopy(buf, "proto: "); if (iob) { struct proto* proto = (struct proto*)(iob - sizeof(struct proto)); if (proto->line) { if (proto->file) { *p++ = '"'; p = strcopy(p, proto->file); *p++ = '"'; *p++ = ','; *p++ = ' '; } p = strcopy(p, "line "); p = number(p, proto->line); } else if (proto->file) p = strcopy(p, proto->file); } else { p = strcopy(p, msg); msg = arg; arg = 0; } *p++ = ':'; *p++ = ' '; if (level == 1) p = strcopy(p, "warning: "); p = strcopy(p, msg); if (arg) { *p++ = ' '; p = strcopy(p, arg); } *p++ = '\n'; write(2, buf, p - buf); if (level >= 3) exit(level - 2); if (level >= 2) errors++; } static char* linesync __PARAM__((struct proto* proto, char* p, long n), (proto, p, n)) __OTORP__(struct proto* proto; char* p; long n;){ if (proto->flags & (1L<<12)) { p = strcopy(p, "\n#line "); p = number(p, n); *p++ = '\n'; } return(p); } static char* init __PARAM__((char* op, int flags), (op, flags)) __OTORP__(char* op; int flags;){ if (flags & (1L<<9)) op = strcopy(op, "\ \n\ #if !defined(__PROTO__)\n\ #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)\n\ #if defined(__cplusplus)\n\ #define __MANGLE__ \"C\"\n\ #else\n\ #define __MANGLE__\n\ #endif\n\ #define __STDARG__\n\ #define __PROTO__(x) x\n\ #define __OTORP__(x)\n\ #define __PARAM__(n,o) n\n\ #if !defined(__STDC__) && !defined(__cplusplus)\n\ #if !defined(c_plusplus)\n\ #define const\n\ #endif\n\ #define signed\n\ #define void int\n\ #define volatile\n\ #define __V_ char\n\ #else\n\ #define __V_ void\n\ #endif\n\ #else\n\ #define __PROTO__(x) ()\n\ #define __OTORP__(x) x\n\ #define __PARAM__(n,o) o\n\ #define __MANGLE__\n\ #define __V_ char\n\ #define const\n\ #define signed\n\ #define void int\n\ #define volatile\n\ #endif\n\ #if defined(__cplusplus) || defined(c_plusplus)\n\ #define __VARARG__ ...\n\ #else\n\ #define __VARARG__\n\ #endif\n\ #if defined(__STDARG__)\n\ #define __VA_START__(p,a) va_start(p,a)\n\ #else\n\ #define __VA_START__(p,a) va_start(p)\n\ #endif\n\ #endif\n\ "); else op = strcopy(op, "\ \n\ #if !defined(__PROTO__)\n\ #include \n\ #endif\n\ "); return(op); } static int lex __PARAM__((struct proto* proto, long flags), (proto, flags)) __OTORP__(struct proto* proto; long flags;){ char* ip; char* op; int c; int state; short* rp; char* m; char* e; char* t; char* bp; char* v; char* im; char* ko; char* aom; int n; int line; int quot; int x; int vc; char* ie = 0; char* om = 0; char* aim = 0; char* aie = 0; int call = 0; int group = 0; int last = 0; int paren = 0; char* qe = 0; int qn = 0; int args = 0; ((ip=proto->ip),(op=proto->op)); if (flags & (1L<<5)) (ko=op); fsm_start: proto->tp = ip; state = 0; bp = ip; do { rp = _pp_fsmtab[state]; fsm_get: while (!(state = rp[c = (*(unsigned char*)ip++)])); fsm_next: ; } while (state > 0); if ((n = ip - bp - 1) > 0) { ip = bp; do switch( n) { default : memcpy( op, ip, n); op += n; ip += n; break; case 7 : * op++ = * ip++; case 6 : * op++ = * ip++; case 5 : * op++ = * ip++; case 4 : * op++ = * ip++; case 3 : * op++ = * ip++; case 2 : * op++ = * ip++; case 1 : * op++ = * ip++; case 0 : break; } while (0); ip++; } state = ~state; fsm_terminal: switch ((( state)&((1<<(7+1))-1))) { case ((0+26)+11): if (op > proto->ob && *(op - 1) == '=' && (op == proto->ob + 1 || *(op - 2) != '=')) switch (c) { case '+': case '-': case '*': case '&': (*op++=( ' ')); break; } (*op++=( c)); break; case ((0+26)+0): (ip--); c = (*(op-1)); break; case ((0+26)+1): switch (c) { case '\n': if ((( rp)>=_pp_fsmtab[(0+14)]&&( rp)<=_pp_fsmtab[(0+16)])) goto fsm_newline; (*op++=( c)); proto->line++; rp = _pp_fsmtab[(0+11)]; break; case '/': if ((flags & ((1L<<5)|(1L<<14))) == (1L<<5)) (op=ko); else (*op++=( c)); if ((( rp)>=_pp_fsmtab[(0+14)]&&( rp)<=_pp_fsmtab[(0+16)])) { rp = _pp_fsmtab[(0+14)]; break; } goto fsm_start; case (255+1): break; default: if ((flags & ((1L<<5)|(1L<<14))) == (1L<<5)) (op=ko); else (*op++=( c)); rp = _pp_fsmtab[(( rp)>=_pp_fsmtab[(0+14)]&&( rp)<=_pp_fsmtab[(0+16)]) ? (0+14) : (0+12)]; break; } bp = ip; goto fsm_get; case ((0+26)+2): if (c) { if (state = _pp_fsmtab[(0+26)][((( rp)-_pp_fsmtab[0])/(255+1))+1]) goto fsm_terminal; do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(0); } (ip--); fsm_eob: if ((flags & ((1L<<1)|((1L<<15))|(1L<<20))) == ((1L<<15)) && (proto->flags & (1L<<15))) { if (!(flags & (1L<<5))) flags |= (1L<<24); c = ip - proto->ib; if (!(flags & (1L<<14))) im = proto->tp; n = ip - im; if (ip - n < proto->ib) proto->flags |= (1L<<4); memcopy(proto->ib - n, ip - n, n); ip = proto->ib; proto->tp -= c; if (flags & (1L<<14)) { im -= c; ie -= c; } if (aim) aim -= c; if (aie) aie -= c; if ((n = read(proto->fd, ip, proto->iz)) > 0) { if ((proto->flags & (1L<<21)) && n < proto->iz) { proto->flags &= ~(1L<<15); close(proto->fd); } *(ip + n) = 0; if (state & (1<<7)) goto fsm_splice; bp = ip; goto fsm_get; } *ip = 0; proto->flags &= ~(1L<<15); close(proto->fd); } if (state & (1<<7)) goto fsm_splice; if (!(flags & (1L<<20)) && (state = rp[c = (255+1)])) { bp = ip; goto fsm_next; } do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(0); case ((0+26)+3): quot = c; if (c == '"' && qe) { for (n = 0, t = qe + 1; t < op && (*t == ' ' || *t == '\t' || *t == '\n' && ++n); t++); if (t == op) { op = qe; qe = 0; qn = n; } else (*op++=( c)); } else (*op++=( c)); rp = _pp_fsmtab[(0+19)]; bp = ip; goto fsm_get; case ((0+26)+4): if (c == quot) { if (!(flags & (1L<<3))) qe = (c == '"') ? op : (char*)0; (*op++=( c)); while (qn > 0) { qn--; (*op++=( '\n')); } } else if (c != '\n' && c != (255+1)) { (*op++=( c)); bp = ip; goto fsm_get; } else { while (qn > 0) { qn--; (*op++=( '\n')); } (ip--); } c = (0401+1); break; case ((0+26)+5): if (flags & (1L<<0)) (*op++=( c)); else switch (c) { case 'a': (*op++=( '0')); (*op++=( '0')); (*op++=( '7')); break; case 'v': (*op++=( '0')); (*op++=( '1')); (*op++=( '3')); break; case 'x': do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); lex(proto, (flags & ((1L<<15))) | (1L<<20)); for (n = x = 0; (c = (*(unsigned char*)ip++)), x < 3; x++) switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = (n << 4) + c - '0'; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': n = (n << 4) + c - 'a' + 10; break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': n = (n << 4) + c - 'A' + 10; break; default: goto fsm_hex; } fsm_hex: (ip--); (*op++=( ((n >> 6) & 07) + '0')); (*op++=( ((n >> 3) & 07) + '0')); (*op++=( (n & 07) + '0')); break; default: (*op++=( c)); break; } rp = _pp_fsmtab[(0+19)]; bp = ip; goto fsm_get; case ((0+26)+6): (ip--); if ((flags & (1L<<5)) && *proto->tp == 's' && !sstrncmp( proto->tp, "static", 6)) { c = ((0500+4)+9); break; } if (*proto->tp == '_' && !sstrncmp( proto->tp, "__STDPP__directive", 6)) c = '#'; else c = (0401+0); break; case ((0+26)+7): fsm_newline: proto->line++; if (flags & (1L<<5)) { if (op != proto->ob && (*(op-1)) != ' ' && (*(op-1)) != '\n') (*op++=( ' ')); } else (*op++=( c)); if (flags & (1L<<3)) { if (flags & (1L<<0)) { if (flags & (1L<<5)) (op=ko); if (flags & (1L<<11)) { *(ip - 1) = 0; op = strcopy(om, "/* "); op = strcopy(op, im); op = strcopy(op, " */\n"); } flags &= ~((1L<<2)|(1L<<3)|(1L<<6)|(1L<<7)|(1L<<11)|(1L<<14)|(1L<<22)|(1L<<26)); } else { if ((flags & ((1L<<2)|(1L<<22))) == ((1L<<2)|(1L<<22))) { *(ip - 1) = 0; op = strcopy(om, "#if defined(__STDC__) || defined(__STDPP__)\n"); op = strcopy(op, im); op = strcopy(op, "\n#else\n"); bp = ip; ip = im; *op++ = *ip++; while (*op = *ip++) if (*op++ == '#' && *ip != '(') { op--; while (*--op == ' ' || *op == '\t'); if (*ip == '#') { op = strcopy(op + 1, "/**/"); while (*++ip == ' ' || *ip == '\t'); } else { if (*op != '"') *++op = '"'; op++; while (*ip == ' ' || *ip == '\t') ip++; while ((c = *ip) >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' || c == '_') *op++ = *ip++; while (*ip == ' ' || *ip == '\t') ip++; if (*ip == '"') ip++; else *op++ = '"'; } } ip = bp; op = strcopy(op, "\n#endif\n"); op = linesync(proto, op, proto->line); } flags &= ~((1L<<2)|(1L<<3)|(1L<<6)|(1L<<7)|(1L<<14)|(1L<<16)|(1L<<22)|(1L<<23)|(1L<<26)); } call = 0; group = 0; paren = 0; last = '\n'; } if (paren == 0 && (flags & ((1L<<14)|(1L<<20)|(1L<<23)|(1L<<24))) == (1L<<24)) { if (flags & (1L<<5)) (op=ko); do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(0); } goto fsm_start; case ((0+26)+8): (*op++=( c)); rp = _pp_fsmtab[((( state)>>(7+1))&((1<<7)-1))]; bp = ip; goto fsm_get; case ((0+26)+13): (*op++=( c)); c = (((( state)>>(7+1))&((1<<7)-1))+0401); break; case ((0+26)+14): (ip--); c = (((( state)>>(7+1))&((1<<7)-1))+0401); break; case (((0+26)+12)): (ip--); c = (0401+0); if (!(flags & (1L<<1))) switch (((((long)( *proto->tp))<<16)|(((long)( *(ip - 1)))<<8)|((long)( ip - proto->tp)))) { case ((((long)( 'd'))<<16)|(((long)( 'o'))<<8)|((long)( 2))): c = ((0500+4)+6); break; case ((((long)( 'e'))<<16)|(((long)( 'e'))<<8)|((long)( 4))): if (!(flags & (1L<<20)) && !sstrncmp( proto->tp, "else", 4)) { c = ((0500+4)+8); goto fsm_id; } break; case ((((long)( 'e'))<<16)|(((long)( 'n'))<<8)|((long)( 6))): if (!sstrncmp( proto->tp, "extern", 6)) c = ((0500+4)+9); break; case ((((long)( 'f'))<<16)|(((long)( 'r'))<<8)|((long)( 3))): if (!(flags & (1L<<20)) && !sstrncmp( proto->tp, "for", 3)) { c = ((0500+4)+11); goto fsm_id; } break; case ((((long)( 'i'))<<16)|(((long)( 'f'))<<8)|((long)( 2))): c = ((0500+4)+13); break; case ((((long)( 'r'))<<16)|(((long)( 'n'))<<8)|((long)( 6))): if (!(flags & (1L<<20)) && !sstrncmp( proto->tp, "return", 6)) { c = ((0500+4)+17); goto fsm_id; } break; case ((((long)( 't'))<<16)|(((long)( 'f'))<<8)|((long)( 7))): if (!(flags & (1L<<20)) && !sstrncmp( proto->tp, "typedef", 7)) { flags |= (1L<<26); c = ((0500+4)+9); } break; case ((((long)( 'v'))<<16)|(((long)( 't'))<<8)|((long)( 8))): if (*ip == '(' && !sstrncmp( proto->tp, "va_start", 8)) c = (0500+1); break; case ((((long)( 'v'))<<16)|(((long)( 'd'))<<8)|((long)( 4))): if (!sstrncmp( proto->tp, "void", 4)) { if (flags & ((1L<<0)|(1L<<18)|(1L<<9)|(1L<<10))) c = ((0500+4)+30); else { do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); line = proto->line; if (lex(proto, (flags & ((1L<<15))) | (1L<<20)) == '*') { memcopy(op - 4, "__V_", 4); memcopy(ip - 4, "__V_", 4); } else c = ((0500+4)+30); proto->line = line; do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); bp = ip; } } break; case ((((long)( 'w'))<<16)|(((long)( 'e'))<<8)|((long)( 5))): if (!(flags & (1L<<20)) && !sstrncmp( proto->tp, "while", 5)) { c = ((0500+4)+26); goto fsm_id; } break; } if ((flags & (1L<<0)) && c != ((0500+4)+9)) c = (0401+0); break; case ((0+26)+10): goto fsm_start; case ((0+26)+15): (ip--); if ((flags & ((1L<<5)|(1L<<14))) == (1L<<5)) { while (op > proto->ob && (*(op - 1) == ' ' || *(op - 1) == '\t')) op--; if (op > proto->ob && *(op - 1) != '\n') *op++ = ' '; } goto fsm_start; default: if (c == '\\' && (state & (1<<7))) { if (!(n = (*(unsigned char*)ip++))) { goto fsm_eob; fsm_splice: c = '\\'; n = (*(unsigned char*)ip++); } if (n == '\n') { proto->line++; (*op++=( '\\')); (*op++=( '\n')); bp = ip; goto fsm_get; } (ip--); state &= ~(1<<7); if (state >= (0+26)) goto fsm_terminal; rp = _pp_fsmtab[state]; } (*op++=( c)); bp = ip; goto fsm_get; } if (!(flags & ((1L<<9)|(1L<<10)|(1L<<20)))) { if (!(flags & (1L<<3))) switch (c) { case '(': if (!(flags & (1L<<0)) || proto->brace == 0) { if (paren++ == 0) { if (!(flags & (1L<<0)) || group <= 1) { args = 0; if (group++ == 0) group++; else if (flags & (1L<<7)) call++; flags |= (1L<<14); im = ip - 1; om = op - 1; } } else if (paren == 2 && !aim) { if (flags & (1L<<7)) { aim = ip - 1; aom = op - 1; } else if ((flags & ((1L<<14)|(1L<<25))) == (1L<<14)) { for (m = ip - 2; m > im && (*m == ' ' || *m == '\t'); m--); if (m == im) { flags &= ~(1L<<14); om = 0; } } } flags &= ~(1L<<25); } break; case ')': if (!(flags & (1L<<0)) || proto->brace == 0) if (--paren == 0) { if (flags & (1L<<0)) { if (group != 2) { c = (0401+0); break; } group++; } ie = ip; } else if (paren == 1 && (flags & (1L<<7)) && !aie) aie = ip; break; case '*': if (last == '(' && group == 2) { group--; if (paren == 1) { flags |= (1L<<7); aim = aie = 0; } } break; case '#': fsm_directive: if (!(flags & ((1L<<1)|(1L<<3)))) { flags |= (1L<<3); if (!(flags & (1L<<18))) { bp = ip; while (*ip == ' ' || *ip == '\t') ip++; if (*ip == 'l' && *++ip == 'i' && *++ip == 'n' && *++ip == 'e') { if (*++ip == ' ' || *ip == '\t') { proto->line = 0; while (*++ip >= '0' && *ip <= '9') proto->line = proto->line * 10 + *ip - '0'; proto->line--; } } else if ((flags & ((1L<<0)|(1L<<5))) == (1L<<0)) { n = 0; t = ip + 6; while (ip < t && *ip >= 'a' && *ip <= 'z') n = (n << 5) | (*ip++ - 'a'); switch (n) { case ((('e'-'a')<<15)|(('l'-'a')<<10)|(('s'-'a')<<5)|('e'-'a')): case ((('e'-'a')<<20)|(('n'-'a')<<15)|(('d'-'a')<<10)|(('i'-'a')<<5)|('f'-'a')): while (*ip == ' ' || *ip == '\t') ip++; if (*ip != '\n' && *ip != '/' && *(ip + 1) != '*') { flags |= (1L<<11)|(1L<<14); im = ip; om = op + (ip - bp); } break; case ((('e'-'a')<<15)|(('l'-'a')<<10)|(('i'-'a')<<5)|('f'-'a')): case ((('e'-'a')<<20)|(('r'-'a')<<15)|(('r'-'a')<<10)|(('o'-'a')<<5)|('r'-'a')): case ((('i'-'a')<<5)|('f'-'a')): case ((('i'-'a')<<20)|(('f'-'a')<<15)|(('d'-'a')<<10)|(('e'-'a')<<5)|('f'-'a')): case ((('i'-'a')<<25)|(('f'-'a')<<20)|(('n'-'a')<<15)|(('d'-'a')<<10)|(('e'-'a')<<5)|('f'-'a')): case ((('u'-'a')<<20)|(('n'-'a')<<15)|(('d'-'a')<<10)|(('e'-'a')<<5)|('f'-'a')): break; case ((('i'-'a')<<25)|(('n'-'a')<<20)|(('c'-'a')<<15)|(('l'-'a')<<10)|(('u'-'a')<<5)|('d'-'a')): if (*ip == 'e') ip++; case ((('d'-'a')<<25)|(('e'-'a')<<20)|(('f'-'a')<<15)|(('i'-'a')<<10)|(('n'-'a')<<5)|('e'-'a')): case ((('p'-'a')<<25)|(('r'-'a')<<20)|(('a'-'a')<<15)|(('g'-'a')<<10)|(('m'-'a')<<5)|('a'-'a')): if (*ip < 'a' || *ip > 'z') break; default: flags |= (1L<<11)|(1L<<14); im = bp - 1; om = op - 1; break; } } else { if (*ip == 'i' && *++ip == 'n' && *++ip == 'c' && *++ip == 'l' && *++ip == 'u' && *++ip == 'd' && *++ip == 'e') { while (*++ip == ' ' || *ip == '\t'); if (*ip++ == '<' && *ip++ == 's' && *ip++ == 't' && *ip++ == 'd' && *ip++ == 'a' && *ip++ == 'r' && *ip++ == 'g' && *ip++ == '.' && *ip++ == 'h' && *ip++ == '>') { op = strcopy(op, "\ if !defined(va_start)\n\ #if defined(__STDARG__)\n\ #include \n\ #else\n\ #include \n\ #endif\n\ #endif\n\ "); op = linesync(proto, op, proto->line); break; } } else if (*ip == 'd' && *++ip == 'e' && *++ ip == 'f' && *++ip == 'i' && *++ip == 'n' && *++ip == 'e' && (*++ip == ' ' || *ip == '\t')) { flags |= (1L<<2)|(1L<<14); im = bp - 1; om = op - 1; } } ip = bp; } } break; case '{': if (proto->brace++ == 0 && paren == 0) { if (last == '=') flags |= (1L<<8); else if (flags & (1L<<0)) { if ((flags & ((1L<<14)|(1L<<16)|(1L<<23))) == (1L<<14)) { if (args) { v = number(op, args < 0 ? -args : args); v = strcopy(v, " argument actual/formal mismatch"); *v++ = ' '; v = memcopy(v, im, ie - im); *v = 0; proto_error((char*)proto + sizeof(struct proto), 2, op, ((char*)0)); } ip--; v = ie; while (ie < ip) if (*ie++ == '/' && *ie == '*') { e = ie - 1; while (++ie < ip) { if (*ie == '*') { while (ie < ip && *ie == '*') ie++; if (ie < ip && *ie == '/') { while (++ie < ip && (*ie == ' ' || *ie == '\t')); while (e > v && (*(e - 1) == ' ' || *(e - 1) == '\t')) e--; if (e > v && *e != '\n') *e++ = ' '; t = ie; while (--e >= v) *--t = *e; v = t; break; } } } } ie = v; op = om++; if (flags & (1L<<5)) { v = op; while (v > ko && *--v != ' '); if (*v != ' ') { om = (v = (op += 4)) + 1; while (v >= ko + 4) { *v = *(v - 4); v--; } memcopy(ko, "int ", 4); } if (*v == ' ') { while (*(v + 1) == '*') *v++ = '*'; *v = '\t'; if ((v - ko) <= 8) { om = (e = ++op) + 1; while (e > v) { *e = *(e - 1); e--; } } } om = (v = (op += 7)) + 1; while (v >= ko + 7) { *v = *(v - 7); v--; } memcopy(ko, "extern ", 7); } (*op++=( '(')); t = op; e = 0; while (ie < ip) { if ((c = *ie) == ' ' || c == '\t' || c == '\n') { while ((c = *++ie) == ' ' || c == '\t' || c == '\n'); if (ie >= ip) break; if (c != '*' && op > om) (*op++=( ' ')); } if ((n = ((c = *ie) == ',')) || c == ';') { if (flags & (1L<<5)) { m = op; while (op > om && ((c = *(op - 1)) == '(' || c == ')' || c == '[' || c == ']')) op--; v = op; while (op > om && (c = *(op - 1)) != ' ' && c != '*') op--; while (*(op - 1) == ' ') op--; if (!e) { e = op; while (e > om && *(e - 1) == '*') e--; } if (op <= om) op = strcopy(op, "int"); else if (*(op - 1) == ',') op = strcopy(op, " int"); while (v < m) (*op++=( *v++)); } (*op++=( ',')); if (n) { if (x = !e) e = op - 1; (*op++=( ' ')); m = t; while (m < e) (*op++=( *m++)); if (x) { m = e; while (*--e != ' '); while (*(e - 1) == '*') e--; op -= m - e; } } while ((c = *++ie) == ' ' || c == '\t' || c == '\n'); if (ie >= ip) (op--); else (*op++=( ' ')); if (!n) { t = op; e = 0; } } else if (*ie == '*') { if (op > om && (c = *(op - 1)) == ' ') op--; while (*ie == '*') (*op++=( *ie++)); while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++; if (c != '(') (*op++=( ' ')); } else if (*ie == '(') { if (op > om && *(op - 1) == ' ') op--; (*op++=( *ie++)); while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++; } else if (*ie == ')') { if (op > om && *(op - 1) == '(') proto_error((char*)proto + sizeof(struct proto), 1, "function pointer argument prototype omitted", ((char*)0)); (*op++=( *ie++)); while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++; } else if ((flags & (1L<<5)) && (op == om || *(op - 1) == ' ') && *ie == 'r' && !sstrncmp( ie, "register", 8) && (*(ie + 8) == ' ' || *(ie + 8) == '\t' || *(ie + 8) == '\n')) { ie += 8; if (op > om) (op--); } else (*op++=( *ie++)); } if (op <= om) op = strcopy(op, "void"); (*op++=( ')')); if (flags & (1L<<5)) { (*op++=( ';')); (*op++=( '\n')); (proto->op=op); (ko=op); } else { (*op++=( '\n')); (*op++=( *ip)); } ip++; flags &= ~((1L<<14)|(1L<<23)); } } else if ((flags & ((1L<<14)|(1L<<18)|(1L<<23)|(1L<<25))) == ((1L<<14)|(1L<<25))) { line = proto->line; op = strcopy(om, " __PARAM__("); op = memcopy(op, im, ie - im); (*op++=( ',')); (*op++=( ' ')); (*op++=( '(')); flags &= ~((1L<<14)|(1L<<23)); if (flags & (1L<<27)) { if ((vc = ie - im + 1) > sizeof(proto->variadic)) vc = sizeof(proto->variadic); memcopy(proto->variadic, im, vc); op = strcopy(op, "va_alist)) __OTORP__(va_dcl)\n{"); } else { flags |= (1L<<23); proto->ip = im; proto->op = op; group = 0; for (;;) { switch (lex(proto, (flags & ((1L<<15))) | (1L<<20))) { case '(': if (paren++) group++; continue; case ')': if (--paren == 0) { group = 0; if (flags & (1L<<14)) { flags &= ~((1L<<14)|(1L<<23)); op = memcopy(op, m, e - m); } break; } continue; case ',': if (paren == 1) { group = 0; if (flags & (1L<<14)) { flags &= ~((1L<<14)|(1L<<23)); op = memcopy(op, m, e - m); } (*op++=( ',')); (*op++=( ' ')); proto->op = op; } continue; case (0401+0): if (group <= 1) { flags |= (1L<<14); m = proto->tp; e = proto->ip; } continue; default: continue; } break; } (*op++=( ')')); (*op++=( ')')); } if (!(flags & (1L<<23))) { flags |= (1L<<23); proto->op = strcopy(op, " __OTORP__("); proto->ip = im + 1; n = *(ie - 1); *(ie - 1) = ';'; c = *ie; *ie = 0; lex(proto, (flags & ((1L<<15))) | (1L<<1)); *(ie - 1) = n; *ie = c; proto->ip = ie; op = proto->op; (*op++=( ')')); } op = linesync(proto, op, proto->line = line); if (!(flags & (1L<<27))) (*op++=( '{')); } } flags &= ~((1L<<6)|(1L<<7)|(1L<<14)|(1L<<16)|(1L<<23)); call = 0; group = 0; break; case '}': flags &= ~((1L<<6)|(1L<<7)|(1L<<14)|(1L<<16)|(1L<<23)|(1L<<25)); if (--proto->brace == 0) { flags &= ~((1L<<8)|(1L<<27)|(1L<<28)); if (flags & (1L<<5)) (op=ko); } call = 0; group = 0; paren = 0; break; case '=': if (last == '?') flags |= (1L<<3); else if (paren == 0 && (flags & ((1L<<8)|(1L<<14)|(1L<<23))) == (1L<<14)) goto fsm_statement; goto fsm_other; case ',': if (flags & (1L<<0)) { if (paren == 1) args++; else { args--; flags &= ~(1L<<14); } break; } if (paren == 0 && (flags & (1L<<1))) *(op - 1) = c = ';'; case ';': fsm_statement: if (flags & (1L<<8)) ; else if (flags & (1L<<0)) { if (paren == 0) { if ((flags & (1L<<14)) && last == ')') flags &= ~(1L<<14); if (!(flags & (1L<<14))) { call = 0; group = 0; flags &= ~(1L<<23); if (flags & (1L<<5)) (op=ko); if (flags & (1L<<24)) { do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(0); } } else { args--; if ((flags & ((1L<<5)|(1L<<23))) == ((1L<<5)|(1L<<23))) (op=ko); } } } else if (paren == 0) { if ((flags & ((1L<<14)|(1L<<16)|(1L<<23))) == (1L<<14) && call > 1) { if ((flags & ((1L<<1)|(1L<<7))) == (1L<<7) && aim && aie < im) { while (aie < ip && (*aie == ' ' || *aie == '\t' || *aie == '\n')) aie++; v = aim; while (v < aie) if (*v++ == ')') break; while (v < aie && (*v == ' ' || *v == '\t' || *v == '\n')) v++; if (v == aie || !(flags & (1L<<19))) { if (flags & (1L<<19)) n = 3; else if (v == aie && *v == '(') n = 10; else n = 11; ko = op; om += n; v = op += n; while (v >= ko + n) { *v = *(v - n); v--; } if (flags & (1L<<19)) memcopy(aom, "(...))", 6); else if (n == 10) memcopy(aom, "(__VARARG__))", 13); else { ko = strcopy(aom, " __PROTO__("); ko = memcopy(ko, aim, aie - aim); *ko = ')'; if (++ko >= om) { *ko++ = ')'; om = ko; } } } } else if (flags & (1L<<26)) { op = om; while (*--op == ' ' || *op == '\t' || *op == '\n'); if (*op != ')') { op = om += 14; *--op = ')'; while ((x = *(op - 14)) >= 'A' && x <= 'Z' || x >= 'a' && x <= 'z' || x >= '0' && x <= '9' || x == '_') *--op = x; memcopy(op - 13, "(__OTORP__(*)", 13); } } if (flags & (1L<<19)) { if (!(flags & (1L<<25))) { op = strcopy(om, "(...)"); (*op++=( c)); } } else { if (flags & (1L<<1)) op = strcopy(om, "()"); else if (!(flags & (1L<<25))) op = strcopy(om, "(__VARARG__)"); else { op = strcopy(om, " __PROTO__("); op = memcopy(op, im, ie - im); (*op++=( ')')); } (*op++=( c)); } flags &= ~((1L<<14)|(1L<<27)|(1L<<28)); if (c == ',' && !(flags & (1L<<7))) { call = 1; group = 0; break; } } else if (flags & ((1L<<16)|(1L<<23))) call = 0; if (c == ';') { flags &= ~((1L<<13)|(1L<<26)); if (flags & (1L<<24)) { do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(0); } call = 0; } else call = call > 1 && c == ','; group = 0; flags &= ~((1L<<6)|(1L<<7)|(1L<<14)|(1L<<16)|(1L<<23)); } else if (paren == 1 && group == 1 && !(flags & ((1L<<6)|(1L<<13)))) flags |= (1L<<25)|(1L<<16); break; case ((0500+4)+6): case ((0500+4)+13): flags |= (1L<<25)|(1L<<23); break; case ((0500+4)+9): if (flags & (1L<<0)) { if (proto->brace == 0) flags |= (1L<<23); } else if (paren == 0 && !(flags & (1L<<26))) { flags |= (1L<<13); if (!(flags & (1L<<18))) op = strcopy(op, " __MANGLE__"); } break; case (0401+29): if (paren == 0 && (flags & ((1L<<1)|(1L<<27))) == (1L<<1)) { op -= 3; do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(c); } if (paren == 1 && !(flags & (1L<<23))) flags |= (1L<<27); flags |= (1L<<25); break; case ((0500+4)+30): goto fsm_id; case (0500+1): if ((flags & ((1L<<18)|(1L<<27))) == (1L<<27)) { flags &= ~(1L<<14); line = proto->line; op = strcopy(op - 8, "__VA_START__"); do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); for (;;) { switch (lex(proto, (flags & ((1L<<15))) | (1L<<20))) { case 0: case ';': break; case (0401+0): if (!(flags & (1L<<14))) { flags |= (1L<<14); m = proto->tp; e = proto->ip; } continue; default: continue; } break; } ((ip=proto->ip),(op=proto->op)); if (flags & (1L<<14)) { v = m; n = e - m; } else { v = "ap"; n = 2; } op = strcopy(op, " __OTORP__("); proto->ip = proto->variadic; proto->op = op; flags &= ~(1L<<14); group = 0; bp = proto->ip + 1; if (*bp == 'r' && !sstrncmp( bp, "register", 8) && (*(bp + 8) == ' ' || *(bp + 8) == '\t')) bp += 9; for (;;) { switch (lex(proto, (flags & ((1L<<15))) | (1L<<20))) { case '(': if (paren++) group++; continue; case ')': if (--paren == 0) { if (flags & (1L<<14)) { flags &= ~(1L<<14); if (!(flags & (1L<<28))) { op = memcopy(op, m, e - m); op = strcopy(op, " = "); } op = strcopy(op, "va_arg("); op = memcopy(op, v, n); (*op++=( ',')); (*op++=( ' ')); if (m > bp) op = memcopy(op, bp, m - bp); else op = strcopy(op, "int "); if (group > 1) op = strcopy(op, ")()"); else op = memcopy(op, e, proto->ip - e - 1); (*op++=( ')')); (*op++=( ';')); } group = 0; break; } continue; case ',': if (paren == 1) { if (flags & (1L<<14)) { flags &= ~(1L<<14); if (!(flags & (1L<<28))) { op = memcopy(op, m, e - m); op = strcopy(op, " = "); } op = strcopy(op, "va_arg("); op = memcopy(op, v, n); (*op++=( ',')); (*op++=( ' ')); if (m > bp) op = memcopy(op, bp, m - bp); else op = strcopy(op, "int "); if (group > 1) op = strcopy(op, ")()"); else op = memcopy(op, e, proto->ip - e - 1); (*op++=( ')')); (*op++=( ';')); bp = proto->ip + 1; if (*bp == 'r' && !sstrncmp( bp, "register", 8) && (*(bp + 8) == ' ' || *(bp + 8) == '\t')) bp += 9; } group = 0; proto->op = op; } continue; case (0401+0): if (group <= 1) { flags |= (1L<<14); m = proto->tp; e = proto->ip; } continue; default: continue; } break; } op = strcopy(op, ")"); flags |= (1L<<28); proto->line = line; call = 0; break; } case (0401+0): fsm_id: if (flags & (1L<<0)) { if (!args && paren == 1) args++; break; } if (paren == 0) { if (last == ')') { if (proto->brace == 0 && !(flags & (1L<<1))) flags |= (1L<<23); call = !call; } else if ((flags & (1L<<23)) || c == (0401+0) || c == ((0500+4)+30)) call++; else flags |= (1L<<23); if (last == (0401+0)) flags |= (1L<<6); } c = (0401+0); flags |= (1L<<25); break; case (0401+1): if (*proto->tp >= '0' && *proto->tp <= '9') switch (*(op - 1)) { case 'l': case 'L': switch (*(op - 2)) { case 'l': case 'L': case 'u': case 'U': *(op - 2) = *(op - 1); op--; break; } break; case 'u': case 'U': op--; break; } goto fsm_other; case '[': if ((flags & (1L<<0)) && paren == 0 && group <= 2) flags |= (1L<<23); default: fsm_other: if (flags & (1L<<0)) break; flags |= (1L<<25); if (paren == 0) flags |= (1L<<16); break; } else if (c == '#' && *ip != '(') flags |= (1L<<22); last = c; if ((flags & ((1L<<5)|(1L<<14))) == ((1L<<5)|(1L<<14)) && ((flags & ((1L<<3)|(1L<<23))) || proto->brace || c != '(' && c != ')' && c != '*' && c != (0401+0))) (op=proto->op); else (proto->op=op); goto fsm_start; } else if (flags & ((1L<<9)|(1L<<10))) { if ((flags & (1L<<29)) && c == '%' && *ip == '{') t = 0; else { if (c == '#') for (t = ip; *t == ' ' || *t == '\t'; t++); else t = ""; if (*t++ == 'i' && *t++ == 'f' && *t++ == 'n' && *t++ == 'd' && *t++ == 'e' && *t++ == 'f') { t = 0; } } if (t) { ip = bp; op = proto->op; } else while (*ip != '\n') *op++ = *ip++; op = init(op, flags); op = linesync(proto, op, proto->line); flags &= ~((1L<<9)|(1L<<10)); proto->flags &= ~((1L<<9)|(1L<<10)); goto fsm_start; } do{(proto->ip=ip);(proto->op=op);proto->flags&=~((1L<<8)|(1L<<27)|(1L<<28));proto->flags|=flags&((1L<<8)|(1L<<27)|(1L<<28));}while(0); return(c); } void pppclose __PARAM__((char* iob), (iob)) __OTORP__(char* iob;){ struct proto* proto = (struct proto*)(iob - sizeof(struct proto)); if (proto->flags & (1L<<15)) close(proto->fd); free((char*)proto); } char* pppopen __PARAM__((char* file, int fd, char* notice, int flags), (file, fd, notice, flags)) __OTORP__(char* file; int fd; char* notice; int flags;){ struct proto* proto; char* iob; long n; char* s; int pragma; char* b; int comlen; char com[(62+4)]; int m = 0; static int retain; if (flags & (1<<0)) flags &= ~(1<<4); if (flags & (1<<10)) flags &= ~retain; else retain &= (1<<5); if (file && (fd = open(file, 0)) < 0) return(0); { n = (4*1024); if (!(proto = (( 0)?( struct proto*)realloc((char*)( 0),sizeof( struct proto)*( 1)+( 5 * n + 2)):( struct proto*)calloc(1,sizeof( struct proto)*( 1)+( 5 * n + 2))))) return(0); proto->iz = n; proto->oz = 3 * n; proto->flags |= (1L<<15); } proto->fd = fd; iob = (char*)proto + sizeof(struct proto); proto->op = proto->ob = iob; proto->ip = proto->ib = iob + proto->oz + n; if (m) proto->flags |= (1L<<21); n = read(fd, proto->ip, proto->iz); if (!(proto->flags & (1L<<15))) close(fd); if (n < 0) { pppclose(iob); return(0); } *(proto->ip + n) = 0; if (notice) { s = comment(com, ((char*)0), 0, 0); comlen = s - com; } else *com = 0; pragma = -1; s = proto->ip; m = 64; while (m-- > 0 && *s) { while (*s == ' ' || *s == '\t') s++; if (*s == '#') { b = s++; while (*s == ' ' || *s == '\t') s++; if (!sstrncmp( s, "pragma", sizeof("pragma") - 1) && (*(s += sizeof("pragma") - 1) == ' ' || *s == '\t')) { while (*s == ' ' || *s == '\t') s++; if (*s == 'n' && *(s + 1) == 'o') { s += 2; pragma = -2; } if (!sstrncmp( s, "prototyped", sizeof("prototyped") - 1) && (*(s += sizeof("prototyped") - 1) == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { while (*s) if (*s++ == '\n') { pragma += 2; if (!(flags & (1<<1)) || (flags & (1<<7))) for (s--; b < s; *b++ = ' '); goto magic; } } pragma = -1; } } else if (*s == '/' && !sstrncmp( s, "/* : : generated by proto : : */\n", sizeof("/* : : generated by proto : : */\n") - 1)) { pragma = 0; break; } else if (*s == '%' && *(s + 1) == '{') proto->flags |= (1L<<29); else if (notice) { if (*s == *com && !sstrncmp( s, com, comlen)) notice = 0; else { while (*s) { if (*s == *"Copyright"&& !sstrncmp( s, "Copyright", sizeof("Copyright") - 1)) { s += sizeof("Copyright") - 1; while (*s == ' ' || *s == '\t') s++; if (*s == '(' && (*(s + 1) == 'c' || *(s + 1) == 'C') && *(s + 2) == ')') notice = 0; } else if (*s++ == '\n') break; } continue; } } while (*s && *s++ != '\n'); } magic: if (flags & (1<<9)) proto->flags |= (1L<<19); if (flags & (1<<11)) proto->test = 1; if (flags & (1<<0)) pragma = -pragma; if (flags & (1<<1)) pragma = 0; if (flags & (1<<6)) proto->flags |= (1L<<12); if (!(proto->flags & (1L<<29)) && file && (m = sstrlen( file)) > 2 && file[--m] == 'y' && file[--m] == '.') proto->flags |= (1L<<29); if (pragma <= 0) { if (flags & (1<<9)) { flags &= ~((1<<3)|(1<<4)); proto->flags |= (1L<<18); } else if (!(flags & ((1<<2)|(1<<8)))) { pppclose(iob); return(0); } else if ((flags & (1<<8)) || !pragma) { proto->flags |= (1L<<17); if (proto->flags & (1L<<15)) proto->oz += proto->iz; proto->iz = n; if (notice) { proto->op = copyright(proto->op, notice); if (!(flags & (1<<0)) && !(proto->flags & (1L<<29))) proto->op = linesync(proto, proto->op, 1); proto->iz += proto->op - proto->ob; } memcopy(proto->op, proto->ip, n); return(iob); } } if (!(retain & (1<<5))) { retain |= (1<<5); ppfsm(4, ((char*)0)); } proto->line = 1; if (notice || (flags & ((1<<3)|(1<<4)))) { if (notice) proto->op = copyright(proto->op, notice); if (flags & (1<<4)) { proto->flags |= (1L<<10); if (flags & (1<<10)) retain |= (1<<4); } else if (flags & (1<<3)) { if (flags & (1<<10)) retain |= (1<<3); if (flags & (1<<0)) { *proto->op++ = '#'; proto->op = strcopy(proto->op, "pragma"); *proto->op++ = ' '; proto->op = strcopy(proto->op, "prototyped"); *proto->op++ = '\n'; } else proto->flags |= (1L<<9); } if (!(flags & (1<<0))) { if (proto->flags & (1L<<29)) { proto->op = strcopy(proto->op, "\n%{\n"+ !notice); proto->op = strcopy(proto->op, "/* : : generated by proto : : */\n"); proto->op = strcopy(proto->op, "%}\n"); } else { if (n || notice) *proto->op++ = '\n'; proto->op = strcopy(proto->op, "/* : : generated by proto : : */\n"); if (n) proto->op = linesync(proto, proto->op, proto->line); else if (proto->flags & ((1L<<9)|(1L<<10))) proto->op = init(proto->op, proto->flags); } } } proto->file = file; if (flags & (1<<0)) { proto->flags |= (1L<<0); if (!(flags & (1<<3))) proto->flags |= (1L<<5); } return(iob); } int pppread __PARAM__((char* iob), (iob)) __OTORP__(char* iob;){ struct proto* proto = (struct proto*)(iob - sizeof(struct proto)); int n; if (proto->flags & (1L<<17)) { if (proto->iz) { n = proto->iz; proto->iz = 0; } else if (!(proto->flags & (1L<<15))) n = 0; else if ((n = read(proto->fd, proto->ob, proto->oz)) <= 0 || (proto->flags & (1L<<21)) && n < proto->oz) { proto->flags &= ~(1L<<15); close(proto->fd); } } else { if (proto->op == proto->ob) { if (proto->flags & (1L<<4)) return(-1); if (proto->flags & (1L<<29)) { char* ip = proto->ip; char* op = proto->ob; char* ep = proto->ob + proto->oz - 2; if (!*ip) { ip = proto->ip = proto->ib; if (!(proto->flags & (1L<<15))) n = 0; else if ((n = read(proto->fd, ip, proto->iz)) <= 0 || (proto->flags & (1L<<21)) && n < proto->iz) { if (n < 0) n = 0; proto->flags &= ~(1L<<15); close(proto->fd); } ip[n] = 0; } if (proto->flags & (1L<<30)) { proto->flags &= ~(1L<<30); if (*ip == '%') { *op++ = *ip++; if (proto->flags & (1L<<31)) proto->flags &= ~(1L<<29); else proto->flags |= (1L<<31); } } if (proto->flags & (1L<<29)) while (op < ep && (n = *op++ = *ip)) { ip++; if (n == '%') { if (*ip == '%' && (ip == proto->ip + 1 || *(ip - 2) == '\n')) { *op++ = *ip++; if (proto->flags & (1L<<31)) proto->flags &= ~(1L<<29); else proto->flags |= (1L<<31); break; } if (!*ip) { *op++ = '%'; proto->flags |= (1L<<30); break; } } else if (n == '\n') proto->line++; } proto->op = memcopy(proto->ob, proto->ip, ip - proto->ip); proto->ip = ip; } else lex(proto, proto->flags); if ((proto->flags & ((1L<<4)|(1L<<15))) == (1L<<4)) proto->op = strcopy(proto->op, "/* NOTE: some constructs may not have been converted */\n"); } n = proto->op - proto->ob; proto->op = proto->ob; } return(n); } #line 69 "/home/gsf/src/cmd/proto/proto.c" static int proto __PARAM__((char* file, char* notice, int flags), (file, notice, flags)) __OTORP__(char* file; char* notice; int flags;){ char* b; char* e; int n; int x; int fd; if (file && access(file, 4)) proto_error(((char*)0), 2, file, "not found"); else if (b = pppopen(file, 0, notice, flags)) { if (file) { e = file + sstrlen( file) - 1; x = *e; *e = '_'; if ((fd = (flags & ((1<<13)<<1)) ? creat(file, 0666) : 1) < 0) { proto_error(b, 2, "cannot create temporary file", ((char*)0)); return(flags); } *e = x; } else fd = 1; while ((n = pppread(b)) > 0) if (write(fd, b, n) != n) { proto_error(b, 2, "write error", ((char*)0)); flags |= ((1<<13)<<0); break; } if (file && (flags & ((1<<13)<<1))) { close(fd); *e = '_'; strcpy(b, file); *e = x; if (replace(b, file, !(flags & (1<<0)))) proto_error(b, 2, "cannot rename to", file); } pppclose(b); } return(flags); } int main __PARAM__((int argc, char** argv), (argc, argv)) __OTORP__(int argc; char** argv;){ char* b; char* file; int fd; char* list = 0; char* notice = 0; int flags = (1<<3); char buf[1024]; ; while ((file = *++argv) && *file == '-' && *(file + 1)) { for (;;) { switch (*++file) { case 0: break; case 'c': if (!*(notice = ++file) && !(notice = *++argv)) { file = "??"; continue; } break; case 'd': flags |= (1<<1); continue; case 'f': flags |= (1<<2); continue; case 'h': flags &= ~(1<<3); continue; case 'i': flags |= (1<<0); continue; case 'l': if (!*(list = ++file) && !(list = *++argv)) { file = "??"; continue; } break; case 'n': flags |= (1<<6); continue; case 'p': flags |= (1<<8); continue; case 'r': flags |= ((1<<13)<<1); continue; case 's': flags |= (1<<4); continue; case 't': flags |= (1<<11); continue; case 'z': flags |= (1<<1)|(1<<7); continue; case '+': flags |= (1<<9); continue; default: proto_error(((char*)0), 2, file, "unknown option"); case '?': b = "Usage: proto [-dfhinprst+] [-c \"name='value' ...\"] [-l list] file ...\n"; write(2, b, sstrlen( b)); exit(2); } break; } } if (list) { if (*list == '-' && !*(list + 1)) fd = 0; else if ((fd = open(list, 0)) < 0) proto_error(((char*)0), 3, list, "not found"); for (;;) { b = buf; while (read(0, b, 1) == 1 && *b != '\n' && b < &buf[sizeof(buf) - 1]) b++; if (b == buf) break; *b = 0; flags = proto(buf, notice, flags); } } if (file) do flags = proto(file, notice, flags); while (file = *++argv); else if (!list) flags = proto(file, notice, flags); exit(errors ? 1 : (flags & ((1<<13)<<0)) ? 2 : 0); }