da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Copyright (c) 1986-2009 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * convert C prototypes to ANSI, K&R and C++ styles or K&R to ANSI
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * slips into the pp block read
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * define PROTOMAIN for standalone proto
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * PROTOMAIN is coded for minimal library support
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic const char id[] = "\n@(#)$Id: proto (AT&T Research) 2008-05-11 $\0\n";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "ppfsm.c"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <hashkey.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTO_STANDALONE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef O_RDONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "pplib.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "ppfsm.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAGICGEN "/* : : generated by proto : : */\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAGICDIR "pragma" /* proto magic directive */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAGICARG "prototyped" /* proto magic directive arg */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAGICOFF "noticed" /* no notice if found in pragma */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAGICTOP 64 /* must be in these top lines */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOTICED "Copyright" /* no notice if found in magic */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define PUBLICDOMAIN "Public Domain" /* no notice if found in magic */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct proto /* proto buffer state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int brace; /* {..} level */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int call; /* call level */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int fd; /* input file descriptor */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* file; /* input file name */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long flags; /* coupled flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long options; /* uncoupled flags */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* package; /* header package */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int line; /* input line count */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int test; /* testing */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* tp; /* input token base */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int iz; /* input buffer size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ib; /* input buffer base */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ip; /* input buffer pointer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int oz; /* output buffer size */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ob; /* output buffer base */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* op; /* output buffer pointer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ox; /* output buffer externalize */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char cc[3]; /* beg mid end comment char */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char pushback[4]; /* pushback area for caller */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char variadic[256]; /* variadic args buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* output buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* slide buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* input buffer */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * proto is separate from pp so these undef's are ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef CLASSIC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CLASSIC (1L<<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef DECLARE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DECLARE (1L<<1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef DEFINE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DEFINE (1L<<2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef DIRECTIVE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DIRECTIVE (1L<<3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef ERROR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ERROR (1L<<4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef EXTERN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EXTERN (1L<<5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef EXTERNALIZE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EXTERNALIZE (1L<<6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef IDID
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define IDID (1L<<7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef INDIRECT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INDIRECT (1L<<8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef INIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INIT (1L<<9)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef INIT_DEFINE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INIT_DEFINE (1L<<10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef INIT_INCLUDE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INIT_INCLUDE (1L<<11)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef JUNK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define JUNK (1L<<12)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef LINESYNC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LINESYNC (1L<<13)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MANGLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MANGLE (1L<<14)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MATCH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MATCH (1L<<15)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MORE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MORE (1L<<16)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef OTHER
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OTHER (1L<<17)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef PASS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PASS (1L<<18)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef PLUSONLY
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PLUSONLY (1L<<19)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef PLUSPLUS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PLUSPLUS (1L<<20)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef RECURSIVE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RECURSIVE (1L<<21)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SHARP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SHARP (1L<<22)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SKIP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SKIP (1L<<23)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef SLIDE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SLIDE (1L<<24)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef TOKENS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TOKENS (1L<<25)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef TYPEDEF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPEDEF (1L<<26)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef VARIADIC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define VARIADIC (1L<<27)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef VARIADIC2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define VARIADIC2 (1L<<28)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef YACC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define YACC (1L<<29)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef YACCSPLIT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define YACCSPLIT (1L<<30)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef YACC2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define YACC2 (1L<<31)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef GLOBAL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GLOBAL (MORE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef REGULAR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REGULAR (1L<<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef CHUNK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CHUNK 1024
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BLOCK (8*CHUNK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_VA_START (N_TOKEN+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RESERVED(b,e,n) ((((long)(b))<<16)|(((long)(e))<<8)|((long)(n)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * generate integer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pointer to end returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinnumber(register char* p, register long n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long d;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (d = 1000000; d > 1; d /= 10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n >= d) *p++ = '0' + (n / d) % 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = '0' + n % 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int errors;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTO_STANDALONE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * namespace pollution forces us to claim parts of libc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef memcpy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memcpy(t,f,n) memcopy(t,f,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef strcpy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define strcpy(t,f) strcopy(t,f)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef strlen
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define strlen(s) sstrlen(s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef strncmp
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define strncmp(s,t,n) sstrncmp(s,t,n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * environmentally safe strlen()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsstrlen(register const char* s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (b = s; *s; s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s - b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * environmentally safe strncmp()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsstrncmp(register const char* s, register char* t, register int n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register const char* e = s + n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (s < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s != *t || !*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return *s - *t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * strcpy() except pointer to end returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstrcopy(register char* s, register const char* t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s++ = *t++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinproto_error(char* iob, int level, char* msg, char* arg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char buf[1024];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(buf, "proto: ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (iob)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct proto* proto = (struct proto*)(iob - sizeof(struct proto));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->line)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = '"';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, proto->file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = '"';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, "line ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = number(p, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (proto->file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, proto->file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, msg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin msg = arg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin arg = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*(p - 1) != ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = ':';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (level == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, "warning: ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, msg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (arg)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin write(2, buf, p - buf);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (level >= 3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exit(level - 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (level >= 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errors++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * memcpy() but pointer to end returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmemcopy(register char* s, register char* t, int n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* e = t + n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (t < e) *s++ = *t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "../libast/port/astlicense.c"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define memcopy(s,t,n) (((char*)memcpy(s,t,n))+(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * generate line sync
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pointer to end returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlinesync(register struct proto* proto, register char* p, register long n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & LINESYNC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, "\n#line ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strcopy(p, "\n# ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = number(p, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p++ = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * output init header
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pointer to end returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininit(struct proto* proto, char* op, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & INIT_DEFINE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(__PROTO__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__cplusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __LINKAGE__ \"C\"\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __LINKAGE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __STDARG__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __PROTO__(x) x\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __OTORP__(x)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __PARAM__(n,o) n\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if !defined(__STDC__) && !defined(__cplusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if !defined(c_plusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define const\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define signed\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define void int\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define volatile\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __V_ char\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __V_ void\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __PROTO__(x) ()\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __OTORP__(x) x\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __PARAM__(n,o) o\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __LINKAGE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __V_ char\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define const\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define signed\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define void int\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define volatile\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE__ __LINKAGE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__cplusplus) || defined(c_plusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __VARARG__ ...\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __VARARG__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__STDARG__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __VA_START__(p,a) va_start(p,a)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __VA_START__(p,a) va_start(p)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if !defined(__INLINE__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(__cplusplus)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __INLINE__ extern __MANGLE__ inline\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# if defined(_WIN32) && !defined(__GNUC__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __INLINE__ __inline\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(__LINKAGE__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __LINKAGE__ /* 2004-08-11 transition */\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(__PROTO__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <prototyped.h>\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(__LINKAGE__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define __LINKAGE__ /* 2004-08-11 transition */\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->package)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef __MANGLE_%_DATA__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef _BLD_%\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef __EXPORT__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_DATA__ __MANGLE__ __EXPORT__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_DATA__ __MANGLE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_FUNC__ __MANGLE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef __IMPORT__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_DATA__ __MANGLE__ __IMPORT__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_DATA__ __MANGLE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define __MANGLE_%_FUNC__ __MANGLE__\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*op++ = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '%':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op - 1, proto->package);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BACKOUT() (op=ko)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CACHE() do{CACHEIN();CACHEOUT();call=proto->call;}while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CACHEIN() (ip=proto->ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CACHEOUT() (op=proto->op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GETCHR() (*(unsigned char*)ip++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define KEEPOUT() (ko=op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LASTOUT() (*(op-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PUTCHR(c) (*op++=(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYNC() do{SYNCIN();SYNCOUT();proto->flags&=~(EXTERN|INIT|OTHER|VARIADIC|VARIADIC2);proto->flags|=flags&(EXTERN|INIT|OTHER|VARIADIC|VARIADIC2);proto->call=call;}while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYNCIN() (proto->ip=ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYNCOUT() (proto->op=op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UNGETCHR() (ip--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define UNPUTCHR() (op--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * advance to the next non-space character
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinnns(register char* s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == ' ' || *s == '\t' || *s == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DIR_if 01
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DIR_el 02
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DIR_en 03
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DIR 03
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * update directive mask
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindirective(register char* s, int dir)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*(s = nns(s)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'e':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'i':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir <<= 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*++s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'f':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir |= DIR_if;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'l':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir |= DIR_el;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir |= DIR_en;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return dir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the tokenizer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * top level calls loop until EOB
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * recursive calls just return the next token
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlex(register struct proto* proto, register long flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register short* rp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* bp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* v;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* im;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ko;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* aom;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int quot;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int brack;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int sub;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int vc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* ie = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* om = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* aim = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* aie = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* func = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int dir = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int last = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int paren = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* qe = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int qn = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int args = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CACHE();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN) KEEPOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_start:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->tp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state = PROTO;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[state];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_get:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (!(state = rp[c = GETCHR()]));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_next:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (state > 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = ip - bp - 1) > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = bp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin MEMCPY(op, ip, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state = ~state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_terminal:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (TERM(state))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_CHR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > proto->ob && *(op - 1) == '=' && (op == proto->ob + 1 || *(op - 2) != '=')) switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '+':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '-':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '*':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '&':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_CHRB:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = LASTOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_COMMENT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (INCOMMENTXX(rp)) goto fsm_newline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[COM2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '/':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (EXTERN|MATCH)) == EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (INCOMMENTXX(rp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[COM5];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case EOF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (EXTERN|MATCH)) == EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[INCOMMENTXX(rp) ? COM5 : COM3];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_EOB:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (state = fsm[TERMINAL][INDEX(rp)+1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_terminal;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_eob:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (DECLARE|GLOBAL|RECURSIVE)) == GLOBAL && (proto->flags & MORE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & EXTERN)) /* XXX */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= SLIDE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = ip - proto->ib;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & MATCH))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = proto->tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ip > proto->ib)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = ip - im;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ip - n < proto->ib)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= ERROR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(proto->ib - n, ip - n, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = proto->ib;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->tp -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ie -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (aim)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aim -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (aie)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aie -= c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = read(proto->fd, ip, proto->iz)) > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((proto->options & REGULAR) && n < proto->iz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(proto->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(ip + n) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (state & SPLICE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_splice;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ip = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(proto->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (state & SPLICE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_splice;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* NOTE: RECURSIVE lex() should really SLIDE too */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && (state = rp[c = EOF]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_LITBEG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin quot = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '"' && qe)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (n = 0, t = qe + 1; t < op && (*t == ' ' || *t == '\t' || *t == '\n' && ++n || *t >= 'A' && *t <= 'Z' || *t == '_'); t++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (t == op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = qe;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qe = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qn = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[LIT1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_LITEND:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == quot)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & DIRECTIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qe = (c == '"') ? op : (char*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (qn > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qn--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c != '\n' && c != EOF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (qn > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qn--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_INVALID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_LITESC:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC) PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = CC_bel;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_oct;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'E':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = CC_esc;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_oct;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'v':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = CC_vt;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_oct;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'x':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lex(proto, (flags & GLOBAL) | RECURSIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (n = x = 0; (c = GETCHR()), x < 3; x++) switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '0': case '1': case '2': case '3':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '4': case '5': case '6': case '7':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '8': case '9':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (n << 4) + c - '0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a': case 'b': case 'c': case 'd':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'e': case 'f':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (n << 4) + c - 'a' + 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'A': case 'B': case 'C': case 'D':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'E': case 'F':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (n << 4) + c - 'A' + 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_hex;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_hex:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_oct:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(((n >> 6) & 07) + '0');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(((n >> 3) & 07) + '0');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR((n & 07) + '0');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[LIT1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_MACRO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & EXTERN) && *proto->tp == 's' && !strncmp(proto->tp, "static", 6))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_EXTERN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*proto->tp == '_' && !strncmp(proto->tp, "__STDPP__directive", 6)) c = '#';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else c = T_ID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_NL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_newline:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op != proto->ob && LASTOUT() != ' ' && LASTOUT() != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & DIRECTIVE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & JUNK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(ip - 1) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(om, "/* ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " */\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(DEFINE|DIRECTIVE|IDID|INDIRECT|JUNK|MATCH|SHARP|TYPEDEF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (DEFINE|SHARP)) == (DEFINE|SHARP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(ip - 1) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(om, "#if defined(__STDC__) || defined(__STDPP__)\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "\n#else\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = im;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *op++ = *ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*op = *ip++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*op++ == '#' && *ip != '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*--op == ' ' || *op == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == '#')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op + 1, "/**/");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++ip == ' ' || *ip == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*op != '"') *++op = '"';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ip == ' ' || *ip == '\t') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *ip) >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' || c == '_') *op++ = *ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ip == ' ' || *ip == '\t') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == '"') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else *op++ = '"';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = bp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "\n#endif\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(DEFINE|DIRECTIVE|IDID|INDIRECT|MATCH|OTHER|SHARP|SKIP|TOKENS|TYPEDEF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin paren = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0 && (flags & (MATCH|RECURSIVE|SKIP|SLIDE)) == SLIDE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_QUAL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[NEXT(state)];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_TOK:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = TYPE(state);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_TOKB:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = TYPE(state);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_RESERVED:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_ID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & DECLARE)) switch (RESERVED(*proto->tp, *(ip - 1), ip - proto->tp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('N', 'N', 3):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->tp[1] == 'o')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_DO;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('d', 'o', 2):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_DO;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('e', 'e', 4):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && (flags & (DIRECTIVE|TOKENS)) != DIRECTIVE && !strncmp(proto->tp, "else", 4))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_ELSE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('e', 'n', 6):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strncmp(proto->tp, "extern", 6))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_EXTERN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('f', 'r', 3):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && !strncmp(proto->tp, "for", 3))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_FOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('i', 'f', 2):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_IF;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('i', 'e', 6):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strncmp(proto->tp, "inline", 6) && !(flags & (MATCH|SKIP|TOKENS|TYPEDEF)) && proto->brace == 0 && paren == 0 && group == 0 && (last == ';' || last == '}' || last == '\n' || last == 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = proto->line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op - 6, "__INLINE__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('r', 'n', 6):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && !strncmp(proto->tp, "return", 6))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_RETURN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('s', 'c', 6):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((proto->options & EXTERNALIZE) && !strncmp(proto->tp, "static", 6))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ox = op - 6;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= EXTERNALIZE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('t', 'f', 7):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && !strncmp(proto->tp, "typedef", 7))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= TYPEDEF;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_EXTERN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('v', 't', 8):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == '(' && !strncmp(proto->tp, "va_start", 8)) c = T_VA_START;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('v', 'd', 4):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strncmp(proto->tp, "void", 4))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & (CLASSIC|PLUSONLY|INIT_DEFINE|INIT_INCLUDE)) c = T_VOID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = proto->line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lex(proto, (flags & GLOBAL) | RECURSIVE) == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(op - 4, "__V_", 4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(ip - 4, "__V_", 4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else c = T_VOID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line = line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case RESERVED('w', 'e', 5):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & RECURSIVE) && !strncmp(proto->tp, "while", 5))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_WHILE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & CLASSIC) && c != T_EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_ID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_VS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case S_WS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (EXTERN|MATCH)) == EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (op > proto->ob && (*(op - 1) == ' ' || *(op - 1) == '\t'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > proto->ob && *(op - 1) != '\n') *op++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (state & SPLICE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(n = GETCHR()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_eob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_splice:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = GETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\\');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin UNGETCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state &= ~SPLICE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (state >= TERMINAL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_terminal;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[state];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_get;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & (INIT_DEFINE|INIT_INCLUDE|RECURSIVE)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & DIRECTIVE)) switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '(':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & CLASSIC) || proto->brace == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren++ == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & CLASSIC) || group <= 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin args = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group++ == 0) group++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & INDIRECT) call++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = ip - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sub = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (paren == 2 && !aim)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sub++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & INDIRECT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aim = ip - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aom = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & (MATCH|TOKENS)) == MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (m = ip - 2; m > im && (*m == ' ' || *m == '\t'); m--);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (m != im && sub == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = im + (*nns(ip) == '*');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (m == im)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & MATCH) && sub == 1 && *nns(ip) != '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~TOKENS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ')':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & CLASSIC) || proto->brace == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group != 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_ID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ie = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (paren == 1 && (flags & INDIRECT) && !aie)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aie = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '*':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == '(' && group == 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= INDIRECT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin aim = aie = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '#':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dir = directive(ip, dir);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->brace == 0 && paren == 0 && last != '=' && (flags & (CLASSIC|DECLARE|DIRECTIVE|MATCH|PLUSONLY|SKIP|TOKENS)) == (MATCH|TOKENS) && ((dir & DIR) != DIR_en || ((dir>>2) & DIR) != DIR_if))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= DIRECTIVE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(flags & (DECLARE|DIRECTIVE)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= DIRECTIVE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PLUSONLY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ip == ' ' || *ip == '\t') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == 'l' && *++ip == 'i' && *++ip == 'n' && *++ip == 'e')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*++ip == ' ' || *ip == '\t')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++ip >= '0' && *ip <= '9')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line = proto->line * 10 + *ip - '0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & (CLASSIC|EXTERN)) == CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = ip + 6;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (ip < t && *ip >= 'a' && *ip <= 'z')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = HASHKEYPART(n, *ip++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY4('e','l','s','e'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY5('e','n','d','i','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ip == ' ' || *ip == '\t') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip != '\n' && *ip != '/' && *(ip + 1) != '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= JUNK|MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = op + (ip - bp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY4('e','l','i','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY5('e','r','r','o','r'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY2('i','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY5('i','f','d','e','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY6('i','f','n','d','e','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY5('u','n','d','e','f'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY6('i','n','c','l','u','d'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == 'e') ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY6('d','e','f','i','n','e'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case HASHKEY6('p','r','a','g','m','a'):
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip < 'a' || *ip > 'z') break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= JUNK|MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = bp - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == 'i' && *++ip == 'n' && *++ip == 'c' && *++ip == 'l' && *++ip == 'u' && *++ip == 'd' && *++ip == 'e')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++ip == ' ' || *ip == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip++ == '<' && *ip++ == 's' && *ip++ == 't' && *ip++ == 'd' && *ip++ == 'a' && *ip++ == 'r' && *ip++ == 'g' && *ip++ == '.' && *ip++ == 'h' && *ip++ == '>')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinif !defined(va_start)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__STDARG__)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stdarg.h>\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <varargs.h>\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*ip == 'd' && *++ip == 'e' && *++ ip == 'f' && *++ip == 'i' && *++ip == 'n' && *++ip == 'e' && (*++ip == ' ' || *ip == '\t'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++ip == ' ' || *ip == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == 'e' && *++ip == 'x' && *++ ip == 't' && *++ip == 'e' && *++ip == 'r' && *++ip == 'n' && (*++ip == ' ' || *ip == '\t'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++t == ' ' || *t == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t == 'e' && *++t == 'x' && *++ t == 't' && *++t == 'e' && *++t == 'r' && *++t == 'n' && (*++t == ' ' || *t == '\t' || *t == '\n' || *t == '\r'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++t == ' ' || *t == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t == '_' && *(t + 1) == '_')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "undef __MANGLE__\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "#define __MANGLE__ __LINKAGE__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= DEFINE|MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = bp - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*ip == 'u' && *++ip == 'n' && *++ ip == 'd' && *++ip == 'e' && *++ip == 'f' && (*++ip == ' ' || *ip == '\t'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++ip == ' ' || *ip == '\t');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == 'e' && *++ip == 'x' && *++ ip == 't' && *++ip == 'e' && *++ip == 'r' && *++ip == 'n' && (*++ip == ' ' || *ip == '\t' || *ip == '\n' || *ip == '\r'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "undef __MANGLE__\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "#define __MANGLE__ __LINKAGE__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= DEFINE|MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin im = bp - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = bp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '{':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->brace++ == 0 && paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == '=') flags |= INIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (MATCH|OTHER|SKIP)) == MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (args)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = number(op, args < 0 ? -args : args);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = strcopy(v, " argument actual/formal mismatch");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = memcopy(v, im, ie - im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto_error((char*)proto + sizeof(struct proto), 2, op, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*UNDENT...*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = ie;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (ie < ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ie++ == '/' && *ie == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = ie - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (++ie < ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ie == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (ie < ip && *ie == '*') ie++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ie < ip && *ie == '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (++ie < ip && (*ie == ' ' || *ie == '\t'));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (e > v && (*(e - 1) == ' ' || *(e - 1) == '\t')) e--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (e > v && *e != '\n') *e++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = ie;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (--e >= v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--t = *e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ie = v;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*...INDENT*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = om++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v > ko && *--v != ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*v != ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = (v = (op += 4)) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v >= ko + 4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v = *(v - 4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(ko, "int ", 4);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*v == ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*(v + 1) == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v++ = '*';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v = '\t';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((v - ko) <= 8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = (e = ++op) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (e > v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *e = *(e - 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = (v = (op += 7)) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v >= ko + 7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v = *(v - 7);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(ko, "extern ", 7);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('(');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*UNDENT...*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (ie < ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = *ie) == ' ' || c == '\t' || c == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *++ie) == ' ' || c == '\t' || c == '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ie >= ip) break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != '*' && op > om) PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = ((c = *ie) == ',')) || c == ';')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (op > om && ((c = *(op - 1)) == '(' || c == ')' || c == '[' || c == ']'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (op > om && (c = *(op - 1)) != ' ' && c != '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*(op - 1) == ' ')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (e > om && *(e - 1) == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _s5r4_386_compiler_bug_fixed_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op <= om || *(op - 1) == ',' && (*op++ = ' '))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "int");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op <= om)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "int");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*(op - 1) == ',')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " int");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v < m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(*v++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x = !e) e = op - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (m < e)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(*m++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*--e != ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*(e - 1) == '*') e--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op -= m - e;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *++ie) == ' ' || c == '\t' || c == '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ie >= ip) UNPUTCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*ie == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > om && (c = *(op - 1)) == ' ') op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ie == '*') PUTCHR(*ie++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != '(') PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*ie == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > om && *(op - 1) == ' ') op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(*ie++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*ie == ')')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > om && *(op - 1) == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto_error((char*)proto + sizeof(struct proto), 1, "function pointer argument prototype omitted", NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(*ie++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*ie == ' ' || *ie == '\t' || *ie == '\n') ie++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & EXTERN) && (op == om || *(op - 1) == ' ') && *ie == 'r' && !strncmp(ie, "register", 8) && (*(ie + 8) == ' ' || *(ie + 8) == '\t' || *(ie + 8) == '\n'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ie += 8;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > om) UNPUTCHR();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else PUTCHR(*ie++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*...INDENT*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op <= om) op = strcopy(op, "void");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(';');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNCOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin KEEPOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(*ip);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(MATCH|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & (MATCH|PLUSONLY|SKIP|TOKENS)) == (MATCH|TOKENS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = proto->line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(om, " __PARAM__(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, im, ie - im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('(');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(MATCH|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & VARIADIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((vc = ie - im + 1) > sizeof(proto->variadic)) vc = sizeof(proto->variadic);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(proto->variadic, im, vc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "va_alist)) __OTORP__(va_dcl)\n{");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = im;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin brack = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (lex(proto, (flags & GLOBAL) | RECURSIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '[':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin brack++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ']':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin brack--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '(':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren++) group++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ')':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(MATCH|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, m, e - m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ',':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(MATCH|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, m, e - m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group <= 1 && !brack)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = proto->tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & SKIP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(op, " __OTORP__(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = im + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = *(ie - 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(ie - 1) = ';';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *ie;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ie = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lex(proto, (flags & GLOBAL) | DECLARE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(ie - 1) = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ie = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = ie;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = proto->op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERNALIZE) memcpy(proto->ox, "extern", 6);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line = line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & DIRECTIVE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->brace = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR('#');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(flags & VARIADIC)) PUTCHR('{');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(IDID|INDIRECT|MATCH|OTHER|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '}':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(IDID|INDIRECT|MATCH|OTHER|SKIP|TOKENS);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--proto->brace == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(INIT|VARIADIC|VARIADIC2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin paren = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '=':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == '?') flags |= DIRECTIVE;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if (paren == 0 && (flags & (INIT|MATCH|SKIP)) == MATCH)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (last == ')' && proto->brace && (group != 2 || call != 2)) flags |= SKIP;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else goto fsm_statement;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_other;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ',':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 1) args++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin args--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0 && (flags & DECLARE)) *(op - 1) = c = ';';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ';':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_statement:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & INIT) /* ignore */;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & MATCH) && last == ')')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & MATCH))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERN) BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & SLIDE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin args--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (EXTERN|SKIP)) == (EXTERN|SKIP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin BACKOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (MATCH|OTHER|SKIP)) == MATCH && call > 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & MANGLE) && func)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func[0] = 'F';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func[1] = 'U';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func[2] = 'N';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func[3] = 'C';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (DECLARE|INDIRECT)) == INDIRECT && aim && aie < im)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (aie < ip && (*aie == ' ' || *aie == '\t' || *aie == '\n')) aie++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = aim;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v < aie)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*v++ == ')') break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v < aie && (*v == ' ' || *v == '\t' || *v == '\n')) v++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (v == aie || !(flags & PLUSPLUS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PLUSPLUS) n = 3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (v == aie && *v == '(') n = 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else n = 11;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ko = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om += n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = op += n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (v >= ko + n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *v = *(v - n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PLUSPLUS) memcopy(aom, "(...))", 6);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (n == 10) memcopy(aom, "(__VARARG__))", 13);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ko = strcopy(aom, " __PROTO__(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ko = memcopy(ko, aim, aie - aim);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ko = ')';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (++ko >= om)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *ko++ = ')';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin om = ko;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & TYPEDEF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = om;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*--op == ' ' || *op == '\t' || *op == '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*op != ')')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = om += 14;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--op = ')';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((x = *(op - 14)) >= 'A' && x <= 'Z' || x >= 'a' && x <= 'z' || x >= '0' && x <= '9' || x == '_')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--op = x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(op - 13, "(__OTORP__(*)", 13);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & OTHER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & PLUSPLUS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = om;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & TOKENS)) op = strcopy(op, "(...)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else op = memcopy(op, im, ie - im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & DECLARE) op = strcopy(om, "()");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(flags & TOKENS)) op = strcopy(om, "(__VARARG__)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(om, " __PROTO__(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, im, ie - im);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & EXTERNALIZE) memcpy(proto->ox, "extern", 6);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(MATCH|VARIADIC|VARIADIC2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == ',' && !(flags & INDIRECT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & (OTHER|SKIP)) call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == ';')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(EXTERNALIZE|MANGLE|TOKENS|TYPEDEF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & SLIDE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else call = call > 1 && c == ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(IDID|INDIRECT|MATCH|OTHER|SKIP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (paren == 1 && group == 1 && !(flags & (IDID|MANGLE))) flags |= TOKENS|OTHER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_DO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_IF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= TOKENS|SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_EXTERN:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->brace == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0 && !(flags & TYPEDEF))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= MANGLE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PLUSONLY) || proto->package)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " __MANGLE__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->package)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op - 1, proto->package);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func = op + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "_DATA__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin func = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_VARIADIC:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0 && (flags & (DECLARE|VARIADIC)) == DECLARE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op -= 3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 1 && !(flags & SKIP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= VARIADIC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= TOKENS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_VOID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_VA_START:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (PLUSONLY|VARIADIC)) == VARIADIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin line = proto->line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op - 8, "__VA_START__");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (lex(proto, (flags & GLOBAL) | RECURSIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ';':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & MATCH))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = proto->tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CACHE();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = e - m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = "ap";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " __OTORP__(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = proto->variadic;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = proto->ip + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*bp == 'r' && !strncmp(bp, "register", 8) && (*(bp + 8) == ' ' || *(bp + 8) == '\t')) bp += 9;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (lex(proto, (flags & GLOBAL) | RECURSIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '(':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren++) group++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ')':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (--paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & VARIADIC2))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, m, e - m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " = ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "va_arg(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, v, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (m > bp) op = memcopy(op, bp, m - bp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else op = strcopy(op, "int ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group > 1) op = strcopy(op, ")()");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else op = memcopy(op, e, proto->ip - e - 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(';');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ',':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & MATCH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & VARIADIC2))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, m, e - m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, " = ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, "va_arg(");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = memcopy(op, v, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(',');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (m > bp) op = memcopy(op, bp, m - bp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else op = strcopy(op, "int ");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group > 1) op = strcopy(op, ")()");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else op = memcopy(op, e, proto->ip - e - 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(')');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUTCHR(';');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin bp = proto->ip + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*bp == 'r' && !strncmp(bp, "register", 8) && (*(bp + 8) == ' ' || *(bp + 8) == '\t')) bp += 9;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin group = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (group <= 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= MATCH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = proto->tp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin e = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = strcopy(op, ")");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= VARIADIC2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line = line;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_id:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!args && paren == 1) args++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == ')')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->brace == 0 && !(flags & DECLARE)) flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin call = !call;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & SKIP) || c == T_ID || c == T_VOID) call++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (last == T_ID) flags |= IDID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = T_ID;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= TOKENS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_INVALID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*proto->tp >= '0' && *proto->tp <= '9')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;; op--)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*(op - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'f':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'F':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *--t) >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t == '.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'l':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'L':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(n & 01))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n |= 01;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *--t) >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t == '.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'u':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'U':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n |= 02;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n & 01)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *op++ = 'L';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n & 02)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = op = m + 10;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while ((c = *--m) >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *--t = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcopy(m + 1, "(unsigned)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_other;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '[':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & CLASSIC) && paren == 0 && group <= 2) flags |= SKIP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm_other:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & CLASSIC) break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags |= TOKENS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (paren == 0) flags |= OTHER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '#' && *ip != '(') flags |= SHARP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin last = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & (EXTERN|MATCH)) == (EXTERN|MATCH) && ((flags & (DIRECTIVE|SKIP)) || proto->brace || c != '(' && c != ')' && c != '*' && c != T_ID))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CACHEOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNCOUT();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & (INIT_DEFINE|INIT_INCLUDE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((flags & YACC) && c == '%' && *ip == '{') t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '#') for (t = ip; *t == ' ' || *t == '\t'; t++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else t = "";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t++ == 'i' && *t++ == 'f' && *t++ == 'n' && *t++ == 'd' && *t++ == 'e' && *t++ == 'f')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*t == ' ' || *t == '\t') t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t != '_')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = bp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = proto->op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else while (*ip != '\n') *op++ = *ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = init(proto, op, flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = linesync(proto, op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(INIT_DEFINE|INIT_INCLUDE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~(INIT_DEFINE|INIT_INCLUDE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto fsm_start;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNC();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * close a proto buffer stream
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpppclose(char* iob)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct proto* proto = (struct proto*)(iob - sizeof(struct proto));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & MORE) close(proto->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((char*)proto); /* some ANSI cc's botch the free() prototype */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * open a new proto buffer stream
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * read buffer pointer returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 0 returned on error or if no magic
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file !=0 file path to open, otherwise use fd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fd open file fd if file==0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * notice !=0 copyright notice info commented at the top
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * options !=0 additional notice name=value pairs, space or ; separated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * package !=0 generate header for this package
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpppopen(char* file, int fd, char* notice, char* options, char* package, char* comment, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct proto* proto;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* iob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register long n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int pragma;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int comlen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char com[80];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int m = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int retain;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize proto
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_CLASSIC) flags &= ~PROTO_INCLUDE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_RETAIN) flags &= ~retain;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else retain &= PROTO_INITIALIZED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (file && (fd = open(file, O_RDONLY)) < 0) return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = lseek(fd, 0L, 2)) > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (lseek(fd, 0L, 0)) return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < CHUNK) n = CHUNK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (n > 2 * BLOCK) n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file read in one chunk
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto = newof(0, struct proto, 1, 4 * n + 2)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->oz = 3 * n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file read in BLOCK chunks
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = BLOCK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto = newof(0, struct proto, 1, 5 * n + 2)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->oz = 3 * n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->fd = fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->package = package;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iob = (char*)proto + sizeof(struct proto);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = proto->ob = iob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = proto->ib = iob + proto->oz + n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (m) proto->options |= REGULAR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!comment)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin comment = "/*";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto->cc[0] = comment[0]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin notice = options = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (comment[1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->cc[1] = comment[1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->cc[2] = comment[2] ? comment[2] : comment[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->cc[1] = proto->cc[2] = comment[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * read the first chunk
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = read(fd, proto->ip, proto->iz);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto->flags & MORE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pppclose(iob);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(proto->ip + n) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * check for proto pragma in first block of lines
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pragma blanked out if found
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * -1 no pragma
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 0 #pragma noprototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 1 #pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: matches may occur inside comments and quotes
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!notice && !options || (comlen = astlicense(com, sizeof(com), NiL, "type=check", proto->cc[0], proto->cc[1], proto->cc[2])) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *com = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pragma = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = MAGICTOP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (m-- > 0 && *s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == ' ' || *s == '\t') s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == '#')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == ' ' || *s == '\t') s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strncmp(s, MAGICDIR, sizeof(MAGICDIR) - 1) && (*(s += sizeof(MAGICDIR) - 1) == ' ' || *s == '\t'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == ' ' || *s == '\t') s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == 'n' && *(s + 1) == 'o')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pragma = -2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!strncmp(s, MAGICARG, sizeof(MAGICARG) - 1) && (*(s += sizeof(MAGICARG) - 1) == ' ' || *s == '\t' || *s == '\n' || *s == '\r'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((*(s - 1) == ' ' || *(s - 1) == '\t') && *s == *MAGICOFF && !strncmp(s, MAGICOFF, sizeof(MAGICOFF) - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin notice = options = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s++ == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pragma += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PROTO_DISABLE) || (flags & PROTO_NOPRAGMA))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (s--; b < s; *b++ = ' ');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto magic;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pragma = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*s == '/' && !strncmp(s, MAGICGEN, sizeof(MAGICGEN) - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pragma = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*s == '%' && *(s + 1) == '{')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= YACC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (notice || options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == *com && !strncmp(s, com, comlen))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin notice = options = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == *NOTICED && !strncmp(s, NOTICED, sizeof(NOTICED) - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s += sizeof(NOTICED) - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == ' ' || *s == '\t')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == '(' && (*(s + 1) == 'c' || *(s + 1) == 'C') && *(s + 2) == ')' || *s >= '0' && *s <= '9' && *(s + 1) >= '0' && *(s + 1) <= '9')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin notice = options = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (*s == *PUBLICDOMAIN && !strncmp(s, PUBLICDOMAIN, sizeof(PUBLICDOMAIN) - 1))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin notice = options = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin break;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*s++ == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s && *s++ != '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin magic:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_PLUSPLUS) proto->flags |= PLUSPLUS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_TEST) proto->test = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_EXTERNALIZE) proto->options |= EXTERNALIZE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_CLASSIC) pragma = -pragma;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_DISABLE) pragma = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_LINESYNC) proto->flags |= LINESYNC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto->flags & YACC) && file && (m = strlen(file)) > 2 && file[--m] == 'y' && file[--m] == '.')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= YACC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pragma <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_PLUSPLUS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags &= ~(PROTO_HEADER|PROTO_INCLUDE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= PLUSONLY;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(flags & (PROTO_FORCE|PROTO_PASS)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pppclose(iob);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((flags & (PROTO_FORCE|PROTO_PASS)) == PROTO_PASS || !pragma)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= PASS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & MORE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->oz += proto->iz;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (notice || options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->cc[0] == '#' && proto->ip[0] == '#' && proto->ip[1] == '!')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s && *s++ != '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin m = s - proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = memcopy(proto->op, proto->ip, m);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz = n -= m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->cc[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((comlen = astlicense(proto->op, proto->oz, notice, options, proto->cc[0], proto->cc[1], proto->cc[2])) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto_error((char*)proto + sizeof(struct proto), 1, proto->op, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op += comlen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PROTO_CLASSIC) && !(proto->flags & YACC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = linesync(proto, proto->op, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz += proto->op - proto->ob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcopy(proto->op, proto->ip, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return iob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(retain & PROTO_INITIALIZED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin retain |= PROTO_INITIALIZED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_INIT, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->line = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHUNK >= 512
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (notice || options || (flags & (PROTO_HEADER|PROTO_INCLUDE)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (notice || options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((comlen = astlicense(proto->op, proto->oz, notice, options, proto->cc[0], proto->cc[1], proto->cc[2])) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto_error((char*)proto + sizeof(struct proto), 1, proto->op, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op += comlen;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_INCLUDE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= INIT_INCLUDE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_RETAIN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin retain |= PROTO_INCLUDE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (flags & PROTO_HEADER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_RETAIN) retain |= PROTO_HEADER;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *proto->op++ = '#';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, MAGICDIR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *proto->op++ = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, MAGICARG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *proto->op++ = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= INIT_DEFINE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PROTO_CLASSIC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, "\n%{\n" + !notice);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, MAGICGEN);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, "%}\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n || notice || options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *proto->op++ = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, MAGICGEN);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = linesync(proto, proto->op, proto->line);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (proto->flags & (INIT_DEFINE|INIT_INCLUDE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = init(proto, proto->op, proto->flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->file = file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (flags & PROTO_CLASSIC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= CLASSIC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(flags & PROTO_HEADER)) proto->flags |= EXTERN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return iob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * read next proto'd chunk into iob
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the chunk is 0 terminated and its size is returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpppread(char* iob)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct proto* proto = (struct proto*)(iob - sizeof(struct proto));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & PASS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->iz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = proto->iz;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->iz = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(proto->flags & MORE)) n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((n = read(proto->fd, proto->ob, proto->oz)) <= 0 || (proto->options & REGULAR) && n < proto->oz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(proto->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->op == proto->ob)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & ERROR) return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* ip = proto->ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* op = proto->ob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* ep = proto->ob + proto->oz - 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = proto->ip = proto->ib;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(proto->flags & MORE)) n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((n = read(proto->fd, ip, proto->iz)) <= 0 || (proto->options & REGULAR) && n < proto->iz)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < 0) n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(proto->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip[n] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACCSPLIT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~YACCSPLIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == '%')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *op++ = *ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACC2) proto->flags &= ~YACC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else proto->flags |= YACC2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACC)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (op < ep && (n = *op++ = *ip))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == '%')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*ip == '%' && (ip == proto->ip + 1 || *(ip - 2) == '\n'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *op++ = *ip++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & YACC2) proto->flags &= ~YACC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else proto->flags |= YACC2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*ip)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *op++ = '%';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags |= YACCSPLIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (n == '\n') proto->line++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = memcopy(proto->ob, proto->ip, ip - proto->ip);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->ip = ip;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lex(proto, proto->flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((proto->flags & (ERROR|MORE)) == ERROR)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = strcopy(proto->op, "/* NOTE: some constructs may not have been converted */\n");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = proto->op - proto->ob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->op = proto->ob;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * drop control of iob after first pppread()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return value is input fd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * if fd<0 then all data in iob
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinpppdrop(char* iob)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct proto* proto = (struct proto*)(iob - sizeof(struct proto));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (proto->flags & MORE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin proto->flags &= ~MORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return proto->fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif