Imported from ../bash-2.02.tar.gz.

This commit is contained in:
Jari Aalto 1998-04-17 19:52:44 +00:00
commit cce855bc5b
323 changed files with 33916 additions and 12321 deletions

383
CHANGES
View file

@ -1,3 +1,386 @@
This document details the changes between this version, bash-2.02-beta2,
and the previous version, bash-2.02-beta1.
1. Changes to Bash
a. A bug was fixed that caused the terminal process group to be set
incorrectly when performing command substitution of builtins in a
pipeline.
------------------------------------------------------------------------------
This document details the changes between this version, bash-2.02-beta2,
and the previous version, bash-2.02-beta1.
1. Changes to Bash
a. Attempting to `wait' for stopped jobs now generates a warning message.
b. Pipelines which exit due to SIGPIPE in non-interactive shells are now
not reported if the shell is compiled -DDONT_REPORT_SIGPIPE.
c. Some changes were made to builtins/psize.sh and support/bashbug.sh to
attempt to avoid some /tmp file races and surreptitious file
substitutions.
d. Fixed a bug that caused the shell not to compile if configured with
dparen arithmetic but without aliases.
e. Fixed a bug that caused the input stream to be switched when assigning
empty arrays with `bash -c'.
f. A bug was fixed in the readline expansion glue code that caused bash to
dump core when expanding lines with an unclosed single quote.
g. A fix was made to the `cd' builtin so that using a non-empty directory
from $CDPATH results in an absolute pathname of the new current working
directory to be displayed after the current directory is changed.
h. Fixed a bug in the variable assignment code that caused the shell to
dump core when referencing an unset variable with `set -u' enabled in
an assignment statement preceding a command.
i. Fixed a bug in the exit trap code that caused reserved words to not be
recognized under certain circumstances.
j. Fixed a bug in the parameter pattern substitution code so that quote
removal is performed.
k. The shell should now configure correctly on Apple Rhapsody systems.
l. The `kill' builtin now prints a usage message if it is not passed any
arguments.
------------------------------------------------------------------------------
This document details the changes between this version, bash-2.02-beta1,
and the previous version, bash-2.02-alpha1.
1. Changes to Bash
a. A few compilation bugs were fixed in the new extended globbing code.
b. Executing arithmetic commands now sets the command name to `((' so
error messages look right.
c. Fixed some build problems with various configuration options.
d. The `printf' builtin now aborts immediately if an illegal format
character is encountered.
e. The code that creates here-documents now behaves better if the file it's
trying to create already exists for some reason.
f. Fixed a problem with the extended globbing code that made patterns like
`x+*' expand incorrectly.
g. The prompt string expansion code no longer quotes tildes with backslashes.
h. The bash getcwd() implementation in lib/sh/getcwd.c now behaves better in
the presence of lstat(2) failures.
i. Fixed a bug with strsub() that caused core dumps when executing `fc -s'.
j. The mail checking code now ensures that it has a valid default mailpath.
k. A bug was fixed that caused local variables to be unset inappropriately
when sourcing a script from within another sourced script.
l. A bug was fixed in the history saving code so that functions are saved
in the history list correctly if `cmdhist' is enabled, but `lithist'
is not.
m. A bug was fixed that caused printf overflows when displaying error
messages.
n. It should be easier to build the loadble builtins in examples/loadables,
though some manual editing of the generated Makefile is still required.
o. The user's primary group is now always ${GROUPS[0]}.
p. Some updates were made to support/config.guess from the GNU master copy.
q. Some changes were made to the autoconf support for Solaris 2.6 large
files.
r. The `command' builtins now does the right thing when confstr(3) cannot
find a value for _CS_PATH.
s. Extended globbing expressions like `*.!(c)' are not history expanded if
`extglob' is enabled.
t. Using the `-P' option to `cd' will force the value that is assigned to
PWD to not contain any symbolic links.
2. Changes to Readline
a. The code that prints completion listings now behaves better if one or
more of the filenames contains non-printable characters.
b. The time delay when showing matching parentheses is now 0.5 seconds.
------------------------------------------------------------------------------
This document details the changes between this version, bash-2.02-alpha1,
and the previous version, bash-2.01.1-release.
1. Changes to Bash
a. OS-specific configuration changes for: BSD/OS 3.x, Minix 2.x,
Solaris 2.6, SINIX SVR4.
b. Changes were made to the generated `info' files so that `install-info'
works correctly.
c. PWD is now auto-exported.
d. A fix was made to the pipeline code to make sure that the shell forks
to execute simple commands consisting solely of assignment statements.
e. Changes to the test suite for systems with 14-character filenames.
f. The default sizes of some internal hash tables have been made smaller
to reduce the shell's memory footprint.
g. The `((...))' arithmetic command is now executed directly instead of
being translated into `let "..."'.
h. Fixes were made to the expansion code so that "$*", "$@", "${array[@]}",
and "${array[@]}" expand correctly when IFS does not contain a space
character, is unset, or is set to NULL.
i. The indirect expansion code (${!var}) was changed so that the only
valid values of `var' are variable names, positional parameters, `#',
`@', and `*'.
j. An arithmetic expression error in a $((...)) expansion now causes a
non-interactive shell running in posix mode to exit.
k. Compound array assignment now splits the words within the parentheses
on shell metacharacters like the parser would before expansing them
and performing the assignment. This is for compatibility with ksh-93.
l. The internal shell backslash-quoting code (used in the output of `set'
and completion) now quotes tildes if they appear at the start of the
string or after a `=' or `:'.
m. A couple of bugs with `shopt -o' were fixed.
n. `bash +o' now displays the same output as `set +o' before starting an
interactive shell.
o. A bug that caused command substitution and the `eval' builtin to
occasionally free memory twice when an error was encountered was fixed.
p. The filename globbing code no longer requires read permission for a
directory when the filename to be matched does not contain any globbing
characters, as POSIX.2 specifies.
q. A bug was fixed so that the job containing the last asynchronous
process is not removed from the job table until a `wait' is executed
for that process or another asynchronous process is started. This
satisfies a POSIX.2 requirement.
r. A `select' bug was fixed so that a non-numeric user response is treated
the same as a numeric response that is out of range.
s. The shell no longer parses the value of SHELLOPTS from the environment
if it is restricted, running setuid, or running in `privileged mode'.
t. Fixes were made to enable large file support on systems such as
Solaris 2.6, where the size of a file may be larger than can be held
in an `int'.
u. The filename hashing code was fixed to not add `./' to the beginning of
filenames which already begin with `./'.
v. The configure script was changed so that the GNU termcap library is not
compiled in if `prefer-curses' has been specified.
w. HISTCONTROL and HISTIGNORE are no longer applied to the second and
subsequent lines of a multi-line command.
x. A fix was made to `disown' so that it does a better job of catching
out-of-range jobs.
y. Non-interactive shells no longer report the status of processes terminated
due to SIGINT, even if the standard output is a terminal.
z. A bug that caused the output of `jobs' to have extra carriage returns
was fixed.
aa. A bug that caused PIPESTATUS to not be set when builtins or shell
functions were executed in the foreground was fixed.
bb. Bash now attempts to detect when it is being run by sshd, and treats
that case identically to being run by rshd.
cc. A bug that caused `set -a' to export SHELLOPTS when one of the shell
options was changed was fixed.
dd. The `kill' builtin now disallows empty or missing process id arguments
instead of treating them as identical to `0', which means the current
process.
ee. `var=value declare -x var' now behaves identically to
`var=value export var'. Similarly for `var=value declare -r var' and
`var=value readonly var'.
ff. A few memory leaks were fixed.
gg. `alias' and `unalias' now print error messages when passed an argument
that is not an alias for printing or deletion, even when the shell is
not interactive, as POSIX.2 specifies.
hh. `alias' and `alias -p' now return a status of 0 when no aliases are
defined, as POSIX.2 specifes.
ii. `cd -' now prints the pathname of the new working directory if the shell
is interactive.
jj. A fix was made so that the code that binds $PWD now copes with getcwd()
returning NULL.
kk. `unset' now checks whether or not a function name it's trying to unset
is a valid shell identifier only when the shell is running in posix mode.
ll. A change was made to the code that generates filenames for here documents
to make them less prone to name collisions.
mm. The parser was changed so that `time' is recognized as a reserved word
only at the beginning of a pipeline.
nn. The pathname canonicalization code was changed so that `//' is converted
into `/', but all other pathnames beginning with `//' are left alone, as
POSIX.2 specifies.
oo. The `logout' builtin will no longer exit a non-interactive non-login
shell.
2. Changes to Readline
a. Fixed a problem in the readline test program rltest.c that caused a core
dump.
b. The code that handles parser directives in inputrc files now displays
more error messages.
c. The history expansion code was fixed so that the appearance of the
history comment character at the beginning of a word inhibits history
expansion for that word and the rest of the input line.
3. New Features in Bash
a. A new version of malloc, based on the older GNU malloc, that has many
changes, is more page-based, is more conservative with memory usage,
and does not `orphan' large blocks when they are freed.
b. A new version of gmalloc, based on the old GLIBC malloc, with many
changes and range checking included by default.
c. A new implementation of fnmatch(3) that includes full POSIX.2 Basic
Regular Expression matching, including character classes, collating
symbols, equivalence classes, and support for case-insensitive pattern
matching.
d. ksh-88 egrep-style extended pattern matching ([@+*?!](patlist)) has been
implemented, controlled by a new `shopt' option, `extglob'.
e. There is a new ksh-like `[[' compound command, which implements
extended `test' functionality.
f. There is a new `printf' builtin, implemented according to the POSIX.2
specification.
g. There is a new feature for command substitution: $(< filename) now expands
to the contents of `filename', with any trailing newlines removed
(equivalent to $(cat filename)).
h. There are new tilde prefixes which expand to directories from the
directory stack.
i. There is a new `**' arithmetic operator to do exponentiation.
j. There are new configuration options to control how bash is linked:
`--enable-profiling', to allow bash to be profiled with gprof, and
`--enable-static-link', to allow bash to be linked statically.
k. There is a new configuration option, `--enable-cond-command', which
controls whether or not the `[[' command is included. It is on by
default.
l. There is a new configuration option, `--enable-extended-glob', which
controls whether or not the ksh extended globbing feature is included.
It is enabled by default.
m. There is a new configuration #define in config.h.top that, when enabled,
will cause all login shells to source /etc/profile and one of the user-
specific login shell startup files, whether or not the shell is
interactive.
n. There is a new invocation option, `--dump-po-strings', to dump
a shell script's translatable strings ($"...") in GNU `po' format.
o. There is a new `shopt' option, `nocaseglob', to enable case-insensitive
pattern matching when globbing filenames and using the `case' construct.
p. There is a new `shopt' option, `huponexit', which, when enabled, causes
the shell to send SIGHUP to all jobs when an interactive login shell
exits.
q. `bind' has a new `-u' option, which takes a readline function name as an
argument and unbinds all key sequences bound to that function in a
specified keymap.
r. `disown' now has `-a' and `-r' options, to limit operation to all jobs
and running jobs, respectively.
s. The `shopt' `-p' option now causes output to be displayed in a reusable
format.
t. `test' has a new `-N' option, which returns true if the filename argument
has been modified since it was last accessed.
u. `umask' now has a `-p' option to print output in a reusable format.
v. A new escape sequence, `\xNNN', has been added to the `echo -e' and $'...'
translation code. It expands to the character whose ascii code is NNN
in hexadecimal.
w. The prompt string expansion code has a new `\r' escape sequence.
x. The shell may now be cross-compiled for the CYGWIN32 environment on
a Unix machine.
4. New Features in Readline
a. There is now an option for `iterative' yank-last-arg handline, so a user
can keep entering `M-.', yanking the last argument of successive history
lines.
b. New variable, `print-completions-horizontally', which causes completion
matches to be displayed across the screen (like `ls -x') rather than up
and down the screen (like `ls').
c. New variable, `completion-ignore-case', which causes filename completion
and matching to be performed case-insensitively.
d. There is a new bindable command, `magic-space', which causes history
expansion to be performed on the current readline buffer and a space to
be inserted into the result.
e. There is a new bindable command, `menu-complete', which enables tcsh-like
menu completion (successive executions of menu-complete insert a single
completion match, cycling through the list of possible completions).
f. There is a new bindable command, `paste-from-clipboard', for use on Win32
systems, to insert the text from the Win32 clipboard into the editing
buffer.
g. The key sequence translation code now understands printf-style backslash
escape sequences, including \NNN octal escapes. These escape sequences
may be used in key sequence definitions or macro values.
h. An `$include' inputrc file parser directive has been added.
------------------------------------------------------------------------------
This document details the changes between this version, bash-2.01.1-release,
and the previous version, bash-2.01-release.

14
COMPAT
View file

@ -101,3 +101,17 @@ encountered by a significant number of users.
alias ulimit="ulimit -S"
9. Bash-2.01 uses a new quoting syntax, $'...' to do ANSI-C string
translation. Backslash-escaped characters in ... are expanded and
replaced as specified by the ANSI C standard.
10. The sourcing of startup files has changed somewhat. This is explained
more completely in the INVOCATION section of the manual page.
A non-interactive shell not named `sh' and not in posix mode reads
and executes commands from the file named by $BASH_ENV. A
non-interactive shell started by `su' and not in posix mode will read
startup files. No other non-interactive shells read any startup files.
An interactive shell started in posix mode reads and executes commands
from the file named by $ENV.

View file

@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

View file

@ -6,7 +6,7 @@ By chet:
SunOS 4.1.4
SunOS 5.5
BSDI BSD/OS 2.1
FreeBSD 2.1.7
FreeBSD 2.2
NetBSD 1.2
AIX 4.2
AIX 4.1.4

View file

@ -21,8 +21,8 @@ The following list is what's changed when `POSIX mode' is in effect:
5. The POSIX.2 `PS1' and `PS2' expansions of `!' to the history
number and `!!' to `!' are enabled, and parameter expansion is
performed on the value regardless of the setting of the
`promptvars' option.
performed on the values of `PS1' and `PS2' regardless of the
setting of the `promptvars' option.
6. Interactive comments are enabled by default. (Note that Bash has
them on by default anyway.)
@ -42,42 +42,51 @@ The following list is what's changed when `POSIX mode' is in effect:
11. Non-interactive shells exit if FILENAME in `.' FILENAME is not
found.
12. Redirection operators do not perform filename expansion on the word
12. Non-interactive shells exit if a syntax error in an arithmetic
expansion results in an invalid expression.
13. Redirection operators do not perform filename expansion on the word
in the redirection unless the shell is interactive.
13. Function names must be valid shell `name's. That is, they may not
14. Function names must be valid shell `name's. That is, they may not
contain characters other than letters, digits, and underscores, and
may not start with a digit. Declaring a function with an illegal
may not start with a digit. Declaring a function with an invalid
name causes a fatal syntax error in non-interactive shells.
14. POSIX.2 `special' builtins are found before shell functions during
15. POSIX.2 `special' builtins are found before shell functions during
command lookup.
15. If a POSIX.2 special builtin returns an error status, a
16. If a POSIX.2 special builtin returns an error status, a
non-interactive shell exits. The fatal errors are those listed in
the POSIX.2 standard, and include things like passing incorrect
options, redirection errors, variable assignment errors for
assignments preceding the command name, and so on.
16. If the `cd' builtin finds a directory to change to using
17. If the `cd' builtin finds a directory to change to using
`$CDPATH', the value it assigns to the `PWD' variable does not
contain any symbolic links, as if `cd -P' had been executed.
17. A non-interactive shell exits with an error status if a variable
18. If `$CDPATH' is set, the `cd' builtin will not implicitly append
the current directory to it. This means that `cd' will fail if no
valid directory name can be constructed from any of the entries in
`$CDPATH', even if the a directory with the same name as the name
given as an argument to `cd' exists in the current directory.
19. A non-interactive shell exits with an error status if a variable
assignment error occurs when no command name follows the assignment
statements. A variable assignment error occurs, for example, when
trying to assign a value to a read-only variable.
trying to assign a value to a readonly variable.
18. A non-interactive shell exits with an error status if the iteration
20. A non-interactive shell exits with an error status if the iteration
variable in a `for' statement or the selection variable in a
`select' statement is a read-only variable.
`select' statement is a readonly variable.
19. Process substitution is not available.
21. Process substitution is not available.
20. Assignment statements preceding POSIX.2 `special' builtins persist
22. Assignment statements preceding POSIX.2 special builtins persist
in the shell environment after the builtin completes.
21. The `export' and `readonly' builtin commands display their output
23. The `export' and `readonly' builtin commands display their output
in the format required by POSIX.2.

File diff suppressed because it is too large Load diff

33
INSTALL
View file

@ -197,17 +197,20 @@ the Bash `configure' recognizes.
`--with-glibc-malloc'
Use the GNU libc version of `malloc' in `lib/malloc/gmalloc.c'.
This is somewhat slower than the default `malloc', but wastes
considerably less space.
This is not the version of `malloc' that appears in glibc version
2, but a modified version of the `malloc' from glibc version 1.
This is somewhat slower than the default `malloc', but wastes less
space on a per-allocation basis, and will return memory to the
operating system under some circumstances.
`--with-gnu-malloc'
Use the GNU version of `malloc' in `lib/malloc/malloc.c'. This is
not the same `malloc' that appears in GNU libc, but an older
version derived from the 4.2 BSD `malloc'. This `malloc' is very
fast, but wastes a lot of space. This option is enabled by
default. The `NOTES' file contains a list of systems for which
this should be turned off, and `configure' disables this option
automatically for a number of systems.
fast, but wastes some space on each allocation. This option is
enabled by default. The `NOTES' file contains a list of systems
for which this should be turned off, and `configure' disables this
option automatically for a number of systems.
`--with-purify'
Define this to use the Purify memory allocation checker from Pure
@ -217,6 +220,17 @@ the Bash `configure' recognizes.
This produces a shell with minimal features, close to the
historical Bourne shell.
There are several `--enable-' options that alter how Bash is compiled
and linked, rather than changing run-time features.
`--enable-profiling'
This builds a Bash binary that produces profiling information to be
processed by `gprof' each time it is executed.
`--enable-static-link'
This causes Bash to be linked statically, if `gcc' is being used.
This could be used to build a version to use as root's shell.
The `minimal-config' option can be used to disable all of the following
options, but it is processed first, so individual options may be
enabled using `enable-FEATURE'.
@ -244,6 +258,9 @@ does not provide the necessary support.
This allows pipelines as well as shell builtins and functions to
be timed.
`--enable-cond-command'
Include support for the `[[' conditional command.
`--enable-directory-stack'
Include support for a `csh'-like directory stack and the `pushd',
`popd', and `dirs' builtins.
@ -257,6 +274,10 @@ does not provide the necessary support.
`--enable-dparen-arithmetic'
Include support for the `ksh' `((...))' command.
`--enable-extended-glob'
Include support for the extended pattern matching features
described above under *Note Pattern Matching::.
`--enable-help-builtin'
Include the `help' builtin, which displays help on shell builtins
and variables.

209
MANIFEST
View file

@ -7,6 +7,7 @@
CWRU d
CWRU/misc d
builtins d
cross-build d
doc d
examples d
examples/bashdb d
@ -25,6 +26,7 @@ lib/posixheaders d
lib/readline d
lib/readline/doc d
lib/readline/examples d
lib/sh d
lib/termcap d
lib/termcap/grot d
lib/tilde d
@ -55,13 +57,11 @@ general.c f
list.c f
locale.c f
stringlib.c f
oslib.c f
variables.c f
make_cmd.c f
copy_cmd.c f
unwind_prot.c f
dispose_cmd.c f
getcwd.c f
bashhist.c f
hashcmd.c f
hashlib.c f
@ -81,11 +81,12 @@ test.c f
expr.c f
alias.c f
execute_cmd.c f
findcmd.c f
redir.c f
bashline.c f
braces.c f
bracecomp.c f
nojobs.c f
vprint.c f
error.c f
xmalloc.c f
alias.h f
@ -97,6 +98,7 @@ array.h f
jobs.h f
maxpath.h f
filecntl.h f
findcmd.h f
hashlib.h f
quit.h f
flags.h f
@ -104,6 +106,7 @@ shell.h f
pathexp.h f
parser.h f
sig.h f
test.h f
trap.h f
general.h f
unwind_prot.h f
@ -121,6 +124,7 @@ bashjmp.h f
bashintl.h f
make_cmd.h f
execute_cmd.h f
redir.h f
bashtypes.h f
mailcheck.h f
pathnames.h f
@ -165,6 +169,7 @@ builtins/history.def f
builtins/jobs.def f
builtins/kill.def f
builtins/mkbuiltins.c f
builtins/printf.def f
builtins/pushd.def f
builtins/read.def f
builtins/reserved.def f
@ -188,12 +193,15 @@ builtins/inlib.def f
builtins/bashgetopt.c f
builtins/common.h f
builtins/bashgetopt.h f
cross-build/cygwin32.cache f
cross-build/win32sig.h f
lib/glob/ChangeLog f
lib/glob/Makefile.in f
lib/glob/fnmatch.c f
lib/glob/fnmatch.h f
lib/glob/glob.c f
lib/glob/glob.h f
lib/glob/collsyms.h f
lib/glob/doc/Makefile f
lib/glob/doc/glob.texi f
lib/glob/ndir.h f
@ -203,6 +211,8 @@ lib/malloc/alloca.c f
lib/malloc/malloc.c f
lib/malloc/gmalloc.c f
lib/malloc/xmalloc.c f
lib/malloc/ogmalloc.c f
lib/malloc/omalloc.c f
lib/malloc/stub.c f
lib/malloc/i386-alloca.s f
lib/malloc/x386-alloca.s f
@ -251,6 +261,7 @@ lib/readline/tilde.h f
lib/readline/rldefs.h f
lib/readline/rlconf.h f
lib/readline/rltty.h f
lib/readline/rlwinsize.h f
lib/readline/readline.h f
lib/readline/tcap.h f
lib/readline/keymaps.h f
@ -275,6 +286,19 @@ lib/readline/examples/histexamp.c f
lib/readline/examples/rltest.c f
lib/readline/examples/rl.c f
lib/readline/examples/Inputrc f
lib/sh/Makefile.in f
lib/sh/clktck.c f
lib/sh/getcwd.c f
lib/sh/getenv.c f
lib/sh/itos.c f
lib/sh/oslib.c f
lib/sh/setlinebuf.c f
lib/sh/strcasecmp.c f
lib/sh/strerror.c f
lib/sh/strtod.c f
lib/sh/strtol.c f
lib/sh/strtoul.c f
lib/sh/vprint.c f
lib/termcap/Makefile.in f
lib/termcap/termcap.c f
lib/termcap/termcap.h f
@ -324,6 +348,8 @@ doc/bashref.texi f
doc/bashref.info f
doc/builtins.1 f
doc/article.ms f
doc/htmlpost.sh f 755
support/Makefile.in f
support/config.guess f
support/config.sub f
support/printenv.sh f 755
@ -335,6 +361,7 @@ support/mkdirs f 755
support/mkversion.sh f 755
support/mksignames.c f
support/bashbug.sh f
support/man2html.c f
support/recho.c f
support/zecho.c f
support/SYMLINKS f
@ -349,10 +376,9 @@ examples/bashdb/bashdb f
examples/bashdb/bashdb.fns f
examples/bashdb/bashdb.pre f
examples/loadables/README f
examples/loadables/Makefile f
examples/loadables/Makefile.in f
examples/loadables/necho.c f
examples/loadables/hello.c f
examples/loadables/printf.c f
examples/loadables/print.c f
examples/loadables/sprintf.c f
examples/loadables/sleep.c f
@ -369,127 +395,159 @@ examples/loadables/pathchk.c f
examples/loadables/tee.c f
examples/loadables/rmdir.c f
examples/loadables/head.c f
examples/functions/substr f
examples/functions/kshenv f
examples/functions/autoload f
examples/functions/autoload.v2 f
examples/functions/basename f
examples/functions/basename2 f
examples/functions/csh-compat f
examples/functions/dirfuncs f
examples/functions/dirname f
examples/functions/exitstat f
examples/functions/external f
examples/functions/fact f
examples/functions/fstty f
examples/functions/func f
examples/functions/getoptx.bash f
examples/functions/inetaddr f
examples/functions/inpath f
examples/functions/isnum.bash f
examples/functions/isnum2 f
examples/functions/jdate.bash f
examples/functions/jj.bash f
examples/functions/keep f
examples/functions/kshenv f
examples/functions/login f
examples/functions/lowercase f
examples/functions/manpage f
examples/functions/mhfold f
examples/functions/notify.bash f
examples/functions/pathfuncs f
examples/functions/repeat2 f
examples/functions/seq f
examples/functions/shcat f
examples/functions/shcat2 f
examples/functions/substr f
examples/functions/substr2 f
examples/functions/term f
examples/functions/whatis f
examples/functions/whence f
examples/functions/func f
examples/functions/dirname f
examples/functions/dirfuncs f
examples/functions/basename f
examples/functions/exitstat f
examples/functions/external f
examples/functions/fact f
examples/functions/manpage f
examples/functions/fstty f
examples/functions/jj.bash f
examples/functions/notify.bash f
examples/functions/inpath f
examples/functions/login f
examples/functions/keep f
examples/functions/seq f
examples/functions/mhfold f
examples/functions/repeat2 f
examples/functions/lowercase f
examples/functions/xalias.bash f
examples/scripts/shprompt f
examples/scripts/adventure.sh f
examples/scripts/precedence f
examples/scripts/bcsh.sh f
examples/scripts/fixfiles.bash f
examples/scripts/hanoi.bash f
examples/scripts/inpath f
examples/scripts/krand.bash f
examples/scripts/nohup.bash f
examples/scripts/precedence f
examples/scripts/randomcard.bash f
examples/scripts/scrollbar f
examples/scripts/scrollbar2 f
examples/scripts/showperm.bash f
examples/scripts/shprompt f
examples/scripts/spin.bash f
examples/scripts/timeout f
examples/scripts/vtree2 f
examples/scripts/vtree3 f
examples/scripts/scrollbar f
examples/scripts/spin.bash f
examples/scripts/zprintf f
examples/startup-files/README f
examples/startup-files/Bashrc f
examples/startup-files/Bashrc.bfox f
examples/startup-files/Bash_aliases f
examples/startup-files/Bash_profile f
examples/startup-files/bash-profile f
examples/startup-files/bashrc f
examples/misc/suncmd.termcap f
examples/misc/alias-conv.sh f
examples/misc/alias-conv.bash f
examples/misc/aliasconv.sh f
examples/misc/aliasconv.bash f
examples/misc/cshtobash f
tests/README f
tests/arith.tests f
tests/arith.right f
tests/array.tests f
tests/array.right f
tests/array-at-star f
tests/array2.right f
tests/braces-tests f
tests/braces.right f
tests/builtins.tests f
tests/builtins.right f
tests/builtins.sub1 f
tests/source.sub1 f
tests/source.sub2 f
tests/source.sub3 f
tests/source.sub4 f
tests/dirstack.tests f
tests/dirstack.right f
tests/dollar-at.sh f
tests/dollar-star.sh f
tests/source1.sub f
tests/source2.sub f
tests/source3.sub f
tests/source4.sub f
tests/source5.sub f
tests/cond.tests f
tests/cond.right f
tests/dollar-at-star f
tests/dollar.right f
tests/dstack.tests f
tests/dstack.right f
tests/dstack2.tests f
tests/dstack2.right f
tests/errors.tests f
tests/errors.right f
tests/execscript f
tests/execscript.right f
tests/execscript.sub f 755
tests/execscript.sub2 f
tests/execscript.sub3 f
tests/execscript.sub4 f
tests/exec.right f
tests/exec1.sub f 755
tests/exec2.sub f
tests/exec3.sub f
tests/exec4.sub f
tests/exec5.sub f
tests/exp-tests f
tests/exp.right f
tests/extglob.tests f
tests/extglob.right f
tests/func.tests f
tests/func.right f
tests/getopts.tests f
tests/getopts.right f
tests/getopts.sub1 f
tests/getopts.sub2 f
tests/getopts.sub3 f
tests/getopts.sub4 f
tests/getopts.sub5 f
tests/getopts.sub6 f
tests/getopts.sub7 f
tests/getopts1.sub f
tests/getopts2.sub f
tests/getopts3.sub f
tests/getopts4.sub f
tests/getopts5.sub f
tests/getopts6.sub f
tests/getopts7.sub f
tests/glob-test f
tests/glob1.sub f
tests/glob.right f
tests/heredoc.tests f
tests/heredoc.right f
tests/histexpand.tests f
tests/histexpand.right f
tests/histexp.tests f
tests/histexp.right f
tests/history.tests f
tests/history.right f
tests/history.list f
tests/ifs-test-1.sh f
tests/ifs-test-2.sh f
tests/ifs-test-3.sh f
tests/ifs.1.right f
tests/ifs.2.right f
tests/ifs.3.right f
tests/ifs-1.test f
tests/ifs-2.test f
tests/ifs-3.test f
tests/ifs-1.right f
tests/ifs-2.right f
tests/ifs-3.right f
tests/input-line.sh f
tests/input-line.sub f
tests/input.right f
tests/jobs.tests f
tests/jobs1.sub f
tests/jobs2.sub f
tests/jobs.right f
tests/more-exp.tests f
tests/more-exp.right f
tests/new-exp.tests f
tests/new-exp.sub1 f
tests/new-exp1.sub f
tests/new-exp2.sub f
tests/new-exp.right f
tests/nquote.tests f
tests/nquote.right f
tests/posix2.tests f
tests/posix2.right f
tests/posixpat.tests f
tests/posixpat.right f
tests/prec.right f
tests/precedence f
tests/printf.tests f
tests/printf.right f
tests/quote.tests f
tests/quote.right f
tests/read.tests f
@ -511,13 +569,16 @@ tests/run-all f
tests/run-minimal f
tests/run-arith f
tests/run-array f
tests/run-array2 f
tests/run-braces f
tests/run-builtins f
tests/run-cond f
tests/run-dirstack f
tests/run-dollars f
tests/run-errors f
tests/run-execscript f
tests/run-exp-tests f
tests/run-extglob f
tests/run-func f
tests/run-getopts f
tests/run-glob-test f
@ -531,13 +592,16 @@ tests/run-more-exp f
tests/run-new-exp f
tests/run-nquote f
tests/run-posix2 f
tests/run-posixpat f
tests/run-precedence f
tests/run-printf f
tests/run-quote f
tests/run-read f
tests/run-redir f
tests/run-rhs-exp f
tests/run-rsh f
tests/run-set-e-test f
tests/run-set-e f
tests/run-shopt f
tests/run-strip f
tests/run-test f
tests/run-tilde f
@ -546,6 +610,8 @@ tests/run-type f
tests/run-varenv f
tests/set-e-test f
tests/set-e.right f
tests/shopt.tests f
tests/shopt.right f
tests/strip.tests f
tests/strip.right f
tests/test-tests f
@ -554,27 +620,28 @@ tests/tilde-tests f
tests/tilde.right f
tests/trap.tests f
tests/trap.right f
tests/trap.sub1 f 755
tests/trap1.sub f 755
tests/type.tests f
tests/type.right f
tests/varenv.right f
tests/varenv.sh f
tests/version f
tests/version.mini f
tests/misc/haertel.perftest f
tests/misc/perf-script f
tests/misc/redir.t2.sh f
tests/misc/run.r2.sh f
tests/misc/sigint.t1.sh f
tests/misc/sigint.t2.sh f
tests/misc/sigint.t3.sh f
tests/misc/sigint.t4.sh f
tests/misc/perftest f
tests/misc/perf-script f
tests/misc/redir-t2.sh f
tests/misc/run-r2.sh f
tests/misc/sigint-1.sh f
tests/misc/sigint-2.sh f
tests/misc/sigint-3.sh f
tests/misc/sigint-4.sh f
tests/misc/test-minus-e.1 f
tests/misc/test-minus-e.2 f
examples/scripts.v2/PERMISSION f
examples/scripts.v2/README f
examples/scripts.v2/arc2tarz f
examples/scripts.v2/bashrand f
examples/scripts.v2/cal2day.bash f
examples/scripts.v2/cdhist.bash f
examples/scripts.v2/corename f
examples/scripts.v2/fman f

View file

@ -1,4 +1,4 @@
# Makefile for bash-2.01, version 2.32
# Makefile for bash-2.02, version 2.84
#
# Make sure the first target in the makefile is the right one
all: .made
@ -27,6 +27,7 @@ VPATH = .:@srcdir@
@SET_MAKE@
CC = @CC@
CC_FOR_BUILD = @CC_FOR_BUILD@
YACC = @YACC@
SHELL=/bin/sh
CP = cp
@ -68,12 +69,13 @@ THIS_SH = $(BUILD_DIR)/$(Program)
# PROFILE_FLAGS is either -pg, to generate profiling info for use
# with gprof, or nothing (the default).
PROFILE_FLAGS=
PROFILE_FLAGS= @PROFILE_FLAGS@
# The GNU coding standards don't recognize the possibility that
# other information besides optimization and debugging might be
# passed to cc. A different name should have been used.
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
LOCAL_CFLAGS = @LOCAL_CFLAGS@
DEFS = @DEFS@
LOCAL_DEFS = @LOCAL_DEFS@
@ -105,6 +107,27 @@ LIBSRC = $(srcdir)/$(LIBSUBDIR)
SUBDIR_INCLUDES = -I. -I$(topdir) -I$(topdir)/$(LIBSUBDIR) -I$(includedir)
# the bash library
# the library is a mix of functions that the C library does not provide on
# some platforms and general shell utility functions
SH_LIBSRC = $(LIBSRC)/sh
SH_LIBDIR = $(dot)/${LIBSUBDIR}/sh
SH_ABSSRC = ${topdir}/${SH_LIBSRC}
SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
${SH_LIBSRC}/getenv.c ${SH_LIBSRC}/oslib.c \
${SH_LIBSRC}/setlinebuf.c \
${SH_LIBSRC}/strcasecmp.c ${SH_LIBSRC}/strerror.c \
${SH_LIBSRC}/strtod.c ${SH_LIBSRC}/strtol.c \
${SH_LIBSRC}/strtoul.c ${SH_LIBSRC}/vprint.c \
${SH_LIBSRC}/itos.c
SHLIB_LIB = -lsh
SHLIB_LIBNAME = libsh.a
SHLIB_LIBRARY = ${SH_LIBDIR}/${SHLIB_LIBNAME}
SHLIB_LDFLAGS = -L${SH_LIBDIR}
SHLIB_DEP = ${SHLIB_LIBRARY}
# we assume for now that readline source is being shipped with bash
RL_LIBSRC = $(LIBSRC)/readline
RL_LIBDOC = $(RL_LIBSRC)/doc
@ -240,13 +263,13 @@ BASHPOSIX_SUPPORT = $(BASHPOSIX_LIB)/posixstat.h $(BASHPOSIX_LIB)/ansi_stdlib.h
$(BASHPOSIX_LIB)/memalloc.h $(BASHPOSIX_LIB)/stdc.h
LIBRARIES = $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
$(TILDE_LIB) $(MALLOC_LIB) $(LOCAL_LIBS)
$(TILDE_LIB) $(MALLOC_LIB) $(SHLIB_LIB) $(LOCAL_LIBS)
LIBDEP = $(READLINE_DEP) $(TERMCAP_DEP) $(GLOB_DEP) $(HISTORY_DEP) \
$(TILDE_DEP) $(MALLOC_DEP)
$(TILDE_DEP) $(MALLOC_DEP) $(SHLIB_DEP)
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(TILDE_LDFLAGS) \
$(GLOB_LDFLAGS) $(MALLOC_LDFLAGS)
$(GLOB_LDFLAGS) $(MALLOC_LDFLAGS) $(SHLIB_LDFLAGS)
#
# The shell itself
@ -257,9 +280,9 @@ CSOURCES = shell.c eval.c parse.y general.c make_cmd.c print_cmd.c y.tab.c \
dispose_cmd.c execute_cmd.c variables.c $(GLOBC) version.c \
expr.c copy_cmd.c flags.c subst.c hashcmd.c hashlib.c mailcheck.c \
test.c trap.c alias.c jobs.c nojobs.c $(ALLOC_FILES) braces.c \
vprint.c input.c bashhist.c array.c sig.c pathexp.c oslib.c \
unwind_prot.c siglist.c getcwd.c bashline.c bracecomp.c error.c \
list.c stringlib.c locale.c xmalloc.c
input.c bashhist.c array.c sig.c pathexp.c \
unwind_prot.c siglist.c bashline.c bracecomp.c error.c \
list.c stringlib.c locale.c findcmd.c redir.c xmalloc.c
HSOURCES = shell.h flags.h trap.h hashcmd.h hashlib.h jobs.h builtins.h \
general.h variables.h config.h $(ALLOC_HEADERS) alias.h maxpath.h \
@ -272,6 +295,9 @@ HSOURCES = shell.h flags.h trap.h hashcmd.h hashlib.h jobs.h builtins.h \
SOURCES = $(CSOURCES) $(HSOURCES) $(BUILTIN_DEFS)
# header files chosen based on running of configure
SIGNAMES_H = @SIGNAMES_H@
# object files chosen based on running of configure
JOBS_O = @JOBS_O@
@ -281,8 +307,7 @@ OBJECTS = shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o $(GLOBO) \
expr.o flags.o $(JOBS_O) subst.o hashcmd.o hashlib.o mailcheck.o \
trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \
alias.o array.o braces.o bracecomp.o bashhist.o bashline.o \
getcwd.o siglist.o vprint.o oslib.o list.o stringlib.o \
locale.o xmalloc.o
siglist.o list.o stringlib.o locale.o findcmd.o redir.o xmalloc.o
# Where the source code of the shell builtins resides.
BUILTIN_SRCDIR=$(srcdir)/builtins
@ -303,7 +328,7 @@ BUILTIN_DEFS = $(DEFSRC)/alias.def $(DEFSRC)/bind.def $(DEFSRC)/break.def \
$(DEFSRC)/times.def $(DEFSRC)/trap.def $(DEFSRC)/type.def \
$(DEFSRC)/ulimit.def $(DEFSRC)/umask.def $(DEFSRC)/wait.def \
$(DEFSRC)/getopts.def $(DEFSRC)/reserved.def \
$(DEFSRC)/pushd.def $(DEFSRC)/shopt.def
$(DEFSRC)/pushd.def $(DEFSRC)/shopt.def $(DEFSRC)/printf.def
BUILTIN_C_SRC = $(DEFSRC)/mkbuiltins.c $(DEFSRC)/common.c \
$(DEFSRC)/evalstring.c $(DEFSRC)/evalfile.c \
$(DEFSRC)/bashgetopt.c $(GETOPT_SOURCE)
@ -317,7 +342,7 @@ BUILTIN_OBJS = $(DEFDIR)/alias.o $(DEFDIR)/bind.o $(DEFDIR)/break.o \
$(DEFDIR)/fg_bg.o $(DEFDIR)/hash.o $(DEFDIR)/help.o \
$(DEFDIR)/history.o $(DEFDIR)/jobs.o $(DEFDIR)/kill.o \
$(DEFDIR)/let.o $(DEFDIR)/pushd.o $(DEFDIR)/read.o \
$(DEFDIR)/return.o $(DEFDIR)/shopt.o \
$(DEFDIR)/return.o $(DEFDIR)/shopt.o $(DEFDIR)/printf.o \
$(DEFDIR)/set.o $(DEFDIR)/setattr.o $(DEFDIR)/shift.o \
$(DEFDIR)/source.o $(DEFDIR)/suspend.o $(DEFDIR)/test.o \
$(DEFDIR)/times.o $(DEFDIR)/trap.o $(DEFDIR)/type.o \
@ -342,13 +367,14 @@ SDIR = $(dot)/support/
TESTS_SUPPORT = recho zecho printenv
CREATED_SUPPORT = signames.h recho zecho printenv tests/recho tests/zecho \
tests/printenv mksignames
tests/printenv mksignames lsignames.h
CREATED_CONFIGURE = config.h config.cache config.status config.log \
stamp-h
CREATED_MAKEFILES = Makefile builtins/Makefile doc/Makefile \
lib/readline/Makefile lib/glob/Makefile \
lib/tilde/Makefile lib/malloc/Makefile \
lib/termcap/Makefile
lib/sh/Makefile lib/tilde/Makefile lib/malloc/Makefile \
lib/termcap/Makefile examples/loadables/Makefile \
support/Makefile
# Keep GNU Make from exporting the entire environment for small machines.
.NOEXPORT:
@ -358,7 +384,7 @@ CREATED_MAKEFILES = Makefile builtins/Makefile doc/Makefile \
$(Program): .build $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP)
$(RM) $@
$(PURIFY) $(CC) $(LDFLAGS) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS)
$(PURIFY) $(CC) $(BUILTINS_LDFLAGS) $(LIBRARY_LDFLAGS) $(LDFLAGS) -o $(Program) $(OBJECTS) $(LIBS)
ls -l $(Program)
size $(Program)
@ -432,13 +458,24 @@ $(TERMCAP_LIBRARY): config.h ${TERMCAP_SOURCE}
@(cd ${TERM_LIBDIR} && \
$(MAKE) $(MFLAGS) libtermcap.a) || exit 1
$(SHLIB_LIBRARY): config.h ${SHLIB_SOURCE}
@echo making $@ in ${SH_LIBDIR}
@(cd ${SH_LIBDIR} && \
$(MAKE) $(MFLAGS) ${SHLIB_LIBNAME}) || exit 1
mksignames: $(SUPPORT_SRC)mksignames.c
$(CC) $(CCFLAGS) $(CPPFLAGS) -o $@ $(SUPPORT_SRC)mksignames.c
signames.h: mksignames
# make a list of signals for the local system -- this is done when we're
# *not* cross-compiling
lsignames.h: mksignames
$(RM) $@
./mksignames $@
# copy the correct signames header file to signames.h
signames.h: $(SIGNAMES_H)
-if cmp -s $(SIGNAMES_H) $@ ; then :; else $(RM) $@ ; $(CP) $(SIGNAMES_H) $@ ; fi
$(BUILTINS_LIBRARY): $(BUILTIN_DEFS) $(BUILTIN_C_SRC) config.h memalloc.h
@(cd $(DEFDIR) && $(MAKE) $(MFLAGS) libbuiltins.a ) || exit 1
@ -587,7 +624,7 @@ test tests check: force $(Program) $(TESTS_SUPPORT)
@-test -d tests || mkdir tests
@cp $(TESTS_SUPPORT) tests
@( cd $(srcdir)/tests && \
PATH=$$PATH:$(BUILD_DIR)/tests THIS_SH=$(THIS_SH) sh ${TESTSCRIPT} )
PATH=$$PATH:$(BUILD_DIR)/tests THIS_SH=$(THIS_SH) $(SHELL) ${TESTSCRIPT} )
symlinks:
$(SHELL) $(SUPPORT_SRC)fixlinks -s $(srcdir)
@ -633,8 +670,6 @@ dispose_cmd.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h
dispose_cmd.o: error.h general.h bashtypes.h variables.h array.h hashlib.h
dispose_cmd.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
dispose_cmd.o: make_cmd.h subst.h sig.h pathnames.h externs.h
getcwd.o: config.h bashtypes.h bashansi.h
getcwd.o: maxpath.h posixstat.h posixdir.h memalloc.h
error.o: config.h bashtypes.h bashansi.h ansi_stdlib.h flags.h stdc.h error.h
error.o: command.h general.h externs.h input.h bashhist.h
eval.o: config.h bashansi.h ansi_stdlib.h trap.h flags.h ${DEFSRC}/common.h
@ -649,13 +684,18 @@ execute_cmd.o: general.h bashtypes.h variables.h array.h hashlib.h
execute_cmd.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
execute_cmd.o: make_cmd.h subst.h sig.h pathnames.h externs.h
execute_cmd.o: memalloc.h ${GRAM_H} flags.h builtins.h jobs.h quit.h siglist.h
execute_cmd.o: execute_cmd.h trap.h pathexp.h $(DEFSRC)/common.h
execute_cmd.o: ${DEFDIR}/builtext.h ${GLOB_LIBSRC}/fnmatch.h
execute_cmd.o: execute_cmd.h findcmd.h redir.h trap.h test.h pathexp.h
execute_cmd.o: $(DEFSRC)/common.h ${DEFDIR}/builtext.h ${GLOB_LIBSRC}/fnmatch.h
expr.o: config.h bashansi.h ansi_stdlib.h
expr.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
expr.o: general.h bashtypes.h variables.h array.h hashlib.h
expr.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
expr.o: make_cmd.h subst.h sig.h pathnames.h externs.h
findcmd.o: config.h bashtypes.h filecntl.h posixstat.h bashansi.h
findcmd.o: ansi_stdlib.h memalloc.h shell.h bashjmp.h posixjmp.h command.h
findcmd.o: stdc.h error.h general.h variables.h quit.h maxpath.h unwind_prot.h
findcmd.o: dispose_cmd.h make_cmd.h subst.h sig.h pathnames.h externs.h
findcmd.o: flags.h hashlib.h pathexp.h hashcmd.h
flags.o: config.h flags.h
flags.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
flags.o: general.h bashtypes.h variables.h array.h hashlib.h
@ -670,7 +710,7 @@ general.o: maxpath.h
hashcmd.o: config.h posixstat.h bashtypes.h bashansi.h ansi_stdlib.h
hashcmd.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
hashcmd.o: general.h bashtypes.h variables.h array.h hashcmd.h
hashcmd.o: execute_cmd.h stdc.h
hashcmd.o: execute_cmd.h findcmd.h stdc.h
hashlib.o: config.h bashansi.h ansi_stdlib.h
hashlib.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
hashlib.o: general.h bashtypes.h variables.h array.h hashlib.h
@ -697,11 +737,6 @@ make_cmd.o: config.h bashtypes.h filecntl.h bashansi.h
make_cmd.o: command.h stdc.h general.h error.h flags.h make_cmd.h
make_cmd.o: variables.h array.h hashlib.h subst.h input.h externs.h
make_cmd.o: jobs.h quit.h siglist.h
oslib.o: config.h bashtypes.h posixstat.h filecntl.h bashansi.h maxpath.h
oslib.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
oslib.o: general.h bashtypes.h variables.h array.h hashlib.h
oslib.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
oslib.o: make_cmd.h subst.h sig.h pathnames.h externs.h
y.tab.o: config.h bashtypes.h bashansi.h ansi_stdlib.h memalloc.h
y.tab.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
y.tab.o: general.h bashtypes.h variables.h array.h hashlib.h
@ -722,13 +757,18 @@ print_cmd.o: general.h bashtypes.h variables.h array.h hashlib.h
print_cmd.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
print_cmd.o: make_cmd.h subst.h sig.h pathnames.h externs.h
print_cmd.o: ${GRAM_H} $(DEFSRC)/common.h
redir.o: config.h bashtypes.h posixstat.h bashansi.h ansi_stdlib.h filecntl.h
redir.o: memalloc.h shell.h bashjmp.h posixjmp.h command.h stdc.h error.h
redir.o: general.h variables.h array.h hashlib.h quit.h maxpath.h unwind_prot.h
redir.o: dispose_cmd.h make_cmd.h subst.h sig.h pathnames.h externs.h
redir.o: flags.h execute_cmd.h redir.h input.h
shell.o: config.h bashtypes.h posixstat.h bashansi.h ansi_stdlib.h filecntl.h
shell.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
shell.o: general.h bashtypes.h variables.h array.h hashlib.h
shell.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
shell.o: make_cmd.h subst.h sig.h pathnames.h externs.h
shell.o: flags.h trap.h mailcheck.h builtins.h $(DEFSRC)/common.h
shell.o: jobs.h siglist.h input.h execute_cmd.h bashhist.h
shell.o: jobs.h siglist.h input.h execute_cmd.h findcmd.h bashhist.h
shell.o: ${GLOB_LIBSRC}/fnmatch.h
sig.o: config.h bashtypes.h
sig.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
@ -754,7 +794,7 @@ test.o: bashtypes.h posixstat.h filecntl.h
test.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
test.o: general.h bashtypes.h variables.h array.h hashlib.h
test.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
test.o: make_cmd.h subst.h sig.h pathnames.h externs.h
test.o: make_cmd.h subst.h sig.h pathnames.h externs.h test.h
test.o: ${DEFSRC}/common.h
trap.o: config.h bashtypes.h trap.h bashansi.h ansi_stdlib.h
trap.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
@ -769,10 +809,9 @@ variables.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
variables.o: general.h bashtypes.h variables.h array.h hashlib.h
variables.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
variables.o: make_cmd.h subst.h sig.h pathnames.h externs.h
varibales.o: flags.h execute_cmd.h mailcheck.h input.h $(DEFSRC)/common.h
variables.o: bashhist.h
variables.o: flags.h execute_cmd.h mailcheck.h input.h $(DEFSRC)/common.h
variables.o: findcmd.h bashhist.h
version.o: version.h .build
vprint.o: config.h
xmalloc.o: config.h bashtypes.h ansi_stdlib.h error.h
# job control
@ -819,7 +858,7 @@ bashline.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
bashline.o: general.h bashtypes.h variables.h array.h hashlib.h
bashline.o: quit.h maxpath.h unwind_prot.h dispose_cmd.h
bashline.o: make_cmd.h subst.h sig.h pathnames.h externs.h
bashline.o: builtins.h bashhist.h bashline.h execute_cmd.h pathexp.h
bashline.o: builtins.h bashhist.h bashline.h execute_cmd.h findcmd.h pathexp.h
bashline.o: $(DEFSRC)/common.h $(GLOB_LIBSRC)/glob.h alias.h
bracecomp.o: config.h bashansi.h ansi_stdlib.h
bracecomp.o: shell.h config.h bashjmp.h posixjmp.h command.h stdc.h error.h
@ -929,7 +968,7 @@ builtins/exec.o: bashtypes.h
builtins/exec.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/exec.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/exec.o: dispose_cmd.h make_cmd.h subst.h externs.h execute_cmd.h
builtins/exec.o: flags.h quit.h $(DEFSRC)/common.h stdc.h
builtins/exec.o: findcmd.h flags.h quit.h $(DEFSRC)/common.h stdc.h
builtins/exit.o: bashtypes.h
builtins/exit.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/exit.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h quit.h
@ -948,7 +987,7 @@ builtins/getopts.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/getopts.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h quit.h
builtins/getopts.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/hash.o: bashtypes.h
builtins/hash.o: builtins.h command.h execute_cmd.h stdc.h $(DEFSRC)/common.h
builtins/hash.o: builtins.h command.h findcmd.h stdc.h $(DEFSRC)/common.h
builtins/hash.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/hash.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h quit.h
builtins/help.o: command.h config.h memalloc.h error.h general.h maxpath.h
@ -973,6 +1012,10 @@ builtins/kill.o: shell.h bashjmp.h posixjmp.h sig.h trap.h unwind_prot.h variabl
builtins/let.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/let.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/let.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/printf.o: config.h memalloc.h bashjmp.h command.h error.h
builtins/printf.o: general.h quit.h dispose_cmd.h make_cmd.h subst.h
builtins/printf.o: externs.h sig.h pathnames.h shell.h unwind_prot.h
builtins/printf.o: variables.h stdc.h $(DEFSRC)/bashgetopt.h
builtins/pushd.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/pushd.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/pushd.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
@ -1000,13 +1043,15 @@ builtins/shopt.o: shell.h bashjmp.h posixjmp.h unwind_prot.h variables.h maxpath
builtins/shopt.o: $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h
builtins/source.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/source.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/source.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/source.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/source.o: findcmd.h
builtins/suspend.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/suspend.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/suspend.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/test.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/test.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/test.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/test.o: test.h
builtins/times.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/times.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/times.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
@ -1015,7 +1060,7 @@ builtins/trap.o: quit.h $(DEFSRC)/common.h
builtins/trap.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/trap.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/type.o: command.h config.h memalloc.h error.h general.h maxpath.h
builtins/type.o: quit.h $(DEFSRC)/common.h execute_cmd.h
builtins/type.o: quit.h $(DEFSRC)/common.h findcmd.h
builtins/type.o: shell.h bashjmp.h posixjmp.h sig.h unwind_prot.h variables.h
builtins/type.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
builtins/ulimit.o: command.h config.h memalloc.h error.h general.h maxpath.h

119
NEWS
View file

@ -1,3 +1,122 @@
This is a terse description of the new features added to bash-2.02 since
the release of bash-2.01.1. As always, the manual page (doc/bash.1) is
the place to look for complete descriptions.
1. New Features in Bash
a. A new version of malloc, based on the older GNU malloc, that has many
changes, is more page-based, is more conservative with memory usage,
and does not `orphan' large blocks when they are freed.
b. A new version of gmalloc, based on the old GLIBC malloc, with many
changes and range checking included by default.
c. A new implementation of fnmatch(3) that includes full POSIX.2 Basic
Regular Expression matching, including character classes, collating
symbols, equivalence classes, and support for case-insensitive pattern
matching.
d. ksh-88 egrep-style extended pattern matching ([@+*?!](patlist)) has been
implemented, controlled by a new `shopt' option, `extglob'.
e. There is a new ksh-like `[[' compound command, which implements
extended `test' functionality.
f. There is a new `printf' builtin, implemented according to the POSIX.2
specification.
g. There is a new feature for command substitution: $(< filename) now expands
to the contents of `filename', with any trailing newlines removed
(equivalent to $(cat filename)).
h. There are new tilde prefixes which expand to directories from the
directory stack.
i. There is a new `**' arithmetic operator to do exponentiation.
j. There are new configuration options to control how bash is linked:
`--enable-profiling', to allow bash to be profiled with gprof, and
`--enable-static-link', to allow bash to be linked statically.
k. There is a new configuration option, `--enable-cond-command', which
controls whether or not the `[[' command is included. It is on by
default.
l. There is a new configuration option, `--enable-extended-glob', which
controls whether or not the ksh extended globbing feature is included.
It is enabled by default.
m. There is a new configuration #define in config.h.top that, when enabled,
will cause all login shells to source /etc/profile and one of the user-
specific login shell startup files, whether or not the shell is
interactive.
n. There is a new invocation option, `--dump-po-strings', to dump
a shell script's translatable strings ($"...") in GNU `po' format.
o. There is a new `shopt' option, `nocaseglob', to enable case-insensitive
pattern matching when globbing filenames and using the `case' construct.
p. There is a new `shopt' option, `huponexit', which, when enabled, causes
the shell to send SIGHUP to all jobs when an interactive login shell
exits.
q. `bind' has a new `-u' option, which takes a readline function name as an
argument and unbinds all key sequences bound to that function in a
specified keymap.
r. `disown' now has `-a' and `-r' options, to limit operation to all jobs
and running jobs, respectively.
s. The `shopt' `-p' option now causes output to be displayed in a reusable
format.
t. `test' has a new `-N' option, which returns true if the filename argument
has been modified since it was last accessed.
u. `umask' now has a `-p' option to print output in a reusable format.
v. A new escape sequence, `\xNNN', has been added to the `echo -e' and $'...'
translation code. It expands to the character whose ascii code is NNN
in hexadecimal.
w. The prompt string expansion code has a new `\r' escape sequence.
x. The shell may now be cross-compiled for the CYGWIN32 environment on
a Unix machine.
2. New Features in Readline
a. There is now an option for `iterative' yank-last-arg handline, so a user
can keep entering `M-.', yanking the last argument of successive history
lines.
b. New variable, `print-completions-horizontally', which causes completion
matches to be displayed across the screen (like `ls -x') rather than up
and down the screen (like `ls').
c. New variable, `completion-ignore-case', which causes filename completion
and matching to be performed case-insensitively.
d. There is a new bindable command, `magic-space', which causes history
expansion to be performed on the current readline buffer and a space to
be inserted into the result.
e. There is a new bindable command, `menu-complete', which enables tcsh-like
menu completion (successive executions of menu-complete insert a single
completion match, cycling through the list of possible completions).
f. There is a new bindable command, `paste-from-clipboard', for use on Win32
systems, to insert the text from the Win32 clipboard into the editing
buffer.
g. The key sequence translation code now understands printf-style backslash
escape sequences, including \NNN octal escapes. These escape sequences
may be used in key sequence definitions or macro values.
h. An `$include' inputrc file parser directive has been added.
-------------------------------------------------------------------------------
This is a terse description of the new features added to bash-2.01 since
the release of bash-2.0. As always, the manual page (doc/bash.1) is the
place to look for complete descriptions.

57
NOTES
View file

@ -137,3 +137,60 @@ being built and linked against, but there is only a stub file in the archive.)
/* Need to get the argument to a -c option processed in the
8. Some people have asked about binding all of the keys in a PC-keyboard-
style numeric keypad to readline functions. Here's something I
received from the gnu-win32 list that may help. Insert the following
lines into ~/.inputrc:
# home key
"\e[1~":beginning-of-line
# insert key
"\e[2~":kill-whole-line
# del key
"\e[3~":delete-char
# end key
"\e[4~":end-of-line
# pgup key
"\e[5~":history-search-forward
# pgdn key
"\e[6~":history-search-backward
9. Hints for building under Minix 2.0 (Contributed by Terry R. McConnell,
<tmc@barnyard.syr.edu>)
The version of /bin/sh distributed with Minix is not up to the job of
running the configure script. The easiest solution is to swap /bin/sh
with /usr/bin/ash. Then use chmem(1) to increase the memory allocated
to /bin/sh. The following settings are known to work:
text data bss stack memory
63552 9440 3304 65536 141832 /bin/sh
If you have problems with make or yacc it may be worthwhile first to
install the GNU versions of these utilities before attempting to build
bash. (As of this writing, all of these utilities are available for the
i386 as pre-built binaries via anonymous ftp at math.syr.edu in the
pub/mcconnell/minix directory. Note that the GNU version of yacc is called
bison.)
Unless you want to see lots of warnings about old-style declarations,
do LOCAL_CFLAGS=-wo; export LOCAL_CFLAGS before running configure.
(These warnings are harmless, but annoying.)
configure will insist that you supply a host type. For example, do
./configure --host=i386-pc-minix.
Minix does not support the system calls required for a proper
implementation of ulimit(). The `ulimit' builtin will not be available.
Configure will fail to notice that many things like uid_t are indeed
typedef'd in <sys/types.h>, because it uses egrep for this purpose
and minix has no egrep. You could try making a link /usr/bin/egrep -->
/usr/bin/grep. Better is to install the GNU version of grep in
/usr/local/bin and make the link /usr/local/bin/egrep -->/usr/local/bin/grep.
(These must be hard links, of course, since Minix does not support
symbolic links.)
You will see many warnings of the form:
warning: unknown s_type: 98
I have no idea what this means, but it doesn't seem to matter.

317
aclocal.m4 vendored
View file

@ -26,7 +26,8 @@ main()
exit(fl != 1);
}
], bash_cv_dup2_broken=yes, bash_cv_dup2_broken=no,
AC_MSG_ERROR(cannot check dup2 if cross compiling))
[AC_MSG_ERROR(cannot check dup2 if cross compiling -- defaulting to no)
bash_cv_dup2_broken=no])
])
AC_MSG_RESULT($bash_cv_dup2_broken)
if test $bash_cv_dup2_broken = yes; then
@ -128,7 +129,8 @@ main()
exit(ok ? 0 : 5);
}
], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
AC_MSG_ERROR(cannot check pgrp synchronization if cross compiling))
[AC_MSG_ERROR(cannot check pgrp synchronization if cross compiling -- defaulting to no)
bash_cv_pgrp_pipe=no])
])
AC_MSG_RESULT($bash_cv_pgrp_pipe)
if test $bash_cv_pgrp_pipe = yes; then
@ -169,7 +171,8 @@ dnl
AC_DEFUN(BASH_RLIMIT_TYPE,
[AC_MSG_CHECKING(for size and type of struct rlimit fields)
AC_CACHE_VAL(bash_cv_type_rlimit,
[AC_TRY_COMPILE([#include <sys/types.h>],
[AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/resource.h>],
[rlim_t xxx;], bash_cv_type_rlimit=rlim_t,[
AC_TRY_RUN([
#include <sys/types.h>
@ -184,7 +187,8 @@ main()
#endif
exit(1);
}], bash_cv_type_rlimit=quad_t, bash_cv_type_rlimit=long,
AC_MSG_ERROR(cannot check quad_t if cross compiling))])
[AC_MSG_ERROR(cannot check quad_t if cross compiling -- defaulting to long)
bash_cv_type_rlimit=long])])
])
AC_MSG_RESULT($bash_cv_type_rlimit)
if test $bash_cv_type_rlimit = quad_t; then
@ -207,7 +211,7 @@ AC_CACHE_VAL(bash_cv_decl_under_sys_siglist,
#include <unistd.h>
#endif], [ char *msg = _sys_siglist[2]; ],
bash_cv_decl_under_sys_siglist=yes, bash_cv_decl_under_sys_siglist=no,
AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling))])dnl
[AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)])])dnl
AC_MSG_RESULT($bash_cv_decl_under_sys_siglist)
if test $bash_cv_decl_under_sys_siglist = yes; then
AC_DEFINE(UNDER_SYS_SIGLIST_DECLARED)
@ -232,8 +236,9 @@ main()
char *msg = (char *)_sys_siglist[2];
exit(msg == 0);
}],
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling))])dnl
bash_cv_under_sys_siglist=yes, bash_cv_under_sys_siglist=no,
[AC_MSG_ERROR(cannot check for _sys_siglist[] if cross compiling -- defaulting to no)
bash_cv_under_sys_siglist=no])])
AC_MSG_RESULT($bash_cv_under_sys_siglist)
if test $bash_cv_under_sys_siglist = yes; then
AC_DEFINE(HAVE_UNDER_SYS_SIGLIST)
@ -258,8 +263,9 @@ main()
char *msg = sys_siglist[2];
exit(msg == 0);
}],
bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
AC_MSG_ERROR(cannot check for sys_siglist if cross compiling))])dnl
bash_cv_sys_siglist=yes, bash_cv_sys_siglist=no,
[AC_MSG_ERROR(cannot check for sys_siglist if cross compiling -- defaulting to no)
bash_cv_sys_siglist=no])])
AC_MSG_RESULT($bash_cv_sys_siglist)
if test $bash_cv_sys_siglist = yes; then
AC_DEFINE(HAVE_SYS_SIGLIST)
@ -319,7 +325,9 @@ dir = opendir("/tmp/not_a_directory");
unlink("/tmp/not_a_directory");
exit (dir == 0);
}], bash_cv_opendir_not_robust=yes,bash_cv_opendir_not_robust=no,
AC_MSG_ERROR(cannot check opendir if cross compiling))])
[AC_MSG_ERROR(cannot check opendir if cross compiling -- defaulting to no)
bash_cv_opendir_not_robust=no]
)])
AC_MSG_RESULT($bash_cv_opendir_not_robust)
if test $bash_cv_opendir_not_robust = yes; then
AC_DEFINE(OPENDIR_NOT_ROBUST)
@ -346,8 +354,116 @@ AC_DEFINE(VOID_SIGHANDLER)
fi
])
AC_DEFUN(BASH_TYPE_INT32_T,
[
if test "X$bash_cv_type_int32_t" = "X"; then
_bash_needmsg=yes
else
AC_MSG_CHECKING(which builtin C type is 32 bits wide)
_bash_needmsg=
fi
AC_CACHE_VAL(bash_cv_type_int32_t,
[AC_TRY_RUN([
main()
{
#if SIZEOF_INT == 4
exit (0);
#else
# if SIZEOF_LONG == 4
exit (1);
# else
# error cannot find 32 bit type...
# endif
#endif
}], bash_cv_type_int32_t=int, bash_cv_type_int32_t=long,
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
bash_cv_type_int32_t=int]
)])
if test "X$_bash_needmsg" = "Xyes"; then
AC_MSG_CHECKING(which builtin C type is 32 bits wide)
fi
AC_MSG_RESULT($bash_cv_type_int32_t);
if test "$bash_cv_type_int32_t" = "int"; then
AC_DEFINE(int32_t, int)
else
AC_DEFINE(int32_t, long)
fi
])
AC_DEFUN(BASH_TYPE_U_INT32_T,
[
if test "X$bash_cv_type_u_int32_t" = "X"; then
_bash_needmsg=yes
else
AC_MSG_CHECKING(which unsigned builtin C type is 32 bits wide)
_bash_needmsg=
fi
AC_CACHE_VAL(bash_cv_type_u_int32_t,
[AC_TRY_RUN([
main()
{
#if SIZEOF_INT == 4
exit (0);
#else
# if SIZEOF_LONG == 4
exit (1);
# else
# error cannot find 32 bit type...
# endif
#endif
}], bash_cv_type_u_int32_t=int, bash_cv_type_u_int32_t=long,
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
bash_cv_type_u_int32_t=int]
)])
if test "X$_bash_needmsg" = "Xyes"; then
AC_MSG_CHECKING(which unsigned builtin C type is 32 bits wide)
fi
AC_MSG_RESULT($bash_cv_type_u_int32_t);
if test "$bash_cv_type_u_int32_t" = "int"; then
AC_DEFINE(u_int32_t, unsigned int)
else
AC_DEFINE(u_int32_t, unsigned long)
fi
])
AC_DEFUN(BASH_TYPE_PTRDIFF_T,
[
if test "X$bash_cv_type_ptrdiff_t" = "X"; then
_bash_needmsg=yes
else
AC_MSG_CHECKING(which builtin C type is correct for ptrdiff_t)
_bash_needmsg=
fi
AC_CACHE_VAL(bash_cv_type_ptrdiff_t,
[AC_TRY_RUN([
main()
{
#if SIZEOF_CHAR_P == SIZEOF_INT
exit (0);
#else
# if SIZEOF_CHAR_P == SIZEOF_LONG
exit (1);
# else
# error cannot find type for pointer arithmetic...
# endif
#endif
}], bash_cv_type_ptrdiff_t=int, bash_cv_type_ptrdiff_t=long,
[AC_MSG_ERROR(cannot check type sizes if cross-compiling -- defaulting to int)
bash_cv_type_ptrdiff_t=int]
)])
if test "X$_bash_needmsg" = "Xyes"; then
AC_MSG_CHECKING(which builtin C type is correct for ptrdiff_t)
fi
AC_MSG_RESULT($bash_cv_type_ptrdiff_t);
if test "$bash_cv_type_ptrdiff_t" = "int"; then
AC_DEFINE(ptrdiff_t, int)
else
AC_DEFINE(ptrdiff_t, long)
fi
])
AC_DEFUN(BASH_FUNC_STRSIGNAL,
[AC_MSG_CHECKING([for the existance of strsignal])
[AC_MSG_CHECKING([for the existence of strsignal])
AC_CACHE_VAL(bash_cv_have_strsignal,
[AC_TRY_LINK([#include <sys/types.h>
#include <signal.h>],
@ -366,7 +482,7 @@ AC_CACHE_CHECK([for lstat], bash_cv_func_lstat,
[AC_TRY_LINK([
#include <sys/types.h>
#include <sys/stat.h>
],[ lstat("",(struct stat *)0); ],
],[ lstat(".",(struct stat *)0); ],
bash_cv_func_lstat=yes, bash_cv_func_lstat=no)])
if test $bash_cv_func_lstat = yes; then
AC_DEFINE(HAVE_LSTAT)
@ -432,7 +548,9 @@ s = getenv("ABCDE");
exit(s == 0); /* force optimizer to leave getenv in */
}
], bash_cv_getenv_redef=yes, bash_cv_getenv_redef=no,
AC_MSG_ERROR(cannot check getenv redefinition if cross compiling))])
[AC_MSG_ERROR(cannot check getenv redefinition if cross compiling -- defaulting to yes)
bash_cv_getenv_redef=yes]
)])
AC_MSG_RESULT($bash_cv_getenv_redef)
if test $bash_cv_getenv_redef = yes; then
AC_DEFINE(CAN_REDEFINE_GETENV)
@ -455,8 +573,10 @@ _bashfunc pf;
pf = (_bashfunc) printf;
exit(pf == 0);
}
],bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
AC_MSG_ERROR(cannot check printf declaration if cross compiling))])
], bash_cv_printf_declared=yes, bash_cv_printf_declared=no,
[AC_MSG_ERROR(cannot check printf declaration if cross compiling -- defaulting to yes)
bash_cv_printf_declared=yes]
)])
AC_MSG_RESULT($bash_cv_printf_declared)
if test $bash_cv_printf_declared = yes; then
AC_DEFINE(PRINTF_DECLARED)
@ -472,8 +592,10 @@ main()
long maxfds = ulimit(4, 0L);
exit (maxfds == -1L);
}
],bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
AC_MSG_ERROR(cannot check ulimit if cross compiling))])
], bash_cv_ulimit_maxfds=yes, bash_cv_ulimit_maxfds=no,
[AC_MSG_ERROR(cannot check ulimit if cross compiling -- defaulting to no)
bash_cv_ulimit_maxfds=no]
)])
AC_MSG_RESULT($bash_cv_ulimit_maxfds)
if test $bash_cv_ulimit_maxfds = yes; then
AC_DEFINE(ULIMIT_MAXFDS)
@ -497,7 +619,7 @@ if test "X$_bash_needmsg" = "Xyes"; then
AC_MSG_CHECKING(which library has the termcap functions)
fi
AC_MSG_RESULT(using $bash_cv_termcap_lib)
if test $bash_cv_termcap_lib = gnutermcap; then
if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
LDFLAGS="$LDFLAGS -L./lib/termcap"
TERMCAP_LIB="./lib/termcap/libtermcap.a"
TERMCAP_DEP="./lib/termcap/libtermcap.a"
@ -568,7 +690,9 @@ main()
exit (popen_called);
}
], bash_cv_getcwd_calls_popen=no, bash_cv_getcwd_calls_popen=yes,
AC_MSG_ERROR(cannot check whether getcwd calls popen if cross compiling))])
[AC_MSG_ERROR(cannot check whether getcwd calls popen if cross compiling -- defaulting to no)
bash_cv_getcwd_calls_popen=no]
)])
AC_MSG_RESULT($bash_cv_getcwd_calls_popen)
if test $bash_cv_getcwd_calls_popen = yes; then
AC_DEFINE(GETCWD_BROKEN)
@ -690,7 +814,9 @@ main()
exit(nsigint != 2);
}
], bash_cv_must_reinstall_sighandlers=no, bash_cv_must_reinstall_sighandlers=yes,
AC_MSG_ERROR(cannot check signal handling if cross compiling))])
[AC_MSG_ERROR(cannot check signal handling if cross compiling -- defaulting to no)
bash_cv_must_reinstall_sighandlers=no]
)])
AC_MSG_RESULT($bash_cv_must_reinstall_sighandlers)
if test $bash_cv_must_reinstall_sighandlers = yes; then
AC_DEFINE(MUST_REINSTALL_SIGHANDLERS)
@ -756,9 +882,10 @@ exit(1);
#endif
exit(0);
}],bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
AC_MSG_ERROR(cannot check job control if cross-compiling))
])
}], bash_cv_job_control_missing=present, bash_cv_job_control_missing=missing,
[AC_MSG_ERROR(cannot check job control if cross-compiling -- defaulting to missing)
bash_cv_job_control_missing=missing]
)])
AC_MSG_RESULT($bash_cv_job_control_missing)
if test $bash_cv_job_control_missing = missing; then
AC_DEFINE(JOB_CONTROL_MISSING)
@ -800,9 +927,10 @@ if (fd == -1)
close(fd);
unlink ("/tmp/sh-np-autoconf");
exit(0);
}],bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
AC_MSG_ERROR(cannot check for named pipes if cross-compiling))
])
}], bash_cv_sys_named_pipes=present, bash_cv_sys_named_pipes=missing,
[AC_MSG_ERROR(cannot check for named pipes if cross-compiling -- defaulting to missing)
bash_cv_sys_named_pipes=missing]
)])
AC_MSG_RESULT($bash_cv_sys_named_pipes)
if test $bash_cv_sys_named_pipes = missing; then
AC_DEFINE(NAMED_PIPES_MISSING)
@ -850,9 +978,10 @@ sigprocmask(SIG_BLOCK, &set, (sigset_t *)NULL);
siglongjmp(xx, 10);
exit(1);
#endif
}],bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
AC_MSG_ERROR(cannot check for sigsetjmp/siglongjmp if cross-compiling))
])
}], bash_cv_func_sigsetjmp=present, bash_cv_func_sigsetjmp=missing,
[AC_MSG_ERROR(cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing)
bash_cv_func_sigsetjmp=missing]
)])
AC_MSG_RESULT($bash_cv_func_sigsetjmp)
if test $bash_cv_func_sigsetjmp = present; then
AC_DEFINE(HAVE_POSIX_SIGSETJMP)
@ -872,14 +1001,23 @@ fi
])
AC_DEFUN(BASH_STRUCT_WINSIZE,
[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h)
AC_CACHE_VAL(bash_cv_struct_winsize_in_ioctl,
[AC_MSG_CHECKING(for struct winsize in sys/ioctl.h and termios.h)
AC_CACHE_VAL(bash_cv_struct_winsize_header,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/ioctl.h>], [struct winsize x;],
bash_cv_struct_winsize_in_ioctl=yes,bash_cv_struct_winsize_in_ioctl=no)])
AC_MSG_RESULT($bash_cv_struct_winsize_in_ioctl)
if test $bash_cv_struct_winsize_in_ioctl = yes; then
AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
bash_cv_struct_winsize_header=ioctl_h,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <termios.h>], [struct winsize x;],
bash_cv_struct_winsize_header=termios_h, bash_cv_struct_winsize_header=other)
])])
if test $bash_cv_struct_winsize_header = ioctl_h; then
AC_MSG_RESULT(sys/ioctl.h)
AC_DEFINE(STRUCT_WINSIZE_IN_SYS_IOCTL)
elif test $bash_cv_struct_winsize_header = termios_h; then
AC_MSG_RESULT(termios.h)
AC_DEFINE(STRUCT_WINSIZE_IN_TERMIOS)
else
AC_MSG_RESULT(not found)
fi
])
@ -1051,16 +1189,16 @@ AC_CACHE_VAL(bash_cv_kernel_rlimit,
int f;
f = RLIMIT_DATA;
], bash_cv_kernel_rlimit=no,
[AC_TRY_COMPILE([
#include <sys/types.h>
#define _KERNEL
#include <sys/resource.h>
#undef _KERNEL
],
[
[AC_TRY_COMPILE([
#include <sys/types.h>
#define _KERNEL
#include <sys/resource.h>
#undef _KERNEL
],
[
int f;
f = RLIMIT_DATA;
], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
], bash_cv_kernel_rlimit=yes, bash_cv_kernel_rlimit=no)]
)])
AC_MSG_RESULT($bash_cv_kernel_rlimit)
if test $bash_cv_kernel_rlimit = yes; then
@ -1108,10 +1246,99 @@ char *v[];
exit (r1 > 0 && r2 > 0);
}
], bash_cv_func_strcoll_broken=yes, bash_cv_func_strcoll_broken=no,
AC_MSG_ERROR(cannot check strcoll if cross compiling))
])
[AC_MSG_ERROR(cannot check strcoll if cross compiling -- defaulting to no)
bash_cv_func_strcoll_broken=no]
)])
AC_MSG_RESULT($bash_cv_func_strcoll_broken)
if test $bash_cv_func_strcoll_broken = yes; then
AC_DEFINE(STRCOLL_BROKEN)
fi
])
dnl
dnl If available, use support for large files unless the user specified
dnl one of the CPPFLAGS, LDFLAGS, or LIBS variables (<eggert@twinsun.com>
dnl via GNU patch 2.5)
dnl
AC_DEFUN(BASH_LARGE_FILE_SUPPORT,
[AC_MSG_CHECKING(whether large file support needs explicit enabling)
ac_getconfs=''
ac_result=yes
ac_set=''
ac_shellvars='CPPFLAGS LDFLAGS LIBS'
for ac_shellvar in $ac_shellvars; do
case $ac_shellvar in
CPPFLAGS) ac_lfsvar=LFS_CFLAGS ac_lfs64var=LFS64_CFLAGS ;;
*) ac_lfsvar=LFS_$ac_shellvar ac_lfs64var=LFS64_$ac_shellvar ;;
esac
eval test '"${'$ac_shellvar'+set}"' = set && ac_set=$ac_shellvar
(getconf $ac_lfsvar) >/dev/null 2>&1 || { ac_result=no; break; }
ac_getconf=`getconf $ac_lfsvar`
ac_getconf64=`getconf $ac_lfs64var`
ac_getconfs=$ac_getconfs$ac_getconf\ $ac_getconf64
eval ac_test_$ac_shellvar="\$ac_getconf\ \$ac_getconf64"
done
case "$ac_result$ac_getconfs" in
yes) ac_result=no ;;
esac
case "$ac_result$ac_set" in
yes?*) ac_result="yes, but $ac_set is already set, so use its settings"
esac
AC_MSG_RESULT($ac_result)
case $ac_result in
yes)
for ac_shellvar in $ac_shellvars; do
eval $ac_shellvar=\$ac_test_$ac_shellvar
done ;;
esac
])
dnl
dnl AC_SYS_RESTARTABLE_SYSCALLS tests only for restarted system calls
dnl after a signal handler has been installed with signal(). Since
dnl Bash uses sigaction() if it is available, we need to check whether
dnl or not a signal handler installed with sigaction and SA_RESTART
dnl causes system calls to be restarted after the signal is caught
dnl
AC_DEFUN(BASH_SYS_RESTARTABLE_SYSCALLS,
[AC_REQUIRE([BASH_SIGNAL_CHECK])
AC_CACHE_CHECK(for restartable system calls with posix sigaction,
bash_cv_sys_restartable_syscalls,
[AC_TRY_RUN(
[/* Exit 0 (true) if wait returns something other than -1,
i.e. the pid of the child, which means that wait was restarted
after getting the signal. */
#include <sys/types.h>
#include <signal.h>
static int caught = 0;
void ucatch (isig) int isig; { caught = 1; }
main ()
{
#if !defined (_POSIX_VERSION) || !defined (HAVE_POSIX_SIGNALS)
exit (1);
#else
struct sigaction act, oact;
int i, status;
act.sa_handler = ucatch;
/* Might want to add SA_RESTART here, but bash's set_signal_handler
does not. */
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigemptyset(&oact.sa_mask);
i = fork ();
/* A possible race condition here, but in practice it never happens. */
if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); exit (0); }
sigaction(SIGINT, &act, &oact);
status = wait(&i);
if (status == -1) wait(&i);
exit (status == -1);
#endif
}
], bash_cv_sys_restartable_syscalls=yes, bash_cv_sys_restartable_syscalls=no,
AC_MSG_ERROR(cannot check restartable syscalls if cross compiling))
])
if test $bash_cv_sys_restartable_syscalls = yes; then
AC_DEFINE(HAVE_RESTARTABLE_SYSCALLS)
fi
])

View file

@ -24,6 +24,9 @@
#if defined (ALIAS)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -411,6 +414,12 @@ rd_token (string, start)
if (quote_char (string[i]))
{
i = skipquotes (string, i);
/* This could be a line that contains a single quote character,
in which case skipquotes () terminates with string[i] == '\0'
(the end of the string). Check for that here. */
if (string[i] == '\0')
break;
/* Now string[i] is the matching quote character, and the
quoted portion of the token has been scanned. */
continue;

View file

@ -13,6 +13,9 @@
#if defined (ARRAY_VARS)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -151,6 +154,7 @@ ARRAY_ELEMENT *s, *e;
}
#endif
#ifdef INCLUDE_UNUSED
ARRAY_ELEMENT *
copy_array_element(ae)
ARRAY_ELEMENT *ae;
@ -158,6 +162,7 @@ ARRAY_ELEMENT *ae;
return(ae ? new_array_element(element_index(ae), element_value(ae))
: (ARRAY_ELEMENT *) NULL);
}
#endif
/*
* Add a new element with index I and value V to array A (a[i] = v).
@ -248,6 +253,7 @@ arrayind_t i;
return((char *) NULL);
}
#ifdef TEST_ARRAY
/*
* Walk the array, calling FUNC once for each element, with the array
* element as the argument.
@ -264,6 +270,7 @@ Function *func;
for (ae = element_forw(a->head); ae != a->head; ae = element_forw(ae))
(*func)(ae);
}
#endif
/*
* Return a string that is the concatenation of all the elements in A,

View file

@ -23,6 +23,9 @@
#if defined (HISTORY)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -174,6 +177,10 @@ bash_history_inhibit_expansion (string, i)
else if (i > 1 && string[i - 1] == '{' && string[i - 2] == '$' &&
member ('}', string + i + 1))
return (1);
#if defined (EXTENDED_GLOB)
else if (extended_glob && i > 1 && string[i+1] == '(' && member (')', string + i + 2))
return (1);
#endif
else
return (0);
}
@ -399,7 +406,7 @@ pre_process_line (line, print_changes, addit)
if (print_changes)
{
if (expanded < 0)
internal_error (history_value);
internal_error ("%s", history_value);
#if defined (READLINE)
else if (hist_verify == 0)
#else
@ -461,9 +468,13 @@ maybe_add_history (line)
should_add = hist_last_line_added = 0;
/* Don't use the value of history_control to affect the second
and subsequent lines of a multi-line command when
command_oriented_history is enabled. */
and subsequent lines of a multi-line command (old code did
this only when command_oriented_history is enabled). */
#if 0
if (command_oriented_history && current_command_line_count > 1)
#else
if (current_command_line_count > 1)
#endif
{
bash_add_history (line);
return;
@ -693,7 +704,7 @@ history_should_ignore (line)
else
npat = histignore.ignores[i].val;
match = fnmatch (npat, line, 0) != FNM_NOMATCH;
match = fnmatch (npat, line, FNMATCH_EXTFLAG) != FNM_NOMATCH;
if (histignore.ignores[i].flags & HIGN_EXPAND)
free (npat);

View file

@ -36,6 +36,7 @@
#include "bashhist.h"
#include "bashline.h"
#include "execute_cmd.h"
#include "findcmd.h"
#include "pathexp.h"
#include "builtins/common.h"
#include <readline/rlconf.h>
@ -55,13 +56,20 @@ extern void bash_brace_completion ();
/* Functions bound to keys in Readline for Bash users. */
static void shell_expand_line ();
static void display_shell_version (), operate_and_get_next ();
static void history_expand_line (), bash_ignore_filenames ();
#ifdef ALIAS
static void alias_expand_line ();
#endif
static void history_and_alias_expand_line ();
static void bash_ignore_filenames ();
static void cleanup_expansion_error (), set_up_new_line ();
#if defined (BANG_HISTORY)
static int history_expand_line ();
static int tcsh_magic_space ();
#endif /* BANG_HISTORY */
#ifdef ALIAS
static int alias_expand_line ();
#endif
#if defined (BANG_HISTORY) && defined (ALIAS)
static int history_and_alias_expand_line ();
#endif
/* Helper functions for Readline. */
static int bash_directory_completion_hook ();
static void filename_completion_ignore ();
@ -196,9 +204,13 @@ initialize_readline ()
rl_bind_key_in_map (CTRL('E'), (Function *)shell_expand_line, emacs_meta_keymap);
/* Bind up our special shell functions. */
#ifdef BANG_HISTORY
rl_add_defun ("history-expand-line", (Function *)history_expand_line, -1);
rl_bind_key_in_map ('^', (Function *)history_expand_line, emacs_meta_keymap);
rl_add_defun ("magic-space", (Function *)tcsh_magic_space, -1);
#endif
#ifdef ALIAS
rl_add_defun ("alias-expand-line", (Function *)alias_expand_line, -1);
rl_add_defun ("history-and-alias-expand-line", (Function *)history_and_alias_expand_line, -1);
@ -1030,7 +1042,7 @@ command_subst_completion_function (text, state)
orig_start = text;
if (*text == '`')
text++;
else if (*text == '$' && text[1] == '(')
else if (*text == '$' && text[1] == '(') /* ) */
text += 2;
start_len = text - orig_start;
filename_text = savestring (text);
@ -1173,7 +1185,12 @@ hostname_completion_function (text, state)
return ((char *)NULL);
}
/* History and alias expand the line. */
/* Functions to perform history and alias expansions on the current line. */
#if defined (BANG_HISTORY)
/* Perform history expansion on the current line. If no history expansion
is done, pre_process_line() returns what it was passed, so we need to
allocate a new line here. */
static char *
history_expand_line_internal (line)
char *line;
@ -1183,22 +1200,6 @@ history_expand_line_internal (line)
new_line = pre_process_line (line, 0, 0);
return (new_line == line) ? savestring (line) : new_line;
}
#if defined (ALIAS)
/* Expand aliases in the current readline line. */
static void
alias_expand_line (ignore)
int ignore;
{
char *new_line;
new_line = alias_expand (rl_line_buffer);
if (new_line)
set_up_new_line (new_line);
else
cleanup_expansion_error ();
}
#endif
/* There was an error in expansion. Let the preprocessor print
@ -1259,8 +1260,32 @@ set_up_new_line (new_line)
}
}
#if defined (ALIAS)
/* Expand aliases in the current readline line. */
static int
alias_expand_line (ignore)
int ignore;
{
char *new_line;
new_line = alias_expand (rl_line_buffer);
if (new_line)
{
set_up_new_line (new_line);
return (0);
}
else
{
cleanup_expansion_error ();
return (1);
}
}
#endif
#if defined (BANG_HISTORY)
/* History expand the line. */
static void
static int
history_expand_line (ignore)
int ignore;
{
@ -1269,13 +1294,35 @@ history_expand_line (ignore)
new_line = history_expand_line_internal (rl_line_buffer);
if (new_line)
set_up_new_line (new_line);
{
set_up_new_line (new_line);
return (0);
}
else
cleanup_expansion_error ();
{
cleanup_expansion_error ();
return (1);
}
}
/* Expand history substitutions in the current line and then insert a
space wherever set_up_new_line decided to put rl_point. */
static int
tcsh_magic_space (ignore)
int ignore;
{
if (history_expand_line (ignore) == 0)
{
rl_insert (1, ' ');
return (0);
}
else
return (1);
}
#endif
/* History and alias expand the line. */
static void
static int
history_and_alias_expand_line (ignore)
int ignore;
{
@ -1297,13 +1344,21 @@ history_and_alias_expand_line (ignore)
#endif /* ALIAS */
if (new_line)
set_up_new_line (new_line);
{
set_up_new_line (new_line);
return (0);
}
else
cleanup_expansion_error ();
{
cleanup_expansion_error ();
return (1);
}
}
/* History and alias expand the line, then perform the shell word
expansions by calling expand_string. */
expansions by calling expand_string. This can't use set_up_new_line()
because we want the variable expansions as a separate undo'able
set of operations. */
static void
shell_expand_line (ignore)
int ignore;
@ -1369,6 +1424,10 @@ shell_expand_line (ignore)
cleanup_expansion_error ();
}
/* Define NO_FORCE_FIGNORE if you want to match filenames that would
otherwise be ignored if they are the only possible matches. */
/* #define NO_FORCE_FIGNORE */
/* If FIGNORE is set, then don't match files with the given suffixes when
completing filenames. If only one of the possibilities has an acceptable
suffix, delete the others, else just return and let the completer
@ -1393,6 +1452,10 @@ _ignore_completion_names (names, name_func)
{
char **newnames;
int idx, nidx;
#ifdef NO_FORCE_FIGNORE
char **oldnames;
int oidx;
#endif
/* If there is only one completion, see if it is acceptable. If it is
not, free it up. In any case, short-circuit and return. This is a
@ -1400,11 +1463,13 @@ _ignore_completion_names (names, name_func)
if there is only one completion; it is the completion itself. */
if (names[1] == (char *)0)
{
#ifndef NO_FORCE_FIGNORE
if ((*name_func) (names[0]) == 0)
{
free (names[0]);
names[0] = (char *)NULL;
}
#endif
return;
}
@ -1413,6 +1478,10 @@ _ignore_completion_names (names, name_func)
for (nidx = 1; names[nidx]; nidx++)
;
newnames = (char **)xmalloc ((nidx + 1) * (sizeof (char *)));
#ifdef NO_FORCE_FIGNORE
oldnames = (char **)xmalloc ((nidx - 1) * (sizeof (char *)));
oidx = 0;
#endif
newnames[0] = names[0];
for (idx = nidx = 1; names[idx]; idx++)
@ -1420,7 +1489,11 @@ _ignore_completion_names (names, name_func)
if ((*name_func) (names[idx]))
newnames[nidx++] = names[idx];
else
#ifndef NO_FORCE_FIGNORE
free (names[idx]);
#else
oldnames[oidx++] = names[idx];
#endif
}
newnames[nidx] = (char *)NULL;
@ -1428,12 +1501,22 @@ _ignore_completion_names (names, name_func)
/* If none are acceptable then let the completer handle it. */
if (nidx == 1)
{
#ifndef NO_FORCE_FIGNORE
free (names[0]);
names[0] = (char *)NULL;
#else
free (oldnames);
#endif
free (newnames);
return;
}
#ifdef NO_FORCE_FIGNORE
while (oidx)
free (oldnames[--oidx]);
free (oldnames);
#endif
/* If only one is acceptable, copy it to names[0] and return. */
if (nidx == 2)
{

View file

@ -28,6 +28,9 @@
#include <stdio.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -25,6 +25,9 @@
#if defined (BRACE_EXPANSION)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -21,6 +21,9 @@
#include "config.h"
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -3,6 +3,7 @@
SHELL = /bin/sh
RANLIB = @RANLIB@
CC = @CC@
CC_FOR_BUILD = @CC_FOR_BUILD@
AR = @AR@
RM = rm -f
CP = cp
@ -11,13 +12,16 @@ srcdir = @srcdir@
VPATH = .:@srcdir@
topdir = @top_srcdir@
includedir = @includedir@
BUILD_DIR = @BUILD_DIR@
PROFILE_FLAGS =
PROFILE_FLAGS = @PROFILE_FLAGS@
CFLAGS = @CFLAGS@
LOCAL_CFLAGS = @LOCAL_CFLAGS@
CPPFLAGS = @CPPFLAGS@
DEFS = @DEFS@
LOCAL_DEFS = @LOCAL_DEFS@
LDFLAGS = @LDFLAGS@ $(LOCAL_LDFLAGS) $(CFLAGS)
LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
LIBS = @LIBS@
INCLUDES = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(srcdir)
@ -62,7 +66,8 @@ DEFSRC = $(srcdir)/alias.def $(srcdir)/bind.def $(srcdir)/break.def \
$(srcdir)/source.def $(srcdir)/suspend.def $(srcdir)/test.def \
$(srcdir)/times.def $(srcdir)/trap.def $(srcdir)/type.def \
$(srcdir)/ulimit.def $(srcdir)/umask.def $(srcdir)/wait.def \
$(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def
$(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def \
$(srcdir)/printf.def
STATIC_SOURCE = common.c evalstring.c evalfile.c getopt.c bashgetopt.c \
getopt.h
@ -74,40 +79,57 @@ OFILES = builtins.o \
exit.o fc.o fg_bg.o hash.o help.o history.o jobs.o kill.o let.o \
pushd.o read.o return.o set.o setattr.o shift.o source.o \
suspend.o test.o times.o trap.o type.o ulimit.o umask.o \
wait.o getopts.o shopt.o getopt.o bashgetopt.o
wait.o getopts.o shopt.o printf.o getopt.o bashgetopt.o
CREATED_FILES = builtext.h builtins.c psize.aux pipesize.h
all: $(MKBUILTINS) libbuiltins.a
libbuiltins.a: $(MKBUILTINS) $(OFILES)
libbuiltins.a: $(MKBUILTINS) $(OFILES) builtins.o
$(RM) $@
$(AR) cr $@ $(OFILES)
-$(RANLIB) $@
builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC)
$(RM) builtext.h builtins.c
@-if test -f builtins.c; then mv -f builtins.c old-builtins.c; fi
@-if test -f builtext.h; then mv -f builtext.h old-builtext.h; fi
./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
-noproduction $(DIRECTDEFINE) $(DEFSRC)
-noproduction $(DIRECTDEFINE) $(DEFSRC)
@-if cmp -s old-builtext.h builtext.h; then \
mv old-builtext.h builtext.h; \
else \
$(RM) old-builtext.h; \
fi
@-if cmp -s old-builtins.c builtins.c; then \
mv old-builtins.c builtins.c; \
else \
$(RM) old-builtins.c; \
fi
mkbuiltins: $(srcdir)/mkbuiltins.c ../config.h
$(CC) $(CCFLAGS) -o $(MKBUILTINS) $(srcdir)/mkbuiltins.c $(LIBS)
mkbuiltins.o: ../config.h
mkbuiltins.o: mkbuiltins.c
$(RM) $@
$(CC_FOR_BUILD) -c $(CCFLAGS) $<
mkbuiltins: mkbuiltins.o
$(CC_FOR_BUILD) $(LDFLAGS) -o $(MKBUILTINS) mkbuiltins.o $(LIBS)
# rules for deficient makes, like SunOS
mkbuiltins.o: mkbuiltins.c
builtins.o: builtins.c
common.o: common.c
bashgetopt.o: bashgetopt.c
getopt.o: getopt.c
evalstring.o: evalstring.c
evalfile.o: evalfile.c
evalstring.o: evalstring.c
evalfile.o: evalfile.c
ulimit.o: ulimit.def
ulimit.o: pipesize.h
pipesize.h: psize.aux
$(SHELL) $(srcdir)/psize.sh > pipesize.h
psize.aux: psize.c
$(CC) $(CCFLAGS) -o $@ $(srcdir)/psize.c
$(CC_FOR_BUILD) $(CCFLAGS) -o $@ $(srcdir)/psize.c
documentation: builtins.texi
@ -146,6 +168,7 @@ history.o: history.def
jobs.o: jobs.def
kill.o: kill.def
let.o: let.def
printf.o: printf.def
pushd.o: pushd.def
read.o: read.def
return.o: return.def
@ -159,6 +182,7 @@ test.o: test.def
times.o: times.def
trap.o: trap.def
type.o: type.def
ulimit.o: ulimit.def
umask.o: umask.def
wait.o: wait.def
getopts.o: getopts.def
@ -274,6 +298,7 @@ exec.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
exec.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/flags.h
exec.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
exec.o: $(srcdir)/common.h $(topdir)/execute_cmd.h $(topdir)/maxpath.h
exec.o: $(topdir)/findcmd.h
exit.o: $(topdir)/bashtypes.h
exit.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
exit.o: $(topdir)/error.h $(topdir)/general.h
@ -302,7 +327,7 @@ getopts.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
getopts.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/maxpath.h
getopts.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
hash.o: $(topdir)/builtins.h $(topdir)/command.h $(topdir)/quit.h
hash.o: $(topdir)/execute_cmd.h $(topdir)/hashlib.h
hash.o: $(topdir)/findcmd.h $(topdir)/hashlib.h
hash.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
hash.o: $(topdir)/error.h $(topdir)/general.h
hash.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
@ -339,6 +364,12 @@ let.o: $(topdir)/error.h $(topdir)/general.h
let.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
let.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/maxpath.h
let.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
printf.o: ../config.h $(topdir)/memalloc.h $(topdir)/bashjmp.h
printf.o: $(topdir)/command.h $(topdir)/error.h $(topdir)/general.h
printf.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
printf.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/sig.h
printf.o: $(topdir)/pathnames.h $(topdir)/shell.h $(topdir)/unwind_prot.h
printf.o: $(topdir)/variables.h $(topdir)/stdc.h $(srcdir)/bashgetopt.h
pushd.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
pushd.o: $(topdir)/error.h $(topdir)/general.h
pushd.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
@ -372,7 +403,7 @@ shift.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
shift.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/maxpath.h
shift.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
source.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
source.o: $(topdir)/error.h $(topdir)/general.h
source.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/findcmd.h
source.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
source.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/maxpath.h
source.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
@ -386,6 +417,7 @@ test.o: $(topdir)/error.h $(topdir)/general.h
test.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
test.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/maxpath.h
test.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
test.o: $(topdir)/test.h
times.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
times.o: $(topdir)/error.h $(topdir)/general.h
times.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
@ -396,7 +428,7 @@ trap.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/externs.h
trap.o: $(topdir)/quit.h $(srcdir)/common.h $(topdir)/maxpath.h
trap.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
trap.o: $(topdir)/shell.h $(topdir)/unwind_prot.h $(topdir)/variables.h
trap.o: $(topdir)/execute_cmd.h
trap.o: $(topdir)/findcmd.h
type.o: $(topdir)/command.h ../config.h $(topdir)/memalloc.h
type.o: $(topdir)/error.h $(topdir)/general.h
type.o: $(topdir)/quit.h $(srcdir)/common.h $(topdir)/maxpath.h

View file

@ -37,6 +37,9 @@ $END
#if defined (ALIAS)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -80,12 +83,12 @@ alias_builtin (list)
if (list == 0 || pflag)
{
if (aliases == 0)
return (EXECUTION_FAILURE);
return (EXECUTION_SUCCESS);
alias_list = all_aliases ();
if (alias_list == 0)
return (EXECUTION_FAILURE);
return (EXECUTION_SUCCESS);
for (offset = 0; alias_list[offset]; offset++)
print_alias (alias_list[offset]);
@ -118,8 +121,7 @@ alias_builtin (list)
print_alias (t);
else
{
if (interactive)
builtin_error ("`%s' not found", name);
builtin_error ("`%s' not found", name);
any_failed++;
}
}
@ -179,9 +181,7 @@ unalias_builtin (list)
remove_alias (alias->name);
else
{
if (interactive)
builtin_error ("`%s': not an alias", list->word->word);
builtin_error ("`%s': not an alias", list->word->word);
aflag++;
}

View file

@ -161,6 +161,7 @@ reset_internal_getopt ()
sp = 1;
}
#ifdef INCLUDE_UNUSED
void
report_bad_option ()
{
@ -171,3 +172,4 @@ report_bad_option ()
s[2] = '\0';
bad_option (s);
}
#endif

View file

@ -26,7 +26,7 @@ $PRODUCES bind.c
$BUILTIN bind
$DEPENDS_ON READLINE
$FUNCTION bind_builtin
$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-r keyseq] [keyseq:readline-function]
$SHORT_DOC bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [keyseq:readline-function]
Bind a key sequence to a Readline function, or to a macro. The
syntax is equivalent to that found in ~/.inputrc, but must be
passed as a single argument: bind '"\C-x\C-r": re-read-init-file'.
@ -42,6 +42,7 @@ Arguments we accept:
-r keyseq Remove the binding for KEYSEQ.
-f filename Read key bindings from FILENAME.
-q function-name Query about which keys invoke the named function.
-u function-name Unbind all keys which are bound to the named function.
-V List variable names and values
-v List variable names and values in a form that can
be reused as input.
@ -53,6 +54,9 @@ $END
#if defined (READLINE)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -71,22 +75,24 @@ extern int errno;
#include "common.h"
static int query_bindings ();
static int unbind_command ();
extern int no_line_editing;
#define BIND_RETURN(x) do { return_code = x; goto bind_exit; } while (0)
#define LFLAG 0x01
#define PFLAG 0x02
#define FFLAG 0x04
#define VFLAG 0x08
#define QFLAG 0x10
#define MFLAG 0x20
#define RFLAG 0x40
#define PPFLAG 0x80
#define VVFLAG 0x100
#define SFLAG 0x200
#define SSFLAG 0x400
#define LFLAG 0x0001
#define PFLAG 0x0002
#define FFLAG 0x0004
#define VFLAG 0x0008
#define QFLAG 0x0010
#define MFLAG 0x0020
#define RFLAG 0x0040
#define PPFLAG 0x0080
#define VVFLAG 0x0100
#define SFLAG 0x0200
#define SSFLAG 0x0400
#define UFLAG 0x0800
int
bind_builtin (list)
@ -96,14 +102,14 @@ bind_builtin (list)
FILE *old_rl_outstream;
Keymap kmap, saved_keymap;
int flags, opt;
char *initfile, *map_name, *fun_name, *remove_seq;
char *initfile, *map_name, *fun_name, *unbind_name, *remove_seq;
if (no_line_editing)
return (EXECUTION_FAILURE);
kmap = saved_keymap = (Keymap) NULL;
flags = 0;
initfile = map_name = fun_name = remove_seq = (char *)NULL;
initfile = map_name = fun_name = unbind_name = remove_seq = (char *)NULL;
return_code = EXECUTION_SUCCESS;
if (!bash_readline_initialized)
@ -116,7 +122,7 @@ bind_builtin (list)
rl_outstream = stdout;
reset_internal_getopt ();
while ((opt = internal_getopt (list, "lvpVPsSf:q:m:r:")) != EOF)
while ((opt = internal_getopt (list, "lvpVPsSf:q:u:m:r:")) != EOF)
{
switch (opt)
{
@ -141,6 +147,10 @@ bind_builtin (list)
flags |= QFLAG;
fun_name = list_optarg;
break;
case 'u':
flags |= UFLAG;
unbind_name = list_optarg;
break;
case 'r':
flags |= RFLAG;
remove_seq = list_optarg;
@ -220,6 +230,9 @@ bind_builtin (list)
if ((flags & QFLAG) && fun_name)
return_code = query_bindings (fun_name);
if ((flags & UFLAG) && unbind_name)
return_code = unbind_command (unbind_name);
if ((flags & RFLAG) && remove_seq)
{
if (rl_set_key (remove_seq, (Function *)NULL, rl_get_keymap ()) != 0)
@ -253,7 +266,7 @@ query_bindings (name)
int j;
function = rl_named_function (name);
if (!function)
if (function == 0)
{
builtin_error ("unknown function name `%s'", name);
return EXECUTION_FAILURE;
@ -275,4 +288,21 @@ query_bindings (name)
free_array (keyseqs);
return EXECUTION_SUCCESS;
}
static int
unbind_command (name)
char *name;
{
Function *function;
function = rl_named_function (name);
if (function == 0)
{
builtin_error ("unknown function name `%s'", name);
return EXECUTION_FAILURE;
}
rl_unbind_function_in_map (function, rl_get_keymap ());
return EXECUTION_SUCCESS;
}
#endif /* READLINE */

View file

@ -30,7 +30,10 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
#include <unistd.h>
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include "../shell.h"

View file

@ -31,6 +31,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -23,13 +23,18 @@ $PRODUCES cd.c
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include "../bashtypes.h"
#include "../posixdir.h"
#include "../posixstat.h"
#ifndef _MINIX
#include <sys/param.h>
#endif
#include <stdio.h>
@ -66,11 +71,11 @@ $BUILTIN cd
$FUNCTION cd_builtin
$SHORT_DOC cd [-PL] [dir]
Change the current directory to DIR. The variable $HOME is the
default DIR. The variable $CDPATH defines the search path for
default DIR. The variable CDPATH defines the search path for
the directory containing DIR. Alternative directory names in CDPATH
are separated by a colon (:). A null directory name is the same as
the current directory, i.e. `.'. If DIR begins with a slash (/),
then $CDPATH is not used. If the directory is not found, and the
then CDPATH is not used. If the directory is not found, and the
shell option `cdable_vars' is set, then try the word as a variable
name. If that variable has a value, then cd to the value of that
variable. The -P option says to use the physical directory structure
@ -146,9 +151,10 @@ bindpwd (no_symlinks)
needing a remake. */
if (old_anm == 0 && array_needs_making && exported_p (tvar))
{
pwdvar = xmalloc (strlen (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */
pwdvar = xmalloc (STRLEN (dirname) + 5); /* 5 = "PWD" + '=' + '\0' */
strcpy (pwdvar, "PWD=");
strcpy (pwdvar + 4, dirname);
if (dirname)
strcpy (pwdvar + 4, dirname);
add_or_supercede_exported_var (pwdvar, 0);
array_needs_making = 0;
}
@ -226,6 +232,8 @@ cd_builtin (list)
builtin_error ("%s: %s", dirname, strerror (errno));
return (EXECUTION_FAILURE);
}
if (interactive)
printf ("%s\n", dirname);
}
else
{
@ -237,6 +245,8 @@ cd_builtin (list)
path_index = 0;
while ((path = extract_colon_unit (cdpath, &path_index)))
{
/* OPT is 1 if the path element is non-empty */
opt = path[0] != '\0';
temp = mkpath (path, dirname, 1);
free (path);
@ -248,17 +258,30 @@ cd_builtin (list)
if (change_to_directory (temp, no_symlinks))
{
if (temp[0] != '.' || temp[1] != '/')
printf ("%s\n", temp);
/* POSIX.2 says that if a nonempty directory from CDPATH
is used to find the directory to change to, the new
directory name is echoed to stdout, whether or not
the shell is interactive. */
if (opt)
printf ("%s\n", the_current_working_directory);
free (temp);
/* Posix.2 says that after using CDPATH, the resultant
value of $PWD will not contain symlinks. */
return (bindpwd (posixly_correct));
return (bindpwd (posixly_correct || no_symlinks));
}
else
free (temp);
}
/* POSIX.2 says that if `.' does not appear in $CDPATH, we don't
try the current directory, so we just punt now with an error
message if POSIXLY_CORRECT is non-zero. */
if (posixly_correct)
{
builtin_error ("%s: %s", dirname, strerror (ENOENT));
return (EXECUTION_FAILURE);
}
}
if (change_to_directory (dirname, no_symlinks))

View file

@ -35,6 +35,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -179,11 +182,16 @@ get_standard_path ()
size_t len;
len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0);
p = xmalloc ((int)len + 2);
*p = '\0';
confstr (_CS_PATH, p, len);
return (p);
#else /* !_CSPATH || !HAVE_CONFSTR */
if (len > 0)
{
p = xmalloc ((int)len + 2);
*p = '\0';
confstr (_CS_PATH, p, len);
return (p);
}
else
return (savestring (STANDARD_UTILS_PATH));
#else /* !_CS_PATH || !HAVE_CONFSTR */
# if defined (CS_PATH)
return (savestring (CS_PATH));
# else

View file

@ -19,6 +19,9 @@
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -27,6 +30,8 @@
#include "../posixstat.h"
#include <signal.h>
#include <errno.h>
#if defined (PREFER_STDARG)
# include <stdarg.h>
#else
@ -54,6 +59,10 @@
# include "../bashhist.h"
#endif
#if !defined (errno)
extern int errno;
#endif /* !errno */
extern int no_symbolic_links, interactive, interactive_shell;
extern int indirection_level, startup_state, subshell_environment;
extern int line_number;
@ -399,11 +408,12 @@ get_working_directory (for_whom)
directory = getcwd (the_current_working_directory, PATH_MAX);
if (directory == 0)
{
fprintf (stderr, "%s: could not get current directory: %s\n",
fprintf (stderr, "%s: could not get current directory: %s: %s\n",
(for_whom && *for_whom) ? for_whom : get_name_for_error (),
the_current_working_directory[0]
? the_current_working_directory
: bash_getcwd_errstr);
: bash_getcwd_errstr,
strerror (errno));
free (the_current_working_directory);
the_current_working_directory = (char *)NULL;
@ -691,8 +701,13 @@ shell_builtin_compare (sbp1, sbp2)
void
initialize_shell_builtins ()
{
#ifdef _MINIX
qsort (shell_builtins, num_shell_builtins, sizeof (struct builtin),
(int (*)(const void *, const void *))shell_builtin_compare);
#else
qsort (shell_builtins, num_shell_builtins, sizeof (struct builtin),
shell_builtin_compare);
#endif
}
/* **************************************************************** */
@ -791,10 +806,14 @@ backslash_quote (string)
*r++ = '\\';
*r++ = c;
break;
case '#': /* comment char */
#if 0
case '~': /* tilde expansion */
if (s == string || s[-1] == '=' || s[-1] == ':')
*r++ = '\\';
*r++ = c;
break;
#endif
case '#': /* comment char */
if (s == string)
*r++ = '\\';
/* FALLTHROUGH */
@ -827,6 +846,9 @@ contains_shell_metas (string)
case '^':
case '$': case '`': /* expansion chars */
return (1);
case '~': /* tilde expansion */
if (s == string || s[-1] == '=' || s[-1] == ':')
return (1);
case '#':
if (s == string) /* comment char */
return (1);

View file

@ -30,77 +30,79 @@
#define SEVAL_INTERACT 0x02
#define SEVAL_NOHIST 0x04
/* Functions from common.c */
extern void builtin_error __P((const char *, ...));
extern void builtin_usage ();
extern void bad_option ();
extern void builtin_usage __P((void));
extern void no_args __P((WORD_LIST *));
extern void bad_option __P((char *));
extern int no_options __P((WORD_LIST *));
extern char **make_builtin_argv ();
extern char **make_builtin_argv __P((WORD_LIST *, int *));
extern void remember_args __P((WORD_LIST *, int));
extern int get_numeric_arg ();
extern void remember_args ();
extern void no_args ();
extern int no_options ();
extern void push_context __P((void));
extern void pop_context __P((void));
extern void push_dollar_vars __P((void));
extern void pop_dollar_vars __P((void));
extern void dispose_saved_dollar_vars __P((void));
extern int dollar_vars_changed __P((void));
extern void set_dollar_vars_unchanged __P((void));
extern void set_dollar_vars_changed __P((void));
extern int read_octal ();
extern void push_context (), pop_context ();
extern void push_dollar_vars (), pop_dollar_vars ();
extern void dispose_saved_dollar_vars ();
extern int dollar_vars_changed ();
extern void set_dollar_vars_unchanged (), set_dollar_vars_changed ();
extern int get_numeric_arg __P((WORD_LIST *, int));
extern int read_octal __P((char *));
/* Keeps track of the current working directory. */
extern char *the_current_working_directory;
extern char *get_working_directory ();
extern void set_working_directory ();
extern char *get_working_directory __P((char *));
extern void set_working_directory __P((char *));
#if defined (JOB_CONTROL)
extern int get_job_spec ();
extern int get_job_spec __P((WORD_LIST *));
#endif
extern int display_signal_list ();
extern int display_signal_list __P((WORD_LIST *, int));
/* It's OK to declare a function as returning a Function * without
providing a definition of what a `Function' is. */
extern struct builtin *builtin_address_internal ();
extern Function *find_shell_builtin ();
extern Function *builtin_address ();
extern Function *find_special_builtin ();
extern struct builtin *builtin_address_internal __P((char *, int));
extern Function *find_shell_builtin __P((char *));
extern Function *builtin_address __P((char *));
extern Function *find_special_builtin __P((char *));
extern void initialize_shell_builtins __P((void));
extern void initialize_shell_builtins ();
extern char *single_quote ();
extern char *double_quote ();
extern char *backslash_quote ();
extern int contains_shell_metas ();
extern char *single_quote __P((char *));
extern char *double_quote __P((char *));
extern char *backslash_quote __P((char *));
extern int contains_shell_metas __P((char *));
/* Functions from set.def */
extern void initialize_shell_options ();
extern void list_minus_o_opts ();
extern int set_minus_o_option ();
extern int minus_o_option_value ();
extern void reset_shell_options ();
extern void initialize_shell_options __P((int));
extern void list_minus_o_opts __P((int, int));
extern int set_minus_o_option __P((int, char *));
extern int minus_o_option_value __P((char *));
extern void reset_shell_options __P((void));
/* Functions from shopt.def */
extern void reset_shopt_options ();
extern void reset_shopt_options __P((void));
/* Functions from type.def */
extern int describe_command ();
extern int describe_command __P((char *, int, int));
/* Functions from setattr.def */
extern int set_or_show_attributes ();
extern int show_var_attributes ();
extern int show_name_attributes ();
extern void set_var_attribute ();
extern int set_or_show_attributes __P((WORD_LIST *, int, int));
extern int show_var_attributes __P((SHELL_VAR *, int, int));
extern int show_name_attributes __P((char *, int));
extern void set_var_attribute __P((char *, int, int));
/* Functions from pushd.def */
extern char *get_dirstack_element ();
extern void set_dirstack_element ();
extern WORD_LIST *get_directory_stack ();
extern char *get_dirstack_from_string __P((char *));
extern char *get_dirstack_element __P((int, int));
extern void set_dirstack_element __P((int, int, char *));
extern WORD_LIST *get_directory_stack __P((void));
/* Functions from evalstring.c */
extern int parse_and_execute ();
extern void parse_and_execute_cleanup ();
extern int parse_and_execute __P((char *, char *, int));
extern void parse_and_execute_cleanup __P((void));
/* Functions from evalfile.c */
extern int maybe_execute_file __P((char *, int));

View file

@ -57,6 +57,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -377,6 +380,18 @@ declare_internal (list, local_var)
FREE (var->value);
var->value = t;
}
/* If we found this variable in the temporary environment, as with
`var=value declare -x var', make sure it is treated identically
to `var=value export var'. Do the same for `declare -r' and
`readonly'. Preserve the attributes, except for att_tempvar. */
if ((flags_on & (att_exported|att_readonly)) && tempvar_p (var))
{
SHELL_VAR *tv;
tv = bind_variable (var->name, var->value ? var->value : "");
tv->attributes = var->attributes & ~att_tempvar;
dispose_variable (var);
}
}
stupidly_hack_special_variables (name);

View file

@ -42,6 +42,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -29,7 +29,10 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
#include <unistd.h>
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include "../shell.h"

View file

@ -75,6 +75,7 @@ _evalfile (filename, flags)
int return_val, fd, result, pflags;
char *string;
struct stat finfo;
size_t file_size;
VFunction *errfunc;
fd = open (filename, O_RDONLY);
@ -108,20 +109,33 @@ file_error_and_exit:
return ((flags & FEVAL_BUILTIN) ? EXECUTION_FAILURE : -1);
}
string = xmalloc (1 + (int)finfo.st_size);
result = read (fd, string, finfo.st_size);
file_size = (size_t)finfo.st_size;
/* Check for overflow with large files. */
if (file_size != finfo.st_size || file_size + 1 < file_size)
{
(*errfunc) ("%s: file is too large", filename);
return ((flags & FEVAL_BUILTIN) ? EXECUTION_FAILURE : -1);
}
string = xmalloc (1 + file_size);
result = read (fd, string, file_size);
string[result] = '\0';
return_val = errno;
close (fd);
errno = return_val;
if (result != (int)finfo.st_size)
if (result < 0) /* XXX was != file_size, not < 0 */
{
free (string);
goto file_error_and_exit;
}
if (result == 0)
{
free (string);
return ((flags & FEVAL_BUILTIN) ? EXECUTION_SUCCESS : 1);
}
if (check_binary_file ((unsigned char *)string, (result > 80) ? 80 : result))
{
free (string);

View file

@ -19,12 +19,18 @@
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include "../filecntl.h"
#include "../bashansi.h"
#include "../shell.h"
@ -33,6 +39,7 @@
#include "../flags.h"
#include "../input.h"
#include "../execute_cmd.h"
#include "../redir.h"
#if defined (HISTORY)
# include "../bashhist.h"
@ -40,6 +47,10 @@
#include "common.h"
#if !defined (errno)
extern int errno;
#endif
extern void run_trap_cleanup ();
extern int interactive, interactive_shell;
@ -47,10 +58,13 @@ extern int indirection_level, startup_state, subshell_environment;
extern int line_number;
extern int last_command_exit_value;
extern int running_trap;
extern int posixly_correct;
extern COMMAND *global_command;
int parse_and_execute_level = 0;
static int cat_file ();
/* How to force parse_and_execute () to clean up after itself. */
void
parse_and_execute_cleanup ()
@ -202,7 +216,23 @@ parse_and_execute (string, from_file, flags)
}
#endif /* ONESHOT */
last_result = execute_command_internal
/* See if this is a candidate for $( <file ). */
if (startup_state == 2 &&
subshell_environment == SUBSHELL_COMSUB &&
*bash_input.location.string == '\0' &&
command->type == cm_simple && !command->redirects &&
(command->flags & CMD_TIME_PIPELINE) == 0 &&
command->value.Simple->words == 0 &&
command->value.Simple->redirects &&
command->value.Simple->redirects->next == 0 &&
command->value.Simple->redirects->instruction == r_input_direction)
{
int r;
r = cat_file (command->value.Simple->redirects);
last_result = (r < 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
}
else
last_result = execute_command_internal
(command, 0, NO_PIPE, NO_PIPE, bitmap);
dispose_command (command);
@ -238,3 +268,94 @@ parse_and_execute (string, from_file, flags)
return (last_result);
}
/* Write NB bytes from BUF to file descriptor FD, retrying the write if
it is interrupted. We retry three times if we get a zero-length
write. Any other signal causes this function to return prematurely. */
static int
zwrite (fd, buf, nb)
int fd;
unsigned char *buf;
int nb;
{
int n, i, nt;
for (n = nb, nt = 0;;)
{
i = write (fd, buf, n);
if (i > 0)
{
n -= i;
if (n <= 0)
return nb;
}
else if (i == 0)
{
if (++nt > 3)
return (nb - n);
}
else if (errno != EINTR)
return -1;
}
}
/* Handle a $( < file ) command substitution. This expands the filename,
returning errors as appropriate, then just cats the file to the standard
output. */
static int
cat_file (r)
REDIRECT *r;
{
char lbuf[128], *fn;
int nr, fd, rval;
if (r->instruction != r_input_direction)
return -1;
/* Get the filename. */
if (posixly_correct && !interactive_shell)
disallow_filename_globbing++;
fn = redirection_expand (r->redirectee.filename);
if (posixly_correct && !interactive_shell)
disallow_filename_globbing--;
if (fn == 0)
{
redirection_error (r, AMBIGUOUS_REDIRECT);
return -1;
}
fd = open(fn, O_RDONLY);
if (fd < 0)
{
file_error (fn);
free (fn);
return -1;
}
rval = 0;
while (1)
{
/* Retry the reads on EINTR. Any other error causes a break from the
loop. */
while ((nr = read (fd, lbuf, sizeof(lbuf))) < 0 && errno == EINTR)
;
if (nr == 0)
break;
else if (nr < 0)
{
rval = -1;
break;
}
if (zwrite (1, lbuf, nr) < 0)
{
rval = -1;
break;
}
}
free (fn);
close (fd);
return (0);
}

