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/ppcall.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/ppcall.c')
| -rw-r--r-- | usr/src/lib/libpp/common/ppcall.c | 459 |
1 files changed, 0 insertions, 459 deletions
diff --git a/usr/src/lib/libpp/common/ppcall.c b/usr/src/lib/libpp/common/ppcall.c deleted file mode 100644 index 2c18530e6e..0000000000 --- a/usr/src/lib/libpp/common/ppcall.c +++ /dev/null @@ -1,459 +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 - * - * preprocessor macro call - */ - -#include "pplib.h" - -#include <ctype.h> - -/* - * call a macro by pushing its value on the input stream - * only the macro token itself has been consumed - * -1 returned if macro disabled - * 0 returned if tok==0 and sym->mac->value to be copied to output by caller - * 1 returned if value pushed on input - */ - -int -ppcall(register struct ppsymbol* sym, int tok) -{ - register int c; - register char* p; - register char* q; - register struct ppmacro* mac; - int n; - int m; - int ret; - int old_hidden; - int last_line; - long old_state; - char* last_file; - char* old_next; - char* old_token; - struct ppmacstk* mp; - struct ppinstk* old_in; - struct ppinstk* kp; - struct pptuple* tp; - - ret = -1; - sym->flags |= SYM_NOTICED; - if (mac = sym->macro) - { - count(macro); - if ((sym->flags & SYM_PREDICATE) && (pp.state & (CONDITIONAL|WARN)) == (CONDITIONAL|WARN)) - error(1, "%s: macro definition overrides assertion: use #%s ...", sym->name, sym->name); - if (sym->flags & SYM_DISABLED) -#if COMPATIBLE - if ((pp.state & (COMPATIBILITY|TRANSITION)) != COMPATIBILITY || !mac->arity) -#endif - { - pp.mode |= MARKMACRO; -#if COMPATIBLE - if ((pp.state & (COMPATIBILITY|STRICT)) == (COMPATIBILITY|STRICT)) - error(1, "%s: macro recursion inhibited", sym->name); -#endif - goto disable; - } - if ((sym->flags & SYM_PREDEFINED) && !(pp.mode & (HOSTED|INACTIVE))) - { -#if COMPATIBLE - if (*sym->name != '_' && !(pp.state & COMPATIBILITY)) -#else - if (*sym->name != '_') -#endif - { - if (pp.state & STRICT) - { - error(1, "%s: obsolete predefined symbol expansion disabled", sym->name); - goto disable; - } - error(1, "%s: obsolete predefined symbol expanded%s", sym->name, (pp.state & DIRECTIVE) ? "" : " outside of directive"); - } - else if (!(pp.state & DIRECTIVE) && mac->value && (ppisdig(*mac->value) || *mac->value == '#')) - error(1, "%s: predefined symbol expanded outside of directive", sym->name); - } - debug((-5, "macro %s = %s", sym->name, mac->value)); - if (pp.macref) - (*pp.macref)(sym, error_info.file, error_info.line, (pp.state & CONDITIONAL) ? REF_IF : REF_NORMAL, 0L); - if (tp = mac->tuple) - { - old_state = pp.state; - pp.state |= DEFINITION|NOSPACE; - old_token = pp.token; - n = 2 * MAXTOKEN; - pp.token = p = oldof(0, char, 0, n); - q = p + MAXTOKEN; - *pp.token++ = ' '; - old_hidden = pp.hidden; - while (c = pplex()) - { - if (c == '\n') - { - pp.hidden++; - pp.state |= HIDDEN|NEWLINE; - old_state |= HIDDEN|NEWLINE; - error_info.line++; - } - else if (c == '#') - { - ungetchr(c); - break; - } - else - { - for (;;) - { - if (streq(pp.token, tp->token)) - { - if (!(tp = tp->match)) - break; - if (!tp->nomatch) - { - free(p); - pp.state = old_state; - pp.token = old_token; - PUSH_TUPLE(sym, tp->token); - ret = 1; - goto disable; - } - } - else if (!(tp = tp->nomatch)) - break; - } - if (!tp) - { - pp.token = pp.toknxt; - break; - } - } - if ((pp.token = pp.toknxt) > q) - { - c = pp.token - p; - p = newof(p, char, n += MAXTOKEN, 0); - q = p + n - MAXTOKEN; - pp.token = p + c; - } - *pp.token++ = ' '; - } - if (pp.token > p && *(pp.token - 1) == ' ') - pp.token--; - if (pp.hidden != old_hidden) - *pp.token++ = '\n'; - else - *pp.token++ = ' '; - *pp.token = 0; - pp.state = old_state; - pp.token = old_token; - if (*p) - PUSH_RESCAN(p); - else - free(p); - if (!mac->value) - goto disable; - } - if (sym->flags & SYM_FUNCTION) - { - /* - * a quick and dirty '(' peek to avoid possibly - * inappropriate ungetchr()'s below - */ - - for (p = pp.in->nextchr; isspace(*p); p++); - if ((c = *p) != '(' && c != '/' && c != 0 && c != MARK) - goto disable; - old_next = (c == MARK) ? pp.in->nextchr : NiL; - old_token = pp.token; - mp = pp.macp->next; - if ((pp.token = (char*)&mp->arg[mac->arity + 1]) > pp.maxmac) - error(3, "%s: too many nested function-like macros", sym->name); - old_hidden = pp.hidden; - old_state = pp.state; - pp.state |= DEFINITION|FILEPOP|NOSPACE; - while ((c = pplex()) == '\n') - { - pp.hidden++; - pp.state |= HIDDEN|NEWLINE; - old_state |= HIDDEN|NEWLINE; - error_info.line++; - } - if (c != '(') - { - pp.state = old_state; - if (old_next) - pp.in->nextchr = old_next; - else - { - if (c) - { - p = pp.toknxt; - while (p > pp.token) - ungetchr(*--p); -#if COMPATIBLE - if ((pp.state & (COMPATIBILITY|STRICT)) == (COMPATIBILITY|STRICT)) - error(1, "%s: macro arguments omitted", sym->name); -#endif - if (c == T_ID && !(pp.state & HIDDEN)) - ungetchr(' '); - } - if (pp.hidden != old_hidden) - { - ungetchr('\n'); - error_info.line--; - if (pp.hidden && !--pp.hidden) - pp.state &= ~HIDDEN; - } - } - pp.token = old_token; - goto disable; - } - pp.state = old_state; - - /* - * arg[i][-1] is an extra char for each actual i - * for a possible ungetchr('"') during IN_QUOTE - * arg[i][-1]==0 if arg i need not be expanded - * arg[0][-2] holds the actual arg count - */ - - c = 0; - m = 0; - n = 0; - mp = pp.macp->next; - p = pp.token = (char*)&mp->arg[mac->arity + 1]; - pp.state |= COLLECTING|NOEXPAND; - pp.state &= ~FILEPOP; - sym->flags |= SYM_ACTIVE; - old_in = pp.in; - last_line = error_info.line; - last_file = error_info.file; - mp->line = error_info.line; -#if MACKEYARGS - if (pp.option & KEYARGS) - { - for (c = 0; c < mac->arity; c++) - mp->arg[c] = mac->args.key[c].value + 1; - mp->arg[0]++; - } - else -#endif - { - *++p = ' '; - mp->arg[0] = ++p; - } -#if MACKEYARGS - keyarg: - if (pp.option & KEYARGS) - { - pp.state |= NOSPACE; - switch (pplex()) - { - case T_ID: - break; - case ')': /* no actual key args */ - if (!(pp.state & NOEXPAND)) - pp.state |= NOEXPAND; - for (c = 0; c < mac->arity; c++) - mp->arg[c][-1] = 0; - c = 0; - goto endactuals; - default: - error(3, "%s: invalid keyword macro argument", pp.token); - break; - } - for (c = 0; c < mac->arity; c++) - if (streq(pp.token, mac->args.key[c].name)) break; - if (c >= mac->arity) - error(2, "%s: invalid macro argument keyword", pp.token); - if (pplex() != '=') - error(2, "= expected in keyword macro argument"); - pp.state &= ~NOSPACE; - if (!c) - p++; - pp.token = mp->arg[c] = ++p; - } -#endif - for (;;) - { - if ((pp.mactop = pp.token = p) >= pp.maxmac) - error(3, "%s: too many nested function-like macros", sym->name); - switch (pplex()) - { - case '(': - n++; - break; - case ')': - if (!n--) - { - if (p > mp->arg[c] && *(p - 1) == ' ') - p--; - if (p > mp->arg[c] && *(p - 1) == '\\') - { - for (q = mp->arg[c]; q < p; q++) - if (*q == '\\') - q++; - if (q > p) - *p++ = '\\'; - } -#if MACKEYARGS - *p = 0; - m++; -#endif - goto endactuals; - } - break; - case ',': - if (!n && (m++, (c < mac->arity - 1 || !(sym->flags & SYM_VARIADIC)))) - { - if (p > mp->arg[c] && *(p - 1) == ' ') - p--; - *p++ = 0; - if (!(pp.state & NOEXPAND)) - pp.state |= NOEXPAND; - else - mp->arg[c][-1] = 0; -#if MACKEYARGS - if (pp.option & KEYARGS) - { - pp.token = p + 1; - goto keyarg; - } -#endif - { - if ((pp.state & STRICT) && p == mp->arg[c]) - error(1, "%s: macro call argument %d is null", sym->name, c + 1); - if (c < mac->arity) - c++; - *p++ = ' '; - } - pp.toknxt = mp->arg[c] = p; - } - break; - case 0: - if (pp.in == old_in) - kp = 0; - else - for (kp = pp.in; kp && kp != old_in; kp = kp->prev); - if (!kp) - { - error( -#if COMPATIBLE - (pp.state & COMPATIBILITY) ? 3 : -#endif - 2, "%s: %s in macro argument list", sym->name, pptokchr(0)); - goto endactuals; - } - continue; - case '\n': - pp.state |= HIDDEN; - error_info.line++; - pp.hidden++; - /*FALLTHROUGH*/ - case ' ': - if (p > mp->arg[c] && *(p - 1) != ' ') *p++ = ' '; - continue; - } - p = pp.toknxt; - if (error_info.line != last_line) - { - SETLINE(p, error_info.line); - last_line = error_info.line; - } - if (error_info.file != last_file) - { - SETFILE(p, error_info.file); - last_file = error_info.file; - } - } - endactuals: - if (pp.state & NOEXPAND) - mp->arg[c][-1] = 0; - pp.token = old_token; - if (pp.in != old_in) - { - for (kp = pp.in; kp && kp != old_in; kp = kp->prev); - if (kp) - error(2, "%s: macro call starts and ends in different files", sym->name); - } - pp.state &= ~(COLLECTING|FILEPOP|NOEXPAND); - sym->flags &= ~SYM_ACTIVE; -#if MACKEYARGS - if (!(pp.option & KEYARGS)) -#endif - { - if (p > mp->arg[0] && ++m || (sym->flags & SYM_VARIADIC)) - c++; - if (c != mac->arity && !(sym->flags & SYM_EMPTY)) - { - n = mac->arity; - if (!(sym->flags & SYM_VARIADIC)) - error(1, "%s: %d actual argument%s expected", sym->name, n, n == 1 ? "" : "s"); - else if (c < --n) - error(1, "%s: at least %d actual argument%s expected", sym->name, n, n == 1 ? "" : "s"); -#if COMPATIBLE - if (!c && (pp.state & (COMPATIBILITY|STRICT)) == (COMPATIBILITY|STRICT)) - goto disable; -#endif - } - if (!c) - ++c; - while (c < mac->arity) - mp->arg[c++] = (char*)"\0" + 1; - } - mp->arg[0][-2] = m; - *p++ = 0; - nextframe(mp, p); - count(function); - } - if (!tok && (sym->flags & SYM_NOEXPAND)) - { - if (sym->flags & SYM_FUNCTION) - popframe(mp); - ret = !mac->size; - } - else if (!(pp.state & HEADER) || (pp.option & HEADEREXPANDALL) || pp.in->type != IN_COPY) - { - if (sym->flags & SYM_MULTILINE) - PUSH_MULTILINE(sym); - else - PUSH_MACRO(sym); - ret = 1; - } - } - disable: - if (ret < 0 && sym->hidden && !(pp.mode & EXPOSE) && !(pp.state & HEADER) && (pp.in->type == IN_FILE || pp.in->type == IN_MACRO || pp.in->type == IN_EXPAND)) - { - struct ppinstk* inp; - - for (inp = pp.in; inp->type != IN_FILE && inp->prev; inp = inp->prev); - sfsprintf(pp.hidebuf, MAXTOKEN, "_%d_%s_hIDe", inp->index, sym->name); - PUSH_STRING(pp.hidebuf); - ret = 1; - } - pp.state &= ~NEWLINE; - pp.in->flags |= IN_tokens; - count(token); - return ret; -} |
