Project

General

Profile

Bug #3248 » 0001-sh-1-bring-sh-from-freebsd.patch

piecuch, 09/16/2020 11:16 AM

View differences:

bin/sh/Makefile
# Makefile for /bin/sh
#
# @(#)Makefile 8.4 (Berkeley) 5/5/95
# $FreeBSD$
.include <src.opts.mk>
CONFGROUPS= ETC ROOT
ETC= profile
ROOT= dot.shrc dot.profile
ROOTDIR= /root
ROOTNAME_dot.shrc= .shrc
ROOTNAME_dot.profile= .profile
PACKAGE=runtime
PROG= sh
INSTALLFLAGS= -S
SHSRCS= alias.c arith_yacc.c arith_yylex.c cd.c echo.c error.c eval.c \
exec.c expand.c \
histedit.c input.c jobs.c kill.c mail.c main.c memalloc.c miscbltin.c \
mystring.c options.c output.c parser.c printf.c redir.c \
mystring.c options.c output.c parser.c printf.c redir.c show.c \
test.c trap.c var.c
GENSRCS= builtins.c nodes.c syntax.c
GENHDRS= builtins.h nodes.h syntax.h token.h
SRCS= ${SHSRCS} ${GENSRCS} ${GENHDRS}
# would be needed if WARNS upgraded to 3, but lets keep the stderr output
# clean, so WARNS has been lowered to 2.
#
WARNS?= 2
# 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/.
LIBADD= edit
CFLAGS+=-DSHELL -I. -I${.CURDIR}
# for debug:
# DEBUG_FLAGS+= -g -DDEBUG=2 -fno-inline
# SHSRCS+=show.c
.if defined(BOOTSTRAPPING)
CFLAGS+= -DNO_HISTORY
# LIBEDIT is not needed here
.else
CFLAGS+= ${PRIVATELIB_CFLAGS}
DPADD= ${LIBEDIT} ${LIBNCURSES}
LDADD= ${LIBEDIT} ${LIBNCURSES}
.endif
.PATH: ${.CURDIR}/bltin \
${.CURDIR}/../kill \
${.CURDIR}/../test \
${.CURDIR}/../../usr.bin/printf
#
# 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
${.CURDIR:H}/kill \
${.CURDIR:H}/test \
${SRCTOP}/usr.bin/printf
CLEANFILES+= mknodes mksyntax
CLEANFILES+= ${GENSRCS} ${GENHDRS}
build-tools: mknodes mksyntax
.ORDER: builtins.c builtins.h
builtins.h: .NOMETA
builtins.c builtins.h: mkbuiltins builtins.def
sh ${.CURDIR}/mkbuiltins ${.CURDIR}
# 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}
DEPENDOBJS+= mknodes mksyntax
mknodes mksyntax: ${BUILD_TOOLS_META}
.ORDER: nodes.c nodes.h
nodes.c nodes.h: nodetypes nodes.c.pat
${.OBJDIR}/mknodes/mknodes.nx ${.ALLSRC}
nodes.h: .NOMETA
nodes.c nodes.h: mknodes nodetypes nodes.c.pat
${BTOOLSPATH:U.}/mknodes ${.CURDIR}/nodetypes ${.CURDIR}/nodes.c.pat
.ORDER: syntax.c syntax.h
syntax.c syntax.h:
${.OBJDIR}/mksyntax/mksyntax.nx
syntax.h: .NOMETA
syntax.c syntax.h: mksyntax
${BTOOLSPATH:U.}/mksyntax
token.h: mktokens
sh ${.CURDIR}/mktokens
.endif
regress: sh
cd ${.CURDIR}/../../tools/regression/bin/sh && ${MAKE} SH=${.OBJDIR}/sh
HAS_TESTS=
SUBDIR.${MK_TESTS}+= tests
beforeinstallconfig:
rm -f ${DESTDIR}/.profile
afterinstallconfig:
${INSTALL_LINK} ${TAG_ARGS} ${DESTDIR}/root/.profile ${DESTDIR}/.profile
.include <bsd.prog.mk>
bin/sh/Makefile.depend
# $FreeBSD$
# Autogenerated - do NOT edit!
DIRDEPS = \
gnu/lib/csu \
include \
include/xlocale \
lib/${CSU_DIR} \
lib/libc \
lib/libcompiler_rt \
lib/libedit \
lib/ncurses/ncursesw \
.include <dirdeps.mk>
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
# local dependencies - needed for -jN in clean tree
.endif
bin/sh/TOUR
program input files generates
------- ----------- ---------
mkbuiltins builtins builtins.h builtins.c
mkbuiltins builtins.def builtins.h builtins.c
mknodes nodetypes nodes.h nodes.c
mksyntax - syntax.h syntax.c
mktokens - token.h
......
exceptions.c. The C language doesn't include exception handling,
so I implement it using setjmp and longjmp. The global variable
exception contains the type of exception. EXERROR is raised by
calling error. EXINT is an interrupt.
calling error or errorwithstatus. EXINT is an interrupt.
INTERRUPTS: In an interactive shell, an interrupt will cause an
EXINT exception to return to the main command loop. (Exception:
......
word. The text consists of ordinary characters and a number of
special codes defined in parser.h. The special codes are:
CTLVAR Variable substitution
CTLENDVAR End of variable substitution
CTLVAR Parameter expansion
CTLENDVAR End of parameter expansion
CTLBACKQ Command substitution
CTLBACKQ|CTLQUOTE Command substitution inside double quotes
CTLARI Arithmetic expansion
CTLENDARI End of arithmetic expansion
CTLESC Escape next character
A variable substitution contains the following elements:
......
VSQUESTION|VSNUL ${var:?text}
VSASSIGN ${var=text}
VSASSIGN|VSNUL ${var:=text}
VSTRIMLEFT ${var#text}
VSTRIMLEFTMAX ${var##text}
VSTRIMRIGHT ${var%text}
VSTRIMRIGHTMAX ${var%%text}
VSLENGTH ${#var}
VSERROR delayed error
In addition, the type field will have the VSQUOTE flag set if the
variable is enclosed in double quotes. The name of the variable
comes next, terminated by an equals sign. If the type is not
VSNORMAL, then the text field in the substitution follows, ter-
minated by a CTLENDVAR byte.
variable is enclosed in double quotes and the VSLINENO flag if
LINENO is being expanded (the parameter name is the decimal line
number). The parameter's name comes next, terminated by an equals
sign. If the type is not VSNORMAL (including when it is VSLENGTH),
then the text field in the substitution follows, terminated by a
CTLENDVAR byte.
The type VSERROR is used to allow parsing bad substitutions like
${var[7]} and generate an error when they are expanded.
Commands in back quotes are parsed and stored in a linked list.
The locations of these commands in the string are indicated by
CTLBACKQ and CTLBACKQ+CTLQUOTE characters, depending upon whether
the back quotes were enclosed in double quotes.
Arithmetic expansion starts with CTLARI and ends with CTLENDARI.
The character CTLESC escapes the next character, so that in case
any of the CTL characters mentioned above appear in the input,
they can be passed through transparently. CTLESC is also used to
......
variable and command substitution, the parser doesn't insert any
CTLESC characters to begin with (so the contents of the text
field can be written without any processing). Other here docu-
ments, and words which are not subject to splitting and file name
generation, have the CTLESC characters removed during the vari-
able and command substitution phase. Words which are subject to
splitting and file name generation have the CTLESC characters re-
moved as part of the file name phase.
ments, and words which are not subject to file name generation,
have the CTLESC characters removed during the variable and command
substitution phase. Words which are subject to file name
generation have the CTLESC characters removed as part of the file
name phase.
EXECUTION: Command execution is handled by the following files:
eval.c The top level routines.
......
The routine shellexec is the interface to the exec system call.
EXPAND.C: Arguments are processed in three passes. The first
(performed by the routine argstr) performs variable and command
substitution. The second (ifsbreakup) performs word splitting
and the third (expandmeta) performs file name generation.
EXPAND.C: As the routine argstr generates words by parameter
expansion, command substitution and arithmetic expansion, it
performs word splitting on the result. As each word is output,
the routine expandmeta performs file name generation (if enabled).
VAR.C: Variables are stored in a hash table. Probably we should
switch to extensible hashing. The variable name is stored in the
......
tered throughout the code, depending on which location appears
most appropriate. They can be recognized because their names al-
ways end in "cmd". The mapping from names to procedures is
specified in the file builtins, which is processed by the mkbuilt-
ins command.
specified in the file builtins.def, which is processed by the
mkbuiltins command.
A builtin command is invoked with argc and argv set up like a
normal program. A builtin command is allowed to overwrite its
......
ing. This is kind of like getopt, but you don't pass argc and
argv to it. Builtin routines can also call error. This routine
normally terminates the shell (or returns to the main command
loop if the shell is interactive), but when called from a builtin
command it causes the builtin command to terminate with an exit
status of 2.
loop if the shell is interactive), but when called from a non-
special builtin command it causes the builtin command to
terminate with an exit status of 2.
The directory bltins contains commands which can be compiled in-
dependently but can also be built into the shell for efficiency
reasons. The makefile in this directory compiles these programs
in the normal fashion (so that they can be run regardless of
whether the invoker is ash), but also creates a library named
bltinlib.a which can be linked with ash. The header file bltin.h
takes care of most of the differences between the ash and the
stand-alone environment. The user should call the main routine
"main", and #define main to be the name of the routine to use
when the program is linked into ash. This #define should appear
before bltin.h is included; bltin.h will #undef main if the pro-
gram is to be compiled stand-alone.
reasons. The header file bltin.h takes care of most of the
differences between the ash and the stand-alone environment.
The user should call the main routine "main", and #define main to
be the name of the routine to use when the program is linked into
ash. This #define should appear before bltin.h is included;
bltin.h will #undef main if the program is to be compiled
stand-alone. A similar approach is used for a few utilities from
bin and usr.bin.
CD.C: This file defines the cd and pwd builtins.
......
When an interrupt is caught and no trap has been set for that
... This diff was truncated because it exceeds the maximum size that can be displayed.
(5-5/10)