View file

@ -49,6 +49,7 @@ $END
#include "../shell.h"
#include "../execute_cmd.h"
#include "../findcmd.h"
#if defined (JOB_CONTROL)
# include "../jobs.h"
#endif

View file

@ -75,7 +75,7 @@ int
logout_builtin (list)
WORD_LIST *list;
{
if (login_shell == 0 && interactive)
if (login_shell == 0 /* && interactive */)
{
builtin_error ("not login shell: use `exit'");
return (EXECUTION_FAILURE);

View file

@ -49,10 +49,14 @@ $END
#include <config.h>
#if defined (HISTORY)
#include <sys/param.h>
#ifndef _MINIX
# include <sys/param.h>
#endif
#include "../bashtypes.h"
#include "../posixstat.h"
#include <sys/file.h>
#ifndef _MINIX
# include <sys/file.h>
#endif
#if defined (HAVE_UNISTD_H)
# include <unistd.h>

View file

@ -20,6 +20,9 @@
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -61,6 +61,9 @@ $END
#include <stdio.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -35,6 +35,8 @@ $END
#include <stdio.h>
#include "../bashtypes.h"
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
@ -43,8 +45,8 @@ $END
#include "../shell.h"
#include "../builtins.h"
#include "../execute_cmd.h"
#include "../flags.h"
#include "../findcmd.h"
#include "../hashcmd.h"
#include "common.h"
#include "bashgetopt.h"
@ -63,7 +65,7 @@ hash_builtin (list)
WORD_LIST *list;
{
int expunge_hash_table, opt;
char *word, *pathname;
char *w, *pathname;
if (hashing_enabled == 0)
{
@ -107,12 +109,12 @@ hash_builtin (list)
for (opt = EXECUTION_SUCCESS; list; list = list->next)
{
/* Add or rehash the specified commands. */
word = list->word->word;
w = list->word->word;
if (pathname)
remember_filename (word, pathname, 0, 0);
else if (absolute_program (word))
remember_filename (w, pathname, 0, 0);
else if (absolute_program (w))
continue;
else if (add_hashed_command (word, 0))
else if (add_hashed_command (w, 0))
opt = EXECUTION_FAILURE;
}
@ -121,23 +123,23 @@ hash_builtin (list)
}
static int
add_hashed_command (word, quiet)
char *word;
add_hashed_command (w, quiet)
char *w;
int quiet;
{
int rv;
char *full_path;
rv = 0;
if (find_function (word) == 0 && find_shell_builtin (word) == 0)
if (find_function (w) == 0 && find_shell_builtin (w) == 0)
{
full_path = find_user_command (word);
full_path = find_user_command (w);
if (full_path && executable_file (full_path))
remember_filename (word, full_path, dot_found_in_search, 0);
remember_filename (w, full_path, dot_found_in_search, 0);
else
{
if (quiet == 0)
builtin_error ("%s: not found", word);
builtin_error ("%s: not found", w);
rv++;
}
if (full_path)

View file

@ -36,11 +36,15 @@ $END
#include <stdio.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include "../shell.h"
#include "../builtins.h"
#include "../pathexp.h"
#include "bashgetopt.h"
#include <glob/fnmatch.h>
@ -100,7 +104,7 @@ help_builtin (list)
{
QUIT;
if ((strncmp (pattern, name, plen) == 0) ||
(fnmatch (pattern, name, 0) != FNM_NOMATCH))
(fnmatch (pattern, name, FNMATCH_EXTFLAG) != FNM_NOMATCH))
{
printf ("%s: %s\n", name, shell_builtins[i].short_doc);

View file

@ -46,7 +46,9 @@ $END
#if defined (HISTORY)
#include "../bashtypes.h"
#include <sys/file.h>
#ifndef _MINIX
# include <sys/file.h>
#endif
#include "../posixstat.h"
#include "../filecntl.h"
#include <errno.h>

View file

@ -205,11 +205,12 @@ execute_list_with_replacements (list)
$BUILTIN disown
$FUNCTION disown_builtin
$DEPENDS_ON JOB_CONTROL
$SHORT_DOC disown [-h] [jobspec ...]
$SHORT_DOC disown [-h] [-ar] [jobspec ...]
By default, removes each JOBSPEC argument from the table of active jobs.
If the -h option is given, the job is not removed from the table, but is
marked so that SIGHUP is not sent to the job if the shell receives a
SIGHUP.
SIGHUP. The -a option, when JOBSPEC is not supplied, means to remove all
jobs from the job table; the -r option means to remove only running jobs.
$END
#if defined (JOB_CONTROL)
@ -217,18 +218,24 @@ int
disown_builtin (list)
WORD_LIST *list;
{
int opt, job, retval, nohup_only;
int opt, job, retval, nohup_only, running_jobs, all_jobs;
sigset_t set, oset;
nohup_only = 0;
nohup_only = running_jobs = all_jobs = 0;
reset_internal_getopt ();
while ((opt = internal_getopt (list, "h")) != -1)
while ((opt = internal_getopt (list, "ahr")) != -1)
{
switch (opt)
{
case 'a':
all_jobs = 1;
break;
case 'h':
nohup_only = 1;
break;
case 'r':
running_jobs = 1;
break;
default:
builtin_usage ();
return (EX_USAGE);
@ -237,17 +244,15 @@ disown_builtin (list)
list = loptend;
retval = EXECUTION_SUCCESS;
#if 0
/* For the future `disown -a' */
if (list == 0)
/* `disown -a' or `disown -r' */
if (list == 0 && (all_jobs || running_jobs))
{
if (nohup_only)
nohup_all_jobs ();
nohup_all_jobs (running_jobs);
else
delete_all_jobs ();
delete_all_jobs (running_jobs);
return (EXECUTION_SUCCESS);
}
#endif
do
{
@ -256,7 +261,7 @@ disown_builtin (list)
? get_job_by_pid (atoi(list->word->word), 0)
: get_job_spec (list);
if (job == NO_JOB || jobs == 0 || jobs[job] == 0)
if (job == NO_JOB || jobs == 0 || job < 0 || job >= job_slots || jobs[job] == 0)
{
builtin_error ("%s: no such job", list ? list->word->word : "current");
retval = EXECUTION_FAILURE;
@ -264,7 +269,7 @@ disown_builtin (list)
else if (nohup_only)
nohup_job (job);
else
delete_job (job);
delete_job (job, 1);
UNBLOCK_CHILD (oset);
if (list)

View file

@ -39,6 +39,9 @@ $END
#include <stdio.h>
#include <errno.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -77,7 +80,10 @@ kill_builtin (list)
pid_t pid;
if (list == 0)
return (EXECUTION_SUCCESS);
{
builtin_usage ();
return (EXECUTION_FAILURE);
}
any_succeeded = listing = saw_signal = 0;
signal = SIGTERM;
@ -145,6 +151,12 @@ kill_builtin (list)
return (EXECUTION_FAILURE);
}
if (list == 0)
{
builtin_usage ();
return (EXECUTION_FAILURE);
}
while (list)
{
word = list->word->word;
@ -152,7 +164,7 @@ kill_builtin (list)
if (*word == '-')
word++;
if (all_digits (word))
if (*word && all_digits (word))
{
/* Use the entire argument in case of minus sign presence. */
pid = (pid_t) atoi (list->word->word);
@ -162,12 +174,12 @@ kill_builtin (list)
else
any_succeeded++;
}
else if (*list->word->word != '%')
else if (*list->word->word && *list->word->word != '%')
{
builtin_error ("%s: no such pid", list->word->word);
CONTINUE_OR_FAIL;
}
else if (interactive || job_control)
else if (*word && (interactive || job_control))
/* Posix.2 says you can kill without job control active (4.32.4) */
{ /* Must be a job spec. Check it out. */
int job;
@ -208,7 +220,7 @@ kill_builtin (list)
}
else
{
builtin_error ("`%s' is not a pid or valid job spec", list->word->word);
builtin_error ("`%s': not a pid or valid job spec", list->word->word);
CONTINUE_OR_FAIL;
}
continue_killing:

View file

@ -63,6 +63,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -22,18 +22,20 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#ifndef _MINIX
#include "../bashtypes.h"
#include <sys/file.h>
#endif
#include "../posixstat.h"
#include "../filecntl.h"
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#include "../bashansi.h"
#include <stdio.h>
@ -437,8 +439,9 @@ extract_info (filename, structfile, externfile)
register int i;
DEF_FILE *defs;
struct stat finfo;
size_t file_size;
char *buffer, *line;
int fd;
int fd, nr;
if (stat (filename, &finfo) == -1)
file_error (filename);
@ -448,13 +451,20 @@ extract_info (filename, structfile, externfile)
if (fd == -1)
file_error (filename);
buffer = xmalloc (1 + (int)finfo.st_size);
file_size = (size_t)finfo.st_size;
buffer = xmalloc (1 + file_size);
if (read (fd, buffer, finfo.st_size) != finfo.st_size)
if ((nr = read (fd, buffer, file_size)) < 0)
file_error (filename);
close (fd);
if (nr == 0)
{
fprintf (stderr, "mkbuiltins: %s: skipping zero-length file\n", filename);
return;
}
/* Create and fill in the initial structure describing this file. */
defs = (DEF_FILE *)xmalloc (sizeof (DEF_FILE));
defs->filename = filename;
@ -466,11 +476,11 @@ extract_info (filename, structfile, externfile)
/* Build the array of lines. */
i = 0;
while (i < finfo.st_size)
while (i < file_size)
{
array_add (&buffer[i], defs->lines);
while (buffer[i] != '\n' && i < finfo.st_size)
while (buffer[i] != '\n' && i < file_size)
i++;
buffer[i++] = '\0';
}
@ -676,7 +686,10 @@ current_builtin (directive, defs)
DEF_FILE *defs;
{
must_be_building (directive, defs);
return ((BUILTIN_DESC *)defs->builtins->array[defs->builtins->sindex - 1]);
if (defs->builtins)
return ((BUILTIN_DESC *)defs->builtins->array[defs->builtins->sindex - 1]);
else
return ((BUILTIN_DESC *)NULL);
}
/* Add LINE to the long documentation for the current builtin.
@ -756,6 +769,11 @@ function_handler (self, defs, arg)
builtin = current_builtin (self, defs);
if (builtin == 0)
{
line_error (defs, "syntax error: no current builtin for $FUNCTION directive");
exit (1);
}
if (builtin->function)
line_error (defs, "%s already has a function (%s)",
builtin->name, builtin->function);

693
builtins/printf.def Normal file
View file

@ -0,0 +1,693 @@
This file is printf.def, from which is created printf.c.
It implements the builtin "printf" in Bash.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any later
version.
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with Bash; see the file COPYING. If not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
$PRODUCES printf.c
$BUILTIN printf
$FUNCTION printf_builtin
$SHORT_DOC printf format [arguments]
printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT
is a character string which contains three types of objects: plain
characters, which are simply copied to standard output, character escape
sequences which are converted and copied to the standard output, and
format specifications, each of which causes printing of the next successive
argument. In addition to the standard printf(1) formats, %b means to
expand backslash escape sequences in the corresponding argument, and %q
means to quote the argument in a way that can be reused as shell input.
$END
#include <config.h>
#include "../bashtypes.h"
#include <errno.h>
#if defined (HAVE_LIMITS_H)
# include <limits.h>
#else
/* Assume 32-bit ints and longs. */
# define LONG_MAX 2147483647L
# define LONG_MIN (-2147483647L-1)
# define INT_MAX 2147483647
# define INT_MIN (-2147483647-1)
#endif
#include <stdio.h>
#include <ctype.h>
#include "../bashansi.h"
#include "../shell.h"
#include "../stdc.h"
#include "bashgetopt.h"
#if !defined (errno)
extern int errno;
#endif
#define PF(f, func) \
do { \
if (fieldwidth && precision) \
(void)printf(f, fieldwidth, precision, func); \
else if (fieldwidth && precision == 0) \
(void)printf(f, fieldwidth, func); \
else if (precision) \
(void)printf(f, precision, func); \
else \
(void)printf(f, func); \
} while (0)
#define PRETURN(value) \
do { free (format); fflush (stdout); return (value); } while (0)
#define SKIP1 "#-+ 0"
#define SKIP2 "*0123456789"
static void printstr __P((char *, char *, int, int, int));
static char *bexpand __P((char *, int, int *, int *));
static char *mklong __P((char *, int));
static int getchr __P((void));
static char *getstr __P((void));
static int getint __P((void));
static int getlong __P((long *));
static int getulong __P((unsigned long *));
static double getdouble __P((void));
static int asciicode __P((void));
static WORD_LIST *garglist;
static int retval;
extern char *backslash_quote ();
int
printf_builtin (list)
WORD_LIST *list;
{
int ch, end, fieldwidth, precision, foundmod;
char convch, nextch, *format, *fmt, *start;
retval = EXECUTION_SUCCESS;
reset_internal_getopt ();
while ((ch = internal_getopt (list, "")) != -1)
{
switch (ch)
{
case '?':
default:
builtin_usage();
return (EX_USAGE);
}
}
list = loptend;
if (list == 0)
{
builtin_usage ();
return (EX_USAGE);
}
if (list->word->word == 0 || list->word->word[0] == '\0')
return (EXECUTION_SUCCESS);
format = ansicstr (list->word->word, strlen (list->word->word), (int *)NULL, (int *)NULL);
garglist = list->next;
/* Basic algorithm is to scan the format string for conversion
specifications -- once one is found, find out if the field
width or precision is a '*'; if it is, gather up value. Note,
format strings are reused as necessary to use up the provided
arguments, arguments of zero/null string are provided to use
up the format string. */
do
{
/* find next format specification */
for (fmt = format; *fmt; fmt++)
{
precision = fieldwidth = foundmod = 0;
if (*fmt != '%')
{
putchar (*fmt);
continue;
}
/* ASSERT(*fmt == '%') */
start = fmt++;
if (*fmt == '%') /* %% prints a % */
{
putchar ('%');
continue;
}
/* found format specification, skip to field width */
for (; *fmt && strchr(SKIP1, *fmt); ++fmt)
;
fieldwidth = (*fmt == '*') ? getint () : 0;
/* skip to possible '.', get following precision */
for (; *fmt && strchr(SKIP2, *fmt); ++fmt)
;
if (*fmt == '.')
{
++fmt;
precision = (*fmt == '*') ? getint () : 0;
}
/* skip to conversion char */
for (; *fmt && strchr(SKIP2, *fmt); ++fmt)
;
if (*fmt == 0)
{
builtin_error ("`%s': missing format character", start);
PRETURN (EXECUTION_FAILURE);
}
/* skip possible format modifiers */
if (*fmt == 'l' || *fmt == 'L' || *fmt == 'h')
{
fmt++;
foundmod = 1;
}
convch = *fmt;
nextch = fmt[1];
fmt[1] = '\0';
switch(convch)
{
case 'c':
{
char p;
p = getchr ();
PF(start, p);
break;
}
case 's':
{
char *p;
p = getstr ();
PF(start, p);
break;
}
case 'b': /* expand escapes in argument */
{
char *p, *xp;
int rlen;
p = getstr ();
ch = rlen = 0;
xp = bexpand (p, strlen (p), &ch, &rlen);
if (xp)
{
/* Have to use printstr because of possible NUL bytes
in XP -- printf does not handle that well. */
printstr (start, xp, rlen, fieldwidth, precision);
free (xp);
}
if (ch)
PRETURN (retval);
break;
}
case 'q': /* print with shell quoting */
{
char *p, *xp;
p = getstr ();
xp = backslash_quote (p);
if (xp)
{
/* Use printstr to get fieldwidth and precision right. */
printstr (start, xp, strlen (xp), fieldwidth, precision);
free (xp);
}
break;
}
case 'd':
case 'i':
{
long p;
char *f;
if (foundmod == 0 && ((f = mklong (start, convch)) == NULL))
PRETURN (EXECUTION_FAILURE);
else
f = start;
if (getlong (&p))
PRETURN (EXECUTION_FAILURE);
PF(f, p);
break;
}
case 'o':
case 'u':
case 'x':
case 'X':
{
unsigned long p;
char *f;
if (foundmod == 0 && ((f = mklong (start, convch)) == NULL))
PRETURN (EXECUTION_FAILURE);
else
f = start;
if (getulong (&p))
PRETURN (EXECUTION_FAILURE);
PF (f, p);
break;
}
case 'e':
case 'E':
case 'f':
case 'g':
case 'G':
{
double p;
p = getdouble ();
PF(start, p);
break;
}
/* We output unrecognized format characters, but we print a
warning message and return a failure exit status. */
default:
builtin_error ("`%c': illegal format character", convch);
PRETURN (EXECUTION_FAILURE);
}
fmt[1] = nextch;
}
}
while (garglist);
PRETURN (retval);
}
/* We duplicate a lot of what printf(3) does here. */
static void
printstr (fmt, string, len, fieldwidth, precision)
char *fmt; /* format */
char *string; /* expanded string argument */
int len; /* length of expanded string */
int fieldwidth; /* argument for width of `*' */
int precision; /* argument for precision of `*' */
{
#if 0
char *s;
#endif
int padlen, nc, ljust, i;
int fw, pr; /* fieldwidth and precision */
if (string == 0 || *string == '\0')
return;
#if 0
s = fmt;
#endif
if (*fmt == '%')
fmt++;
ljust = fw = pr = 0;
/* skip flags */
while (*fmt == '#' || *fmt == '-' || *fmt == '+' || *fmt == ' ' || *fmt == '0')
{
if (*fmt == '-')
ljust = 1;
fmt++;
}
/* get fieldwidth, if present */
if (*fmt == '*')
{
fmt++;
fw = fieldwidth;
}
else if (isdigit (*fmt))
{
fw = *fmt++ - '0';
while (isdigit (*fmt))
fw = (fw * 10) + (*fmt++ - '0');
}
/* get precision, if present */
if (*fmt == '.')
{
fmt++;
if (*fmt == '*')
{
fmt++;
pr = precision;
}
else if (isdigit (*fmt))
{
pr = *fmt++ - '0';
while (isdigit (*fmt))
pr = (pr * 10) + (*fmt++ - '0');
}
}
#if 0
/* If we remove this, get rid of `s'. */
if (*fmt != 'b' && *fmt != 'q')
{
internal_error ("format parsing problem: %s", s);
fw = pr = 0;
}
#endif
/* chars from string to print */
nc = (pr > 0 && pr <= len) ? pr : len;
padlen = fw - nc;
if (padlen < 0)
padlen = 0;
if (ljust)
padlen = -padlen;
/* leading pad characters */
for (; padlen > 0; padlen--)
putchar (' ');
/* output NC characters from STRING */
for (i = 0; i < nc; i++)
putchar (string[i]);
/* output any necessary trailing padding */
for (; padlen < 0; padlen++)
putchar (' ');
}
/* Convert STRING by expanding the escape sequences specified by the
POSIX standard for printf's `%b' format string. If SAWC is non-null,
recognize `\c' and use that as a string terminator. If we see \c, set
*SAWC to 1 before returning. LEN is the length of STRING. */
#ifdef isoctal
#undef isoctal
#endif
#define isoctal(c) ((c) >= '0' && (c) <= '7')
#define OCTVALUE(c) ((c) - '0')
#ifndef isxdigit
# define isxdigit(c) (isdigit((c)) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
#endif
#define HEXVALUE(c) \
((c) >= 'a' && (c) <= 'f' ? (c)-'a'+10 : (c) >= 'A' && (c) <= 'F' ? (c)-'A'+10 : (c)-'0')
static char *
bexpand (string, len, sawc, lenp)
char *string;
int len, *sawc, *lenp;
{
int c, temp;
char *ret, *r, *s;
if (string == 0 || *string == '\0')
{
if (sawc)
*sawc = 0;
if (lenp)
*lenp = 0;
return ((char *)NULL);
}
ret = xmalloc (len + 1);
for (r = ret, s = string; s && *s; )
{
c = *s++;
if (c != '\\' || *s == '\0')
{
*r++ = c;
continue;
}
switch (c = *s++)
{
#if defined (__STDC__)
case 'a': c = '\a'; break;
#else
case 'a': c = '\007'; break;
#endif
case 'b': c = '\b'; break;
case 'e': c = '\033'; break; /* ESC -- non-ANSI */
case 'f': c = '\f'; break;
case 'n': c = '\n'; break;
case 'r': c = '\r'; break;
case 't': c = '\t'; break;
case 'v': c = '\v'; break;
/* %b octal constants are `\0' followed by one, two, or three
octal digits... */
case '0':
for (temp = 3, c = 0; isoctal (*s) && temp--; s++)
c = (c * 8) + OCTVALUE (*s);
break;
/* but, as an extension, the other echo-like octal escape
sequences are supported as well. */
case '1': case '2': case '3': case '4':
case '5': case '6': case '7':
for (temp = 2, c -= '0'; isoctal (*s) && temp--; s++)
c = (c * 8) + OCTVALUE (*s);
break;
/* And, as another extension, we allow \xNNN, where each N is a
hex digit. */
case 'x':
for (temp = 3, c = 0; isxdigit (*s) && temp--; s++)
c = (c * 16) + HEXVALUE (*s);
if (temp == 3)
{
builtin_error ("missing hex digit for \\x");
*r++ = '\\';
c = 'x';
}
break;
case '\\':
#if 0
case '\'': /* XXX */
case '"': /* XXX */
#endif
break;
case 'c':
if (sawc)
*sawc = 1;
*r = '\0';
if (lenp)
*lenp = r - ret;
return ret;
/* other backslash escapes are passed through unaltered */
default: *r++ = '\\'; break;
}
*r++ = c;
}
*r = '\0';
if (lenp)
*lenp = r - ret;
return ret;
}
static char *
mklong (str, ch)
char *str;
int ch;
{
static char copy[64];
int len;
len = strlen (str) + 2;
FASTCOPY (str, copy, len - 3);
copy[len - 3] = 'l';
copy[len - 2] = ch;
copy[len - 1] = '\0';
return (copy);
}
static int
getchr ()
{
int ret;
if (garglist == 0)
return ('\0');
ret = (int)garglist->word->word[0];
garglist = garglist->next;
return ret;
}
static char *
getstr ()
{
char *ret;
if (garglist == 0)
return ("");
ret = garglist->word->word;
garglist = garglist->next;
return ret;
}
static int
getint ()
{
long ret;
if (getlong (&ret))
return (0);
if (ret > INT_MAX)
{
builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
return (0);
}
return ((int)ret);
}
static int
getlong (lp)
long *lp;
{
long ret;
if (garglist == 0)
{
*lp = 0L;
return (0);
}
if (garglist->word->word[0] == '\'' || garglist->word->word[0] == '"')
{
*lp = (long)asciicode ();
return (0);
}
errno = 0;
/* legal_number does not currently detect overflow, but it should.
Someday it will. */
if (legal_number (garglist->word->word, &ret) == 0)
{
builtin_error ("%s: illegal number", garglist->word->word);
return (1);
}
else if (errno == ERANGE)
{
builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
return (1);
}
*lp = ret;
garglist = garglist->next;
return (0);
}
static int
getulong (ulp)
unsigned long *ulp;
{
unsigned long ret;
char *ep;
if (garglist == 0)
{
*ulp = (unsigned long)0;
return (0);
}
if (garglist->word->word[0] == '\'' || garglist->word->word[0] == '"')
{
*ulp = (unsigned long)asciicode ();
return (0);
}
errno = 0;
ret = strtoul (garglist->word->word, &ep, 0);
if (*ep)
{
builtin_error ("%s: illegal number", garglist->word->word);
return (1);
}
else if (errno == ERANGE)
{
builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
return (1);
}
*ulp = ret;
garglist = garglist->next;
return (0);
}
static double
getdouble ()
{
double ret;
if (garglist == 0)
return ((double)0);
if (garglist->word->word[0] == '\'' || garglist->word->word[0] == '"')
return ((double)asciicode ());
/* This should use strtod if it is available. */
ret = atof (garglist->word->word);
garglist = garglist->next;
return (ret);
}
/* NO check is needed for garglist here. */
static int
asciicode ()
{
register int ch;
ch = garglist->word->word[1];
garglist = garglist->next;
return (ch);
}

View file

@ -24,11 +24,16 @@
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include <stdio.h>
#ifndef _MINIX
#include "../bashtypes.h"
#endif
#include <signal.h>
#include <errno.h>

View file

@ -3,6 +3,12 @@
# psize.sh -- determine this system's pipe size, and write a define to
# pipesize.h so ulimit.c can use it.
TMPDIR=/tmp
TMPNAME=pipsize.$$
TMPFILE=$TMPDIR/$TMPNAME
trap 'rm -f $TMPFILE' 0 1 2 3 6 15
echo "/*"
echo " * pipesize.h"
echo " *"
@ -11,14 +17,20 @@ echo " * Do not edit!"
echo " */"
echo ""
./psize.aux 2>/tmp/pipesize | sleep 3
#
# Try to avoid tempfile races. We can't really check for the file's
# existance before we run psize.aux, because `test -e' is not portable,
# `test -h' (test for symlinks) is not portable, and `test -f' only
# checks for regular files
#
rm -f $TMPFILE
if [ -s /tmp/pipesize ]; then
echo "#define PIPESIZE `cat /tmp/pipesize`"
./psize.aux 2>$TMPFILE | sleep 3
if [ -s $TMPFILE ]; then
echo "#define PIPESIZE `cat $TMPFILE`"
else
echo "#define PIPESIZE 512"
fi
rm -f /tmp/pipesize
exit 0

View file

@ -95,9 +95,14 @@ $END
#if defined (PUSHD_AND_POPD)
#include <stdio.h>
#include <sys/param.h>
#ifndef _MINIX
# include <sys/param.h>
#endif
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -547,6 +552,34 @@ get_dirstack_index (ind, sign, indexp)
return (sign > 0 ? directory_list_offset - ind : ind);
}
/* Used by the tilde expansion code. */
char *
get_dirstack_from_string (string)
char *string;
{
int ind, sign, index_flag;
long i;
sign = 1;
if (*string == '-' || *string == '+')
{
sign = (*string == '-') ? -1 : 1;
string++;
}
if (legal_number (string, &i) == 0)
return ((char *)NULL);
index_flag = 0;
ind = get_dirstack_index (i, sign, &index_flag);
if (index_flag && (ind < 0 || ind > directory_list_offset))
return ((char *)NULL);
if (index_flag == 0 || (index_flag == 1 && ind == 0))
return (get_string_value ("PWD"));
else
return (pushd_directory_list[ind]);
}
#ifdef INCLUDE_UNUSED
char *
get_dirstack_element (ind, sign)
int ind, sign;
@ -557,6 +590,7 @@ get_dirstack_element (ind, sign)
return (i < 0 || i > directory_list_offset) ? (char *)NULL
: pushd_directory_list[i];
}
#endif
void
set_dirstack_element (ind, sign, value)

View file

@ -43,6 +43,9 @@ $END
#include <stdio.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -395,11 +398,13 @@ bind_read_variable (name, value)
#if defined (ARRAY_VARS)
if (valid_array_reference (name) == 0)
{
#if 0
if (legal_identifier (name) == 0)
{
builtin_error ("`%s': not a valid identifier", name);
return ((SHELL_VAR *)NULL);
}
#endif
return (bind_variable (name, value));
}
else

View file

@ -32,6 +32,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -24,6 +24,9 @@ $PRODUCES set.c
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -229,9 +232,20 @@ minus_o_option_value (name)
#define MINUS_O_FORMAT "%-15s\t%s\n"
static void
print_minus_o_option (name, value, pflag)
char *name;
int value, pflag;
{
if (pflag == 0)
printf (MINUS_O_FORMAT, name, value ? on : off);
else
printf ("set %co %s\n", value ? '-' : '+', name);
}
void
list_minus_o_opts (mode)
int mode;
list_minus_o_opts (mode, reusable)
int mode, reusable;
{
register int i;
int *on_or_off, value;
@ -242,33 +256,13 @@ list_minus_o_opts (mode)
if (on_or_off == FLAG_UNKNOWN)
on_or_off = &value;
if (mode == -1 || mode == *on_or_off)
printf (MINUS_O_FORMAT, o_options[i].name, *on_or_off ? on : off);
print_minus_o_option (o_options[i].name, *on_or_off, reusable);
}
for (i = 0; binary_o_options[i].name; i++)
{
value = GET_BINARY_O_OPTION_VALUE (i, binary_o_options[i].name);
if (mode == -1 || mode == value)
printf (MINUS_O_FORMAT, binary_o_options[i].name, value ? on : off);
}
}
static void
minus_o_option_commands ()
{
register int i;
int *on_or_off, value;
for (value = i = 0; o_options[i].name; i++)
{
on_or_off = find_flag (o_options[i].letter);
if (on_or_off == FLAG_UNKNOWN)
on_or_off = &value;
printf ("set %co %s\n", *on_or_off ? '-' : '+', o_options[i].name);
}
for (i = 0; binary_o_options[i].name; i++)
{
value = GET_BINARY_O_OPTION_VALUE (i, binary_o_options[i].name);
printf ("set %co %s\n", value ? '-' : '+', binary_o_options[i].name);
print_minus_o_option (binary_o_options[i].name, value, reusable);
}
}
@ -421,7 +415,7 @@ void
set_shellopts ()
{
char *value;
int vsize, i, vptr, *ip;
int vsize, i, vptr, *ip, exported;
SHELL_VAR *v;
for (vsize = i = 0; o_options[i].name; i++)
@ -458,10 +452,25 @@ set_shellopts ()
value[vptr] = '\0';
v = find_variable ("SHELLOPTS");
/* Turn off the read-only attribute so we can bind the new value, and
note whether or not the variable was exported. */
if (v)
v->attributes &= ~att_readonly;
{
v->attributes &= ~att_readonly;
exported = exported_p (v);
}
else
exported = 0;
v = bind_variable ("SHELLOPTS", value);
/* Turn the read-only attribute back on, and turn off the export attribute
if it was set implicitly by mark_modified_vars and SHELLOPTS was not
exported before we bound the new value. */
v->attributes |= att_readonly;
if (mark_modified_vars && exported == 0 && exported_p (v))
v->attributes &= ~att_exported;
free (value);
}
@ -482,20 +491,24 @@ parse_shellopts (value)
}
void
initialize_shell_options ()
initialize_shell_options (no_shellopts)
int no_shellopts;
{
char *temp;
SHELL_VAR *var;
var = find_variable ("SHELLOPTS");
/* set up any shell options we may have inherited. */
if (var && imported_p (var))
if (no_shellopts == 0)
{
temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
if (temp)
var = find_variable ("SHELLOPTS");
/* set up any shell options we may have inherited. */
if (var && imported_p (var))
{
parse_shellopts (temp);
free (temp);
temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
if (temp)
{
parse_shellopts (temp);
free (temp);
}
}
}
@ -607,10 +620,7 @@ set_builtin (list)
if (opt == 0)
{
if (on_or_off == '-')
list_minus_o_opts (-1);
else
minus_o_option_commands ();
list_minus_o_opts (-1, (on_or_off == '+'));
continue;
}
@ -619,10 +629,7 @@ set_builtin (list)
if (option_name == 0 || *option_name == '\0' ||
*option_name == '-' || *option_name == '+')
{
if (on_or_off == '-')
list_minus_o_opts (-1);
else
minus_o_option_commands ();
list_minus_o_opts (-1, (on_or_off == '+'));
continue;
}
list = list->next; /* Skip over option name. */
@ -730,7 +737,10 @@ unset_builtin (list)
}
#endif
if (legal_identifier (name) == 0)
/* Bash allows functions with names which are not valid identifiers
to be created when not in posix mode, so check only when in posix
mode when unsetting a function. */
if (((unset_function && posixly_correct) || !unset_function) && legal_identifier (name) == 0)
{
builtin_error ("`%s': not a valid identifier", name);
NEXT_VARIABLE ();

View file

@ -24,6 +24,9 @@ $PRODUCES setattr.c
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -339,6 +342,7 @@ show_name_attributes (name, nodefs)
int nodefs;
{
SHELL_VAR *var;
int ret;
var = find_tempenv_variable (name);
if (var == 0)
@ -347,6 +351,8 @@ show_name_attributes (name, nodefs)
if (var && invisible_p (var) == 0)
{
show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
if (tempvar_p (var))
dispose_variable (var);
return (0);
}
else

View file

@ -24,6 +24,9 @@ $PRODUCES shift.c
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -38,6 +38,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -59,6 +62,12 @@ extern int no_exit_on_failed_exec, print_shift_error;
extern int check_hashed_filenames, promptvars, interactive_comments;
extern int cdspelling, expand_aliases;
extern int check_window_size;
extern int glob_ignore_case;
extern int hup_on_exit;
#if defined (EXTENDED_GLOB)
extern int extended_glob;
#endif
#if defined (HISTORY)
extern int literal_history, command_oriented_history;
@ -89,6 +98,9 @@ static struct {
{ "dotglob", &glob_dot_filenames, (Function *)NULL },
{ "execfail", &no_exit_on_failed_exec, (Function *)NULL },
{ "expand_aliases", &expand_aliases, (Function *)NULL },
#if defined (EXTENDED_GLOB)
{ "extglob", &extended_glob, (Function *)NULL },
#endif
#if defined (READLINE)
{ "histreedit", &history_reediting, (Function *)NULL },
#endif
@ -99,11 +111,13 @@ static struct {
{ "histverify", &hist_verify, (Function *)NULL },
{ "hostcomplete", &perform_hostname_completion, (Function *)enable_hostname_completion },
#endif
{ "huponexit", &hup_on_exit, (Function *)NULL },
{ "interactive_comments", &interactive_comments, set_interactive_comments },
#if defined (HISTORY)
{ "lithist", &literal_history, (Function *)NULL },
#endif
{ "mailwarn", &mail_warning, (Function *)NULL },
{ "nocaseglob", &glob_ignore_case, (Function *)NULL },
{ "nullglob", &allow_null_glob_expansion, (Function *)NULL },
{ "promptvars", &promptvars, (Function *)NULL },
{ "shift_verbose", &print_shift_error, (Function *)NULL },
@ -166,17 +180,17 @@ shopt_builtin (list)
rval = EXECUTION_SUCCESS;
if ((flags & OFLAG) && ((flags & (SFLAG|UFLAG)) == 0)) /* shopt -o */
rval = list_shopt_o_options (list, flags & QFLAG);
rval = list_shopt_o_options (list, flags);
else if (list && (flags & OFLAG)) /* shopt -so args */
rval = set_shopt_o_options ((flags & SFLAG) ? FLAG_ON : FLAG_OFF, list, flags & QFLAG);
else if (flags & OFLAG) /* shopt -so */
rval = list_some_o_options ((flags & SFLAG) ? FLAG_ON : FLAG_OFF, flags & QFLAG);
rval = list_some_o_options ((flags & SFLAG) ? 1 : 0, flags);
else if (list && (flags & (SFLAG|UFLAG))) /* shopt -su args */
rval = toggle_shopts ((flags & SFLAG) ? SETOPT : UNSETOPT, list, flags & QFLAG);
else if ((flags & (SFLAG|UFLAG)) == 0) /* shopt [args] */
rval = list_shopts (list, flags & QFLAG);
rval = list_shopts (list, flags);
else /* shopt -su */
rval = list_some_shopts ((flags & SFLAG) ? SETOPT : UNSETOPT, flags & QFLAG);
rval = list_some_shopts ((flags & SFLAG) ? SETOPT : UNSETOPT, flags);
return (rval);
}
@ -192,6 +206,10 @@ reset_shopt_options ()
source_uses_path = promptvars = 1;
#if defined (EXTENDED_GLOB)
extended_glob = 0;
#endif
#if defined (HISTORY)
literal_history = force_append_history = 0;
command_oriented_history = 1;
@ -244,12 +262,23 @@ toggle_shopts (mode, list, quiet)
return (rval);
}
static int
print_shopt (name, val, flags)
char *name;
int val, flags;
{
if (flags & PFLAG)
printf ("shopt %s %s\n", val ? "-s" : "-u", name);
else
printf (OPTFMT, name, val ? on : off);
}
/* List the values of all or any of the `shopt' options. Returns 0 if
all were listed or all variables queried were on; 1 otherwise. */
static int
list_shopts (list, quiet)
list_shopts (list, flags)
WORD_LIST *list;
int quiet;
int flags;
{
WORD_LIST *l;
int i, val, rval;
@ -259,8 +288,8 @@ list_shopts (list, quiet)
for (i = 0; shopt_vars[i].name; i++)
{
val = *shopt_vars[i].value;
if (quiet == 0)
printf (OPTFMT, shopt_vars[i].name, val ? on : off);
if ((flags & QFLAG) == 0)
print_shopt (shopt_vars[i].name, val, flags);
}
return (EXECUTION_SUCCESS);
}
@ -277,39 +306,39 @@ list_shopts (list, quiet)
val = *shopt_vars[i].value;
if (val == 0)
rval = EXECUTION_FAILURE;
if (quiet == 0)
printf (OPTFMT, l->word->word, val ? on : off);
if ((flags & QFLAG) == 0)
print_shopt (l->word->word, val, flags);
}
return (rval);
}
static int
list_some_shopts (mode, quiet)
int mode, quiet;
list_some_shopts (mode, flags)
int mode, flags;
{
int val, i;
for (i = 0; shopt_vars[i].name; i++)
{
val = *shopt_vars[i].value;
if (quiet == 0 && mode == val)
printf (OPTFMT, shopt_vars[i].name, val ? on : off);
if (((flags & QFLAG) == 0) && mode == val)
print_shopt (shopt_vars[i].name, val, flags);
}
return (EXECUTION_SUCCESS);
}
static int
list_shopt_o_options (list, quiet)
list_shopt_o_options (list, flags)
WORD_LIST *list;
int quiet;
int flags;
{
WORD_LIST *l;
int val, rval;
if (list == 0)
{
if (quiet == 0)
list_minus_o_opts (-1);
if ((flags & QFLAG) == 0)
list_minus_o_opts (-1, (flags & PFLAG));
return (EXECUTION_SUCCESS);
}
@ -324,18 +353,23 @@ list_shopt_o_options (list, quiet)
}
if (val == 0)
rval = EXECUTION_FAILURE;
if (quiet == 0)
printf (OPTFMT, l->word->word, val ? "on" : "off");
if ((flags & QFLAG) == 0)
{
if (flags & PFLAG)
printf ("set %co %s\n", val ? '-' : '+', l->word->word);
else
printf (OPTFMT, l->word->word, val ? on : off);
}
}
return (rval);
}
static int
list_some_o_options (mode, quiet)
int mode, quiet;
list_some_o_options (mode, flags)
int mode, flags;
{
if (quiet == 0)
list_minus_o_opts (mode);
if ((flags & QFLAG) == 0)
list_minus_o_opts (mode, (flags & PFLAG));
return (EXECUTION_SUCCESS);
}

View file

@ -41,7 +41,9 @@ $END
#include "../bashtypes.h"
#include "../posixstat.h"
#include "../filecntl.h"
#include <sys/file.h>
#ifndef _MINIX
# include <sys/file.h>
#endif
#include <errno.h>
#if defined (HAVE_UNISTD_H)
@ -51,7 +53,7 @@ $END
#include "../bashansi.h"
#include "../shell.h"
#include "../execute_cmd.h"
#include "../findcmd.h"
#include "common.h"
#if !defined (errno)

View file

@ -34,6 +34,9 @@ $END
#if defined (JOB_CONTROL)
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -50,9 +50,10 @@ File operators:
-x FILE True if the file is executable by you.
-O FILE True if the file is effectively owned by you.
-G FILE True if the file is effectively owned by your group.
-N FILE True if the file has been modified since it was last read.
FILE1 -nt FILE2 True if file1 is newer than (according to
modification date) file2.
FILE1 -nt FILE2 True if file1 is newer than file2 (according to
modification date).
FILE1 -ot FILE2 True if file1 is older than file2.
@ -70,12 +71,13 @@ String operators:
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically
True if STRING1 sorts after STRING2 lexicographically.
Other operators:
-o OPTION True if the shell option OPTION is enabled.
! EXPR True if expr is false.
EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.
@ -99,12 +101,16 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
#include "../bashansi.h"
#include "../shell.h"
#include "../test.h"
#include "common.h"
extern char *this_command_name;

View file

@ -31,6 +31,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -53,7 +56,7 @@ $END
# include <sys/times.h>
#endif /* HAVE_SYS_TIMES_H */
#if defined (HAVE_SYS_RESOURCE_H)
#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
# include <sys/resource.h>
#endif

View file

@ -42,6 +42,9 @@ $END
#include <config.h>
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif

View file

@ -27,20 +27,18 @@ $SHORT_DOC type [-apt] name [name ...]
For each NAME, indicate how it would be interpreted if used as a
command name.
If the -t option is used, returns a single word which is one of
If the -t option is used, `type' outputs a single word which is one of
`alias', `keyword', `function', `builtin', `file' or `', if NAME is an
alias, shell reserved word, shell function, shell builtin, disk file,
or unfound, respectively.
If the -p flag is used, either returns the name of the disk file
that would be executed, or nothing if -t would not return `file'.
If the -p flag is used, `type' either returns the name of the disk
file that would be executed, or nothing if `type -t NAME' would not
return `file'.
If the -a flag is used, displays all of the places that contain an
executable named `file'. This includes aliases and functions, if and
only if the -p flag is not also used.
Type accepts -all, -path, and -type in place of -a, -p, and -t,
respectively.
If the -a flag is used, `type' displays all of the places that contain
an executable named `file'. This includes aliases and functions, if
and only if the -p flag is not also used.
$END
#include <config.h>
@ -56,7 +54,7 @@ $END
#include "../bashansi.h"
#include "../shell.h"
#include "../execute_cmd.h"
#include "../findcmd.h"
#include "../hashcmd.h"
#if defined (ALIAS)

View file

@ -23,7 +23,7 @@ $PRODUCES ulimit.c
$BUILTIN ulimit
$FUNCTION ulimit_builtin
$DEPENDS_ON !MINIX
$DEPENDS_ON !_MINIX
$SHORT_DOC ulimit [-SHacdflmnpstuv] [limit]
Ulimit provides control over the resources available to processes
started by the shell, on systems that allow such control. If an
@ -52,10 +52,14 @@ increments of 512 bytes, and -u, which is an unscaled number of
processes.
$END
#if !defined (_MINIX)
#include <config.h>
#include "../bashtypes.h"
#include <sys/param.h>
#ifndef _MINIX
# include <sys/param.h>
#endif
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
@ -101,7 +105,7 @@ extern int errno;
#if !defined (RLIMTYPE)
# define RLIMTYPE long
# define string_to_rlimtype string_to_long
# define string_to_rlimtype(s) strtol(s, (char **)NULL, 10)
# define print_rlimtype(num, nl) printf ("%ld%s", num, nl ? "\n" : "")
#endif
@ -597,7 +601,8 @@ printone (limind, curlim, pdesc)
if (curlim == RLIM_INFINITY)
puts ("unlimited");
else if (curlim == RLIM_INVALID)
printf ("cannot get limit: %s\n", strerror (errno));
builtin_error ("cannot get limit: %s\n", strerror (errno));
else
print_rlimtype ((curlim / limits[limind].block_factor), 1);
}
#endif /* !_MINIX */

View file

@ -23,19 +23,23 @@ $PRODUCES umask.c
$BUILTIN umask
$FUNCTION umask_builtin
$SHORT_DOC umask [-S] [mode]
$SHORT_DOC umask [-p] [-S] [mode]
The user file-creation mask is set to MODE. If MODE is omitted, or if
`-S' is supplied, the current value of the mask is printed. The `-S'
option makes the output symbolic; otherwise an octal number is output.
If MODE begins with a digit, it is interpreted as an octal number,
otherwise it is a symbolic mode string like that accepted by chmod(1).
If `-p' is supplied, and MODE is omitted, the output is in a form
that may be used as input. If MODE begins with a digit, it is
interpreted as an octal number, otherwise it is a symbolic mode string
like that accepted by chmod(1).
$END
#include <config.h>
#include "../bashtypes.h"
#include "../filecntl.h"
#include <sys/file.h>
#ifndef _MINIX
# include <sys/file.h>
#endif
#if defined (HAVE_UNISTD_H)
#include <unistd.h>
@ -63,18 +67,21 @@ int
umask_builtin (list)
WORD_LIST *list;
{
int print_symbolically, opt, umask_value;
int print_symbolically, opt, umask_value, pflag;
mode_t umask_arg;
print_symbolically = 0;
print_symbolically = pflag = 0;
reset_internal_getopt ();
while ((opt = internal_getopt (list, "S")) != -1)
while ((opt = internal_getopt (list, "Sp")) != -1)
{
switch (opt)
{
case 'S':
print_symbolically++;
break;
case 'p':
pflag++;
break;
default:
builtin_usage ();
return (EX_USAGE);
@ -116,6 +123,8 @@ umask_builtin (list)
umask_arg = umask (022);
umask (umask_arg);
if (pflag)
printf ("umask%s ", (print_symbolically ? " -S" : ""));
if (print_symbolically)
print_symbolic_umask (umask_arg);
else

View file

@ -136,6 +136,12 @@ wait_builtin (list)
UNBLOCK_CHILD (oset);
status = wait_for_job (job);
}
else if (job_control == 0 && *w == '%')
{
/* can't use jobspecs as arguments if job control is not active. */
builtin_error ("job control not enabled");
status = EXECUTION_FAILURE;
}
#endif /* JOB_CONTROL */
else
{

View file

@ -54,7 +54,8 @@ enum r_instruction {
/* Command Types: */
enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
cm_connection, cm_function_def, cm_until, cm_group };
cm_connection, cm_function_def, cm_until, cm_group,
cm_arith, cm_cond };
/* Possible values for the `flags' field of a WORD_DESC. */
#define W_HASDOLLAR 0x01 /* Dollar sign present. */
@ -142,6 +143,12 @@ typedef struct command {
struct group_com *Group;
#if defined (SELECT_COMMAND)
struct select_com *Select;
#endif
#if defined (DPAREN_ARITHMETIC)
struct arith_com *Arith;
#endif
#if defined (COND_COMMAND)
struct cond_com *Cond;
#endif
} value;
} COMMAND;
@ -207,6 +214,34 @@ typedef struct while_com {
COMMAND *action; /* Thing to do while test is non-zero. */
} WHILE_COM;
#if defined (DPAREN_ARITHMETIC)
/* The arithmetic evaluation command, ((...)). Just a set of flags and
a WORD_LIST, of which the first element is the only one used, for the
time being. */
typedef struct arith_com {
int flags;
WORD_LIST *exp;
int line;
} ARITH_COM;
#endif /* DPAREN_ARITHMETIC */
/* The conditional command, [[...]]. This is a binary tree -- we slippped
a recursive-descent parser into the YACC grammar to parse it. */
#define COND_AND 1
#define COND_OR 2
#define COND_UNARY 3
#define COND_BINARY 4
#define COND_TERM 5
#define COND_EXPR 6
typedef struct cond_com {
int flags;
int line;
int type;
WORD_DESC *op;
struct cond_com *left, *right;
} COND_COM;
/* The "simple" command. Just a collection of words and redirects. */
typedef struct simple_com {
int flags; /* See description of CMD flags. */
@ -218,7 +253,7 @@ typedef struct simple_com {
/* The "function definition" command. */
typedef struct function_def {
int ignore; /* See description of CMD flags. */
int flags; /* See description of CMD flags. */
WORD_DESC *name; /* The name of the function. */
COMMAND *command; /* The parsed execution tree. */
int line; /* Line number the function def starts on. */

View file

@ -110,6 +110,14 @@
evaluation command. */
#undef DPAREN_ARITHMETIC
/* Define EXTENDED_GLOB if you want the ksh-style [*+@?!](patlist) extended
pattern matching. */
#undef EXTENDED_GLOB
/* Define COND_COMMAND if you want the ksh-style [[...]] conditional
command. */
#undef COND_COMMAND
/* Define AFS if you are using Transarc's AFS. */
#undef AFS
@ -170,6 +178,15 @@
/* Define if on MINIX. */
#undef _MINIX
/* The number of bytes in a int. */
#undef SIZEOF_INT
/* The number of bytes in a long. */
#undef SIZEOF_LONG
/* The number of bytes in a pointer to char. */
#undef SIZEOF_CHAR_P
/* Define to `long' if <sys/types.h> doesn't define. */
#undef off_t
@ -182,6 +199,27 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef pid_t
/* Define to `int' if <sys/types.h> doesn't define. */
#undef int32_t
/* Define to `unsigned int' if <sys/types.h> doesn't define. */
#undef u_int32_t
/* Define to `int' if <sys/types.h> doesn't define. */
#undef ptrdiff_t
/* Define to `unsigned' if <sys/types.h> doesn't define. */
#undef size_t
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
/* Define to `long' if <sys/types.h> doesn't define. */
#undef clock_t
/* Define to `long' if <sys/types.h> doesn't define. */
#undef time_t
/* Define if the system does not provide POSIX.1 features except
with this defined. */
#undef _POSIX_1_SOURCE
@ -197,9 +235,6 @@
before release 3. */
#undef SETVBUF_REVERSED
/* Define to `unsigned' if <sys/types.h> doesn't define. */
#undef size_t
/* If using the C implementation of alloca, define if you know the
direction of stack growth for your system; otherwise it will be
automatically deduced at run-time.
@ -212,21 +247,12 @@
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define if `sys_siglist' is declared by <signal.h>. */
/* Define if `sys_siglist' is declared by <signal.h> or <unistd.h>. */
#undef SYS_SIGLIST_DECLARED
/* Define if `_sys_siglist' is declared by <signal.h> or <unistd.h>. */
#undef UNDER_SYS_SIGLIST_DECLARED
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
/* Define to `long' if <sys/types.h> doesn't define. */
#undef clock_t
/* Define to `long' if <sys/types.h> doesn't define. */
#undef time_t
#undef DUP2_BROKEN
#undef HAVE_GETRLIMIT
@ -307,6 +333,8 @@
#undef STRUCT_WINSIZE_IN_SYS_IOCTL
#undef STRUCT_WINSIZE_IN_TERMIOS
#undef SPEED_T_IN_SYS_TYPES
#undef CAN_REDEFINE_GETENV
@ -395,6 +423,15 @@
/* Define if you have the strerror function. */
#undef HAVE_STRERROR
/* Define if you have the strtod function. */
#undef HAVE_STRTOD
/* Define if you have the strtol function. */
#undef HAVE_STRTOL
/* Define if you have the strtoul function. */
#undef HAVE_STRTOUL
/* Define if you have the tcgetattr function. */
#undef HAVE_TCGETATTR
@ -496,6 +533,9 @@
/* Define if you have the <libintl.h> header file. */
#undef HAVE_LIBINTL_H
/* Define if you have the <stddef.h> header file. */
#undef HAVE_STDDEF_H
#undef HAVE_LIBDL
#undef HAVE_LIBSUN

1380
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -1,12 +1,12 @@
dnl
dnl Configure script for bash-2.01
dnl Configure script for bash-2.02
dnl
dnl report bugs to chet@po.cwru.edu
dnl
dnl Process this file with autoconf to produce a configure script.
dnl checks for version info
AC_REVISION([for Bash 2.01, version 1.28, from autoconf version] AC_ACVERSION)dnl
AC_REVISION([for Bash 2.02, version 2.19, from autoconf version] AC_ACVERSION)dnl
AC_INIT(shell.h)
AC_CONFIG_HEADER(config.h)
@ -34,19 +34,20 @@ dnl and some need a special compiler or loader
dnl look in the NOTES file for more
case "${host_cpu}-${host_os}" in
alpha-*) opt_gnu_malloc=no ;; # alpha running osf/1 or linux
*cray*-*) opt_gnu_malloc=no ;; # Crays
*[Cc]ray*-*) opt_gnu_malloc=no ;; # Crays
*-osf1*) opt_gnu_malloc=no ;; # other osf/1 machines
sparc-svr4*) opt_gnu_malloc=no ;; # sparc SVR4, SVR4.2
sparc-netbsd*) opt_gnu_malloc=no ;; # needs 8-byte alignment
sgi-irix6*) opt_gnu_malloc=no ;; # needs 8-byte alignment
sparc-linux*) opt_gnu_malloc=no ;; # sparc running linux; requires ELF
*-freebsd*) opt_gnu_malloc=no ;; # they claim it's better
#*-freebsd*) opt_gnu_malloc=no ;; # they claim it's better
*-aix*) opt_gnu_malloc=no ;; # AIX machines
*-nextstep*) opt_gnu_malloc=no ;; # NeXT machines running NeXTstep
*-dgux*) opt_gnu_malloc=no ;; # DG/UX machines
*-qnx*) opt_gnu_malloc=no ;; # QNX 4.2
*-machten4) opt_gnu_malloc=no ;; # MachTen 4.x
*-bsdi2.1|*-bsdi3.0) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
*-bsdi2.1|*-bsdi3.?) opt_gnu_malloc=no ; : ${CC:=shlicc2} ;; # for loadable builtins
*-cygwin32*) opt_gnu_malloc=no ;; # Cygnus's CYGWIN32 environment
esac
dnl arguments to configure
@ -104,10 +105,16 @@ opt_select=yes
opt_help=yes
opt_array_variables=yes
opt_dparen_arith=yes
opt_extended_glob=yes
opt_brace_expansion=yes
opt_disabled_builtins=no
opt_command_timing=yes
opt_usg_echo=no
opt_cond_command=yes
dnl options that affect how bash is compiled and linked
opt_static_link=no
opt_profiling=no
dnl argument parsing for optional features
AC_ARG_ENABLE(minimal-config, --enable-minimal-config a minimal sh-like configuration, opt_minimal_config=$enableval)
@ -120,6 +127,7 @@ if test $opt_minimal_config = yes; then
opt_restricted=no opt_process_subst=no opt_prompt_decoding=no
opt_select=no opt_help=no opt_array_variables=no opt_dparen_arith=no
opt_brace_expansion=no opt_disabled_builtins=no opt_command_timing=no
opt_extended_glob=no opt_cond_command=no
fi
AC_ARG_ENABLE(alias, --enable-alias enable shell aliases, opt_alias=$enableval)
@ -127,9 +135,11 @@ AC_ARG_ENABLE(array-variables, --enable-array-variables include shell array vari
AC_ARG_ENABLE(bang-history, --enable-bang-history turn on csh-style history substitution, opt_bang_history=$enableval)
AC_ARG_ENABLE(brace-expansion, --enable-brace-expansion include brace expansion, opt_brace_expansion=$enableval)
AC_ARG_ENABLE(command-timing, --enable-command-timing enable the time reserved word and command timing, opt_command_timing=$enableval)
AC_ARG_ENABLE(cond-command, --enable-cond-command enable the conditional command, opt_cond_command=$enableval)
AC_ARG_ENABLE(directory-stack, --enable-directory-stack enable builtins pushd/popd/dirs, opt_dirstack=$enableval)
AC_ARG_ENABLE(disabled-builtins, --enable-disabled-builtins allow disabled builtins to still be invoked, opt_disabled_builtins=$enableval)
AC_ARG_ENABLE(dparen-arithmetic, [--enable-dparen-arithmetic include ((...)) command], opt_dparen_arith=$enableval)
AC_ARG_ENABLE(extended-glob, --enable-extended-glob include ksh-style extended pattern matching, opt_extended_glob=$enableval)
AC_ARG_ENABLE(help-builtin, --enable-help-builtin include the help builtin, opt_help=$enableval)
AC_ARG_ENABLE(history, --enable-history turn on command history, opt_history=$enableval)
AC_ARG_ENABLE(job-control, --enable-job-control enable job control features, opt_job_control=$enableval)
@ -140,6 +150,10 @@ AC_ARG_ENABLE(restricted, --enable-restricted enable a restricted shell, opt_res
AC_ARG_ENABLE(select, --enable-select include select command, opt_select=$enableval)
AC_ARG_ENABLE(usg-echo-default, --enable-usg-echo-default make the echo builtin expand escape sequences by default, opt_usg_echo=$enableval)
dnl options that alter how bash is compiled and linked
AC_ARG_ENABLE(profiling, --enable-profiling allow profiling with gprof, opt_profiling=$enableval)
AC_ARG_ENABLE(static-link, --enable-static-link [link bash statically, for use as a root shell], opt_static_link=$enableval)
dnl opt_job_control is handled later, after BASH_JOB_CONTROL_MISSING runs
if test $opt_alias = yes; then
@ -202,6 +216,12 @@ fi
if test $opt_usg_echo = yes ; then
AC_DEFINE(DEFAULT_ECHO_TO_USG)
fi
if test $opt_extended_glob = yes ; then
AC_DEFINE(EXTENDED_GLOB)
fi
if test $opt_cond_command = yes ; then
AC_DEFINE(COND_COMMAND)
fi
if test "$opt_minimal_config" = yes; then
TESTSCRIPT=run-minimal
@ -226,19 +246,74 @@ esyscmd(cat _distribution)dnl
[BASHPATCH=]dnl
esyscmd(cat _patchlevel)dnl
echo "Beginning configuration for bash-$BASHVERS"
echo "Beginning configuration for bash-$BASHVERS for ${host_cpu}-${host_vendor}-${host_os}"
dnl compilation checks
dnl AC_PROG_CC sets $cross_compiling to `yes' if cross-compiling for a
dnl different environment
AC_PROG_CC
BASH_LARGE_FILE_SUPPORT
AC_ISC_POSIX
AC_MINIX
dnl BEGIN changes for CYGNUS cross-building for cygwin32
dnl load up the cross-building cache file -- add more cases and cache
dnl files as necessary
if test "x$cross_compiling" = "xyes"; then
case "${host}" in
*-cygwin32*)
cross_cache=${srcdir}/cross-build/cygwin32.cache
if test -r "${cross_cache}"; then
echo "loading cross-build cache file ${cross_cache}"
. ${cross_cache}
fi
unset cross_cache
;;
*) echo "configure: cross-compiling for a non-cygwin32 target is not supported" >&2
;;
esac
fi
if test -z "$CC_FOR_BUILD"; then
if test "x$cross_compiling" = "xno"; then
CC_FOR_BUILD='$(CC)'
else
CC_FOR_BUILD=gcc
fi
fi
AC_SUBST(CC_FOR_BUILD)
dnl Set SIGNAMES_H based on whether or not we're cross-compiling
if test "x$cross_compiling" = "xno"; then
SIGNAMES_H=lsignames.h
else
SIGNAMES_H='$(srcdir)/cross-build/win32sig.h'
fi
AC_SUBST(SIGNAMES_H)
dnl END changes for CYGNUS cross-building for cygwin32
dnl We want these before the checks, so the checks can modify their values.
test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1
dnl If we're using gcc and the user hasn't specified CFLAGS, add -O2 to CFLAGS.
test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O2"
dnl handle options that alter how bash is compiled and linked
dnl these must come after the test for cc/gcc
if test "$opt_profiling" = "yes"; then
PROFILE_FLAGS=-pg
opt_static_link=yes
fi
if test "$opt_static_link" = yes; then
# if we're using gcc, add `-static' to LDFLAGS
if test -n "$GCC" || test "$ac_cv_prog_gcc" = "yes"; then
LDFLAGS="$LDFLAGS -static"
fi
fi
AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LDFLAGS)
@ -287,8 +362,9 @@ AC_CHECK_FUNCS(dup2 select getdtablesize getgroups gethostname \
dnl checks for c library functions
AC_CHECK_FUNCS(bcopy bzero confstr getcwd strcasecmp setenv putenv \
setlinebuf setlocale strchr strerror tcgetattr uname \
sysconf ulimit times tzset siginterrupt memmove)
setlinebuf setlocale strchr strerror strtod strtol \
strtoul tcgetattr uname sysconf ulimit times tzset \
siginterrupt memmove)
dnl checks for locale functions
AC_CHECK_HEADERS(libintl.h)
@ -304,8 +380,10 @@ if test "$ac_cv_func_bindtextdomain" = "no"; then
fi
dnl checks for the dynamic loading library functions in libc and libdl
if test "$opt_static_link" != yes; then
AC_CHECK_LIB(dl, dlopen)
AC_CHECK_FUNCS(dlopen dlclose dlsym)
fi
dnl this defines SYS_SIGLIST_DECLARED
AC_DECL_SYS_SIGLIST
@ -315,7 +393,8 @@ AC_HEADER_DIRENT
AC_HEADER_TIME
AC_CHECK_HEADERS(unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
memory.h locale.h termcap.h termio.h termios.h dlfcn.h)
memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
stddef.h)
AC_CHECK_HEADERS(sys/ptem.h sys/pte.h sys/stream.h sys/select.h sys/file.h \
sys/resource.h sys/param.h sys/socket.h \
sys/time.h sys/times.h sys/wait.h)
@ -339,6 +418,24 @@ AC_CHECK_TYPE(time_t, long)
AC_TYPE_SIGNAL
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(char *)
AC_CHECK_TYPE(int32_t)
if test "$ac_cv_type_int32_t" = "no"; then
BASH_TYPE_INT32_T
fi
AC_CHECK_TYPE(u_int32_t)
if test "$ac_cv_type_u_int32_t" = "no"; then
BASH_TYPE_U_INT32_T
fi
AC_CHECK_TYPE(ptrdiff_t)
if test "$ac_cv_type_ptrdiff_t" = "no"; then
BASH_TYPE_PTRDIFF_T
fi
dnl structures
AC_HEADER_STAT
AC_HEADER_EGREP(struct timeval, sys/time.h, bash_cv_struct_timeval=yes, )
@ -370,6 +467,10 @@ BASH_DUP2_CLOEXEC_CHECK
BASH_PGRP_SYNC
BASH_SIGNAL_CHECK
if test "$ac_cv_sys_restartable_syscalls" = "no"; then
BASH_SYS_RESTARTABLE_SYSCALLS
fi
dnl checking for the presence of certain library symbols
BASH_SYS_ERRLIST
BASH_SYS_SIGLIST
@ -471,6 +572,7 @@ linux*) LOCAL_LDFLAGS=-rdynamic ;; # allow dynamic loading
aix4.2*) LOCAL_LDFLAGS="-bexpall -brtl" ;;# allow dynamic loading
*qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s -lunix -lncurses" ;;
powerux) LOCAL_LIBS="-lgen" ;;
cygwin32*) LOCAL_LIBS="-luser32" ;;
esac
case "$host_cpu" in
@ -490,17 +592,20 @@ esac
# this should be packaged into a script accessible via ${srcdir}/support
case "$srcdir" in
.) ;;
*) for d in doc tests support lib ; do # dirs
*) for d in doc tests support lib examples; do # dirs
test -d $d || mkdir $d
done
for ld in readline glob tilde malloc termcap; do # libdirs
for ld in readline glob tilde malloc sh termcap; do # libdirs
test -d lib/$ld || mkdir lib/$ld
done
test -d examples/loadables || mkdir examples/loadables # loadable builtins
;;
esac
BUILD_DIR=`pwd`
AC_SUBST(PROFILE_FLAGS)
AC_SUBST(incdir)
AC_SUBST(BUILD_DIR)
@ -522,8 +627,9 @@ AC_SUBST(LOCAL_DEFS)
#AC_SUBST(ALLOCA_OBJECT)
AC_OUTPUT([Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile \
lib/malloc/Makefile lib/termcap/Makefile lib/tilde/Makefile \
doc/Makefile],
lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile \
lib/tilde/Makefile doc/Makefile support/Makefile \
examples/loadables/Makefile],
[
# Makefile uses this timestamp file to record whether config.h is up to date.
echo timestamp > stamp-h

View file

@ -22,23 +22,25 @@
#include "config.h"
#include <stdio.h>
#include "bashtypes.h"
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
#include <stdio.h>
#include "shell.h"
WORD_DESC *
copy_word (word)
WORD_DESC *word;
copy_word (w)
WORD_DESC *w;
{
WORD_DESC *new_word;
new_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
FASTCOPY ((char *)word, (char *)new_word, sizeof (WORD_DESC));
new_word->word = savestring (word->word);
FASTCOPY ((char *)w, (char *)new_word, sizeof (WORD_DESC));
new_word->word = savestring (w->word);
return (new_word);
}
@ -201,12 +203,47 @@ copy_if_command (com)
return (new_if);
}
#if defined (DPAREN_ARITHMETIC)
static ARITH_COM *
copy_arith_command (com)
ARITH_COM *com;
{
ARITH_COM *new_arith;
new_arith = (ARITH_COM *)xmalloc (sizeof (ARITH_COM));
new_arith->flags = com->flags;
new_arith->exp = copy_word_list (com->exp);
new_arith->line = com->line;
return (new_arith);
}
#endif
#if defined (COND_COMMAND)
static COND_COM *
copy_cond_command (com)
COND_COM *com;
{
COND_COM *new_cond;
new_cond = (COND_COM *)xmalloc (sizeof (COND_COM));
new_cond->flags = com->flags;
new_cond->line = com->line;
new_cond->op = copy_word (com->op);
new_cond->left = com->left ? copy_cond_command (com->left) : (COND_COM *)NULL;
new_cond->right = com->right ? copy_cond_command (com->right) : (COND_COM *)NULL;
return (new_cond);
}
#endif
static SIMPLE_COM *
copy_simple_command (com)
SIMPLE_COM *com;
{
SIMPLE_COM *new_simple = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
SIMPLE_COM *new_simple;
new_simple = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
new_simple->flags = com->flags;
new_simple->words = copy_word_list (com->words);
new_simple->redirects = copy_redirects (com->redirects);
@ -276,6 +313,18 @@ copy_command (command)
new_command->value.If = copy_if_command (command->value.If);
break;
#if defined (DPAREN_ARITHMETIC)
case cm_arith:
new_command->value.Arith = copy_arith_command (command->value.Arith);
break;
#endif
#if defined (COND_COMMAND)
case cm_cond:
new_command->value.Cond = copy_cond_command (command->value.Cond);
break;
#endif
case cm_simple:
new_command->value.Simple = copy_simple_command (command->value.Simple);
break;

View file

@ -0,0 +1,39 @@
# This file is a shell script that caches the results of configure
# tests for CYGWIN32 so they don't need to be done when cross-compiling.
# AC_FUNC_GETPGRP should also define GETPGRP_VOID
ac_cv_func_getpgrp_void=${ac_cv_func_getpgrp_void='yes'}
# AC_FUNC_SETVBUF_REVERSED should not define anything else
ac_cv_func_setvbuf_reversed=${ac_cv_func_setvbuf_reversed='no'}
# on CYGWIN32, system calls do not restart
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
bash_cv_sys_restartable_syscalls=${bash_cv_sys_restartable_syscalls='no'}
# these may be necessary, but they are currently commented out
#ac_cv_c_bigendian=${ac_cv_c_bigendian='no'}
ac_cv_sizeof_char_p=${ac_cv_sizeof_char_p='4'}
ac_cv_sizeof_int=${ac_cv_sizeof_int='4'}
ac_cv_sizeof_long=${ac_cv_sizeof_long='4'}
bash_cv_dup2_broken=${bash_cv_dup2_broken='no'}
bash_cv_pgrp_pipe=${bash_cv_pgrp_pipe='no'}
bash_cv_type_rlimit=${bash_cv_type_rlimit='long'}
bash_cv_decl_under_sys_siglist=${bash_cv_decl_under_sys_siglist='no'}
bash_cv_under_sys_siglist=${bash_cv_under_sys_siglist='no'}
bash_cv_sys_siglist=${bash_cv_sys_siglist='no'}
bash_cv_opendir_not_robust=${bash_cv_opendir_not_robust='no'}
bash_cv_getenv_redef=${bash_cv_getenv_redef='yes'}
bash_cv_printf_declared=${bash_cv_printf_declared='yes'}
bash_cv_ulimit_maxfds=${bash_cv_ulimit_maxfds='no'}
bash_cv_getcwd_calls_popen=${bash_cv_getcwd_calls_popen='no'}
bash_cv_must_reinstall_sighandlers=${bash_cv_must_reinstall_sighandlers='no'}
bash_cv_job_control_missing=${bash_cv_job_control_missing='present'}
bash_cv_sys_named_pipes=${bash_cv_sys_named_pipes='missing'}
bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp='missing'}
bash_cv_mail_dir=${bash_cv_mail_dir='unknown'}
bash_cv_func_strcoll_broken=${bash_cv_func_strcoll_broken='no'}
bash_cv_type_int32_t=${bash_cv_type_int32_t='int'}
bash_cv_type_u_int32_t=${bash_cv_type_u_int32_t='int'}
# end of cross-build/cygwin32.cache

