diff options
author | Andy Fiddaman <omnios@citrus-it.co.uk> | 2020-12-27 17:47:37 +0000 |
---|---|---|
committer | Andy Fiddaman <omnios@citrus-it.co.uk> | 2021-01-30 17:13:33 +0000 |
commit | b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f (patch) | |
tree | 6a37e590faffb9bb9af66887de645c546445036c /usr/src/lib/libpp/common/ppargs.c | |
parent | df36e06d12cbf655ddf22339ef8c39fa2b83ebf8 (diff) | |
download | illumos-joyent-b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f.tar.gz |
13405 ksh93 update to 2012-08-01
13434 sh: mishandles backslash as last character of a block of input
11750 ksh mkdir builtin doesn't honor special file permissions
9199 ksh93 builtin *grep -v mishandles blank lines, blows up libgcrypt-config
6756 sh (and ksh) have issues with ${1+"$@"}
6520 ksh: sleep could wait forever
4860 ksh93: core in printf
3791 /bin/sh's builtin 'rm' busted: 'rm -f' without arguments returns error
1047 ksh overwrites child core files
880 ksh93 coredumps on 'unset'
499 "interrupted system call" when using "tee" builtin in ksh
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Reviewed by: Dominik Hassler <hadfl@omnios.org>
Approved by: Rich Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libpp/common/ppargs.c')
-rw-r--r-- | usr/src/lib/libpp/common/ppargs.c | 608 |
1 files changed, 0 insertions, 608 deletions
diff --git a/usr/src/lib/libpp/common/ppargs.c b/usr/src/lib/libpp/common/ppargs.c deleted file mode 100644 index 567b216512..0000000000 --- a/usr/src/lib/libpp/common/ppargs.c +++ /dev/null @@ -1,608 +0,0 @@ -/*********************************************************************** -* * -* This software is part of the ast package * -* Copyright (c) 1986-2009 AT&T Intellectual Property * -* and is licensed under the * -* Common Public License, Version 1.0 * -* by AT&T Intellectual Property * -* * -* A copy of the License is available at * -* http://www.opensource.org/licenses/cpl1.0.txt * -* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * -* * -* Information and Software Systems Research * -* AT&T Research * -* Florham Park NJ * -* * -* Glenn Fowler <gsf@research.att.com> * -* * -***********************************************************************/ -#pragma prototyped -/* - * Glenn Fowler - * AT&T Research - * - * common preprocessor command line argument parse - * called by optjoin() - */ - -static const char usage[] = -"[-?\n@(#)$Id: cpp (AT&T Research) 2009-02-02 $\n]" -USAGE_LICENSE -"[+NAME?cpp - C language preprocessor]" -"[+DESCRIPTION?\bcpp\b is the preprocessor for all C language dialects. It is" -" a standalone version of the \blibpp\b(3) preprocessor library. The" -" C dialect implemented by \bcpp\b is determined by probing \bcc\b(1)" -" using \bprobe\b(1). The path of the emulated compiler can be changed" -" by the \b-D-X\b command line option.]" -"[+?If \aoutput\a is omitted then the standard output is written; if \ainput\a" -" is also omitted then the standard input is read. NOTE: this is an" -" ancient, non-standard, non-intuitiive file operand syntax that is" -" required by \bcc\b(1); use shell file name expansion at your peril.]" -"[+?\bcpp\b specific options are set by the \b-D-\b and \b-I-\b options.]" - -"[C:comments?Pass comments to the output. By default comments are omitted.]" -"[D:define?Define the macro \aname\a to have \avalue\a; \b1\b is assumed if" -" \b=\b\avalue\a is omitted. If \aname\a begins with \b:\b then it is" -" interpreted as a \blibpp\b(3) \b#pragma pp:\b statement; if \aname\a" -" begins with \b%\b then it is interpreted as a \blibpp\b(3) \b#\b" -" directive statement; if \aname\a begins with \b-\b or \b+\b then it is" -" interpreted as a \blibpp\b(3) option; \b-\b turns the option on," -" \b+\b turns it off. Most options have a \b#pragma\b counterpart that" -" is listed with the option definition. Right, this is ugly, but its the" -" only portable way to pass options through \bcc\b(1) to" -" \bcpp\b:]:[name[=value]]]{" -" [+-D-C, pp::compatibility?Preprocess for K&R compatibility.]" -" [+-D-D\alevel\a, \bpp::debug\b \alevel\a?Set the debug trace level." -" Higher levels produce more output. Levels higher than 3" -" enabled only in \b-g\b compiled versions.]" -" [+-D-F\aname\a?Set the main input file name to \aname\a. This only" -" affects error message and line sync output.]" -" [+-D-H, pp::hosted?All directories are hosted; compatibility" -" warning messages from hosted directory headers are suppressed.]" -" [+-D-I, pp::cdir?All directories contain C headers; used only with" -" \b-D-+\b.]" -" [+-D-K, pp::keyargs?Enable the non-standard \aname=value\a macro" -" argument mode.]" -" [+-D-L\b[\aid\a]], \bpp::lineid\b [\aid\a]]?Set the line sync directive" -" id to \aid\a or null if omitted.]" -" [+-D-M, pp::nomultiple?Disable multiple include detection.]" -" [+-D-P, pp::passthrough?Enable the non-standard passthrough mode; may" -" be useful for processing non-C input.]" -" [+-D-Q, pp::dump?Dump macro definitions to the output so that the" -" output may be passed through \bcpp\b again. Used for" -" generating precompiled headers.]" -" [+-D-R, pp::transition?Enable the transition preprocessing mode. Used" -" for compilers that can't make up their semantics between" -" K&R and ISO.]" -" [+-D-S, pp::strict?Enable strict preprocessing semantics and warnings." -" Works with any mode (compatibiliy, transition," -" or the default ISO).]" -" [+-D-T\atest\a, \bpp::test\b \atest\a?Enable implementation specific" -" test code according to \atest\a.]" -" [+-D-W, pp::warn?Enable warnings in non-hosted files.]" -" [+-D-X\b[\acc\a]]?Preprocess for the compiler \acc\a which must be" -" an executable path or an executable on \b$PATH\b.]" -" [+-D-Y, pp::pedantic?Enable pedantic \bpp::warn\b warnings in" -" non-hosted files.]" -" [+-D-Z, pp::pool?Enable pool mode. See \blibpp\b(3).]" -" [+-D-d?List canonicalized \b#define\b statements for non-predefined" -" macros in the output. ]" -" [+-D-m?List canonicalized \b#define\b statements for all macros. All" -" other output is disabled.]" -" [+-D-+, pp::plusplus?Preprocess for the C++ dialect.]" -"}" -"[I:include?Append \adirectory\a to the list of directories searched for" -" \b#include\b files. If \adirectory\a is \b-\b then: (1) \b-I\b" -" directories before \b-I-\b are searched only for \"...\" include" -" files; (2) \b-I\b directories after \b-I-\b are searched for" -" \"...\" and <...> include files; (3) the directory \b.\b is searched" -" only if it is explicitly specified by a \b-I\b option.]:?[directory]{" -" [+-I-C\adirectory\a, \bpp::cdir\b \adirectory\a?Mark \adirectory\a" -" as a C header directory. Used with \bpp:plusplus\b.]" -" [+-I-D[\afile\a]]?Read the default \bprobe\b(1) definitions from" -" \afile\a, or ignore the default definitions if \afile\a" -" is omitted.]" -" [+-I-H\adirectory\a, \bpp::hostdir\b \adirectory\a?Mark \adirectory\a" -" as a hosted directory. Headers from hosted directories have" -" compatibility warnings disabled.]" -" [+-I-I\aheader\a, \bpp::ignore\b \aheader\a?Add \aheader\a to the" -" list of ignored headers.]" -" [+-I-M\afile\a?\afile\a contains a sequence of \aheader\a" -" [= \"\amap\a\" ]] lines, where \aheader\a is either <\aname\a>" -" or \"\aname\a\", and \"\amap\a\" is an explicit binding" -" for \aheader\a. \aheader\a is ignored if = \"\amap\a\" is" -" omitted.]" -" [+-I-R\afile\a?Include \afile\a but do not emit text or line syncs.]" -" [+-I-S\adirectory\a?Add \adirectory\a to the default standard include" -" directory list.]" -" [+-I-T\afile\a?Include \afile\a and emit text to the output file.]" -"}" -"[M:dependencies?Generate \bmake\b(1) dependencies. Not needed with" -" \bnmake\b(1). \b-M\b may be followed by optional \aflags\a to change" -" dependency output styles:]{" -" [+D?Generate dependencies in a separate \b.d\b file. Preprocessed" -" output is still written to \aoutput\a, or the standard output" -" if \aoutput\a is omitted.]" -" [+G?Generate missing dependencies too.]" -" [+M?Only generate local header dependencies; \ahosted\a headers are" -" omitted. Note that \ahosted\a headers are determined by" -" \b-I-H\b and the \bpp:hosted\b and \bpp:hostdir\b pragmas;" -" no special distiction is made between \"\" and <> \binclude\b" -" styles.]" -"}" -"[P!:sync?Emit line syncs.]" -"[U:undefine?Remove the definition for the macro \aname\a.]:[name]" - -"[A:assert?Enter the assertion via \b#assert\b for system V" -" compatibility.]:[assertion]" -"[E:preprocess?Ignored for compatibility with ancient compilers.]" -"[H:include-reference?Emit \b#include\b file paths on the standard error," -" one per line, indented to show nesting.]" -"[T?If not \bgcc\b(1) then truncate identifiers to \alength\a" -" characters for compatibility with old AT&T (I guess only Lucent needs" -" them now) compilers.]#?[length]" -"[V:version?Emit the \blibpp\b(3) version.]" -"[X:argmode?Enable \aname\a=\avalue\a macro arguments for \beasel\b(1)" -" compatibility.]" -"[Y:standard?Add \adirectory\a to the list searched for" -" \b#include\b \b<...>\b files.]:[directory]" - -"\n" -"\n[ input [ output ] ]\n" -"\n" - -"[+SEE ALSO?\bcc\b(1), \bgcc\b(1), \blibpp\b(3)]" -; - -#include "pplib.h" - -#include <ctype.h> - -/* - * convert lint comments to pragmas - */ - -static void -pplint(char* head, char* comment, char* tail, int line) -{ - NoP(line); - if (strmatch(comment, "(ARGSUSED|PRINTFLIKE|PROTOLIB|SCANFLIKE|VARARGS)*([0-9])|CONSTCOND|CONSTANTCOND|CONSTANTCONDITION|EMPTY|FALLTHRU|FALLTHROUGH|LINTLIBRARY|LINTED*|NOTREACHED")) - { - strncopy(pp.token, comment, MAXTOKEN); - ppprintf("\n#%s %s:%s\n", dirname(PRAGMA), pp.pass, pp.token); - ppline(error_info.line, NiL); - } -} - -/* - * if last!=0 then argv[opt_info.index]==0 with return(0) - * else if argv[opt_info.index]==0 then return(0) - * otherwise argv[opt_info.index] is the first unrecognized - * option with return(1) - * - * use last=0 if the preprocessor is combined with other passes - * so that unknown options may be interpreted for those passes - */ - -int -ppargs(char** argv, int last) -{ - register char* s; - register int c; - register int n; - char* p; - - /* - * check the args and initialize - */ - - if (!error_info.id) - error_info.id = "cpp"; - for (;;) - { - for (; c = optget(argv, usage); last = 0) switch (c) - { - case 'C': - ppop(PP_COMMENT, ppcomment); - break; - case 'D': - /* - * this allows single arg pp option extensions - * without touching cc - * (not all cc wrappers have -W...) - */ - - switch (*(s = opt_info.arg)) - { - case '-': - case '+': - n = (*s++ == '-'); - while (c = *s++) switch (c) - { - case 'C': - ppop(PP_COMPATIBILITY, n); - break; - case 'D': - if (n && ((c = strtol(s, &p, 0)) || p != s)) - { - s = p; - n = c; - } - ppop(PP_DEBUG, -n); - break; - case 'F': - ppop(PP_FILENAME, n ? s : NiL); - goto hasarg; - case 'H': - ppop(PP_HOSTDIR, "-", n); - break; - case 'I': - ppop(PP_CDIR, "-", n); - break; - case 'K': - ppop(PP_KEYARGS, n); - break; - case 'L': - ppop(PP_LINEID, n && *s ? s : "line"); - goto hasarg; - case 'M': - ppop(PP_MULTIPLE, !n); - break; - case 'P': - ppop(PP_PASSTHROUGH, n); - break; - case 'Q': - ppop(PP_DUMP, n); - break; - case 'R': - ppop(PP_TRANSITION, n); - break; - case 'S': - ppop(PP_STRICT, n); - break; - case 'T': - ppop(PP_TEST, s); - goto hasarg; - case 'V': - ppop(PP_VENDOR, "-", n); - break; - case 'W': - ppop(PP_WARN, n); - break; - case 'X': - ppop(PP_PROBE, n && *s ? s : 0); - goto hasarg; - case 'Y': - ppop(PP_PEDANTIC, n); - break; - case 'Z': - ppop(PP_POOL, n); - break; - case 'd': - pp.option |= DEFINITIONS; - break; - case 'm': - pp.state |= NOTEXT; - pp.option |= KEEPNOTEXT|DEFINITIONS|PREDEFINITIONS; - pp.linesync = 0; - break; - case '+': - ppop(PP_PLUSPLUS, n); - break; - default: - if (pp.optarg) - { - if ((c = (*pp.optarg)(n, c, s)) > 0) goto hasarg; - else if (!c) break; - } - error(1, "%c%s: unknown -D option overload", n ? '-' : '+', s - 1); - goto hasarg; - } - hasarg: - break; - case ':': - ppop(PP_OPTION, s + 1); - break; - case '%': - ppop(PP_DIRECTIVE, s + 1); - break; - case '_': - if (strmatch(s, "__GNUC__*")) - pp.arg_style |= STYLE_gnu; - else if (strmatch(s, "__(ANSI|STDC|STRICT)__*") || !(pp.arg_style & STYLE_gnu) && strmatch(s, "__STRICT_ANSI__*")) - ppop(PP_STRICT, 1); - else if (strmatch(s, "__cplusplus*")) - ppop(PP_PLUSPLUS, 1); - /*FALLTHROUGH*/ - default: - ppop(PP_DEFINE, s); - break; - } - break; - case 'E': - /* historically ignored */ - break; - case 'I': - if (!(s = opt_info.arg)) - { - /* - * some compilers interpret `-I ...' as - * `-I-S' and arg ... while others interpret - * it as `-I...' - */ - - p = "-S"; - if ((s = argv[opt_info.index]) && ((n = *s++) == '-' || n == '+') && *s++ == 'D') - { - if (isalpha(*s) || *s == '_') - while (isalnum(*++s) || *s == '_'); - if (*s && *s != '=' && *s != '-' && *s != '+') - p = argv[opt_info.index++]; - } - s = p; - } - switch (*s) - { - case '-': - case '+': - n = *(p = s++) == '-'; - c = *s++; - if (!n && !*s) s = 0; - switch (c) - { - case 0: - ppop(PP_LOCAL); - break; - case 'C': - ppop(PP_CDIR, s, n); - break; - case 'D': - ppop(PP_DEFAULT, s); - break; - case 'H': - ppop(PP_HOSTDIR, s, n); - break; - case 'I': - ppop(PP_IGNORE, s); - break; - case 'M': - ppop(PP_IGNORELIST, s); - break; - case 'R': - ppop(PP_READ, s); - break; - case 'S': - ppop(PP_STANDARD, s); - break; - case 'T': - ppop(PP_TEXT, s); - break; - case 'V': - ppop(PP_VENDOR, s, n); - break; - default: - error(1, "%s: unknown -I option overload", p); - break; - } - break; - default: - ppop(PP_INCLUDE, s); - break; - } - break; - case 'M': - for (n = PP_deps; argv[opt_info.index]; opt_info.offset++) - { - switch (argv[opt_info.index][opt_info.offset]) - { - case 'D': - n |= PP_deps_file; - continue; - case 'G': - n |= PP_deps_generated; - continue; - case 'M': - n |= PP_deps_local; - continue; - } - break; - } - ppop(PP_FILEDEPS, n); - break; - case 'P': - ppop(PP_LINE, (PPLINESYNC)0); - break; - case 'U': - ppop(PP_UNDEF, opt_info.arg); - break; - - /* - * System V CCS compatibility - */ - - case 'A': - if (isalpha(opt_info.arg[0]) || opt_info.arg[0] == '_' || opt_info.arg[0] == '$') - ppop(PP_ASSERT, opt_info.arg); - break; - case 'H': - ppop(PP_INCREF, ppincref); - break; - case 'T': - if (!(pp.arg_style & STYLE_gnu)) - ppop(PP_TRUNCATE, TRUNCLENGTH); - /* else enable ANSI trigraphs -- default */ - break; - case 'V': - error(0, "%s", pp.version); - break; - case 'X': - pp.arg_mode = (*(opt_info.arg + 1) || pp.arg_mode && pp.arg_mode != *opt_info.arg) ? '-' : *opt_info.arg; - break; - case 'Y': - if (*(s = opt_info.arg) && *(s + 1) == ',') - { - if (*s != 'I') break; - s += 2; - } - ppop(PP_STANDARD, s); - break; - - /* - * errors - */ - - case '?': - error(ERROR_USAGE|4, "%s", opt_info.arg); - break; - case ':': - if (!last) - { - opt_info.again = 1; - return(1); - } - - /* - * cross your fingers - */ - - if (!(s = argv[opt_info.index])) - error(3, "%s", opt_info.arg); - if (opt_info.offset == 2 && (pp.arg_style & STYLE_gnu)) - { - p = argv[opt_info.index + 1]; - if (streq(s, "-$")) - { - ppop(PP_OPTION, "noid \"$\""); - goto ignore; - } - else if (streq(s, "-dD")) - { - pp.option |= DEFINITIONS; - goto ignore; - } - else if (streq(s, "-dM")) - { - pp.state |= NOTEXT; - pp.option |= KEEPNOTEXT|DEFINITIONS|PREDEFINITIONS; - pp.linesync = 0; - goto ignore; - } - else if (streq(s, "-imacros")) - { - if (p) - { - ppop(PP_READ, p); - opt_info.index++; - opt_info.offset = 0; - } - goto ignore; - } - else if (streq(s, "-include")) - { - if (p) - { - ppop(PP_TEXT, p); - opt_info.index++; - opt_info.offset = 0; - } - opt_info.offset = 0; - goto ignore; - } - else if (strneq(s, "-lang-", 6)) - { - s += 6; - if (streq(s, "c")) - c = 0; - else if (streq(s, "c++")) - c = 1; - else if (streq(s, "objc")) - c = 2; - else if (streq(s, "objc++")) - c = 3; - ppop(PP_PLUSPLUS, c & 1); - if (c & 2) - ppop(PP_DIRECTIVE, "pragma pp:map \"/#(pragma )?import>/\" \"/#(pragma )?import(.*)/__STDPP__IMPORT__(\\2)/\"\n\ -#macdef __STDPP__IMPORT__(x)\n\ -#pragma pp:noallmultiple\n\ -#include x\n\ -#pragma pp:allmultiple\n\ -#endmac"); - goto ignore; - } - else if (streq(s, "-lint")) - { - ppop(PP_COMMENT, pplint); - goto ignore; - } - } - s += opt_info.offset - 1; - if (strmatch(s, "i*.h")) - ppop((pp.arg_style & STYLE_gnu) || s[1] == '/' ? PP_READ : PP_TEXT, s + 1); - else if (strmatch(s, "*@(nostandard|nostdinc)*")) - ppop(PP_STANDARD, ""); - else if (strmatch(s, "*@(exten|xansi)*|std")) - { - ppop(PP_COMPATIBILITY, 0); - ppop(PP_TRANSITION, 1); - } - else if (strmatch(s, "*@(ansi|conform|pedantic|stand|std1|strict[!-])*")) - { - ppop(PP_COMPATIBILITY, 0); - ppop(PP_STRICT, 1); - if (strmatch(s, "*pedantic*")) - ppop(PP_PEDANTIC, 1); - } - else if (strmatch(s, "*@(trans)*")) - { - ppop(PP_COMPATIBILITY, 1); - ppop(PP_TRANSITION, 1); - } - else if (strmatch(s, "*@(classic|compat|std0|tradition|[kK][n&+][rR])*")) - { - ppop(PP_COMPATIBILITY, 1); - ppop(PP_TRANSITION, 0); - } - else if (strmatch(s, "*@(plusplus|++)*")) - ppop(PP_PLUSPLUS, 1); - else if (strmatch(s, "*@(warn)*")) - ppop(PP_WARN, 1); - - /* - * ignore unknown options - * the probe info takes care of these - * fails if an option value is in the next arg - * and this is the last option - */ - - if (argv[opt_info.index + 1] && argv[opt_info.index + 1][0] != '-' && argv[opt_info.index + 2] && argv[opt_info.index + 2][0] == '-') - { - opt_info.index++; - opt_info.offset = 0; - } - ignore: - while (argv[opt_info.index][opt_info.offset]) opt_info.offset++; - break; - } - if (!(s = argv[opt_info.index])) return(0); - switch (pp.arg_file) - { - case 0: - if (*s != '-' || *(s + 1)) ppop(PP_INPUT, s); - break; - case 1: - if (*s != '-' || *(s + 1)) ppop(PP_OUTPUT, s); - break; - default: - if (!last) return(1); - error(1, "%s: extraneous argument ignored", s); - break; - } - pp.arg_file++; - if (!argv[++opt_info.index]) return(0); - - /* - * old versions allow options after file args - */ - } -} |