da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Copyright (c) 2000-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 * C message catalog preprocessor
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char usage[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[-?\n@(#)$Id: msgcpp (AT&T Research) 2002-03-11 $\n]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinUSAGE_LICENSE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+NAME?msgcpp - C language message catalog preprocessor]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+DESCRIPTION?\bmsgcpp\b is a C language message catalog preprocessor."
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" It accepts \bcpp\b(1) style options and arguments. \bmsgcpp\b"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" preprocesses an input C source file and emits keyed lines to the"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" output, usually for further processing by \bmsgcc\b(1). \bmsgcc\b"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" output is in the \bgencat\b(1) syntax. Candidate message text is"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" determined by arguments to the \bast\b \b<error.h>\b and"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \b<option.h>\b functions. The \bmsgcpp\b keyed output lines are:]{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+cmd \acommand\a?\acommand\a is a candidate for \b--??keys\b"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" option string generation. Triggered by"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \bb_\b\acommand\a\b(int argc,\b in the input.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+def \aname\a \astring\a?\aname\a is a candidate variable with"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" string value \astring\a.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+str \astring\a?\astring\a should be entered into the catalog.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+var \aname\a?If \bdef\b \aname\a occurs then its \astring\a value"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" should be entered into the catalog.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" }"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?The input source file is preprocessed with the \bpp:allpossible\b"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" option on. This enables non-C semantics; all source should first"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" be compiled error-free with a real compiler before running \bmsgcpp\b."
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" The following changes are enabled for the top level files (i.e.,"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" included file behavior is not affected):]{"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+(1)?All \b#if\b, \b#ifdef\b and \b#ifndef\b branches"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" are enabled.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+(2)?The first definition for a macro is retained, even when"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" subsequent \b#define\b statements would normally"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" redefine the macro. \b#undef\b must be used to"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" redefine a macro.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+(3)?Macro calls with an improper number of arguments are"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" silently ignored.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+(4)?\b#include\b on non-existent headers are silently"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" ignored.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" [+(5)?Invalid C source characters are silently ignored.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" }"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?\b\"msgcat.h\"\b is included if it exists. This file may contain macro"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" definitions for functions that translate string arguments. If \afoo\a"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" is a function that translates its string arguments then include the"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" line \b#define \b\afoo\a\b _TRANSLATE_\b in \bmsgcat.h\b or specify"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" the option \b-D\b\afoo\a\b=_TRANSLATE_\b. If \abar\a is a function"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" that translates string arguments if the first argument is \bstderr\b"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" then use either \b#define \b\abar\a\b _STDIO_\b or"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \b-D\b\abar\a\b=_STDIO_\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+?The macro \b_BLD_msgcat\b is defined to be \b1\b. As an alternative to"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \bmsgcat.h\b, \b_TRANSLATE_\b definitions could be placed inside"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \b#ifdef _BLD_msgcat\b ... \b#endif\b.]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n[ input [ output ] ]\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\n"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"[+SEE ALSO?\bcc\b(1), \bcpp\b(1), \bgencat\b(1), \bmsggen\b(1),"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin" \bmsgcc\b(1), \bmsgcvt\b(1)]"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <error.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "pp.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "ppkey.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_STDERR (T_KEYWORD+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_STDIO (T_KEYWORD+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_TRANSLATE (T_KEYWORD+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OMIT "*@(\\[[-+]*\\?*\\]|\\@\\(#\\)|Copyright \\(c\\)|\\\\000|\\\\00[!0-9]|\\\\0[!0-9])*"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic struct ppkeyword keys[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "char", T_CHAR,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "int", T_INT,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "sfstderr", T_STDERR,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "stderr", T_STDERR,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "_STDIO_", T_STDIO,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin "_TRANSLATE_", T_TRANSLATE,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0, 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmsgppargs(char** argv, int last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (optget(argv, usage))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '?':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.again = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_USAGE|4, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ':':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.again = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "%s", opt_info.arg);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!last)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.again = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return argv[opt_info.index] != 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmain(int argc, char** argv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t* tmp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(argc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = strrchr(*argv, '/'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = *argv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFAULT, PPDEFAULT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin optjoin(argv, msgppargs, ppargs, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (strlen(s) >= 5 && *(s + 3) != 'c')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_PLUSPLUS, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_NOHASH, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_PROBE, "CC");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_SPACEOUT, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPILE, keys);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OPTION, "allpossible");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OPTION, "catliteral");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OPTION, "modern");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OPTION, "readonly");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "_BLD_msgcat=1");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "const=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "errorf=_TRANSLATE_");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "register=");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "sfstderr=sfstderr");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "stderr=stderr");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "_(m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "__(m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "gettxt(i,m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "gettext(m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "dgettext(d,m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "dcgettext(d,m,c)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "ERROR_catalog(m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "ERROR_dictionary(m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "ERROR_translate(l,i,c,m)=_TRANSLATE_(m)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "error(l,f,...)=_TRANSLATE_(f)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DEFINE, "errormsg(t,l,f,...)=_TRANSLATE_(f)");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DIRECTIVE, "include \"msgcat.h\"");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OPTION, "noreadonly");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_INIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(tmp = sfstropen()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "out of space");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = pplex();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin again:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_TRANSLATE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c = pplex())
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '(':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ')':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = pplex()) != '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '(':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case ')':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_STDIO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = pplex()) != '(' || (c = pplex()) != T_STDERR || (c = pplex()) != ',')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_STRING:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x > 0 && !strmatch(pp.token, OMIT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "str \"%s\"\n", pp.token);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = pp.symbol->name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = pplex()) == '+' && ppisinteger(c = pplex()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "var %s %s\n", pp.token, s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "var %s\n", s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (s[0] == 'b' && s[1] == '_' && s[2])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = pplex()) == '(' && (c = pplex()) == T_INT && (c = pplex()) == T_ID && (c = pplex()) == ',' && (c = pplex()) == T_CHAR && (c = pplex()) == '*')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "cmd %s\n", s + 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = pplex()) == '[')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ppisinteger(c = pplex()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = pplex();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != ']')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = pplex();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '=' && (c = pplex()) == T_STRING && !strmatch(pp.token, OMIT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstdout, "def %s \"%s\"\n", s, pp.token);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(tmp, "#define %s \"%s\"\n", s, pp.token);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(s = sfstruse(tmp)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "out of space");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppinput(s, "string", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto again;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_DONE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return error_info.errors != 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}