254
cross-build/win32sig.h Normal file
View file

@ -0,0 +1,254 @@
/* This file is used when cross-compiling for the CYGWIN32 environment on
a Unix machine. */
#include <sys/types.h>
#include <signal.h>
#ifndef __GNUC__
# error cross compiling requires gcc
#endif
/* A translation list so we can be polite to our users. Use gcc
labelled initializers to set up the array. Note that some entries
might wind up being NULL. */
char *signal_names[NSIG + 2] = {
[0] "EXIT",
#ifdef SIGLOST
[SIGLOST] "SIGLOST",
#endif
#ifdef SIGMSG
[SIGMSG] "SIGMSG",
#endif
#ifdef SIGDANGER
[SIGDANGER] "SIGDANGER",
#endif
#ifdef SIGMIGRATE
[SIGMIGRATE] "SIGMIGRATE",
#endif
#ifdef SIGPRE
[SIGPRE] "SIGPRE",
#endif
#ifdef SIGVIRT
[SIGVIRT] "SIGVIRT",
#endif
#ifdef SIGALRM1
[SIGALRM1] "SIGALRM1",
#endif
#ifdef SIGWAITING
[SIGWAITING] "SIGWAITING",
#endif
#ifdef SIGGRANT
[SIGGRANT] "SIGGRANT",
#endif
#ifdef SIGKAP
[SIGKAP] "SIGKAP",
#endif
#ifdef SIGRETRACT
[SIGRETRACT] "SIGRETRACT",
#endif
#ifdef SIGSOUND
[SIGSOUND] "SIGSOUND",
#endif
#ifdef SIGSAK
[SIGSAK] "SIGSAK",
#endif
#ifdef SIGLWP
[SIGLWP] "SIGLWP",
#endif
#ifdef SIGFREEZE
[SIGFREEZE] "SIGFREEZE",
#endif
#ifdef SIGTHAW
[SIGTHAW] "SIGTHAW",
#endif
#ifdef SIGCANCEL
[SIGCANCEL] "SIGCANCEL",
#endif
#ifdef SIGDIL
[SIGDIL] "SIGDIL",
#endif
#ifdef SIGCLD
#ifndef SIGCHLD
[SIGCLD] "SIGCLD",
#else
#if SIGCHLD != SIGCLD
[SIGCLD] "SIGCLD",
#endif
#endif
#endif
#ifdef SIGPWR
[SIGPWR] "SIGPWR",
#endif
#ifdef SIGPOLL
#ifndef SIGIO
[SIGPOLL] "SIGPOLL",
#else
#if SIGIO != SIGPOLL
[SIGPOLL] "SIGPOLL",
#endif
#endif
#endif
#ifdef SIGWINDOW
[SIGWINDOW] "SIGWINDOW",
#endif
#ifdef SIGHUP
[SIGHUP] "SIGHUP",
#endif
#ifdef SIGINT
[SIGINT] "SIGINT",
#endif
#ifdef SIGQUIT
[SIGQUIT] "SIGQUIT",
#endif
#ifdef SIGILL
[SIGILL] "SIGILL",
#endif
#ifdef SIGTRAP
[SIGTRAP] "SIGTRAP",
#endif
#ifdef SIGIOT
#ifndef SIGABRT
[SIGIOT] "SIGIOT",
#else
#if SIGABRT != SIGIOT
[SIGIOT] "SIGIOT",
#endif
#endif
#endif
#ifdef SIGABRT
[SIGABRT] "SIGABRT",
#endif
#ifdef SIGEMT
[SIGEMT] "SIGEMT",
#endif
#ifdef SIGFPE
[SIGFPE] "SIGFPE",
#endif
#ifdef SIGKILL
[SIGKILL] "SIGKILL",
#endif
#ifdef SIGBUS
[SIGBUS] "SIGBUS",
#endif
#ifdef SIGSEGV
[SIGSEGV] "SIGSEGV",
#endif
#ifdef SIGSYS
[SIGSYS] "SIGSYS",
#endif
#ifdef SIGPIPE
[SIGPIPE] "SIGPIPE",
#endif
#ifdef SIGALRM
[SIGALRM] "SIGALRM",
#endif
#ifdef SIGTERM
[SIGTERM] "SIGTERM",
#endif
#ifdef SIGURG
[SIGURG] "SIGURG",
#endif
#ifdef SIGSTOP
[SIGSTOP] "SIGSTOP",
#endif
#ifdef SIGTSTP
[SIGTSTP] "SIGTSTP",
#endif
#ifdef SIGCONT
[SIGCONT] "SIGCONT",
#endif
#ifdef SIGCHLD
[SIGCHLD] "SIGCHLD",
#endif
#ifdef SIGTTIN
[SIGTTIN] "SIGTTIN",
#endif
#ifdef SIGTTOU
[SIGTTOU] "SIGTTOU",
#endif
#ifdef SIGIO
[SIGIO] "SIGIO",
#endif
#ifdef SIGXCPU
[SIGXCPU] "SIGXCPU",
#endif
#ifdef SIGXFSZ
[SIGXFSZ] "SIGXFSZ",
#endif
#ifdef SIGVTALRM
[SIGVTALRM] "SIGVTALRM",
#endif
#ifdef SIGPROF
[SIGPROF] "SIGPROF",
#endif
#ifdef SIGWINCH
[SIGWINCH] "SIGWINCH",
#endif
#ifdef SIGINFO
[SIGINFO] "SIGINFO",
#endif
#ifdef SIGUSR1
[SIGUSR1] "SIGUSR1",
#endif
#ifdef SIGUSR2
[SIGUSR2] "SIGUSR2",
#endif
[NSIG] "DEBUG",
[NSIG + 1] (char *)0x0
};

