Bug #3248 » 0010-sh-1-bring-back-Makefile-changes-between-2234273d6f-.patch
bin/sh/Makefile | ||
---|---|---|
# @(#)Makefile 8.4 (Berkeley) 5/5/95
|
||
# $FreeBSD$
|
||
# Makefile for /bin/sh
|
||
#
|
||
PROG= sh
|
||
INSTALLFLAGS= -S
|
||
... | ... | |
# MLINKS for Shell built in commands for which there are no userland
|
||
# utilities of the same name are handled with the associated manpage,
|
||
# builtin.1 in share/man/man1/.
|
||
CFLAGS+=-DSHELL -I. -I${.CURDIR} -I${.CURDIR}/../../contrib/libedit/src
|
||
# for debug:
|
||
# DEBUG_FLAGS+= -g -DDEBUG=2 -fno-inline
|
||
... | ... | |
LDADD= ${LIBEDIT} ${LIBNCURSES}
|
||
.endif
|
||
.PATH: ${.CURDIR}/bltin \
|
||
${.CURDIR}/../kill \
|
||
${.CURDIR}/../test \
|
||
${.CURDIR}/../../usr.bin/printf
|
||
CLEANFILES+= mknodes mksyntax
|
||
#
|
||
# NOTE: the headers and sources in pregenerated/ must be updated upon any
|
||
# changes to the nodetypes nodes.c.pat mkbuiltins mknodes.c mksyntax.c mktokens
|
||
# files using following scripts and build programs.
|
||
#
|
||
.if 1 # not updating sh(1)
|
||
.PATH: ${.CURDIR}/pregenerated
|
||
CFLAGS+= -I${.CURDIR}/pregenerated
|
||
.else
|
||
CLEANFILES+= ${GENSRCS} ${GENHDRS}
|
||
build-tools: mknodes mksyntax
|
||
.ORDER: builtins.c builtins.h
|
||
builtins.c builtins.h: mkbuiltins builtins.def
|
||
sh ${.CURDIR}/mkbuiltins ${.CURDIR}
|
||
DEPENDOBJS+= mknodes mksyntax
|
||
mknodes mksyntax: ${BUILD_TOOLS_META}
|
||
# XXX this is just to stop the default .c rule being used, so that the
|
||
# intermediate object has a fixed name.
|
||
# XXX we have a default .c rule, but no default .o rule.
|
||
.o:
|
||
${CC} ${CFLAGS} ${LDFLAGS} ${.IMPSRC} ${LDLIBS} -o ${.TARGET}
|
||
.ORDER: nodes.c nodes.h
|
||
nodes.c nodes.h: mknodes nodetypes nodes.c.pat
|
||
${BTOOLSPATH:U.}/mknodes ${.CURDIR}/nodetypes ${.CURDIR}/nodes.c.pat
|
||
nodes.c nodes.h: nodetypes nodes.c.pat
|
||
${.OBJDIR}/mknodes/mknodes.nx ${.ALLSRC}
|
||
.ORDER: syntax.c syntax.h
|
||
syntax.c syntax.h: mksyntax
|
||
${BTOOLSPATH:U.}/mksyntax
|
||
syntax.c syntax.h:
|
||
${.OBJDIR}/mksyntax/mksyntax.nx
|
||
token.h: mktokens
|
||
sh ${.CURDIR}/mktokens
|
||
HAS_TESTS=
|
||
SUBDIR.${MK_TESTS}+= tests
|
||
.endif
|
||
regress: sh
|
||
cd ${.CURDIR}/../../tools/regression/bin/sh && ${MAKE} SH=${.OBJDIR}/sh
|
||
.include <bsd.prog.mk>
|
bin/sh/mknodes/Makefile | ||
---|---|---|
.PATH: ${.CURDIR}/..
|
||
PROG= mknodes
|
||
build-tools: mknodes.nx
|
||
# this mknodes is used in place, it is not installed anywhere
|
||
install:
|
||
.include <bsd.hostprog.mk>
|
bin/sh/mksyntax/Makefile | ||
---|---|---|
.PATH: ${.CURDIR}/..
|
||
PROG= mksyntax
|
||
build-tools: mksyntax.nx
|
||
# this mksyntax is used in place, it is not installed anywhere
|
||
install:
|
||
.include <bsd.hostprog.mk>
|
bin/sh/pregenerated/builtins.c | ||
---|---|---|
/*
|
||
* This file was generated by the mkbuiltins program.
|
||
*/
|
||
#include <stdlib.h>
|
||
#include "shell.h"
|
||
#include "builtins.h"
|
||
int (*const builtinfunc[])(int, char **) = {
|
||
bltincmd,
|
||
aliascmd,
|
||
bgcmd,
|
||
bindcmd,
|
||
breakcmd,
|
||
cdcmd,
|
||
commandcmd,
|
||
dotcmd,
|
||
echocmd,
|
||
evalcmd,
|
||
execcmd,
|
||
exitcmd,
|
||
letcmd,
|
||
exportcmd,
|
||
falsecmd,
|
||
fgcmd,
|
||
freebsd_wordexpcmd,
|
||
getoptscmd,
|
||
hashcmd,
|
||
histcmd,
|
||
jobidcmd,
|
||
jobscmd,
|
||
killcmd,
|
||
localcmd,
|
||
printfcmd,
|
||
pwdcmd,
|
||
readcmd,
|
||
returncmd,
|
||
setcmd,
|
||
setvarcmd,
|
||
shiftcmd,
|
||
testcmd,
|
||
timescmd,
|
||
trapcmd,
|
||
truecmd,
|
||
typecmd,
|
||
ulimitcmd,
|
||
umaskcmd,
|
||
unaliascmd,
|
||
unsetcmd,
|
||
waitcmd,
|
||
wordexpcmd,
|
||
};
|
||
const unsigned char builtincmd[] = {
|
||
"\007\000builtin"
|
||
"\005\001alias"
|
||
"\002\002bg"
|
||
"\004\003bind"
|
||
"\005\204break"
|
||
"\010\204continue"
|
||
"\002\005cd"
|
||
"\005\005chdir"
|
||
"\007\006command"
|
||
"\001\207."
|
||
"\004\010echo"
|
||
"\004\211eval"
|
||
"\004\212exec"
|
||
"\004\213exit"
|
||
"\003\014let"
|
||
"\006\215export"
|
||
"\010\215readonly"
|
||
"\005\016false"
|
||
"\002\017fg"
|
||
"\017\020freebsd_wordexp"
|
||
"\007\021getopts"
|
||
"\004\022hash"
|
||
"\002\023fc"
|
||
"\005\024jobid"
|
||
"\004\025jobs"
|
||
"\004\026kill"
|
||
"\005\027local"
|
||
"\006\030printf"
|
||
"\003\031pwd"
|
||
"\004\032read"
|
||
"\006\233return"
|
||
"\003\234set"
|
||
"\006\035setvar"
|
||
"\005\236shift"
|
||
"\004\037test"
|
||
"\001\037["
|
||
"\005\240times"
|
||
"\004\241trap"
|
||
"\001\242:"
|
||
"\004\042true"
|
||
"\004\043type"
|
||
"\006\044ulimit"
|
||
"\005\045umask"
|
||
"\007\046unalias"
|
||
"\005\247unset"
|
||
"\004\050wait"
|
||
"\007\051wordexp"
|
||
};
|
bin/sh/pregenerated/builtins.h | ||
---|---|---|
/*
|
||
* This file was generated by the mkbuiltins program.
|
||
*/
|
||
#include <sys/cdefs.h>
|
||
#define BLTINCMD 0
|
||
#define ALIASCMD 1
|
||
#define BGCMD 2
|
||
#define BINDCMD 3
|
||
#define BREAKCMD 4
|
||
#define CDCMD 5
|
||
#define COMMANDCMD 6
|
||
#define DOTCMD 7
|
||
#define ECHOCMD 8
|
||
#define EVALCMD 9
|
||
#define EXECCMD 10
|
||
#define EXITCMD 11
|
||
#define LETCMD 12
|
||
#define EXPORTCMD 13
|
||
#define FALSECMD 14
|
||
#define FGCMD 15
|
||
#define FREEBSD_WORDEXPCMD 16
|
||
#define GETOPTSCMD 17
|
||
#define HASHCMD 18
|
||
#define HISTCMD 19
|
||
#define JOBIDCMD 20
|
||
#define JOBSCMD 21
|
||
#define KILLCMD 22
|
||
#define LOCALCMD 23
|
||
#define PRINTFCMD 24
|
||
#define PWDCMD 25
|
||
#define READCMD 26
|
||
#define RETURNCMD 27
|
||
#define SETCMD 28
|
||
#define SETVARCMD 29
|
||
#define SHIFTCMD 30
|
||
#define TESTCMD 31
|
||
#define TIMESCMD 32
|
||
#define TRAPCMD 33
|
||
#define TRUECMD 34
|
||
#define TYPECMD 35
|
||
#define ULIMITCMD 36
|
||
#define UMASKCMD 37
|
||
#define UNALIASCMD 38
|
||
#define UNSETCMD 39
|
||
#define WAITCMD 40
|
||
#define WORDEXPCMD 41
|
||
#define BUILTIN_SPECIAL 0x80
|
||
extern int (*const builtinfunc[])(int, char **);
|
||
extern const unsigned char builtincmd[];
|
||
int bltincmd(int, char **);
|
||
int aliascmd(int, char **);
|
||
int bgcmd(int, char **);
|
||
int bindcmd(int, char **);
|
||
int breakcmd(int, char **);
|
||
int cdcmd(int, char **);
|
||
int commandcmd(int, char **);
|
||
int dotcmd(int, char **);
|
||
int echocmd(int, char **);
|
||
int evalcmd(int, char **);
|
||
int execcmd(int, char **);
|
||
int exitcmd(int, char **);
|
||
int letcmd(int, char **);
|
||
int exportcmd(int, char **);
|
||
int falsecmd(int, char **);
|
||
int fgcmd(int, char **);
|
||
int freebsd_wordexpcmd(int, char **);
|
||
int getoptscmd(int, char **);
|
||
int hashcmd(int, char **);
|
||
int histcmd(int, char **);
|
||
int jobidcmd(int, char **);
|
||
int jobscmd(int, char **);
|
||
int killcmd(int, char **);
|
||
int localcmd(int, char **);
|
||
int printfcmd(int, char **);
|
||
int pwdcmd(int, char **);
|
||
int readcmd(int, char **);
|
||
int returncmd(int, char **);
|
||
int setcmd(int, char **);
|
||
int setvarcmd(int, char **);
|
||
int shiftcmd(int, char **);
|
||
int testcmd(int, char **);
|
||
int timescmd(int, char **);
|
||
int trapcmd(int, char **);
|
||
int truecmd(int, char **);
|
||
int typecmd(int, char **);
|
||
int ulimitcmd(int, char **);
|
||
int umaskcmd(int, char **);
|
||
int unaliascmd(int, char **);
|
||
int unsetcmd(int, char **);
|
||
int waitcmd(int, char **);
|
||
int wordexpcmd(int, char **);
|
||
static inline int
|
||
safe_builtin_always(int idx)
|
||
{
|
||
if (idx == BLTINCMD ||
|
||
idx == COMMANDCMD ||
|
||
idx == ECHOCMD ||
|
||
idx == FALSECMD ||
|
||
idx == JOBIDCMD ||
|
||
idx == JOBSCMD ||
|
||
idx == KILLCMD ||
|
||
idx == PRINTFCMD ||
|
||
idx == PWDCMD ||
|
||
idx == TESTCMD ||
|
||
idx == TIMESCMD ||
|
||
idx == TRUECMD ||
|
||
idx == TYPECMD)
|
||
return (1);
|
||
return(0);
|
||
}
|
bin/sh/pregenerated/nodes.c | ||
---|---|---|
/*
|
||
* This file was generated by the mknodes program.
|
||
*/
|
||
/*-
|
||
* Copyright (c) 1991, 1993
|
||
* The Regents of the University of California. All rights reserved.
|
||
*
|
||
* This code is derived from software contributed to Berkeley by
|
||
* Kenneth Almquist.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. Neither the name of the University nor the names of its contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* @(#)nodes.c.pat 8.2 (Berkeley) 5/4/95
|
||
* $FreeBSD$
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <stdlib.h>
|
||
#include <stddef.h>
|
||
/*
|
||
* Routine for dealing with parsed shell commands.
|
||
*/
|
||
#include "shell.h"
|
||
#include "nodes.h"
|
||
#include "memalloc.h"
|
||
#include "mystring.h"
|
||
struct nodesize {
|
||
int blocksize; /* size of structures in function */
|
||
int stringsize; /* size of strings in node */
|
||
};
|
||
struct nodecopystate {
|
||
pointer block; /* block to allocate function from */
|
||
char *string; /* block to allocate strings from */
|
||
};
|
||
static const short nodesize[27] = {
|
||
ALIGN(sizeof (struct nbinary)),
|
||
ALIGN(sizeof (struct ncmd)),
|
||
ALIGN(sizeof (struct npipe)),
|
||
ALIGN(sizeof (struct nredir)),
|
||
ALIGN(sizeof (struct nredir)),
|
||
ALIGN(sizeof (struct nredir)),
|
||
ALIGN(sizeof (struct nbinary)),
|
||
ALIGN(sizeof (struct nbinary)),
|
||
ALIGN(sizeof (struct nif)),
|
||
ALIGN(sizeof (struct nbinary)),
|
||
ALIGN(sizeof (struct nbinary)),
|
||
ALIGN(sizeof (struct nfor)),
|
||
ALIGN(sizeof (struct ncase)),
|
||
ALIGN(sizeof (struct nclist)),
|
||
ALIGN(sizeof (struct nclist)),
|
||
ALIGN(sizeof (struct narg)),
|
||
ALIGN(sizeof (struct narg)),
|
||
ALIGN(sizeof (struct nfile)),
|
||
ALIGN(sizeof (struct nfile)),
|
||
ALIGN(sizeof (struct nfile)),
|
||
ALIGN(sizeof (struct nfile)),
|
||
ALIGN(sizeof (struct nfile)),
|
||
ALIGN(sizeof (struct ndup)),
|
||
ALIGN(sizeof (struct ndup)),
|
||
ALIGN(sizeof (struct nhere)),
|
||
ALIGN(sizeof (struct nhere)),
|
||
ALIGN(sizeof (struct nnot)),
|
||
};
|
||
static void calcsize(union node *, struct nodesize *);
|
||
static void sizenodelist(struct nodelist *, struct nodesize *);
|
||
static union node *copynode(union node *, struct nodecopystate *);
|
||
static struct nodelist *copynodelist(struct nodelist *, struct nodecopystate *);
|
||
static char *nodesavestr(const char *, struct nodecopystate *);
|
||
struct funcdef {
|
||
unsigned int refcount;
|
||
union node n;
|
||
};
|
||
/*
|
||
* Make a copy of a parse tree.
|
||
*/
|
||
struct funcdef *
|
||
copyfunc(union node *n)
|
||
{
|
||
struct nodesize sz;
|
||
struct nodecopystate st;
|
||
struct funcdef *fn;
|
||
if (n == NULL)
|
||
return NULL;
|
||
sz.blocksize = offsetof(struct funcdef, n);
|
||
sz.stringsize = 0;
|
||
calcsize(n, &sz);
|
||
fn = ckmalloc(sz.blocksize + sz.stringsize);
|
||
fn->refcount = 1;
|
||
st.block = (char *)fn + offsetof(struct funcdef, n);
|
||
st.string = (char *)fn + sz.blocksize;
|
||
copynode(n, &st);
|
||
return fn;
|
||
}
|
||
union node *
|
||
getfuncnode(struct funcdef *fn)
|
||
{
|
||
return fn == NULL ? NULL : &fn->n;
|
||
}
|
||
static void
|
||
calcsize(union node *n, struct nodesize *result)
|
||
{
|
||
if (n == NULL)
|
||
return;
|
||
result->blocksize += nodesize[n->type];
|
||
switch (n->type) {
|
||
case NSEMI:
|
||
case NAND:
|
||
case NOR:
|
||
case NWHILE:
|
||
case NUNTIL:
|
||
calcsize(n->nbinary.ch2, result);
|
||
calcsize(n->nbinary.ch1, result);
|
||
break;
|
||
case NCMD:
|
||
calcsize(n->ncmd.redirect, result);
|
||
calcsize(n->ncmd.args, result);
|
||
break;
|
||
case NPIPE:
|
||
sizenodelist(n->npipe.cmdlist, result);
|
||
break;
|
||
case NREDIR:
|
||
case NBACKGND:
|
||
case NSUBSHELL:
|
||
calcsize(n->nredir.redirect, result);
|
||
calcsize(n->nredir.n, result);
|
||
break;
|
||
case NIF:
|
||
calcsize(n->nif.elsepart, result);
|
||
calcsize(n->nif.ifpart, result);
|
||
calcsize(n->nif.test, result);
|
||
break;
|
||
case NFOR:
|
||
result->stringsize += strlen(n->nfor.var) + 1;
|
||
calcsize(n->nfor.body, result);
|
||
calcsize(n->nfor.args, result);
|
||
break;
|
||
case NCASE:
|
||
calcsize(n->ncase.cases, result);
|
||
calcsize(n->ncase.expr, result);
|
||
break;
|
||
case NCLIST:
|
||
case NCLISTFALLTHRU:
|
||
calcsize(n->nclist.body, result);
|
||
calcsize(n->nclist.pattern, result);
|
||
calcsize(n->nclist.next, result);
|
||
break;
|
||
case NDEFUN:
|
||
case NARG:
|
||
sizenodelist(n->narg.backquote, result);
|
||
result->stringsize += strlen(n->narg.text) + 1;
|
||
calcsize(n->narg.next, result);
|
||
break;
|
||
case NTO:
|
||
case NFROM:
|
||
case NFROMTO:
|
||
case NAPPEND:
|
||
case NCLOBBER:
|
||
calcsize(n->nfile.fname, result);
|
||
calcsize(n->nfile.next, result);
|
||
break;
|
||
case NTOFD:
|
||
case NFROMFD:
|
||
calcsize(n->ndup.vname, result);
|
||
calcsize(n->ndup.next, result);
|
||
break;
|
||
case NHERE:
|
||
case NXHERE:
|
||
calcsize(n->nhere.doc, result);
|
||
calcsize(n->nhere.next, result);
|
||
break;
|
||
case NNOT:
|
||
calcsize(n->nnot.com, result);
|
||
break;
|
||
};
|
||
}
|
||
static void
|
||
sizenodelist(struct nodelist *lp, struct nodesize *result)
|
||
{
|
||
while (lp) {
|
||
result->blocksize += ALIGN(sizeof(struct nodelist));
|
||
calcsize(lp->n, result);
|
||
lp = lp->next;
|
||
}
|
||
}
|
||
static union node *
|
||
copynode(union node *n, struct nodecopystate *state)
|
||
{
|
||
union node *new;
|
||
if (n == NULL)
|
||
return NULL;
|
||
new = state->block;
|
||
state->block = (char *)state->block + nodesize[n->type];
|
||
switch (n->type) {
|
||
case NSEMI:
|
||
case NAND:
|
||
case NOR:
|
||
case NWHILE:
|
||
case NUNTIL:
|
||
new->nbinary.ch2 = copynode(n->nbinary.ch2, state);
|
||
new->nbinary.ch1 = copynode(n->nbinary.ch1, state);
|
||
break;
|
||
case NCMD:
|
||
new->ncmd.redirect = copynode(n->ncmd.redirect, state);
|
||
new->ncmd.args = copynode(n->ncmd.args, state);
|
||
break;
|
||
case NPIPE:
|
||
new->npipe.cmdlist = copynodelist(n->npipe.cmdlist, state);
|
||
new->npipe.backgnd = n->npipe.backgnd;
|
||
break;
|
||
case NREDIR:
|
||
case NBACKGND:
|
||
case NSUBSHELL:
|
||
new->nredir.redirect = copynode(n->nredir.redirect, state);
|
||
new->nredir.n = copynode(n->nredir.n, state);
|
||
break;
|
||
case NIF:
|
||
new->nif.elsepart = copynode(n->nif.elsepart, state);
|
||
new->nif.ifpart = copynode(n->nif.ifpart, state);
|
||
new->nif.test = copynode(n->nif.test, state);
|
||
break;
|
||
case NFOR:
|
||
new->nfor.var = nodesavestr(n->nfor.var, state);
|
||
new->nfor.body = copynode(n->nfor.body, state);
|
||
new->nfor.args = copynode(n->nfor.args, state);
|
||
break;
|
||
case NCASE:
|
||
new->ncase.cases = copynode(n->ncase.cases, state);
|
||
new->ncase.expr = copynode(n->ncase.expr, state);
|
||
break;
|
||
case NCLIST:
|
||
case NCLISTFALLTHRU:
|
||
new->nclist.body = copynode(n->nclist.body, state);
|
||
new->nclist.pattern = copynode(n->nclist.pattern, state);
|
||
new->nclist.next = copynode(n->nclist.next, state);
|
||
break;
|
||
case NDEFUN:
|
||
case NARG:
|
||
new->narg.backquote = copynodelist(n->narg.backquote, state);
|
||
new->narg.text = nodesavestr(n->narg.text, state);
|
||
new->narg.next = copynode(n->narg.next, state);
|
||
break;
|
||
case NTO:
|
||
case NFROM:
|
||
case NFROMTO:
|
||
case NAPPEND:
|
||
case NCLOBBER:
|
||
new->nfile.fname = copynode(n->nfile.fname, state);
|
||
new->nfile.next = copynode(n->nfile.next, state);
|
||
new->nfile.fd = n->nfile.fd;
|
||
break;
|
||
case NTOFD:
|
||
case NFROMFD:
|
||
new->ndup.vname = copynode(n->ndup.vname, state);
|
||
new->ndup.dupfd = n->ndup.dupfd;
|
||
new->ndup.next = copynode(n->ndup.next, state);
|
||
new->ndup.fd = n->ndup.fd;
|
||
break;
|
||
case NHERE:
|
||
case NXHERE:
|
||
new->nhere.doc = copynode(n->nhere.doc, state);
|
||
new->nhere.next = copynode(n->nhere.next, state);
|
||
new->nhere.fd = n->nhere.fd;
|
||
break;
|
||
case NNOT:
|
||
new->nnot.com = copynode(n->nnot.com, state);
|
||
break;
|
||
};
|
||
new->type = n->type;
|
||
return new;
|
||
}
|
||
static struct nodelist *
|
||
copynodelist(struct nodelist *lp, struct nodecopystate *state)
|
||
{
|
||
struct nodelist *start;
|
||
struct nodelist **lpp;
|
||
lpp = &start;
|
||
while (lp) {
|
||
*lpp = state->block;
|
||
state->block = (char *)state->block +
|
||
ALIGN(sizeof(struct nodelist));
|
||
(*lpp)->n = copynode(lp->n, state);
|
||
lp = lp->next;
|
||
lpp = &(*lpp)->next;
|
||
}
|
||
*lpp = NULL;
|
||
return start;
|
||
}
|
||
static char *
|
||
nodesavestr(const char *s, struct nodecopystate *state)
|
||
{
|
||
const char *p = s;
|
||
char *q = state->string;
|
||
char *rtn = state->string;
|
||
while ((*q++ = *p++) != '\0')
|
||
continue;
|
||
state->string = q;
|
||
return rtn;
|
||
}
|
||
void
|
||
reffunc(struct funcdef *fn)
|
||
{
|
||
if (fn)
|
||
fn->refcount++;
|
||
}
|
||
/*
|
||
* Decrement the reference count of a function definition, freeing it
|
||
* if it falls to 0.
|
||
*/
|
||
void
|
||
unreffunc(struct funcdef *fn)
|
||
{
|
||
if (fn) {
|
||
fn->refcount--;
|
||
if (fn->refcount > 0)
|
||
return;
|
||
ckfree(fn);
|
||
}
|
||
}
|
bin/sh/pregenerated/nodes.h | ||
---|---|---|
/*
|
||
* This file was generated by the mknodes program.
|
||
*/
|
||
#define NSEMI 0
|
||
#define NCMD 1
|
||
#define NPIPE 2
|
||
#define NREDIR 3
|
||
#define NBACKGND 4
|
||
#define NSUBSHELL 5
|
||
#define NAND 6
|
||
#define NOR 7
|
||
#define NIF 8
|
||
#define NWHILE 9
|
||
#define NUNTIL 10
|
||
#define NFOR 11
|
||
#define NCASE 12
|
||
#define NCLIST 13
|
||
#define NCLISTFALLTHRU 14
|
||
#define NDEFUN 15
|
||
#define NARG 16
|
||
#define NTO 17
|
||
#define NFROM 18
|
||
#define NFROMTO 19
|
||
#define NAPPEND 20
|
||
#define NCLOBBER 21
|
||
#define NTOFD 22
|
||
#define NFROMFD 23
|
||
#define NHERE 24
|
||
#define NXHERE 25
|
||
#define NNOT 26
|
||
struct nbinary {
|
||
int type;
|
||
union node *ch1;
|
||
union node *ch2;
|
||
};
|
||
struct ncmd {
|
||
int type;
|
||
union node *args;
|
||
union node *redirect;
|
||
};
|
||
struct npipe {
|
||
int type;
|
||
int backgnd;
|
||
struct nodelist *cmdlist;
|
||
};
|
||
struct nredir {
|
||
int type;
|
||
union node *n;
|
||
union node *redirect;
|
||
};
|
||
struct nif {
|
||
int type;
|
||
union node *test;
|
||
union node *ifpart;
|
||
union node *elsepart;
|
||
};
|
||
struct nfor {
|
||
int type;
|
||
union node *args;
|
||
union node *body;
|
||
char *var;
|
||
};
|
||
struct ncase {
|
||
int type;
|
||
union node *expr;
|
||
union node *cases;
|
||
};
|
||
struct nclist {
|
||
int type;
|
||
union node *next;
|
||
union node *pattern;
|
||
union node *body;
|
||
};
|
||
struct narg {
|
||
int type;
|
||
union node *next;
|
||
char *text;
|
||
struct nodelist *backquote;
|
||
};
|
||
struct nfile {
|
||
int type;
|
||
int fd;
|
||
union node *next;
|
||
union node *fname;
|
||
char *expfname;
|
||
};
|
||
struct ndup {
|
||
int type;
|
||
int fd;
|
||
union node *next;
|
||
int dupfd;
|
||
union node *vname;
|
||
};
|
||
struct nhere {
|
||
int type;
|
||
int fd;
|
||
union node *next;
|
||
union node *doc;
|
||
const char *expdoc;
|
||
};
|
||
struct nnot {
|
||
int type;
|
||
union node *com;
|
||
};
|
||
union node {
|
||
int type;
|
||
struct nbinary nbinary;
|
||
struct ncmd ncmd;
|
||
struct npipe npipe;
|
||
struct nredir nredir;
|
||
struct nif nif;
|
||
struct nfor nfor;
|
||
struct ncase ncase;
|
||
struct nclist nclist;
|
||
struct narg narg;
|
||
struct nfile nfile;
|
||
struct ndup ndup;
|
||
struct nhere nhere;
|
||
struct nnot nnot;
|
||
};
|
||
struct nodelist {
|
||
struct nodelist *next;
|
||
union node *n;
|
||
};
|
||
struct funcdef;
|
||
struct funcdef *copyfunc(union node *);
|
||
union node *getfuncnode(struct funcdef *);
|
||
void reffunc(struct funcdef *);
|
||
void unreffunc(struct funcdef *);
|
bin/sh/pregenerated/syntax.c | ||
---|---|---|
/*
|
||
* This file was generated by the mksyntax program.
|
||
*/
|
||
#include "parser.h"
|
||
#include "shell.h"
|
||
#include "syntax.h"
|
||
/* syntax table used when not in quotes */
|
||
const char basesyntax[SYNBASE + CHAR_MAX + 1] = {
|
||
[SYNBASE + PEOF] = CEOF,
|
||
[SYNBASE + CTLESC] = CCTL,
|
||
[SYNBASE + CTLVAR] = CCTL,
|
||
[SYNBASE + CTLENDVAR] = CCTL,
|
||
[SYNBASE + CTLBACKQ] = CCTL,
|
||
[SYNBASE + CTLBACKQ + CTLQUOTE] = CCTL,
|
||
[SYNBASE + CTLARI] = CCTL,
|
||
[SYNBASE + CTLENDARI] = CCTL,
|
||
[SYNBASE + CTLQUOTEMARK] = CCTL,
|
||
[SYNBASE + CTLQUOTEEND] = CCTL,
|
||
[SYNBASE + '\n'] = CNL,
|
||
[SYNBASE + '\\'] = CBACK,
|
||
[SYNBASE + '\''] = CSQUOTE,
|
||
[SYNBASE + '"'] = CDQUOTE,
|
||
[SYNBASE + '`'] = CBQUOTE,
|
||
[SYNBASE + '$'] = CVAR,
|
||
[SYNBASE + '}'] = CENDVAR,
|
||
[SYNBASE + '<'] = CSPCL,
|
||
[SYNBASE + '>'] = CSPCL,
|
||
[SYNBASE + '('] = CSPCL,
|
||
[SYNBASE + ')'] = CSPCL,
|
||
[SYNBASE + ';'] = CSPCL,
|
||
[SYNBASE + '&'] = CSPCL,
|
||
[SYNBASE + '|'] = CSPCL,
|
||
[SYNBASE + ' '] = CSPCL,
|
||
[SYNBASE + '\t'] = CSPCL,
|
||
};
|
||
/* syntax table used when in double quotes */
|
||
const char dqsyntax[SYNBASE + CHAR_MAX + 1] = {
|
||
[SYNBASE + PEOF] = CEOF,
|
||
[SYNBASE + CTLESC] = CCTL,
|
||
[SYNBASE + CTLVAR] = CCTL,
|
||
[SYNBASE + CTLENDVAR] = CCTL,
|
||
[SYNBASE + CTLBACKQ] = CCTL,
|
||
[SYNBASE + CTLBACKQ + CTLQUOTE] = CCTL,
|
||
[SYNBASE + CTLARI] = CCTL,
|
||
[SYNBASE + CTLENDARI] = CCTL,
|
||
[SYNBASE + CTLQUOTEMARK] = CCTL,
|
||
[SYNBASE + CTLQUOTEEND] = CCTL,
|
||
[SYNBASE + '\n'] = CQNL,
|
||
[SYNBASE + '\\'] = CBACK,
|
||
[SYNBASE + '"'] = CENDQUOTE,
|
||
[SYNBASE + '`'] = CBQUOTE,
|
||
[SYNBASE + '$'] = CVAR,
|
||
[SYNBASE + '}'] = CENDVAR,
|
||
[SYNBASE + '!'] = CCTL,
|
||
[SYNBASE + '*'] = CCTL,
|
||
[SYNBASE + '?'] = CCTL,
|
||
[SYNBASE + '['] = CCTL,
|
||
[SYNBASE + ']'] = CCTL,
|
||
[SYNBASE + '='] = CCTL,
|
||
[SYNBASE + '~'] = CCTL,
|
||
[SYNBASE + ':'] = CCTL,
|
||
[SYNBASE + '/'] = CCTL,
|
||
[SYNBASE + '-'] = CCTL,
|
||
[SYNBASE + '^'] = CCTL,
|
||
};
|
||
/* syntax table used when in single quotes */
|
||
const char sqsyntax[SYNBASE + CHAR_MAX + 1] = {
|
||
[SYNBASE + PEOF] = CEOF,
|
||
[SYNBASE + CTLESC] = CCTL,
|
||
[SYNBASE + CTLVAR] = CCTL,
|
||
[SYNBASE + CTLENDVAR] = CCTL,
|
||
[SYNBASE + CTLBACKQ] = CCTL,
|
||
[SYNBASE + CTLBACKQ + CTLQUOTE] = CCTL,
|
||
[SYNBASE + CTLARI] = CCTL,
|
||
[SYNBASE + CTLENDARI] = CCTL,
|
||
[SYNBASE + CTLQUOTEMARK] = CCTL,
|
||
[SYNBASE + CTLQUOTEEND] = CCTL,
|
||
[SYNBASE + '\n'] = CQNL,
|
||
[SYNBASE + '\\'] = CSBACK,
|
||
[SYNBASE + '\''] = CENDQUOTE,
|
||
[SYNBASE + '!'] = CCTL,
|
||
[SYNBASE + '*'] = CCTL,
|
||
[SYNBASE + '?'] = CCTL,
|
||
[SYNBASE + '['] = CCTL,
|
||
[SYNBASE + ']'] = CCTL,
|
||
[SYNBASE + '='] = CCTL,
|
||
[SYNBASE + '~'] = CCTL,
|
||
[SYNBASE + ':'] = CCTL,
|
||
[SYNBASE + '/'] = CCTL,
|
||
[SYNBASE + '-'] = CCTL,
|
||
[SYNBASE + '^'] = CCTL,
|
||
};
|
||
/* syntax table used when in arithmetic */
|
||
const char arisyntax[SYNBASE + CHAR_MAX + 1] = {
|
||
[SYNBASE + PEOF] = CEOF,
|
||
[SYNBASE + CTLESC] = CCTL,
|
||
[SYNBASE + CTLVAR] = CCTL,
|
||
[SYNBASE + CTLENDVAR] = CCTL,
|
||
[SYNBASE + CTLBACKQ] = CCTL,
|
||
[SYNBASE + CTLBACKQ + CTLQUOTE] = CCTL,
|
||
[SYNBASE + CTLARI] = CCTL,
|
||
[SYNBASE + CTLENDARI] = CCTL,
|
||
[SYNBASE + CTLQUOTEMARK] = CCTL,
|
||
[SYNBASE + CTLQUOTEEND] = CCTL,
|
||
[SYNBASE + '\n'] = CQNL,
|
||
[SYNBASE + '\\'] = CBACK,
|
||
[SYNBASE + '`'] = CBQUOTE,
|
||
[SYNBASE + '"'] = CIGN,
|
||
[SYNBASE + '$'] = CVAR,
|
||
[SYNBASE + '}'] = CENDVAR,
|
||
[SYNBASE + '('] = CLP,
|
||
[SYNBASE + ')'] = CRP,
|
||
};
|
||
/* character classification table */
|
||
const char is_type[SYNBASE + CHAR_MAX + 1] = {
|
||
[SYNBASE + '0'] = ISDIGIT,
|
||
[SYNBASE + '1'] = ISDIGIT,
|
||
[SYNBASE + '2'] = ISDIGIT,
|
||
[SYNBASE + '3'] = ISDIGIT,
|
||
[SYNBASE + '4'] = ISDIGIT,
|
||
[SYNBASE + '5'] = ISDIGIT,
|
||
[SYNBASE + '6'] = ISDIGIT,
|
||
[SYNBASE + '7'] = ISDIGIT,
|
||
[SYNBASE + '8'] = ISDIGIT,
|
||
[SYNBASE + '9'] = ISDIGIT,
|
||
[SYNBASE + 'a'] = ISLOWER,
|
||
[SYNBASE + 'b'] = ISLOWER,
|
||
[SYNBASE + 'c'] = ISLOWER,
|
||
[SYNBASE + 'd'] = ISLOWER,
|
||
[SYNBASE + 'e'] = ISLOWER,
|
||
[SYNBASE + 'f'] = ISLOWER,
|
||
[SYNBASE + 'g'] = ISLOWER,
|
||
[SYNBASE + 'h'] = ISLOWER,
|
||
[SYNBASE + 'i'] = ISLOWER,
|
||
[SYNBASE + 'j'] = ISLOWER,
|
||
[SYNBASE + 'k'] = ISLOWER,
|
||
[SYNBASE + 'l'] = ISLOWER,
|
||
[SYNBASE + 'm'] = ISLOWER,
|
||
[SYNBASE + 'n'] = ISLOWER,
|
||
[SYNBASE + 'o'] = ISLOWER,
|
||
[SYNBASE + 'p'] = ISLOWER,
|
||
[SYNBASE + 'q'] = ISLOWER,
|
||
[SYNBASE + 'r'] = ISLOWER,
|
||
[SYNBASE + 's'] = ISLOWER,
|
||
[SYNBASE + 't'] = ISLOWER,
|
||
[SYNBASE + 'u'] = ISLOWER,
|
||
[SYNBASE + 'v'] = ISLOWER,
|
||
[SYNBASE + 'w'] = ISLOWER,
|
||
[SYNBASE + 'x'] = ISLOWER,
|
||
[SYNBASE + 'y'] = ISLOWER,
|
||
[SYNBASE + 'z'] = ISLOWER,
|
||
[SYNBASE + 'A'] = ISUPPER,
|
||
[SYNBASE + 'B'] = ISUPPER,
|
||
[SYNBASE + 'C'] = ISUPPER,
|
||
[SYNBASE + 'D'] = ISUPPER,
|
||
[SYNBASE + 'E'] = ISUPPER,
|
||
[SYNBASE + 'F'] = ISUPPER,
|
||
[SYNBASE + 'G'] = ISUPPER,
|
||
[SYNBASE + 'H'] = ISUPPER,
|
||
[SYNBASE + 'I'] = ISUPPER,
|
||
[SYNBASE + 'J'] = ISUPPER,
|
||
[SYNBASE + 'K'] = ISUPPER,
|
||
[SYNBASE + 'L'] = ISUPPER,
|
||
[SYNBASE + 'M'] = ISUPPER,
|
||
[SYNBASE + 'N'] = ISUPPER,
|
||
[SYNBASE + 'O'] = ISUPPER,
|
||
[SYNBASE + 'P'] = ISUPPER,
|
||
[SYNBASE + 'Q'] = ISUPPER,
|
||
[SYNBASE + 'R'] = ISUPPER,
|
||
[SYNBASE + 'S'] = ISUPPER,
|
||
[SYNBASE + 'T'] = ISUPPER,
|
||
[SYNBASE + 'U'] = ISUPPER,
|
||
[SYNBASE + 'V'] = ISUPPER,
|
||
[SYNBASE + 'W'] = ISUPPER,
|
||
[SYNBASE + 'X'] = ISUPPER,
|
||
[SYNBASE + 'Y'] = ISUPPER,
|
||
[SYNBASE + 'Z'] = ISUPPER,
|
||
[SYNBASE + '_'] = ISUNDER,
|
||
[SYNBASE + '#'] = ISSPECL,
|
||
[SYNBASE + '?'] = ISSPECL,
|
||
[SYNBASE + '$'] = ISSPECL,
|
||
[SYNBASE + '!'] = ISSPECL,
|
||
[SYNBASE + '-'] = ISSPECL,
|
||
[SYNBASE + '*'] = ISSPECL,
|
||
[SYNBASE + '@'] = ISSPECL,
|
||
};
|
bin/sh/pregenerated/syntax.h | ||
---|---|---|
/*
|
||
* This file was generated by the mksyntax program.
|
||
*/
|
||
#include <sys/cdefs.h>
|
||
#include <limits.h>
|
||
/* Syntax classes */
|
||
#define CWORD 0 /* character is nothing special */
|
||
#define CNL 1 /* newline character */
|
||
#define CQNL 2 /* newline character in quotes */
|
||
#define CBACK 3 /* a backslash character */
|
||
#define CSBACK 4 /* a backslash character in single quotes */
|
||
#define CSQUOTE 5 /* single quote */
|
||
#define CDQUOTE 6 /* double quote */
|
||
#define CENDQUOTE 7 /* a terminating quote */
|
||
#define CBQUOTE 8 /* backwards single quote */
|
||
#define CVAR 9 /* a dollar sign */
|
||
#define CENDVAR 10 /* a '}' character */
|
||
#define CLP 11 /* a left paren in arithmetic */
|
||
#define CRP 12 /* a right paren in arithmetic */
|
||
#define CEOF 13 /* end of file */
|
||
#define CCTL 14 /* like CWORD, except it must be escaped */
|
||
#define CSPCL 15 /* these terminate a word */
|
||
#define CIGN 16 /* character should be ignored */
|
||
/* Syntax classes for is_ functions */
|
||
#define ISDIGIT 01 /* a digit */
|
||
#define ISUPPER 02 /* an upper case letter */
|
||
#define ISLOWER 04 /* a lower case letter */
|
||
#define ISUNDER 010 /* an underscore */
|
||
#define ISSPECL 020 /* the name of a special parameter */
|
||
#define SYNBASE (1 - CHAR_MIN)
|
||
#define PEOF -SYNBASE
|
||
#define BASESYNTAX (basesyntax + SYNBASE)
|
||
#define DQSYNTAX (dqsyntax + SYNBASE)
|
||
#define SQSYNTAX (sqsyntax + SYNBASE)
|
||
#define ARISYNTAX (arisyntax + SYNBASE)
|
||
#define is_digit(c) ((unsigned int)((c) - '0') <= 9)
|
||
#define is_eof(c) ((c) == PEOF)
|
||
#define is_alpha(c) ((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER))
|
||
#define is_name(c) ((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER|ISUNDER))
|
||
#define is_in_name(c) ((is_type+SYNBASE)[(int)c] & (ISUPPER|ISLOWER|ISUNDER|ISDIGIT))
|
||
#define is_special(c) ((is_type+SYNBASE)[(int)c] & (ISSPECL|ISDIGIT))
|
||
#define digit_val(c) ((c) - '0')
|
||
extern const char basesyntax[];
|
||
extern const char dqsyntax[];
|
||
extern const char sqsyntax[];
|
||
extern const char arisyntax[];
|
||
extern const char is_type[];
|
bin/sh/pregenerated/token.h | ||
---|---|---|
#define TEOF 0
|
||
#define TNL 1
|
||
#define TSEMI 2
|
||
#define TBACKGND 3
|
||
#define TAND 4
|
||
#define TOR 5
|
||
#define TPIPE 6
|
||
#define TLP 7
|
||
#define TRP 8
|
||
#define TENDCASE 9
|
||
#define TFALLTHRU 10
|
||
#define TREDIR 11
|
||
#define TWORD 12
|
||
#define TIF 13
|
||
#define TTHEN 14
|
||
#define TELSE 15
|
||
#define TELIF 16
|
||
#define TFI 17
|
||
#define TWHILE 18
|
||
#define TUNTIL 19
|
||
#define TFOR 20
|
||
#define TDO 21
|
||
#define TDONE 22
|
||
#define TBEGIN 23
|
||
#define TEND 24
|
||
#define TCASE 25
|
||
#define TESAC 26
|
||
#define TNOT 27
|
||
/* Array indicating which tokens mark the end of a list */
|
||
static const char tokendlist[] = {
|
||
1,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
0,
|
||
1,
|
||
1,
|
||
1,
|
||
0,
|
||
0,
|
||
0,
|
||
1,
|
||
1,
|
||
1,
|
||
1,
|
||
0,
|
||
0,
|
||
0,
|
||
1,
|
||
1,
|
||
0,
|
||
1,
|
||
0,
|
||
1,
|
||
0,
|
||
};
|
||
static const char *const tokname[] = {
|
||
"end of file",
|
||
"newline",
|
||
"\";\"",
|
||
"\"&\"",
|
||
"\"&&\"",
|
||
"\"||\"",
|
||
"\"|\"",
|
||
"\"(\"",
|
||
"\")\"",
|
||
"\";;\"",
|
||
"\";&\"",
|
||
"redirection",
|
||
"word",
|
||
"\"if\"",
|
||
"\"then\"",
|
||
"\"else\"",
|
||
"\"elif\"",
|
||
"\"fi\"",
|
||
"\"while\"",
|
||
"\"until\"",
|
||
"\"for\"",
|
||
"\"do\"",
|
||
"\"done\"",
|
||
"\"{\"",
|
||
"\"}\"",
|
||
"\"case\"",
|
||
"\"esac\"",
|
||
"\"!\"",
|
||
};
|
||
#define KWDOFFSET 13
|
||
const char *const parsekwd[] = {
|
||
"if",
|
||
"then",
|
||
"else",
|
||
"elif",
|
||
"fi",
|
||
"while",
|
||
"until",
|
||
"for",
|
||
"do",
|
||
"done",
|
||
"{",
|
||
"}",
|
||
"case",
|
||
"esac",
|
||
"!",
|
||
0
|
||
};
|