View file

@ -20,6 +20,8 @@
#include "config.h"
#include "bashtypes.h"
#if defined (HAVE_UNISTD_H)
# include <unistd.h>
#endif
@ -132,6 +134,29 @@ dispose_command (command)
break;
}
#if defined (DPAREN_ARITHMETIC)
case cm_arith:
{
register ARITH_COM *c;
c = command->value.Arith;
dispose_words (c->exp);
free (c);
break;
}
#endif /* DPAREN_ARITHMETIC */
#if defined (COND_COMMAND)
case cm_cond:
{
register COND_COM *c;
c = command->value.Cond;
dispose_cond_node (c);
break;
}
#endif /* COND_COMMAND */
case cm_function_def:
{
register FUNCTION_DEF *c;
@ -150,13 +175,32 @@ dispose_command (command)
free (command);
}
#if defined (COND_COMMAND)
/* How to free a node in a conditional command. */
void
dispose_cond_node (cond)
COND_COM *cond;
{
if (cond)
{
if (cond->left)
dispose_cond_node (cond->left);
if (cond->right)
dispose_cond_node (cond->right);
if (cond->op)
dispose_word (cond->op);
free (cond);
}
}
#endif /* COND_COMMAND */
/* How to free a WORD_DESC. */
void
dispose_word (word)
WORD_DESC *word;
dispose_word (w)
WORD_DESC *w;
{
FREE (word->word);
free (word);
FREE (w->word);
free (w);
}
/* How to get rid of a linked list of words. A WORD_LIST. */

View file

@ -29,4 +29,8 @@ extern void dispose_words __P((WORD_LIST *));
extern void dispose_word_array __P((char **));
extern void dispose_redirects __P((REDIRECT *));
#if defined (COND_COMMAND)
extern void dispose_cond_node __P((COND_COM *));
#endif
#endif /* !_DISPOSE_CMD_H_ */

131
doc/FAQ
View file

@ -1,4 +1,4 @@
This is the Bash FAQ, version 2.5, for Bash version 2.01.
This is the Bash FAQ, version 2.11, for Bash version 2.02.
This document contains a set of frequently-asked questions concerning
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
@ -13,7 +13,7 @@ chet@po.cwru.edu.
This document is available for anonymous FTP with the URL
ftp://slc2.ins.cwru.edu/pub/bash/FAQ
ftp://ftp.cwru.edu/pub/bash/FAQ
----------
Contents:
@ -34,8 +34,8 @@ Section A: The Basics
Section B: The latest version
11) What's new in version 2.01?
12) Are there any user-visible incompatibilities between bash-2.01 and
11) What's new in version 2.02?
12) Are there any user-visible incompatibilities between bash-2.02 and
bash-1.14.7?
Section C: Differences from other Unix shells
@ -120,23 +120,22 @@ of Case Western Reserve University.
2) What's the latest version?
The latest version is 2.01, first made available on June 6, 1997.
The latest version is 2.02, first made available on Monday, 20 April, 1998.
3) Where can I get it?
Bash is the GNU project's shell, and so is available from the
master GNU archive site, prep.ai.mit.edu, and its mirrors. The
latest version is also available for FTP from slc2.ins.cwru.edu,
the maintainer's machine. The following URLs tell how to get
version 2.01:
latest version is also available for FTP from ftp.cwru.edu.
The following URLs tell how to get version 2.02:
ftp://prep.ai.mit.edu/pub/gnu/bash-2.01.tar.gz
ftp://slc2.ins.cwru.edu/pub/dist/bash-2.01.tar.gz
ftp://prep.ai.mit.edu/pub/gnu/bash-2.02.tar.gz
ftp://ftp.cwru.edu/pub/bash/bash-2.02.tar.gz
Formatted versions of the documentation are available with the URLs:
ftp://prep.ai.mit.edu/pub/gnu/bash-doc-2.01.tar.gz
ftp://slc2.ins.cwru.edu/pub/dist/bash-doc-2.01.tar.gz
ftp://prep.ai.mit.edu/pub/gnu/bash-doc-2.02.tar.gz
ftp://ftp.cwru.edu/pub/bash/bash-doc-2.02.tar.gz
4) On what machines will bash run?
@ -162,8 +161,22 @@ project. For more information about the project, look at the URL
http://www.cygnus.com/misc/gnu-win32
Cygnus has ported bash-1.14.7. Maybe someday they (or I) will port
bash-2.01 (or later) to the GNU-Win32 environment.
Cygnus has ported bash-1.14.7, and their port is part of the current
gnu-win32 release. Cygnus has also done a port of bash-2.01 to the
GNU-Win32 environment, and it should be available as part of their next
release.
Bash-2.02 should require no local Cygnus changes to build and run under
GNU-WIN32.
The Cygnus port works only on Intel machines. There is a port of bash
(I don't know which version) to the alpha/NT environment available from
ftp://ftp.gnustep.org//pub/win32/bash-alpha-nt-1.01.tar.gz
Softway Systems has ported bash-2.01.1 to their OpenNT system, a
Unix subsystem for NT that replaces the Microsoft POSIX subsystem.
Check out http://www.opennt.com for more information.
D. J. Delorie has ported bash-1.14.7 to run under MS-DOS, as part of
the DJGPP project. For more information on the project, see
@ -179,11 +192,13 @@ The corresponding source is
ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsh1147s.zip
A port of bash-1.12 is available for OS/2 from
Ports of bash-1.12 and bash-2.0 are available for OS/2 from
ftp://hobbes.nmsu.edu/os2/unix/bash_112.zip
ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash_112.zip
ftp://hobbes.nmsu.edu/pub/os2/util/shell/bash-2.0(253).zip
I haven't looked at it.
I haven't looked at either, but the second appears to be a binary-only
distribution. Beware.
6) How can I build bash with gcc?
@ -193,11 +208,11 @@ file INSTALL in the distribution for more information.
7) How can I make bash my login shell?
Some machines let you use `chsh' to change your login shell. Other
systems use `passwd -s'. If one of these works for you, that's all
you need. Note that many systems require the full pathname to a shell
to appear in /etc/shells before you can make it your login shell. For
this, you may need the assistance of your friendly local system
administrator.
systems use `passwd -s' or `passwd -e'. If one of these works for
you, that's all you need. Note that many systems require the full
pathname to a shell to appear in /etc/shells before you can make it
your login shell. For this, you may need the assistance of your
friendly local system administrator.
If you cannot do this, you can still use bash as your login shell, but
you need to perform some tricks. The basic idea is to add a command
@ -298,15 +313,37 @@ Reference Manual.
Section B: The latest version
11) What's new in version 2.01?
11) What's new in version 2.02?
Bash-2.01 contains only a few new features.
Bash-2.02 has a number of new features. Here's a short list:
a new version of malloc (based on the old GNU malloc code in previous
bash versions) that is more page-oriented, more conservative
with memory usage, does not `orphan' large blocks when they
are freed, is usable on 64-bit machines, and has allocation
checking turned on unconditionally
POSIX.2-style globbing character classes ([:alpha:], [:alnum:], etc.)
POSIX.2-style globbing equivalence classes
POSIX.2-style globbing collating symbols
the ksh [[...]] extended conditional command
the ksh egrep-style extended pattern matching operators
a new `printf' builtin
the ksh-like $(<filename) command substitution, which is equivalent to
$(cat filename)
new tilde prefixes that expand to directories from the directory stack
new `**' arithmetic operator to do exponentiation
case-insensitive globbing (filename expansion)
menu completion a la tcsh
`magic-space' history expansion function like tcsh
the readline inputrc `language' has a new file inclusion directive ($include)
Bash-2.01 contained only a few new features:
new `GROUPS' builtin array variable containing the user's group list
new bindable readline commands: history-and-alias-expand-line and
alias-expand-line
Bash-2.0 contains extensive changes and new features from bash-1.14.7.
Bash-2.0 contained extensive changes and new features from bash-1.14.7.
Here's a short list:
new `time' reserved word to time pipelines, shell builtins, and
@ -344,11 +381,11 @@ grammar tighter and smaller (66 reduce-reduce conflicts gone)
lots of code now smaller and faster
test suite greatly expanded
12) Are there any user-visible incompatibilities between bash-2.01 and
12) Are there any user-visible incompatibilities between bash-2.02 and
bash-1.14.7?
There are a few incompatibilities between version 1.14.7 and version 2.01.
They are detailed in the file COMPAT in the bash-2.01 distribution.
There are a few incompatibilities between version 1.14.7 and version 2.02.
They are detailed in the file COMPAT in the bash-2.02 distribution.
Section C: Differences from other Unix shells
@ -494,7 +531,7 @@ Implementation differences:
15) Which new features in ksh-93 are not in bash, and which are?
New things in ksh-93 not in bash-2.01:
New things in ksh-93 not in bash-2.02:
associative arrays
floating point arithmetic
++, --, comma arithmetic operators
@ -510,12 +547,12 @@ New things in ksh-93 not in bash-2.01:
variables: .sh.edchar, .sh.edmode, .sh.edcol, .sh.edtext, HISTEDIT,
.sh.version, .sh.name, .sh.subscript, .sh.value
backreferences in pattern matching
print -f and printf (bash has loadable versions)
print -f (bash has a loadable version)
`fc' has been renamed to `hist'
read -t/-d
`.' can execute shell functions
New things in ksh-93 present in bash-2.01:
New things in ksh-93 present in bash-2.02:
?: arithmetic operator
expansions: ${!param}, ${param:offset[:len]}, ${param/pat[/str]}
compound array assignment
@ -808,7 +845,7 @@ and the \] escape to signal the end of such a sequence.
27) How can I find the value of a shell variable whose name is the value
of another shell variable?
Bash-2.01 supports this directly. You can use
Bash-2.02 supports this directly. You can use
${!var}
@ -830,7 +867,7 @@ parameter:
The expansion of the quoted portions of this expression will be
deferred until `eval' runs, while the `$#' will be expanded
before `eval' is executed. In bash-2.01,
before `eval' is executed. In bash-2.02,
echo ${!#}
@ -1055,7 +1092,7 @@ is, in fact, a syntax error. Redirections may only precede `simple
commands'. A subshell construct such as the above is one of the shell's
`compound commands'. A redirection may only follow a compound command.
The file CWRU/sh-redir-hack in the bash-2.01 distribution is an
The file CWRU/sh-redir-hack in the bash-2.02 distribution is an
(unofficial) patch to parse.y that will modify the grammar to
support this construct. It will not apply with `patch'; you must
modify parse.y by hand. Note that if you apply this, you must
@ -1100,34 +1137,30 @@ Postscript files created from the above source are available in
the documentation distribution.
There is additional documentation available for anonymous FTP from host
slc2.ins.cwru.edu in the `pub/bash' directory.
ftp.cwru.edu in the `pub/bash' directory.
Cameron Newham and Bill Rosenblatt have written a book on bash, published
by O'Reilly and Associates. The book is based on Bill Rosenblatt's Korn
Shell book. The title is ``Learning the Bash Shell'', and the ISBN number
is 1-56592-147-X. Look for it in fine bookstores near you. This book
covers bash-1.14, but has an appendix describing some of the new features
in bash-2.0. There are rumors of a second edition of this book, describing
bash-2.0 (and 2.01). I do not know what ORA's publication schedule for
this edition is.
in bash-2.0.
A second edition of this book is available, just published in January, 1998.
The ISBN number is 1-56592-347-2. Look for it in the same fine bookstores
or on the web.
39) What's coming in future versions?
These are features I plan to include in a future version of bash.
POSIX.2-style globbing character classes ([:alpha:], [:alnum:], etc.)
POSIX.2-style globbing equivalence classes
POSIX.2-style globbing collating symbols
a bash debugger (a minimally-tested version is included with bash-2.01)
a bash debugger (a minimally-tested version is included with bash-2.02)
Programmable completion a la zsh
40) What's on the bash `wish list' for future versions?
These are features that may or may not appear in a future version of bash.
Programmable completion a la zsh
menu completion a la tcsh
the ksh [[...]] extended test command
the ksh egrep-style extended pattern matching operators
associative arrays (not really all that hard)
breaking some of the shell functionality into embeddable libraries
better internationalization using GNU `gettext'
@ -1135,13 +1168,15 @@ an option to use external files for the long `help' text
timeouts for the `read' builtin
the ksh-93 ${!prefix*} and ${!prefix@} operators
arithmetic ++ and -- prefix and postfix operators
date-stamped command history
41) When will the next release appear?
The next version will appear sometime in 1997. Never make predictions.
The next version will appear sometime in 1998. Never make
predictions.
This document is Copyright 1995, 1996 by Chester Ramey.
This document is Copyright 1995, 1996, 1998 by Chester Ramey.
Permission is hereby granted, without written agreement and
without license or royalty fees, to use, copy, and distribute

View file

@ -30,6 +30,8 @@ TEX = tex
MAKEINFO = makeinfo
TEXI2DVI = ${topdir}/support/texi2dvi
TEXI2HTML = ${topdir}/support/texi2html
MAN2HTML = ${BUILD_DIR}/support/man2html
HTMLPOST = ${srcdir}/htmlpost.sh
QUIETPS = #set this to -q to shut up dvips
DVIPS = dvips -D 300 $(QUIETPS) -o $@ # tricky
TEXINPUTDIR = $(RL_LIBDIR)/doc
@ -45,7 +47,7 @@ GROFF = groff
HSUSER = $(RL_LIBDIR)/doc/hsuser.texinfo
RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo
.SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi
.SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi .html
.1.ps:
$(RM) $@
@ -55,6 +57,10 @@ RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo
$(RM) $@
-${NROFF} -man $< > $@
.1.html:
$(RM) $@
-${MAN2HTML} $< | ${HTMLPOST} > $@
.ms.ps:
$(RM) $@
-${GROFF} -ms $< > $@
@ -71,6 +77,10 @@ RLUSER = $(RL_LIBDIR)/doc/rluser.texinfo
$(RM) $@
-${NROFF} -man $< > $@
.3.html:
$(RM) $@
-${MAN2HTML} $< > $@
all: ps info dvi text html
nodvi: ps info text html
@ -78,7 +88,7 @@ ps: bash.ps bashbug.ps readline.ps article.ps builtins.ps
dvi: bashref.dvi bashref.ps
info: bashref.info
text: bash.0 bashbug.0 builtins.0 readline.0
html: bashref.html
html: bashref.html bash.html
bashref.dvi: $(srcdir)/bashref.texi $(HSUSER) $(RLUSER)
TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/bashref.texi
@ -102,6 +112,7 @@ bashman.ps: bash.dvi
bash.txt: bash.1
bash.ps: bash.1
bash.html: bash.1 $(MAN2HTML)
bashbug.ps: bashbug.1
builtins.ps: builtins.1 bash.1
bash.0: bash.1
@ -111,6 +122,9 @@ readline.0: readline.3
readline.ps: readline.3
article.ps: article.ms
$(MAN2HTML): ${topdir}/support/man2html.c
-( cd ${BUILD_DIR}/support ; ${MAKE} ${MFLAGS} man2html)
faq: faq.news faq.news2 faq.mail faq.version
faq.version: FAQ.version FAQ

1515
doc/bash.1

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

19
doc/htmlpost.sh Executable file
View file

@ -0,0 +1,19 @@
#! /bin/sh
#
# Some of these should really be done by man2html
#
# The ~/xxx links don't really work -- netscape doesn't expand the home
# directory of the user running navigator
#
sed -e 's|<B>gnu.bash.bug</B>|<A HREF="news:gnu.bash.bug">gnu.bash.bug</A>|' \
-e 's|<I>/bin/bash</I>|<A HREF="file:/bin/bash"><I>/bin/bash</I></A>|' \
-e 's|<I>/etc/profile</I>|<A HREF="file:/etc/profile"><I>/etc/profile</I></A>|' \
-e 's|<I>~/.bash_profile</I>|<A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>|' \
-e 's|<I>~/.bash_login</I>|<A HREF="file:~/.bash_login"><I>~/.bash_login</I></A>|' \
-e 's|<I>~/.profile</I>|<A HREF="file:~/.profile"><I>~/.profile</I></A>|' \
-e 's|<I>~/.bashrc</I>|<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>|' \
-e 's|<I>~/.bash_logout</I>|<A HREF="file:~/.bash_logout"><I>~/.bash_logout</I></A>|' \
-e 's|<I>~/.bash_history</I>|<A HREF="file:~/.bash_history"><I>~/.bash_history</I></A>|' \
-e 's|<I>~/.inputrc</I>|<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>|' \
-e 's|<I>/etc/inputrc</I>|<A HREF="file:/etc/inputrc"><I>/etc/inputrc</I></A>|'

View file

@ -6,9 +6,9 @@
.\" Case Western Reserve University
.\" chet@ins.CWRU.Edu
.\"
.\" Last Change: Wed Feb 5 14:13:22 EST 1997
.\" Last Change: Thu Feb 19 10:26:47 EST 1998
.\"
.TH READLINE 3 "1997 Feb 5" GNU
.TH READLINE 3 "1998 Feb 19" GNU
.\"
.\" File Name macro. This used to be `.PN', for Path Name,
.\" but Sun doesn't seem to like that very much.
@ -159,7 +159,7 @@ command or the text of a macro and a key sequence to which
it should be bound. The name may be specified in one of two ways:
as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP
prefixes, or as a key sequence.
When using the form \fBkeyname\fP:\fIfunction-name\fP or \fImacro\fP,
When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP,
.I keyname
is the name of a key spelled out in English. For example:
.sp
@ -185,7 +185,7 @@ expressed on the right hand side (that is, to insert the text
.I >&output
into the line).
.PP
In the second form, \fB"keyseq"\fP:\fIfunction\-name\fP or \fImacro\fP,
In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP,
.B keyseq
differs from
.B keyname
@ -213,8 +213,9 @@ and
.I "ESC [ 1 1 ~"
is bound to insert the text
.BR "Function Key 1" .
The full set of escape sequences is
The full set of GNU Emacs style escape sequences is
.RS
.PD 0
.TP
.B \eC\-
control prefix
@ -234,11 +235,53 @@ literal "
.B \e'
literal '
.RE
.PD
.PP
In addition to the GNU Emacs style escape sequences, a second
set of backslash escapes is available:
.RS
.PD 0
.TP
.B \ea
alert (bell)
.TP
.B \eb
backspace
.TP
.B \ed
delete
.TP
.B \ef
form feed
.TP
.B \en
newline
.TP
.B \er
carriage return
.TP
.B \et
horizontal tab
.TP
.B \ev
vertical tab
.TP
.B \e\fInnn\fP
the character whose ASCII code is the octal value \fInnn\fP
(one to three digits)
.TP
.B \ex\fInnn\fP
the character whose ASCII code is the hexadecimal value \fInnn\fP
(one to three digits)
.RE
.PD
.PP
When entering the text of a macro, single or double quotes should
be used to indicate a macro definition. Unquoted text
is assumed to be a function name. Backslash
will quote any character in the macro text, including " and '.
is assumed to be a function name.
In the macro body, the backslash escapes described above are expanded.
Backslash will quote any other character in the macro text,
including " and '.
.PP
.B Bash
allows the current readline key bindings to be displayed or modified
@ -288,6 +331,10 @@ This command is bound to
in emacs mode and to
.B #
in vi command mode.
.TP
.B completion\-ignore\-case (Off)
If set to \fBOn\fP, readline performs filename matching and completion
in a case\-insensitive fashion.
.TP
.B completion\-query\-items (100)
This determines when the user is queried about viewing
@ -346,7 +393,7 @@ the value of
also affects the default keymap.
.TP
.B mark\-directories (On)
If set to \fBOn\fP, completed directory names have a slash
If set to \fBOn\fP, complete<d directory names have a slash
appended.
.TP
.B mark\-modified\-lines (Off)
@ -363,6 +410,10 @@ If set to \fBOn\fP, readline will display characters with the
eighth bit set directly rather than as a meta-prefixed escape
sequence.
.TP
.B print\-completions\-horizontally (Off)
If set to \fBOn\fP, readline will display completions with matches
sorted horizontally in alphabetical order, rather than down the screen.
.TP
.B show\-all\-if\-ambiguous (Off)
This alters the default behavior of the completion functions. If
set to
@ -380,7 +431,7 @@ completions.
Readline implements a facility similar in spirit to the conditional
compilation features of the C preprocessor which allows key
bindings and variable settings to be performed as the result
of tests. There are three parser directives used.
of tests. There are four parser directives used.
.IP \fB$if\fP
The
.B $if
@ -417,6 +468,7 @@ file can test for a particular value.
This could be used to bind key sequences to functions useful for
a specific program. For instance, the following command adds a
key sequence that quotes the current or previous word in Bash:
.sp 1
.RS
.nf
\fB$if\fP bash
@ -427,11 +479,21 @@ key sequence that quotes the current or previous word in Bash:
.RE
.RE
.IP \fB$endif\fP
This command, as you saw in the previous example, terminates an
This command, as seen in the previous example, terminates an
\fB$if\fP command.
.IP \fB$else\fP
Commands in this branch of the \fB$if\fP directive are executed if
the test fails.
.IP \fB$include\fP
This directive takes a single filename as an argument and reads commands
and bindings from that file. For example, the following directive
would read \fI/etc/inputrc\fP:
.sp 1
.RS
.nf
\fB$include\fP \^ \fI/etc/inputrc\fP
.fi
.RE
.SH SEARCHING
.PP
Readline provides commands for searching through the command history
@ -464,7 +526,7 @@ the line, thereby executing the command from the history list.
.PP
Non-incremental searches read the entire search string before starting
to search for matching history lines. The search string may be
typed by the user or part of the contents of the current line.
typed by the user or be part of the contents of the current line.
.SH EDITING COMMANDS
.PP
The following is a list of the names of the commands and the default
@ -567,6 +629,8 @@ yank\-last\-arg (M\-.\^, M\-_\^)
Insert the last argument to the previous command (the last word of
the previous history entry). With an argument,
behave exactly like \fByank\-nth\-arg\fP.
Successive calls to \fByank\-last\-arg\fP move back through the history
list, inserting the last argument of each line in turn.
.PD
.SS Commands for Changing Text
.PP
@ -575,9 +639,7 @@ behave exactly like \fByank\-nth\-arg\fP.
.B delete\-char (C\-d)
Delete the character under the cursor. If point is at the
beginning of the line, there are no characters in the line, and
the last character typed was not
.BR C\-d ,
then return
the last character typed was not bound to \fBBdelete\-char\fP, then return
.SM
.BR EOF .
.TP
@ -606,15 +668,15 @@ moving the cursor over that word as well.
.TP
.B upcase\-word (M\-u)
Uppercase the current (or following) word. With a negative argument,
do the previous word, but do not move point.
uppercase the previous word, but do not move point.
.TP
.B downcase\-word (M\-l)
Lowercase the current (or following) word. With a negative argument,
do the previous word, but do not move point.
lowercase the previous word, but do not move point.
.TP
.B capitalize\-word (M\-c)
Capitalize the current (or following) word. With a negative argument,
do the previous word, but do not move point.
capitalize the previous word, but do not move point.
.PD
.SS Killing and Yanking
.PP
@ -628,6 +690,7 @@ Kill backward to the beginning of the line.
.TP
.B unix\-line\-discard (C\-u)
Kill backward from point to the beginning of the line.
The killed text is saved on the kill-ring.
.\" There is no real difference between this and backward-kill-line
.TP
.B kill\-whole\-line
@ -660,9 +723,11 @@ Copy the text in the region to the kill buffer.
.TP
.B copy\-backward\-word
Copy the word before point to the kill buffer.
The word boundaries are the same as \fBbackward\-word\fP.
.TP
.B copy\-forward\-word
Copy the word following point to the kill buffer.
The word boundaries are the same as \fBforward\-word\fP.
.TP
.B yank (C\-y)
Yank the top of the kill ring into the buffer at the cursor.
@ -720,6 +785,19 @@ List the possible completions of the text before point.
Insert all completions of the text before point
that would have been generated by
\fBpossible\-completions\fP.
.TP
.B menu\-complete
Similar to \fBcomplete\fP, but replaces the word to be completed
with a single match from the list of possible completions.
Repeated execution of \fBmenu\-complete\fP steps through the list
of possible completions, inserting each match in turn.
At the end of the list of completions, the bell is rung and the
original text is restored.
An argument of \fIn\fP moves \fIn\fP positions forward in the list
of matches; a negative argument may be used to move backward
through the list.
This command is intended to be bound to \fBTAB\fP, but is unbound
by default.
.PD
.SS Keyboard Macros
.PP
@ -765,7 +843,7 @@ is equivalent to
Incremental undo, separately remembered for each line.
.TP
.B revert\-line (M\-r)
Undo all changes made to this line. This is like typing the
Undo all changes made to this line. This is like executing the
.B undo
command enough times to return the line to its initial state.
.TP
@ -795,15 +873,6 @@ variable is inserted at the beginning of the current line, and the line
is accepted as if a newline had been typed. This makes the current line
a shell comment.
.TP
.B glob\-expand\-word (C\-x *)
The word before point is treated as a pattern for pathname expansion,
and the list of matching file names is inserted, replacing the word.
.TP
.B glob\-list\-expansions (C\-x g)
The list of expansions that would have been generated by
.B glob\-expand\-word
is inserted into the line, replacing the word before point.
.TP
.B dump\-functions
Print all of the functions and their key bindings to the
readline output stream. If a numeric argument is supplied,
@ -1097,10 +1166,10 @@ version of the
library that you have.
.PP
Once you have determined that a bug actually exists, mail a
bug report to \fIbug\-readline\fP@\fIprep.ai.MIT.Edu\fP.
bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
If you have a fix, you are welcome to mail that
as well! Suggestions and `philosophical' bug reports may be mailed
to \fPbug-readline\fP@\fIprep.ai.MIT.Edu\fP or posted to the Usenet
to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
newsgroup
.BR gnu.bash.bug .
.PP

35
error.c
View file

@ -189,6 +189,16 @@ internal_error (format, arg1, arg2, arg3, arg4, arg5)
fprintf (stderr, "\n");
}
void
internal_warning (format, arg1, arg2, arg3, arg4, arg5)
char *format;
{
fprintf (stderr, "%s: warning: ", get_name_for_error ());
fprintf (stderr, format, arg1, arg2, arg3, arg4, arg5);
fprintf (stderr, "\n");
}
void
sys_error (format, arg1, arg2, arg3, arg4, arg5)
char *format;
@ -320,6 +330,31 @@ internal_error (format, va_alist)
va_end (args);
}
void
#if defined (PREFER_STDARG)
internal_warning (const char *format, ...)
#else
internal_warning (format, va_alist)
const char *format;
va_dcl
#endif
{
va_list args;
fprintf (stderr, "%s: warning: ", get_name_for_error ());
#if defined (PREFER_STDARG)
va_start (args, format);
#else
va_start (args);
#endif
vfprintf (stderr, format, args);
fprintf (stderr, "\n");
va_end (args);
}
void
#if defined (PREFER_STDARG)
sys_error (const char *format, ...)

View file

@ -47,4 +47,7 @@ extern void sys_error __P((const char *, ...));
/* Report an internal error. */
extern void internal_error __P((const char *, ...));
/* Report an internal warning. */
extern void internal_warning __P((const char *, ...));
#endif /* !_ERROR_H_ */

38
eval.c
View file

@ -23,6 +23,9 @@
#include "config.h"
#if defined (HAVE_UNISTD_H)
# ifdef _MINIX
# include <sys/types.h>
# endif
# include <unistd.h>
#endif
@ -257,3 +260,38 @@ read_command ()
return (result);
}
/* Take a string and run it through the shell parser, returning the
resultant word list. Used by compound array assignment. */
WORD_LIST *
parse_string_to_word_list (s, whom)
char *s, *whom;
{
WORD_LIST *wl;
COMMAND *saved_global;
push_stream (1);
saved_global = global_command;
global_command = (COMMAND *)0;
with_input_from_string (s, whom);
if (parse_command () != 0 || global_command == 0 || global_command->type != cm_simple)
{
if (global_command)
dispose_command (global_command);
wl = (WORD_LIST *)NULL;
}
else
{
wl = global_command->value.Simple->words;
free (global_command->value.Simple);
free (global_command);
}
global_command = saved_global;
pop_stream ();
return (wl);
}

View file

@ -0,0 +1,43 @@
#From: "Grigoriy Strokin" <grg@philol.msu.ru>
#Newsgroups: comp.unix.shell
#Subject: fast basename and dirname functions for BASH/SH
#Date: Sat, 27 Dec 1997 21:18:40 +0300
#
#Please send your comments to grg@philol.msu.ru
function basename()
{
local name="${1##*/}"
echo "${name%$2}"
}
function dirname()
{
local dir="${1%${1##*/}}"
[ "${dir:=./}" != "/" ] && dir="${dir%?}"
echo "$dir"
}
# Two additional functions:
# 1) namename prints the basename without extension
# 2) ext prints extension of a file, including "."
function namename()
{
local name=${1##*/}
local name0="${name%.*}"
echo "${name0:-$name}"
}
function ext()
{
local name=${1##*/}
local name0="${name%.*}"
local ext=${name0:+${name#$name0}}
echo "${ext:-.}"
}

View file

@ -0,0 +1,302 @@
#From: "Grigoriy Strokin" <grg@philol.msu.ru>
#Newsgroups: comp.unix.shell
#Subject: BASH: getopt function that parses long-named options
#Date: Mon, 22 Dec 1997 20:35:18 +0300
#Hi, I have written a BASH function named getoptex, that is like bash builtin
#"getopts", but does parse long-named options and optional arguments. It only
#uses builtin bash commands, so it is very fast. In order to use it in your
#bash scripts, include a command ". getopt.sh" (<dot> getopt.sh) to the file
#containing your script, and that will define functions getopt, getoptex, and
#optlistex (the file getopt.sh with its detailed description is listed
#below).
#*** file getopt.sh ***
#! /bin/bash
#
# getopt.sh:
# functions like getopts but do long-named options parsing
# and support optional arguments
#
# Version 1.0 1997 by Grigoriy Strokin (grg@philol.msu.ru), Public Domain
# Date created: December 21, 1997
# Date modified: December 21, 1997
#
# IMPORTANT FEATURES
#
# 1) Parses both short and long-named options
# 2) Supports optional arguments
# 3) Only uses bash builtins, thus no calls to external
# utilities such as expr or sed is done. Therefore,
# parsing speed is high enough
#
#
# DESCRIPTION
#
# FUNCTION getopt
# Usage: getopt OPTLIST {"$@"|ALTERNATIVE_PARAMETERS}
#
# like getopts, but parse options with both required and optional arguments,
# Options with optional arguments must have "." instead of ":" after them.
# Furthemore, a variable name to place option name cannot be specified
# and is always placed in OPTOPT variable
#
# This function is provided for compatibility with getopts()
# OPTLIST style, and it actually calls getoptex (see bellow)
#
# NOTE that a list of parameters is required and must be either "$@",
# if processing command line arguments, or some alternative parameters.
#
# FUNCTION getoptex
# Usage: getoptex OPTION_LIST {"$@"|ALTERNATIVE_PARAMETERS}
#
# like getopts, but parse long-named options.
#
# Both getopt and getoptex return 0 if an option has been parsed,
# and 1 if all options are already parsed or an error occured
#
# Both getopt and getoptex set or test the following variables:
#
# OPTERR -- tested for whether error messages must be given for invalid
options
#
# OPTOPT -- set to the name of an option parsed,
# or to "?" if no more options or error
# OPTARG -- set to the option argument, if any;
# unset if ther is no argument;
# on error, set to the erroneous option name
#
# OPTIND -- Initialized to 1.
# Then set to the number of the next parameter to be parsed
# when getopt or getoptex will be called next time.
# When all options are parsed, contains a number of
# the first non-option argument.
#
#
# OPTOFS -- If a parameter number $OPTIND containg an option parsed
# does not contain any more options, OPTOFS is unset;
# otherwise, OPTOFS is set to such a number of "?" signs
# which is equal to the number of options parsed
#
# You might not set variables OPTIND and OPTOFS yourself
# unless you want to parse a list of parameters more than once.
# Otherwise, you whould unset OPTIND (or set it to 1)
# and unset OPTOFS each time you want to parse a new parameters
list
#
# Option list format is DIFFERENT from one for getopts or getopt.
getopts-style
# option list can be converted to getoptex-style using a function optlistex
# (see bellow)
#
# DESCRIPTION of option list used with getoptex:
# Option names are separated by whitespace. Options consiting of
# more than one character are treated as long-named (--option)
#
# Special characters can appear at the and of option names specifying
# whether an argument is required (default is ";"):
# ";" (default) -- no argument
# ":" -- required argument
# "," -- optional argument
#
# For example, an option list "a b c help version f: file: separator."
# defines the following options:
# -a, -b, -c, --help, --version -- no argument
# -f, --file -- argument required
# --separator -- optional argument
#
# FUNCTION optlistex
# Usage new_style_optlist=`optlistex OLD_STYLE_OPTLIST`
#
# Converts getopts-style option list in a format suitable for use with getoptex
# Namely, it inserts spaces after each option name.
#
#
# HOW TO USE
#
# In order o use in your bash scripts the functions described,
# include a command ". getopt.sh" to the file containing the script,
# which will define functions getopt, getoptex, and optlistex
#
# EXAMPLES
#
# See files 'getopt1' and 'getopt2' that contain sample scripts that use
# getopt and getoptex functions respectively
#
#
# Please send your comments to grg@philol.msu.ru
function getoptex()
{
let $# || return 1
local optlist="${1#;}"
let OPTIND || OPTIND=1
[ $OPTIND -lt $# ] || return 1
shift $OPTIND
if [ "$1" != "-" -a "$1" != "${1#-}" ]
then OPTIND=$[OPTIND+1]; if [ "$1" != "--" ]
then
local o
o="-${1#-$OPTOFS}"
for opt in ${optlist#;}
do
OPTOPT="${opt%[;.:]}"
unset OPTARG
local opttype="${opt##*[^;:.]}"
[ -z "$opttype" ] && opttype=";"
if [ ${#OPTOPT} -gt 1 ]
then # long-named option
case $o in
"--$OPTOPT")
if [ "$opttype" != ":" ]; then return 0; fi
OPTARG="$2"
if [ -z "$OPTARG" ];
then # error: must have an agrument
let OPTERR && echo "$0: error: $OPTOPT must have an argument" >&2
OPTARG="$OPTOPT";
OPTOPT="?"
return 1;
fi
OPTIND=$[OPTIND+1] # skip option's argument
return 0
;;
"--$OPTOPT="*)
if [ "$opttype" = ";" ];
then # error: must not have arguments
let OPTERR && echo "$0: error: $OPTOPT must not have arguments" >&2
OPTARG="$OPTOPT"
OPTOPT="?"
return 1
fi
OPTARG=${o#"--$OPTOPT="}
return 0
;;
esac
else # short-named option
case "$o" in
"-$OPTOPT")
unset OPTOFS
[ "$opttype" != ":" ] && return 0
OPTARG="$2"
if [ -z "$OPTARG" ]
then
echo "$0: error: -$OPTOPT must have an argument" >&2
OPTARG="$OPTOPT"
OPTOPT="?"
return 1
fi
OPTIND=$[OPTIND+1] # skip option's argument
return 0
;;
"-$OPTOPT"*)
if [ $opttype = ";" ]
then # an option with no argument is in a chain of options
OPTOFS="$OPTOFS?" # move to the next option in the chain
OPTIND=$[OPTIND-1] # the chain still has other options
return 0
else
unset OPTOFS
OPTARG="${o#-$OPTOPT}"
return 0
fi
;;
esac
fi
done
echo "$0: error: invalid option: $o"
fi; fi
OPTOPT="?"
unset OPTARG
return 1
}
function optlistex
{
local l="$1"
local m # mask
local r # to store result
while [ ${#m} -lt $[${#l}-1] ]; do m="$m?"; done # create a "???..." mask
while [ -n "$l" ]
do
r="${r:+"$r "}${l%$m}" # append the first character of $l to $r
l="${l#?}" # cut the first charecter from $l
m="${m#?}" # cut one "?" sign from m
if [ -n "${l%%[^:.;]*}" ]
then # a special character (";", ".", or ":") was found
r="$r${l%$m}" # append it to $r
l="${l#?}" # cut the special character from l
m="${m#?}" # cut one more "?" sign
fi
done
echo $r
}
function getopt()
{
local optlist=`optlistex "$1"`
shift
getoptex "$optlist" "$@"
return $?
}
#**************************************
# cut here
#**************************************
#*** (end of getopt.sh) ***
#*** file getopt1 ***
#! /bin/bash
# getopt1:
# Sample script using the function getopt
#
# Type something like "getopt1 -ab -d 10 -e20 text1 text2"
# on the command line to see how it works
#
# See getopt.sh for more information
#. getopt.sh
#echo Using getopt to parse arguments:
#while getopt "abcd:e." "$@"
#do
# echo "Option <$OPTOPT> ${OPTARG:+has an arg <$OPTARG>}"
#done
#shift $[OPTIND-1]
#for arg in "$@"
#do
# echo "Non option argument <$arg>"
#done
#
#**************************************
# cut here
#**************************************
#*** (end of getopt1) ***
#
#
#*** file getopt2 ***
#
#! /bin/bash
# getopt2:
# Sample script using the function getoptex
#
# Type something like "getopt2 -ab -d 10 -e20 --opt1 --opt4=100 text1 text2"
# to see how it works
#
# See getopt.sh for more information
. getopt.sh
#echo Using getoptex to parse arguments:
#while getoptex "a; b; c; d: e. opt1 opt2 opt3 opt4: opt5." "$@"
#do
# echo "Option <$OPTOPT> ${OPTARG:+has an arg <$OPTARG>}"
#done
#shift $[OPTIND-1]
#for arg in "$@"
#do
# echo "Non option argument <$arg>"
#done
#
#**************************************
# cut here
#**************************************
#*** (end of getopt2) ***

View file

@ -0,0 +1,44 @@
#
# inet2hex - Internet address conversion, dotted-decimal to hex
#
inet2hex ()
{
local IFS
IFS=.
set -- $1
if (( $# != 4 )); then
echo "inet2hex: incorrect input format: $1" >&2
echo "inet2hex: usage: inet2hex XX.XX.XX.XX" >&2
return 2
fi
printf "0x%02x%02x%02x%02x\n" $1 $2 $3 $4
}
#
# hex2inet - Internet address conversion, hex to dotted-decimal
#
hex2inet ()
{
local x1 x2 x3 x4
case "$1" in
0x*) h=${1#??} ;;
*) h=$1 ;;
esac
if (( ${#h} != 8 )); then
echo "hex2inet: $h not in inet format" >&2
echo "hex2inet: usage: hex2inet [0x]XXXXXXXX" >&2
return 2
fi
x1=$(( 0x${h:0:2} ))
x2=$(( 0x${h:2:2} ))
x3=$(( 0x${h:4:2} ))
x4=$(( 0x${h:6:2} ))
printf "%d.%d.%d.%d\n" $x1 $x2 $x3 $x4
}

View file

@ -1,5 +1,6 @@
inpath()
{
local PROG
path=$(echo $PATH | sed 's/^:/.:/
s/::/:.:/g
s/:$/:./
@ -9,7 +10,5 @@ inpath()
do
[ -x $x/$1 ] && { PROG=$x/$1; break; }
done
[ -z "$PROG" ]
return
[ -n "$PROG" ]
}

View file

@ -0,0 +1,23 @@
#From: jrmartin@rainey.blueneptune.com (James R. Martin)
#Newsgroups: comp.unix.shell
#Subject: Re: testing user input on numeric or character value
#Date: 26 Nov 1997 01:28:43 GMT
# isnum returns True if its argument is a valid number,
# and False (retval=1) if it is any other string.
# The first pattern requires a digit before the decimal
# point, and the second after the decimal point.
# BASH NOTE: make sure you have executed `shopt -s extglob' before
# trying to use this function, or it will not work
function isnum # string
{
case $1 in
?([-+])+([0-9])?(.)*([0-9])?([Ee]?([-+])+([0-9])) )
return 0;;
?([-+])*([0-9])?(.)+([0-9])?([Ee]?([-+])+([0-9])) )
return 0;;
*) return 1;;
esac
}

22
examples/functions/isnum2 Normal file
View file

@ -0,0 +1,22 @@
isnum2()
{
case "$1" in
'[-+]' | '') return 1;; # empty or bare `-' or `+'
[-+]*[!0-9]*) return 1;; # non-digit with leading sign
[-+]*) return 0;; # OK
*[!0-9]*) return 1;; # non-digit
*) return 0;; # OK
esac
}
# this one handles floating point
isnum3()
{
case "$1" in
'') return 1;; # empty
*[!0-9.+-]*) return 1;; # non-digit, +, -, or .
*?[-+]*) return 1;; # sign as second or later char
*.*.*) return 1;; # multiple decimal points
*) return 0;; # OK
esac
}

View file

@ -0,0 +1,78 @@
#From: damatex@CAM.ORG (Mario Boudreault)
#Newsgroups: comp.unix.shell
#Subject: JULIAN DATE CONVERSION SUB
#Date: 4 Aug 1995 10:23:28 -0400
#Message-ID: <3vtah0$jb3@ocean.CAM.ORG>
#For those using shells and who want to convert dates to a julian number
#here is a shell script (wihtout validation) that can be used as a base
#program for your shell scripts.
#Special thanks to Ed Ferguson@ti.com who sent me the algorithm to compute
#that date.
#
# MODIFIED BY CHET RAMEY TO CONVERT TO bash v2 SYNTAX
#
# cnvdate - Conversion de dates en julienne et vice et versa...
#
# Par : Mario Boudreault Damatex Inc Montreal, Canada
# Date: 2 Aout 1995
# Rev.: 2 Aout 1995
#
# Usage:
# cvdate [-j] YYYMMDD pour convertir en nbre de jours
# cvdate -d {julian number} pour convertir en AAAAMMJJ
#
jul_date()
{
#
# Separe ANNEE, MOIS et JOUR...
#
YEAR=`echo $DATE | awk ' { print substr($0,1,4) } '`
MONTH=`echo $DATE | awk ' { print substr($0,5,2) } '`
DAY=`echo $DATE | awk ' { print substr($0,7,2) } '`
#
# Execute la formule magique...
#
A=$(( $DAY - 32075 + 1461 * ( $YEAR + 4800 - ( 14 - $MONTH ) / 12 ) \
/ 4 + 367 * ( $MONTH - 2 + ( 14 - $MONTH ) / 12 * 12 ) / 12 - \
3 * ( ( $YEAR + 4900 - ( 14 - $MONTH ) / 12 ) / 100 ) / 4 ))
echo $A
}
day_date()
{
TEMP1=$(( $DATE + 68569 ))
TEMP2=$(( 4 * $TEMP1 / 146097 ))
TEMP1=$(( $TEMP1 - ( 146097 * $TEMP2 + 3 ) / 4 ))
Y=$(( 4000 * ( $TEMP1 + 1 ) / 1461001 ))
TEMP1=$(( $TEMP1 - 1461 * $Y / 4 + 31 ))
M=$(( 80 * $TEMP1 / 2447 ))
D=$(( $TEMP1 - 2447 * $M / 80 ))
TEMP1=$(( $M / 11 ))
M=$(( $M + 2 - 12 * $TEMP1 ))
Y=$(( 100 * ( $TEMP2 - 49 ) + $Y + $TEMP1 ))
M=`echo $M | awk ' { M=$0 ; if ( length($0) == 1 ) M="0"$0 } END { print M } '`
D=`echo $D | awk ' { D=$0 ; if ( length($0) == 1 ) D="0"$0 } END { print D } '`
echo $Y$M$D
}
# main()
if [ $# -eq 1 ]; then
DATE=$1
jul_date
elif [ "$1" = '-j' ]; then
DATE=$2
jul_date
elif [ "$1" = '-d' ]; then
DATE=$2
day_date
fi
#
# Termine
#
exit 0

View file

@ -0,0 +1,48 @@
#From: "Simon J. Gerraty" <sjg@zen.void.oz.au>
#Message-Id: <199510091130.VAA01188@zen.void.oz.au>
#Subject: Re: a shell idea?
#Date: Mon, 09 Oct 1995 21:30:20 +1000
# NAME:
# add_path.sh - add dir to path
#
# DESCRIPTION:
# These functions originated in /etc/profile and ksh.kshrc, but
# are more useful in a separate file.
#
# SEE ALSO:
# /etc/profile
#
# AUTHOR:
# Simon J. Gerraty <sjg@zen.void.oz.au>
# RCSid:
# $Id: add_path.sh,v 1.1 1995/09/30 12:45:23 sjg Exp $
#
# @(#)Copyright (c) 1991 Simon J. Gerraty
#
# This file is provided in the hope that it will
# be of use. There is absolutely NO WARRANTY.
# Permission to copy, redistribute or otherwise
# use this file is hereby granted provided that
# the above copyright notice and this notice are
# left intact.
# is $1 missing from $2 (or PATH) ?
no_path() {
eval "case :\$${2-PATH}: in *:$1:*) return 1;; *) return 0;; esac"
}
# if $1 exists and is not in path, append it
add_path () {
[ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
}
# if $1 exists and is not in path, prepend it
pre_path () {
[ -d ${1:-.} ] && no_path $* && eval ${2:-PATH}="$1:\$${2:-PATH}"
}
# if $1 is in path, remove it
del_path () {
no_path $* || eval ${2:-PATH}=`eval echo :'$'${2:-PATH}: |
sed -e "s;:$1:;:;g" -e "s;^:;;" -e "s;:\$;;"`
}

19
examples/functions/shcat2 Normal file
View file

@ -0,0 +1,19 @@
shcat()
{
while read -r line
do
echo "$line"
done
}
shcat2()
{
while [ $# -ge 1 ]; do
case "$1" in
-) shcat ;;
*) shcat < "$1" ;;
esac
shift
done
exit 0
}

View file

@ -1,41 +1,64 @@
#
# Simple makefile for the sample loadable builtins
#
CC = cc
# This includes some boilerplate definitions added by configure, but will
# still need hand-editing
#
# Include some boilerplate Gnu makefile definitions.
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
infodir = @infodir@
includedir = @includedir@
topdir = @top_srcdir@
BUILD_DIR = @BUILD_DIR@
srcdir = @srcdir@
VPATH = .:@srcdir@
@SET_MAKE@
CC = @CC@
RM = rm -f
SHELL = /bin/sh
# SunOS 4
PICFLAG = -pic
#PICFLAG = -pic
# Some versions of gcc, esp. on NetBSD and FreeBSD
#PICFLAG = -fpic
PICFLAG = -fpic
# Linux -- could also be -fpic
#PICFLAG = -fPIC
# SunOS 5
#PICFLAG = -K pic
# SVR4, SVR4.2, Irix
#PICFLAG = -K PIC
# BSD/OS 2.1
# BSD/OS 2.1, BSD/OS 3.x
#PICFLAG =
# AIX 4.2
#PICFLAG = -K
# SunOS 4, BSD/OS 2.1, SVR4.2, SVR4, Linux, AIX 4.2, etc.
# SunOS 4, BSD/OS 2.1, BSD/OS 3.x, SVR4.2, SVR4, Linux, AIX 4.2, etc.
LD = ld
# SunOS 5, Linux
#LD = cc
#LD = ${CC}
# SunOS 4
LDOPT = -assert pure-text
#LDOPT = -assert pure-text
# OSF/1, Digital UNIX
#LDOPT = -shared -soname $@ -expect_unresolved '*'
# SunOS 5
# SunOS 5 using sun cc
#LDOPT = -dy -z text -G -i -h $@
# SunOS 5 using gcc with Sun ld
#LDOPT = -shared -Wl,-dy -Wl,-G -Wl,-i
# SVR4, SVR4.2
#LDOPT = -dy -z text -G -h $@
# NetBSD, FreeBSD -- might also need -r
#LDOPT = -x -Bshareable
LDOPT = -x -Bshareable
# Linux
#LDOPT = -shared
# BSD/OS 2.1
# BSD/OS 2.1, BSD/OS 3.x
#LDOPT = -r
# AIX 4.2
#LDOPT = -bdynamic -bnoentry -bexpall -G
@ -43,19 +66,25 @@ LDOPT = -assert pure-text
# other libraries to link the shared object against
# BSD/OS 2.1
#LDLIBS = -lc_s.2.1.0
# BSD/OS 3.0, BSD/OS 3.1
#LDLIBS = -lc_s.3.0.0
srcdir = ../..
INC= -I$(srcdir) -I$(srcdir)/builtins -I$(srcdir)/lib
INC = -I. -I.. -I$(topdir) -I$(topdir)/lib -I$(topdir)/builtins \
-I$(BUILD_DIR) -I$(BUILD_DIR)/lib -I$(BUILD_DIR)/builtins
.c.o:
$(CC) $(PICFLAG) $(CFLAGS) $(INC) -c -o $@ $<
all: printf print truefalse sleep pushd finfo logname basename dirname \
tty pathchk tee head rmdir sprintf
others: necho getconf hello cat
printf: printf.o
$(LD) $(LDOPT) -o $@ printf.o $(LDLIBS)
ALLPROG = print truefalse sleep pushd finfo logname basename dirname \
tty pathchk tee head rmdir sprintf
OTHERPROG = necho getconf hello cat
all: $(ALLPROG)
others: $(OTHERPROG)
everything: all others
sprintf: sprintf.o
$(LD) $(LDOPT) -o $@ sprintf.o $(LDLIBS)
@ -110,3 +139,31 @@ rmdir: rmdir.o
head: head.o
$(LD) $(LDOPT) -o $@ head.o $(LDLIBS)
clean:
$(RM) $(ALLPROG) $(OTHERPROG) *.o
mostlyclean: clean
distclean maintainer-clean: clean
$(RM) Makefile
print.o: print.c
truefalse.o: truefalse.c
sleep.o: sleep.c
pushd.o: pushd.c
finfo.o: finfo.c
logname.o: logname.c
basename.o: basename.c
dirname.o: dirname.c
tty.o: tty.c
pathchk.o: pathchk.c
tee.o: tee.c
head.o: head.c
rmdir.o: rmdir.c
sprintf.o: sprintf.c
necho.o: necho.c
getconf.o: getconf.c
hello.o: hello.c
cat.o: cat.c

View file

@ -1,4 +1,6 @@
/*
* ORIGINAL COPYRIGHT STATEMENT:
*
* Copyright (c) 1994 Winning Strategies, Inc.
* All rights reserved.
*
@ -31,14 +33,13 @@
/*
* POSIX.2 getconf utility
*
* Written by:
* Originally Written by:
* J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
*
* Heavily modified for inclusion in bash by
* Chet Ramey <chet@po.cwru.edu>
*/
#ifndef lint
static char rcsid[] = "$Id: getconf.c,v 1.2 1994/05/10 00:04:12 jtc Exp $";
#endif /* not lint */
#include <stdio.h>
#include <limits.h>
#include <locale.h>
@ -48,7 +49,8 @@ static char rcsid[] = "$Id: getconf.c,v 1.2 1994/05/10 00:04:12 jtc Exp $";
#include "shell.h"
#include "builtins.h"
#include "stdc.h"
#include "common.h"
#include "bashgetopt.h"
struct conf_variable
{
@ -57,25 +59,66 @@ struct conf_variable
long value;
};
/* BSD/OS does not define this; use Posix.2 recommended minimum value. */
/* Some systems do not define these; use POSIX.2 minimum recommended values. */
#ifndef _POSIX2_COLL_WEIGHTS_MAX
#define _POSIX2_COLL_WEIGHTS_MAX 2
# define _POSIX2_COLL_WEIGHTS_MAX 2
#endif
static const struct conf_variable conf_table[] =
{
/* POSIX.2 Configurable Variable Values */
{ "PATH", CONFSTR, _CS_PATH },
{ "CS_PATH", CONFSTR, _CS_PATH },
/* Utility Limit Minimum Values */
/* POSIX.1 Configurable Variable Values (only Solaris?) */
#if defined (_CS_LFS_CFLAGS)
{ "LFS_CFLAGS", CONFSTR, _CS_LFS_CFLAGS },
{ "LFS_LDFLAGS", CONFSTR, _CS_LFS_LDFLAGS },
{ "LFS_LIBS", CONFSTR, _CS_LFS_LIBS },
{ "LFS_LINTFLAGS", CONFSTR, _CS_LFS_LINTFLAGS },
#endif
#if defined (_CS_LFS64_CFLAGS)
{ "LFS64_CFLAGS", CONFSTR, _CS_LFS64_CFLAGS },
{ "LFS64_LDFLAGS", CONFSTR, _CS_LFS64_LDFLAGS },
{ "LFS64_LIBS", CONFSTR, _CS_LFS64_LIBS },
{ "LFS64_LINTFLAGS", CONFSTR, _CS_LFS64_LINTFLAGS },
#endif
/* Single UNIX Specification version 2 Configurable Variable Values */
#if defined (_CS_XBS5_ILP32_OFF32_CFLAGS)
{ "XBS5_ILP32_OFF32_CFLAGS", CONFSTR, _CS_XBS5_ILP32_OFF32_CFLAGS },
{ "XBS5_ILP32_OFF32_LDFLAGS", CONFSTR, _CS_XBS5_ILP32_OFF32_LDFLAGS },
{ "XBS5_ILP32_OFF32_LIBS", CONFSTR, _CS_XBS5_ILP32_OFF32_LIBS },
{ "XBS5_ILP32_OFF32_LINTFLAGS", CONFSTR, _CS_XBS5_ILP32_OFF32_LINTFLAGS },
{ "XBS5_ILP32_OFFBIG_CFLAGS", CONFSTR, _CS_XBS5_ILP32_OFFBIG_CFLAGS },
{ "XBS5_ILP32_OFFBIG_LDFLAGS", CONFSTR, _CS_XBS5_ILP32_OFFBIG_LDFLAGS },
{ "XBS5_ILP32_OFFBIG_LIBS", CONFSTR, _CS_XBS5_ILP32_OFFBIG_LIBS },
{ "XBS5_ILP32_OFFBIG_LINTFLAGS", CONFSTR, _CS_XBS5_ILP32_OFFBIG_LINTFLAGS },
{ "XBS5_LP64_OFF64_CFLAGS", CONFSTR, _CS_XBS5_LP64_OFF64_CFLAGS },
{ "XBS5_LP64_OFF64_LDFLAGS", CONFSTR, _CS_XBS5_LP64_OFF64_LDFLAGS },
{ "XBS5_LP64_OFF64_LIBS", CONFSTR, _CS_XBS5_LP64_OFF64_LIBS },
{ "XBS5_LP64_OFF64_LINTFLAGS", CONFSTR, _CS_XBS5_LP64_OFF64_LINTFLAGS },
{ "XBS5_LPBIG_OFFBIG_CFLAGS", CONFSTR, _CS_XBS5_LPBIG_OFFBIG_CFLAGS },
{ "XBS5_LPBIG_OFFBIG_LDFLAGS", CONFSTR, _CS_XBS5_LPBIG_OFFBIG_LDFLAGS },
{ "XBS5_LPBIG_OFFBIG_LIBS", CONFSTR, _CS_XBS5_LPBIG_OFFBIG_LIBS },
{ "XBS5_LPBIG_OFFBIG_LINTFLAGS", CONFSTR, _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS },
#endif /* _CS_XBS5_ILP32_OFF32_CFLAGS */
/* POSIX.2 Utility Limit Minimum Values */
{ "POSIX2_BC_BASE_MAX", CONSTANT, _POSIX2_BC_BASE_MAX },
{ "POSIX2_BC_DIM_MAX", CONSTANT, _POSIX2_BC_DIM_MAX },
{ "POSIX2_BC_SCALE_MAX", CONSTANT, _POSIX2_BC_SCALE_MAX },
{ "POSIX2_BC_STRING_MAX", CONSTANT, _POSIX2_BC_STRING_MAX },
{ "POSIX2_COLL_WEIGHTS_MAX", CONSTANT, _POSIX2_COLL_WEIGHTS_MAX },
#if defined (_POSIX2_EQUIV_CLASS_MAX)
{ "POSIX2_EQUIV_CLASS_MAX", CONSTANT, _POSIX2_EQUIV_CLASS_MAX },
#endif
{ "POSIX2_EXPR_NEST_MAX", CONSTANT, _POSIX2_EXPR_NEST_MAX },
{ "POSIX2_LINE_MAX", CONSTANT, _POSIX2_LINE_MAX },
{ "POSIX2_RE_DUP_MAX", CONSTANT, _POSIX2_RE_DUP_MAX },
#if defined (_POSIX2_VERSION)
{ "POSIX2_VERSION", CONSTANT, _POSIX2_VERSION },
#endif
/* POSIX.1 Minimum Values */
{ "_POSIX_ARG_MAX", CONSTANT, _POSIX_ARG_MAX },
@ -92,7 +135,7 @@ static const struct conf_variable conf_table[] =
{ "_POSIX_STREAM_MAX", CONSTANT, _POSIX_STREAM_MAX },
{ "_POSIX_TZNAME_MAX", CONSTANT, _POSIX_TZNAME_MAX },
/* Symbolic Utility Limits */
/* POSIX.2 Symbolic Utility Limits */
{ "BC_BASE_MAX", SYSCONF, _SC_BC_BASE_MAX },
{ "BC_DIM_MAX", SYSCONF, _SC_BC_DIM_MAX },
{ "BC_SCALE_MAX", SYSCONF, _SC_BC_SCALE_MAX },
@ -102,15 +145,25 @@ static const struct conf_variable conf_table[] =
{ "LINE_MAX", SYSCONF, _SC_LINE_MAX },
{ "RE_DUP_MAX", SYSCONF, _SC_RE_DUP_MAX },
/* Optional Facility Configuration Values */
/* POSIX.2 Optional Facility Configuration Values */
{ "POSIX2_C_BIND", SYSCONF, _SC_2_C_BIND },
{ "POSIX2_C_DEV", SYSCONF, _SC_2_C_DEV },
#if defined (_SC_2_C_VERSION)
{ "POSIX2_C_VERSION", SYSCONF, _SC_2_C_VERSION },
#endif
#if defined (_SC_2_CHAR_TERM)
{ "POSIX2_CHAR_TERM", SYSCONF, _SC_2_CHAR_TERM },
#endif
{ "POSIX2_FORT_DEV", SYSCONF, _SC_2_FORT_DEV },
{ "POSIX2_FORT_RUN", SYSCONF, _SC_2_FORT_RUN },
{ "POSIX2_LOCALEDEF", SYSCONF, _SC_2_LOCALEDEF },
{ "POSIX2_SW_DEV", SYSCONF, _SC_2_SW_DEV },
#if defined (_SC2_UPE)
{ "POSIX2_UPE", SYSCONF, _SC_2_UPE },
#endif
#if !defined (_POSIX2_VERSION) && defined (_SC_2_VERSION)
{ "POSIX2_VERSION" SYSCONF, _SC_2_VERSION },
#endif
/* POSIX.1 Configurable System Variables */
{ "ARG_MAX", SYSCONF, _SC_ARG_MAX },
@ -124,6 +177,140 @@ static const struct conf_variable conf_table[] =
{ "_POSIX_SAVED_IDS", SYSCONF, _SC_SAVED_IDS },
{ "_POSIX_VERSION", SYSCONF, _SC_VERSION },
/* POSIX.1 Optional Facility Configuration Values */
#if defined (_SC_ASYNCHRONOUS_IO)
{ "_POSIX_ASYNCHRONOUS_IO", SYSCONF, _SC_ASYNCHRONOUS_IO },
#endif
#if defined (_SC_FSYNC)
{ "_POSIX_FSYNC", SYSCONF, _SC_FSYNC },
#endif
#if defined (_SC_MAPPED_FILES)
{ "_POSIX_MAPPED_FILES", SYSCONF, _SC_MAPPED_FILES },
#endif
#if defined (_SC_MEMLOCK)
{ "_POSIX_MEMLOCK", SYSCONF, _SC_MEMLOCK },
#endif
#if defined (_SC_MEMLOCK_RANGE)
{ "_POSIX_MEMLOCK_RANGE", SYSCONF, _SC_MEMLOCK_RANGE },
#endif
#if defined (_SC_MEMORY_PROTECTION)
{ "_POSIX_MEMORY_PROTECTION", SYSCONF, _SC_MEMORY_PROTECTION },
#endif
#if defined (_SC_MESSAGE_PASSING)
{ "_POSIX_MESSAGE_PASSING", SYSCONF, _SC_MESSAGE_PASSING },
#endif
#if defined (SC_PRIORITIZED_IO)
{ "_POSIX_PRIORITIZED_IO", SYSCONF, _SC_PRIORITIZED_IO },
#endif
#if defined (_SC_PRIORITY_SCHEDULING)
{ "_POSIX_PRIORITY_SCHEDULING", SYSCONF, _SC_PRIORITY_SCHEDULING },
#endif
#if defined (_SC_REALTIME_SIGNALS)
{ "_POSIX_REALTIME_SIGNALS", SYSCONF, _SC_REALTIME_SIGNALS },
#endif
#if defined (_SC_SEMAPHORES)
{ "_POSIX_SEMAPHORES", SYSCONF, _SC_SEMAPHORES },
#endif
#if defined (_SC_SHARED_MEMORY_OBJECTS)
{ "_POSIX_SHARED_MEMORY_OBJECTS", SYSCONF, _SC_SHARED_MEMORY_OBJECTS },
#endif
#if defined (_SC_SYNCHRONIZED_IO)
{ "_POSIX_SYNCHRONIZED_IO", SYSCONF, _SC_SYNCHRONIZED_IO },
#endif
#if defined (_SC_TIMERS)
{ "_POSIX_TIMERS", SYSCONF, _SC_TIMERS },
#endif
#if defined (_SC_THREADS)
{ "_POSIX_THREADS", SYSCONF, _SC_THREADS },
{ "_POSIX_THREAD_ATTR_STACKADDR", SYSCONF, _SC_THREAD_ATTR_STACKADDR },
{ "_POSIX_THREAD_ATTR_STACKSIZE", SYSCONF, _SC_THREAD_ATTR_STACKSIZE },
{ "_POSIX_THREAD_PRIORITY_SCHEDULING", SYSCONF, _SC_THREAD_PRIORITY_SCHEDULING },
{ "_POSIX_THREAD_PRIO_INHERIT", SYSCONF, _SC_THREAD_PRIO_INHERIT },
{ "_POSIX_THREAD_PRIO_PROTECT", SYSCONF, _SC_THREAD_PRIO_PROTECT },
{ "_POSIX_THREAD_PROCESS_SHARED", SYSCONF, _SC_THREAD_PROCESS_SHARED },
# if defined (_SC_THREAD_SAFE_FUNCTIONS)
{ "_POSIX_THREAD_SAFE_FUNCTIONS", SYSCONF, _SC_THREAD_SAFE_FUNCTIONS },
# endif
#endif /* _SC_THREADS */
/* XPG 4.2 Configurable System Variables. */
#if defined (_SC_ATEXIT_MAX)
{ "ATEXIT_MAX", SYSCONF, _SC_ATEXIT_MAX },
#endif
#if defined (_SC_IOV_MAX)
{ "IOV_MAX", SYSCONF, _SC_IOV_MAX },
#endif
#if defined (_SC_PAGESIZE)
{ "PAGESIZE", SYSCONF, _SC_PAGESIZE },
#endif
#if defined (_SC_PAGE_SIZE)
{ "PAGE_SIZE", SYSCONF, _SC_PAGE_SIZE },
#endif
#if defined (_SC_AIO_LISTIO_MAX)
{ "AIO_LISTIO_MAX", SYSCONF, _SC_AIO_LISTIO_MAX },
{ "AIO_MAX", SYSCONF, _SC_AIO_MAX },
{ "AIO_PRIO_DELTA_MAX", SYSCONF, _SC_AIO_PRIO_DELTA_MAX },
{ "DELAYTIMER_MAX", SYSCONF, _SC_DELAYTIMER_MAX },
#if defined (_SC_GETGR_R_SIZE_MAX)
{ "GETGR_R_SIZE_MAX", SYSCONF, _SC_GETGR_R_SIZE_MAX },
#endif
#if defined (_SC_GETPW_R_SIZE_MAX)
{ "GETPW_R_SIZE_MAX", SYSCONF, _SC_GETPW_R_SIZE_MAX },
#endif
{ "MQ_OPEN_MAX", SYSCONF, _SC_MQ_OPEN_MAX },
{ "MQ_PRIO_MAX", SYSCONF, _SC_MQ_PRIO_MAX },
{ "RTSIG_MAX", SYSCONF, _SC_RTSIG_MAX },
{ "SEM_NSEMS_MAX", SYSCONF, _SC_SEM_NSEMS_MAX },
{ "SEM_VALUE_MAX", SYSCONF, _SC_SEM_VALUE_MAX },
{ "SIGQUEUE_MAX", SYSCONF, _SC_SIGQUEUE_MAX },
{ "TIMER_MAX", SYSCONF, _SC_TIMER_MAX },
#endif /* _SC_AIO_LISTIO_MAX */
#if defined (_SC_LOGIN_NAME_MAX)
{ "LOGIN_NAME_MAX", SYSCONF, _SC_LOGIN_NAME_MAX },
#endif
#if defined (_SC_LOGNAME_MAX)
{ "LOGNAME_MAX", SYSCONF, _SC_LOGNAME_MAX },
#endif
#if defined (_SC_TTY_NAME_MAX)
{ "TTY_NAME_MAX", SYSCONF, _SC_TTY_NAME_MAX },
#endif
#if defined (_SC_PTHREAD_DESTRUCTOR_ITERATIONS)
{ "PTHREAD_DESTRUCTOR_ITERATIONS", SYSCONF, _SC_THREAD_DESTRUCTOR_ITERATIONS },
{ "PTHREAD_KEYS_MAX", SYSCONF, _SC_THREAD_KEYS_MAX },
{ "PTHREAD_STACK_MIN", SYSCONF, _SC_THREAD_STACK_MIN },
{ "PTHREAD_THREADS_MAX", SYSCONF, _SC_THREAD_THREADS_MAX },
#endif /* _SC_PTHREAD_DESTRUCTOR_ITERATIONS */
/* XPG 4.2 Optional Facility Configuration Values */
#if defined (_SC_XOPEN_UNIX)
{ "_XOPEN_UNIX", SYSCONF, _SC_XOPEN_UNIX },
{ "_XOPEN_CRYPT", SYSCONF, _SC_XOPEN_CRYPT },
{ "_XOPEN_ENH_I18N", SYSCONF, _SC_XOPEN_ENH_I18N },
{ "_XOPEN_SHM", SYSCONF, _SC_XOPEN_SHM },
{ "_XOPEN_VERSION", SYSCONF, _SC_XOPEN_VERSION },
# if defined (_SC_XOPEN_XCU_VERSION)
{ "_XOPEN_XCU_VERSION", SYSCONF, _SC_XOPEN_XCU_VERSION },
# endif
#endif
#if defined (_SC_XOPEN_REALTIME)
{ "_XOPEN_REALTIME", SYSCONF, _SC_XOPEN_REALTIME },
{ "_XOPEN_REALTIME_THREADS", SYSCONF, _SC_XOPEN_REALTIME_THREADS },
#endif
#if defined (_SC_XOPEN_LEGACY)
{ "_XOPEN_LEGACY", SYSCONF, _SC_XOPEN_LEGACY },
#endif /* _SC_XOPEN_LEGACY */
/* Single UNIX Specification version 2 Optional Facility Configuration Values */
#if defined (_SC_XBS5_ILP32_OFF32)
{ "_XBS5_ILP32_OFF32", SYSCONF, _SC_XBS5_ILP32_OFF32 },
{ "_XBS5_ILP32_OFFBIG", SYSCONF, _SC_XBS5_ILP32_OFFBIG },
{ "_XBS5_LP64_OFF64", SYSCONF, _SC_XBS5_LP64_OFF64 },
{ "_XBS5_LPBIG_OFFBIG", SYSCONF, _SC_XBS5_LPBIG_OFFBIG },
#endif /* _SC_XBS5_ILP32_OFF32 */
/* POSIX.1 Configurable Pathname Values */
{ "LINK_MAX", PATHCONF, _PC_LINK_MAX },
{ "MAX_CANON", PATHCONF, _PC_MAX_CANON },
{ "MAX_INPUT", PATHCONF, _PC_MAX_INPUT },
@ -134,81 +321,93 @@ static const struct conf_variable conf_table[] =
{ "_POSIX_NO_TRUNC", PATHCONF, _PC_NO_TRUNC },
{ "_POSIX_VDISABLE", PATHCONF, _PC_VDISABLE },
/* XPG 4.2 Configurable Pathname Values */
#if defined (_PC_FILESIZEBITS)
{ "FILESIZEBITS", PATHCONF, _PC_FILESIZEBITS },
#endif
#if defined (_PC_ASYNC_IO)
{ "_POSIX_ASYNC_IO", PATHCONF, _PC_ASYNC_IO },
#endif
#if defined (_PC_PRIO_IO)
{ "_POSIX_PRIO_IO", PATHCONF, _PC_PRIO_IO },
#endif
#if defined (_PC_SYNC_IO)
{ "_POSIX_SYNC_IO", PATHCONF, _PC_SYNC_IO },
#endif
{ NULL }
};
static int num_getconf_variables = sizeof(conf_table) / sizeof(struct conf_variable) - 1;
extern char *this_command_name;
extern char *xmalloc ();
extern char **make_builtin_argv ();
static int getconf_main ();
static void getconf_help ();
static int getconf_print ();
static int getconf_one ();
static int getconf_all ();
int
getconf_builtin (list)
WORD_LIST *list;
{
int c, r;
int c, r, opt, aflag;
char **v;
WORD_LIST *l;
v = make_builtin_argv (list, &c);
r = getconf_main (c, v);
free (v);
aflag = 0;
reset_internal_getopt();
while ((opt = internal_getopt (list, "ah")) != -1) {
switch (opt) {
case 'a':
aflag = 1;
break;
case 'h':
getconf_help();
return(EXECUTION_SUCCESS);
default:
builtin_usage();
return(EX_USAGE);
}
}
list = loptend;
if ((aflag == 0 && list == 0) || (aflag && list) || list_length(list) > 2) {
builtin_usage();
return(EX_USAGE);
}
r = aflag ? getconf_all() : getconf_one(list);
return r;
}
static int
getconf_main(argc, argv)
int argc;
char **argv;
static void
getconf_help()
{
int ch;
const struct conf_variable *cp;
register int i, column;
long val;
size_t slen;
char *sval;
setlocale(LC_ALL, "");
while ((ch = getopt(argc, argv, "")) != -1) {
switch (ch) {
case '?':
default:
builtin_usage();
return(EX_USAGE);
/* NOTREACHED */
}
}
argc -= optind;
argv += optind;
if (argc < 1 || argc > 2) {
builtin_usage();
return(EX_USAGE);
/* NOTREACHED */
}
builtin_usage();
printf("Acceptable variable names are:\n");
for (cp = conf_table; cp->name != NULL; cp++) {
if (strcmp(*argv, cp->name) == 0)
break;
}
if (cp->name == NULL) {
builtin_error ("%s: unknown variable", *argv);
return (EXECUTION_FAILURE);
if (cp->type == PATHCONF)
printf("%s pathname\n", cp->name);
else
printf("%s\n", cp->name);
}
}
if (cp->type == PATHCONF) {
if (argc != 2) {
builtin_usage();
return(EX_USAGE);
}
} else {
if (argc != 1) {
builtin_usage();
return(EX_USAGE);
}
}
static int
getconf_print(cp, vpath, all)
struct conf_variable *cp;
char *vpath;
int all;
{
long val;
char *sval;
size_t slen;
switch (cp->type) {
case CONSTANT:
@ -216,19 +415,33 @@ getconf_main(argc, argv)
break;
case CONFSTR:
errno = 0;
slen = confstr (cp->value, (char *) 0, (size_t) 0);
if (slen == 0) {
if (errno != 0) {
if (all)
printf ("getconf: %s\n", strerror(errno));
else
builtin_error ("%s", strerror(errno));
} else
printf ("undefined\n");
return (EXECUTION_FAILURE);
}
sval = xmalloc(slen);
confstr(cp->value, sval, slen);
printf("%s\n", sval);
free(sval);
break;
case SYSCONF:
errno = 0;
if ((val = sysconf(cp->value)) == -1) {
if (errno != 0) {
builtin_error ("%s", strerror (errno));
if (all)
printf("getconf: %s\n", strerror (errno));
else
builtin_error ("%s", strerror (errno));
return (EXECUTION_FAILURE);
}
@ -240,9 +453,12 @@ getconf_main(argc, argv)
case PATHCONF:
errno = 0;
if ((val = pathconf(argv[1], cp->value)) == -1) {
if ((val = pathconf(vpath, cp->value)) == -1) {
if (errno != 0) {
builtin_error ("%s: %s", argv[1], strerror (errno));
if (all)
printf("getconf: %s: %s\n", vpath, strerror (errno));
else
builtin_error ("%s: %s", vpath, strerror (errno));
return (EXECUTION_FAILURE);
}
@ -256,6 +472,56 @@ getconf_main(argc, argv)
return (ferror(stdout) ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
}
static int
getconf_all()
{
const struct conf_variable *cp;
int ret;
ret = EXECUTION_SUCCESS;
for (cp = conf_table; cp->name != NULL; cp++) {
printf("%-35s", cp->name);
if (getconf_print(cp, ".", 1) == EXECUTION_FAILURE)
ret = EXECUTION_FAILURE;
}
return ret;
}
static int
getconf_one(list)
WORD_LIST *list;
{
const struct conf_variable *cp;
char *vname, *vpath;
vname = list->word->word;
vpath = (list->next && list->next->word) ? list->next->word->word
: (char *)NULL;
for (cp = conf_table; cp->name != NULL; cp++) {
if (strcmp(vname, cp->name) == 0)
break;
}
if (cp->name == NULL) {
builtin_error ("%s: unknown variable", vname);
return (EXECUTION_FAILURE);
}
if (cp->type == PATHCONF) {
if (list->next == 0) {
builtin_usage();
return(EX_USAGE);
}
} else {
if (list->next) {
builtin_usage();
return(EX_USAGE);
}
}
return (getconf_print(cp, vpath, 0));
}
static char *getconf_doc[] = {
"getconf writes the current value of a configurable system limit or",
"option variable to the standard output.",
@ -267,6 +533,6 @@ struct builtin getconf_struct = {
getconf_builtin,
BUILTIN_ENABLED,
getconf_doc,
"getconf sysvar or getconf pathvar pathname",
"getconf -a or getconf -h or getconf sysvar or getconf pathvar pathname",
0
};

View file

@ -1,37 +1,4 @@
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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.
*/
#include <sys/types.h>
#include "bashtypes.h"
#include <errno.h>
#include <limits.h>
@ -47,44 +14,15 @@
extern int errno;
#endif
#define PF(f, func) { \
if (fieldwidth) \
if (precision) \
(void)fprintf(ofp, f, fieldwidth, precision, func); \
else \
(void)fprintf(ofp, f, fieldwidth, func); \
else if (precision) \
(void)fprintf(ofp, f, precision, func); \
else \
(void)fprintf(ofp, f, func); \
}
static int asciicode __P((void));
static void escape __P((char *));
static int getchr __P((void));
static double getdouble __P((void));
static int getint __P((int *));
static int getlong __P((long *));
static char *getstr __P((void));
static char *mklong __P((char *, int));
static void usage __P((void));
static char **gargv;
int print_builtin ();
static int printf_main ();
static int printargs ();
static FILE *ofp;
extern char *ansicstr ();
extern char *single_quote ();
extern char **make_builtin_argv ();
extern char *this_command_name;
extern int optind;
static char *print_doc[] = {
"Output the arguments. The -f option means to use the argument as a",
"format string as would be supplied to printf(1). The rest of the",
@ -168,12 +106,15 @@ opt_end:
if (pfmt)
{
v = word_list_to_argv (list, 0, 2, &c);
v[0] = this_command_name;
v[1] = pfmt;
r = printf_main (c, v);
free (v);
return r;
WORD_DESC *w;
WORD_LIST *nlist;
w = make_word (pfmt);
nlist = make_word_list (w, list);
r = printf_builtin (nlist);
nlist->next = (WORD_LIST *)NULL;
dispose_words (nlist);
return (r);
}
if (raw)
@ -198,7 +139,8 @@ opt_end:
return 0;
}
static int printargs (list, ofp)
static int
printargs (list, ofp)
WORD_LIST *list;
FILE *ofp;
{
@ -208,7 +150,7 @@ static int printargs (list, ofp)
for (sawc = 0, l = list; l; l = l->next)
{
ostr = ansicstr (l->word->word, strlen (l->word->word), &sawc);
ostr = ansicstr (l->word->word, strlen (l->word->word), &sawc, (int *)0);
fprintf (ofp, "%s", ostr);
free (ostr);
if (sawc)
@ -219,335 +161,3 @@ static int printargs (list, ofp)
return (1);
}
static int
printf_main(argc, argv)
int argc;
char *argv[];
{
static char *skip1, *skip2;
int ch, end, fieldwidth, precision;
char convch, nextch, *format, *fmt, *start;
while ((ch = getopt(argc, argv, "")) != EOF)
switch (ch) {
case '?':
default:
usage();
return (1);
}
argc -= optind;
argv += optind;
if (argc < 1) {
usage();
return (1);
}
/*
* Basic algorithm is to scan the format string for conversion
* specifications -- once one is found, find out if the field
* width or precision is a '*'; if it is, gather up value. Note,
* format strings are reused as necessary to use up the provided
* arguments, arguments of zero/null string are provided to use
* up the format string.
*/
skip1 = "#-+ 0";
skip2 = "*0123456789";
escape(fmt = format = *argv); /* backslash interpretation */
gargv = ++argv;
for (;;) {
end = 0;
/* find next format specification */
next: for (start = fmt;; ++fmt) {
if (!*fmt) {
/* avoid infinite loop */
if (end == 1) {
warnx("missing format character",
NULL, NULL);
return (1);
}
end = 1;
if (fmt > start)
(void)printf("%s", start);
if (!*gargv)
return (0);
fmt = format;
goto next;
}
/* %% prints a % */
if (*fmt == '%') {
if (*++fmt != '%')
break;
*fmt++ = '\0';
(void)printf("%s", start);
goto next;
}
}
/* skip to field width */
for (; strchr(skip1, *fmt); ++fmt);
if (*fmt == '*') {
if (getint(&fieldwidth))
return (1);
} else
fieldwidth = 0;
/* skip to possible '.', get following precision */
for (; strchr(skip2, *fmt); ++fmt);
if (*fmt == '.')
++fmt;
if (*fmt == '*') {
if (getint(&precision))
return (1);
} else
precision = 0;
/* skip to conversion char */
for (; strchr(skip2, *fmt); ++fmt);
if (!*fmt) {
warnx("missing format character", NULL, NULL);
return (1);
}
convch = *fmt;
nextch = *++fmt;
*fmt = '\0';
switch(convch) {
case 'c': {
char p;
p = getchr();
PF(start, p);
break;
}
case 's': {
char *p;
p = getstr();
PF(start, p);
break;
}
case 'b': { /* expand escapes in argument */
char *p;
p = getstr();
escape(p);
PF(start, p);
break;
}
case 'q': { /* print with shell single quoting */
char *p, *p2;
p = getstr();
p2 = single_quote(p);
PF(start, p2);
free(p2);
break;
}
case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
long p;
char *f;
if ((f = mklong(start, convch)) == NULL)
return (1);
if (getlong(&p))
return (1);
PF(f, p);
break;
}
case 'e': case 'E': case 'f': case 'g': case 'G': {
double p;
p = getdouble();
PF(start, p);
break;
}
default:
warnx("illegal format character", NULL, NULL);
return (1);
}
*fmt = nextch;
}
/* NOTREACHED */
}
static char *
mklong(str, ch)
char *str;
int ch;
{
static char copy[64];
int len;
len = strlen(str) + 2;
memmove(copy, str, len - 3);
copy[len - 3] = 'l';
copy[len - 2] = ch;
copy[len - 1] = '\0';
return (copy);
}
static void
escape(fmt)
register char *fmt;
{
register char *store;
register int value, c;
for (store = fmt; c = *fmt; ++fmt, ++store) {
if (c != '\\') {
*store = c;
continue;
}
switch (*++fmt) {
case '\0': /* EOS, user error */
*store = '\\';
*++store = '\0';
return;
case '\\': /* backslash */
case '\'': /* single quote */
*store = *fmt;
break;
case 'a': /* bell/alert */
*store = '\7';
break;
case 'b': /* backspace */
*store = '\b';
break;
case 'c':
return;
case 'e':
case 'E':
*store = '\033';
break;
case 'f': /* form-feed */
*store = '\f';
break;
case 'n': /* newline */
*store = '\n';
break;
case 'r': /* carriage-return */
*store = '\r';
break;
case 't': /* horizontal tab */
*store = '\t';
break;
case 'v': /* vertical tab */
*store = '\13';
break;
/* octal constant */
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
for (c = 3, value = 0;
c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) {
value <<= 3;
value += *fmt - '0';
}
--fmt;
*store = value;
break;
default:
*store = *fmt;
break;
}
}
*store = '\0';
}
static int
getchr()
{
if (!*gargv)
return ('\0');
return ((int)**gargv++);
}
static char *
getstr()
{
if (!*gargv)
return ("");
return (*gargv++);
}
static char *Number = "+-.0123456789";
static int
getint(ip)
int *ip;
{
long val;
if (getlong(&val))
return (1);
if (val > INT_MAX) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
*ip = val;
return (0);
}
static int
getlong(lp)
long *lp;
{
long val;
char *ep;
if (!*gargv) {
*lp = 0;
return (0);
}
if (strchr(Number, **gargv)) {
errno = 0;
val = strtol(*gargv, &ep, 0);
if (*ep != '\0') {
warnx("%s: illegal number", *gargv, NULL);
return (1);
}
if (errno == ERANGE)
if (val == LONG_MAX) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
if (val == LONG_MIN) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
*lp = val;
++gargv;
return (0);
}
*lp = (long)asciicode();
return (0);
}
static double
getdouble()
{
if (!*gargv)
return ((double)0);
if (strchr(Number, **gargv))
return (atof(*gargv++));
return ((double)asciicode());
}
static int
asciicode()
{
register int ch;
ch = **gargv;
if (ch == '\'' || ch == '"')
ch = (*gargv)[1];
++gargv;
return (ch);
}
static void
usage()
{
(void)fprintf(stderr, "usage: print [-Rnprs] [-u unit] [-f format] [arg ...]\n");
}

View file

@ -1,460 +0,0 @@
/*
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. 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.
*/
#if !defined(BUILTIN) && !defined(SHELL)
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#endif
#ifndef lint
static char sccsid[] = "@(#)printf.c 8.1 (Berkeley) 7/20/93";
#endif /* not lint */
#include <sys/types.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include "bashansi.h"
#include "shell.h"
#include "builtins.h"
#include "stdc.h"
#if !defined (errno)
extern int errno;
#endif
#define PF(f, func) { \
if (fieldwidth) \
if (precision) \
(void)printf(f, fieldwidth, precision, func); \
else \
(void)printf(f, fieldwidth, func); \
else if (precision) \
(void)printf(f, precision, func); \
else \
(void)printf(f, func); \
}
static int asciicode __P((void));
static void escape __P((char *));
static int getchr __P((void));
static double getdouble __P((void));
static int getint __P((int *));
static int getlong __P((long *));
static char *getstr __P((void));
static char *mklong __P((char *, int));
static void usage __P((void));
static char **gargv;
int printf_builtin ();
static int printf_main ();
extern char *this_command_name;
extern char *single_quote ();
extern char **make_builtin_argv ();
static char *printf_doc[] = {
"printf formats and prints its arguments, after the first, under control",
"of the format. The format is a character string which contains three",
"types of objects: plain characters, which are simply copied to standard",
"output, character escape sequences which are converted and copied to the",
"standard output, and format specifications, each of which causes printing",
"of the next successive argument. In addition to the standard printf(1)",
"formats, %%b means to expand escapes in the corresponding argument, and",
"%%q means to quote the argument in a way that can be reused as shell input.",
(char *)NULL
};
struct builtin printf_struct = {
"printf",
printf_builtin,
BUILTIN_ENABLED,
printf_doc,
"printf format [arguments]",
(char *)0
};
int
printf_builtin (list)
WORD_LIST *list;
{
int c, r;
char **v;
WORD_LIST *l;
v = make_builtin_argv (list, &c);
r = printf_main (c, v);
free (v);
fflush(stdout);
return r;
}
static int
printf_main(argc, argv)
int argc;
char *argv[];
{
extern int optind;
static char *skip1, *skip2;
int ch, end, fieldwidth, precision;
char convch, nextch, *format, *fmt, *start;
while ((ch = getopt(argc, argv, "")) != EOF)
switch (ch) {
case '?':
default:
usage();
return (1);
}
argc -= optind;
argv += optind;
if (argc < 1) {
usage();
return (1);
}
/*
* Basic algorithm is to scan the format string for conversion
* specifications -- once one is found, find out if the field
* width or precision is a '*'; if it is, gather up value. Note,
* format strings are reused as necessary to use up the provided
* arguments, arguments of zero/null string are provided to use
* up the format string.
*/
skip1 = "#-+ 0";
skip2 = "*0123456789";
escape(fmt = format = *argv); /* backslash interpretation */
gargv = ++argv;
for (;;) {
end = 0;
/* find next format specification */
next: for (start = fmt;; ++fmt) {
if (!*fmt) {
/* avoid infinite loop */
if (end == 1) {
warnx("missing format character",
NULL, NULL);
return (1);
}
end = 1;
if (fmt > start)
(void)printf("%s", start);
if (!*gargv)
return (0);
fmt = format;
goto next;
}
/* %% prints a % */
if (*fmt == '%') {
if (*++fmt != '%')
break;
*fmt++ = '\0';
(void)printf("%s", start);
goto next;
}
}
/* skip to field width */
for (; strchr(skip1, *fmt); ++fmt);
if (*fmt == '*') {
if (getint(&fieldwidth))
return (1);
} else
fieldwidth = 0;
/* skip to possible '.', get following precision */
for (; strchr(skip2, *fmt); ++fmt);
if (*fmt == '.')
++fmt;
if (*fmt == '*') {
if (getint(&precision))
return (1);
} else
precision = 0;
/* skip to conversion char */
for (; strchr(skip2, *fmt); ++fmt);
if (!*fmt) {
warnx("missing format character", NULL, NULL);
return (1);
}
convch = *fmt;
nextch = *++fmt;
*fmt = '\0';
switch(convch) {
case 'c': {
char p;
p = getchr();
PF(start, p);
break;
}
case 's': {
char *p;
p = getstr();
PF(start, p);
break;
}
case 'b': { /* expand escapes in argument */
char *p;
p = getstr();
escape(p);
PF("%s", p);
break;
}
case 'q': { /* print with shell single quoting */
char *p, *p2;
p = getstr();
p2 = single_quote(p);
PF("%s", p2);
free(p2);
break;
}
case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
long p;
char *f;
if ((f = mklong(start, convch)) == NULL)
return (1);
if (getlong(&p))
return (1);
PF(f, p);
break;
}
case 'e': case 'E': case 'f': case 'g': case 'G': {
double p;
p = getdouble();
PF(start, p);
break;
}
default:
warnx("illegal format character", NULL, NULL);
return (1);
}
*fmt = nextch;
}
/* NOTREACHED */
}
static char *
mklong(str, ch)
char *str;
int ch;
{
static char copy[64];
int len;
len = strlen(str) + 2;
memmove(copy, str, len - 3);
copy[len - 3] = 'l';
copy[len - 2] = ch;
copy[len - 1] = '\0';
return (copy);
}
static void
escape(fmt)
register char *fmt;
{
register char *store;
register int value, c;
for (store = fmt; c = *fmt; ++fmt, ++store) {
if (c != '\\') {
*store = c;
continue;
}
switch (*++fmt) {
case '\0': /* EOS, user error */
*store = '\\';
*++store = '\0';
return;
case '\\': /* backslash */
case '\'': /* single quote */
*store = *fmt;
break;
case 'a': /* bell/alert */
*store = '\7';
break;
case 'b': /* backspace */
*store = '\b';
break;
case 'c':
return;
case 'e':
case 'E':
*store = '\033';
break;
case 'f': /* form-feed */
*store = '\f';
break;
case 'n': /* newline */
*store = '\n';
break;
case 'r': /* carriage-return */
*store = '\r';
break;
case 't': /* horizontal tab */
*store = '\t';
break;
case 'v': /* vertical tab */
*store = '\13';
break;
/* octal constant */
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
for (c = 3, value = 0;
c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) {
value <<= 3;
value += *fmt - '0';
}
--fmt;
*store = value;
break;
default:
*store = *fmt;
break;
}
}
*store = '\0';
}
static int
getchr()
{
if (!*gargv)
return ('\0');
return ((int)**gargv++);
}
static char *
getstr()
{
if (!*gargv)
return ("");
return (*gargv++);
}
static char *Number = "+-.0123456789";
static int
getint(ip)
int *ip;
{
long val;
if (getlong(&val))
return (1);
if (val > INT_MAX) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
*ip = val;
return (0);
}
static int
getlong(lp)
long *lp;
{
long val;
char *ep;
if (!*gargv) {
*lp = 0;
return (0);
}
if (strchr(Number, **gargv)) {
errno = 0;
val = strtol(*gargv, &ep, 0);
if (*ep != '\0') {
warnx("%s: illegal number", *gargv, NULL);
return (1);
}
if (errno == ERANGE)
if (val == LONG_MAX) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
if (val == LONG_MIN) {
warnx("%s: %s", *gargv, strerror(ERANGE));
return (1);
}
*lp = val;
++gargv;
return (0);
}
*lp = (long)asciicode();
return (0);
}
static double
getdouble()
{
if (!*gargv)
return ((double)0);
if (strchr(Number, **gargv))
return (atof(*gargv++));
return ((double)asciicode());
}
static int
asciicode()
{
register int ch;
ch = **gargv;
if (ch == '\'' || ch == '"')
ch = (*gargv)[1];
++gargv;
return (ch);
}
static void
usage()
{
(void)fprintf(stderr, "usage: printf format [arg ...]\n");
}

View file

@ -0,0 +1,49 @@
#!/bin/bash
# cal2day - "parse" appropriate calendar output to match date number
# with day name.
#
# usage: cal2day month day [year]
#
# ORIGINAL *TAG:33239 3:Dec 9 1997:0755:sh.d/cal2day:
#
# Obtained from usenet
#
# Converted to bash v2 syntax by Chet Ramey <chet@po.cwru.edu>
#1 PARSE OPTIONS
while getopts :dls _inst
do case $_inst in
(d) format='%1d%.0s\n' ;; # 0, 1, ..., 7
(l) format='%0.s%-s\n' ;; # Sunday, Monday, ..., Saturday
(s) format='%0.s%-.3s\n' ;; # Sun, Mon, ..., Sat
esac
done
shift $((OPTIND-1))
#2 PARAMETER VALUES
((!$#)) && set -- $(date '+%m %d')
: ${format:='%0.s%-.3s\n'}
: ${1:?missing month parameter [1-12]}
: ${2:?missing day parameter [1-31]}
#3 CALCULATE DAY-OF-WEEK FROM DATE
cal $1 ${3:-$(date +%Y)} | gawk -FX '
BEGIN { day="Sunday Monday Tuesday WednesdayThursday Friday Saturday"
sub(/^0/, "", daynum)
dayre="(^| )" daynum "( |$)"
}
#NR==2 { print length($0) }
NR==1 || NR==2 \
{ next }
dayre { if (match($0, dayre))
{ #print RSTART, RLENGTH, substr($0, RSTART, RLENGTH)
if (daynum<=9 || RSTART==1) RSTART-=1
exit
}
}
END { # 20/21 char width assumed
printf format, RSTART/3, substr(day, RSTART*3+1, 9)
}
' daynum=$2 format=$format -
exit 0

Some files were not shown because too many files have changed in this diff Show more