mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-07-11 14:10:49 +02:00
commit bash-20090312 snapshot
This commit is contained in:
@@ -7705,3 +7705,68 @@ parse.y
|
||||
reported by Mike Frysinger <vapier@gentoo.org> (rest of fix
|
||||
on 3/3)
|
||||
|
||||
3/10
|
||||
----
|
||||
{.,lib/readline}/doc/fdl.texi
|
||||
- updated to FDL version 1.3
|
||||
|
||||
3/14
|
||||
----
|
||||
execute_cmd.c
|
||||
- in execute_case_command, if ;& is used with no following pattern
|
||||
list, make sure we don't reference a NULL pointer. Bug report and
|
||||
fix from Clark Jian Wang <dearvoid@gmail.com>
|
||||
|
||||
parse.y
|
||||
- make parser_state global, so other files can use it
|
||||
- command_word_acceptable now returns non-zero if PST_REDIRLIST bit
|
||||
set in parser_state, so we accept assignment statements and
|
||||
perform alias expansion. Fix for bug reported by Vincent
|
||||
Lefevre <vincent@vinc17.org> (2/24/2009)
|
||||
|
||||
parser.h
|
||||
- add PST_REDIRLIST flag, notes that parser is currently parsing a
|
||||
redirection list preceding a simple command
|
||||
|
||||
make_cmd.c
|
||||
- make_simple_command now turns on PST_REDIRLIST in parser_state when
|
||||
creating a new simple command
|
||||
- make_simple_command turns off PST_REDIRLIST in parser_state if it
|
||||
adds a non-redirection to the command it's building
|
||||
- clean_simple_command turns off PST_REDIRLIST to make sure it's off
|
||||
|
||||
subst.c
|
||||
- new flag for param_expand: PF_IGNUNBOUND, means to not exit if the
|
||||
variable is unbound even if `set -u' is enabled
|
||||
- change param_expand to not call err_unboundvar if the `pflags'
|
||||
argument has the PF_IGNUNBOUND bit set
|
||||
- parameter_brace_expand_word now takes an extra `pflags' argument to
|
||||
pass down to param_expand; changed callers
|
||||
- changed call to parameter_brace_expand_word in parameter_brace_expand
|
||||
to add PF_IGNUNBOUND flag so ${@:-foo} doesn't cause the shell to
|
||||
exit (but ${@} does) when there are no positional parameters. Fixes
|
||||
Debian bug 519165 from Dan Jacobson <jidanni@jidanni.org>
|
||||
|
||||
parse.y
|
||||
- add code to parse_comsub to allow here-documents within command
|
||||
substitutions to be delimited by the closing right paren, with the
|
||||
usual warning about here documents delimited by EOF on execution.
|
||||
Fixes regression from bash-3.2 noted in Red Hat bugzilla 485664 by
|
||||
Ralf Corsepius
|
||||
|
||||
3/15
|
||||
----
|
||||
subst.c
|
||||
- string_list_dollar_at now checks for Q_PATQUOTE, which getpattern()
|
||||
uses to denote Q_DOUBLE_QUOTES (?). Fixes a=abcd echo "${a#$*}"
|
||||
when IFS= and args are `a b' as noted by Stephane Chazleas
|
||||
<stephane_chazelas@yahoo.fr>
|
||||
- param_expand now checks for Q_PATQUOTE and treats it identically
|
||||
to Q_DOUBLE_QUOTES when expanding $*
|
||||
- expand_word_unsplit now sets W_NOSPLIT in the flags of the word it
|
||||
passes to expand_word_internal if $IFS is NULL
|
||||
- expand_word_leave_quoted now sets expand_no_split_dollar_start and
|
||||
the W_NOSPLIT bit in the word flags before calling
|
||||
expand_word_internal if $IFS is NULL, just like expand_word_unsplit.
|
||||
It is now virtually identical to expand_word_unsplit. Rest of fix for
|
||||
problems reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>
|
||||
|
||||
+78
-1
@@ -7648,7 +7648,7 @@ builtins/read.def
|
||||
parse.y
|
||||
- break comment checking code into a common COMMENT_BEGIN define so
|
||||
we can use it in multiple places in parse_comsub
|
||||
- in parse_comsub, don't turn off the LEX_RESWDOK flag if we read a
|
||||
- in parse_comsub, don't alter the LEX_RESWDOK flag if we read a
|
||||
`#' and we're checking comments, even though `#' isn't a `shell break'
|
||||
character. Fixes bug reported by Mike Frysinger <vapier@gentoo.org>
|
||||
|
||||
@@ -7693,3 +7693,80 @@ parse.y
|
||||
- move LEX_PASSNEXT code to the top of parse_comsub, so the rest
|
||||
of the function doesn't have to check for the flag at different
|
||||
places
|
||||
|
||||
3/7
|
||||
---
|
||||
parse.y
|
||||
- in parse_comsub, when looking for a reserved word (LEX_RESWDOK
|
||||
non-zero), and in a case statement, we can see either an esac
|
||||
or a pattern list. We handle an esac separately. We should
|
||||
turn off LEX_RESWDOK if we see anything but a newline, since
|
||||
we'll be reading a pattern list. Other part of fix for bug
|
||||
reported by Mike Frysinger <vapier@gentoo.org> (rest of fix
|
||||
on 3/3)
|
||||
|
||||
3/10
|
||||
----
|
||||
{.,lib/readline}/doc/fdl.texi
|
||||
- updated to FDL version 1.3
|
||||
|
||||
3/14
|
||||
----
|
||||
execute_cmd.c
|
||||
- in execute_case_command, if ;& is used with no following pattern
|
||||
list, make sure we don't reference a NULL pointer. Bug report and
|
||||
fix from Clark Jian Wang <dearvoid@gmail.com>
|
||||
|
||||
parse.y
|
||||
- make parser_state global, so other files can use it
|
||||
- command_word_acceptable now returns non-zero if PST_REDIRLIST bit
|
||||
set in parser_state, so we accept assignment statements and
|
||||
perform alias expansion. Fix for bug reported by Vincent
|
||||
Lefevre <vincent@vinc17.org> (2/24/2009)
|
||||
|
||||
parser.h
|
||||
- add PST_REDIRLIST flag, notes that parser is currently parsing a
|
||||
redirection list preceding a simple command
|
||||
|
||||
make_cmd.c
|
||||
- make_simple_command now turns on PST_REDIRLIST in parser_state when
|
||||
creating a new simple command
|
||||
- make_simple_command turns off PST_REDIRLIST in parser_state if it
|
||||
adds a non-redirection to the command it's building
|
||||
- clean_simple_command turns off PST_REDIRLIST to make sure it's off
|
||||
|
||||
subst.c
|
||||
- new flag for param_expand: PF_IGNUNBOUND, means to not exit if the
|
||||
variable is unbound even if `set -u' is enabled
|
||||
- change param_expand to not call err_unboundvar if the `pflags'
|
||||
argument has the PF_IGNUNBOUND bit set
|
||||
- parameter_brace_expand_word now takes an extra `pflags' argument to
|
||||
pass down to param_expand; changed callers
|
||||
- changed call to parameter_brace_expand_word in parameter_brace_expand
|
||||
to add PF_IGNUNBOUND flag so ${@:-foo} doesn't cause the shell to
|
||||
exit (but ${@} does) when there are no positional parameters. Fixes
|
||||
Debian bug 519165 from Dan Jacobson <jidanni@jidanni.org>
|
||||
|
||||
parse.y
|
||||
- add code to parse_comsub to allow here-documents within command
|
||||
substitutions to be delimited by the closing right paren, with the
|
||||
usual warning about here documents delimited by EOF on execution.
|
||||
Fixes regression from bash-3.2 noted in Red Hat bugzilla 485664 by
|
||||
Ralf Corsepius
|
||||
|
||||
3/15
|
||||
----
|
||||
subst.c
|
||||
- string_list_dollar_at now checks for Q_PATQUOTE, which getpattern()
|
||||
uses to denote Q_DOUBLE_QUOTES (?). Fixes a=abcd echo "${a#$*}"
|
||||
when IFS= and args are `a b' as noted by Stephane Chazleas
|
||||
<stephane_chazelas@yahoo.fr>
|
||||
- param_expand now checks for Q_PATQUOTE and treats it identically
|
||||
to Q_DOUBLE_QUOTES when expanding $*
|
||||
- expand_word_unsplit now sets W_NOSPLIT in the flags of the word it
|
||||
passes to expand_word_internal
|
||||
- expand_word_leave_quoted now sets expand_no_split_dollar_start and
|
||||
the W_NOSPLIT bit in the word flags before calling
|
||||
expand_word_internal, just like expand_word_unsplit. It is now
|
||||
virtually identical to expand_word_unsplit. Rest of fix for
|
||||
problems reported by Stephane Chazleas <stephane_chazelas@yahoo.fr>
|
||||
|
||||
@@ -777,6 +777,7 @@ tests/comsub-eof0.sub f
|
||||
tests/comsub-eof1.sub f
|
||||
tests/comsub-eof2.sub f
|
||||
tests/comsub-eof3.sub f
|
||||
tests/comsub-eof4.sub f
|
||||
tests/comsub-eof.right f
|
||||
tests/comsub-posix.tests f
|
||||
tests/comsub-posix.right f
|
||||
@@ -797,9 +798,11 @@ tests/dbg-support3.sub f
|
||||
tests/dollar-at-star f
|
||||
tests/dollar-at1.sub f
|
||||
tests/dollar-at2.sub f
|
||||
tests/dollar-at3.sub f
|
||||
tests/dollar-star1.sub f
|
||||
tests/dollar-star2.sub f
|
||||
tests/dollar-star3.sub f
|
||||
tests/dollar-star4.sub f
|
||||
tests/dollar.right f
|
||||
tests/dstack.tests f
|
||||
tests/dstack.right f
|
||||
|
||||
@@ -771,11 +771,13 @@ tests/casemod.tests f
|
||||
tests/casemod.right f
|
||||
tests/comsub.tests f
|
||||
tests/comsub.right f
|
||||
tests/comsub1.sub f
|
||||
tests/comsub-eof.tests f
|
||||
tests/comsub-eof0.sub f
|
||||
tests/comsub-eof1.sub f
|
||||
tests/comsub-eof2.sub f
|
||||
tests/comsub-eof3.sub f
|
||||
tests/comsub-eof4.sub f
|
||||
tests/comsub-eof.right f
|
||||
tests/comsub-posix.tests f
|
||||
tests/comsub-posix.right f
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
This file is alias.def, from which is created alias.c
|
||||
It implements the builtins "alias" and "unalias" in Bash.
|
||||
|
||||
Copyright (C) 1987-2009 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
$BUILTIN alias
|
||||
$FUNCTION alias_builtin
|
||||
$DEPENDS_ON ALIAS
|
||||
$PRODUCES alias.c
|
||||
$SHORT_DOC alias [-p] [name[=value] ... ]
|
||||
Define or display aliases.
|
||||
|
||||
Without arguments, `alias' prints the list of aliases in the reusable
|
||||
form `alias NAME=VALUE' on standard output.
|
||||
|
||||
Otherwise, an alias is defined for each NAME whose VALUE is given.
|
||||
A trailing space in VALUE causes the next word to be checked for
|
||||
alias substitution when the alias is expanded.
|
||||
|
||||
Options:
|
||||
-p Print all defined aliases in a reusable format
|
||||
|
||||
Exit Status:
|
||||
alias returns true unless a NAME is supplied for which no alias has been
|
||||
defined.
|
||||
$END
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined (ALIAS)
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# ifdef _MINIX
|
||||
# include <sys/types.h>
|
||||
# endif
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
# include "../bashansi.h"
|
||||
# include "../bashintl.h"
|
||||
|
||||
# include <stdio.h>
|
||||
# include "../shell.h"
|
||||
# include "../alias.h"
|
||||
# include "common.h"
|
||||
# include "bashgetopt.h"
|
||||
|
||||
/* Flags for print_alias */
|
||||
#define AL_REUSABLE 0x01
|
||||
|
||||
static void print_alias __P((alias_t *, int));
|
||||
|
||||
extern int posixly_correct;
|
||||
|
||||
/* Hack the alias command in a Korn shell way. */
|
||||
int
|
||||
alias_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
int any_failed, offset, pflag, dflags;
|
||||
alias_t **alias_list, *t;
|
||||
char *name, *value;
|
||||
|
||||
itrace("alias_builtin");
|
||||
dflags = posixly_correct ? 0 : AL_REUSABLE;
|
||||
pflag = 0;
|
||||
reset_internal_getopt ();
|
||||
while ((offset = internal_getopt (list, "p")) != -1)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 'p':
|
||||
pflag = 1;
|
||||
dflags |= AL_REUSABLE;
|
||||
break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
|
||||
list = loptend;
|
||||
|
||||
if (list == 0 || pflag)
|
||||
{
|
||||
if (aliases == 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
||||
alias_list = all_aliases ();
|
||||
|
||||
if (alias_list == 0)
|
||||
return (EXECUTION_SUCCESS);
|
||||
|
||||
for (offset = 0; alias_list[offset]; offset++)
|
||||
print_alias (alias_list[offset], dflags);
|
||||
|
||||
free (alias_list); /* XXX - Do not free the strings. */
|
||||
|
||||
if (list == 0)
|
||||
return (sh_chkwrite (EXECUTION_SUCCESS));
|
||||
}
|
||||
|
||||
any_failed = 0;
|
||||
while (list)
|
||||
{
|
||||
name = list->word->word;
|
||||
|
||||
for (offset = 0; name[offset] && name[offset] != '='; offset++)
|
||||
;
|
||||
|
||||
if (offset && name[offset] == '=')
|
||||
{
|
||||
name[offset] = '\0';
|
||||
value = name + offset + 1;
|
||||
|
||||
if (legal_alias_name (name, 0) == 0)
|
||||
{
|
||||
builtin_error (_("`%s': invalid alias name"), name);
|
||||
any_failed++;
|
||||
}
|
||||
else
|
||||
add_alias (name, value);
|
||||
}
|
||||
else
|
||||
{
|
||||
t = find_alias (name);
|
||||
if (t)
|
||||
print_alias (t, dflags);
|
||||
else
|
||||
{
|
||||
sh_notfound (name);
|
||||
any_failed++;
|
||||
}
|
||||
}
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
|
||||
}
|
||||
#endif /* ALIAS */
|
||||
|
||||
$BUILTIN unalias
|
||||
$FUNCTION unalias_builtin
|
||||
$DEPENDS_ON ALIAS
|
||||
$SHORT_DOC unalias [-a] name [name ...]
|
||||
Remove each NAME from the list of defined aliases.
|
||||
|
||||
Options:
|
||||
-a remove all alias definitions.
|
||||
|
||||
Return success unless a NAME is not an existing alias.
|
||||
$END
|
||||
|
||||
#if defined (ALIAS)
|
||||
/* Remove aliases named in LIST from the aliases database. */
|
||||
int
|
||||
unalias_builtin (list)
|
||||
register WORD_LIST *list;
|
||||
{
|
||||
register alias_t *alias;
|
||||
int opt, aflag;
|
||||
|
||||
aflag = 0;
|
||||
reset_internal_getopt ();
|
||||
while ((opt = internal_getopt (list, "a")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'a':
|
||||
aflag = 1;
|
||||
break;
|
||||
default:
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
}
|
||||
|
||||
list = loptend;
|
||||
|
||||
if (aflag)
|
||||
{
|
||||
delete_all_aliases ();
|
||||
return (EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
if (list == 0)
|
||||
{
|
||||
builtin_usage ();
|
||||
return (EX_USAGE);
|
||||
}
|
||||
|
||||
aflag = 0;
|
||||
while (list)
|
||||
{
|
||||
alias = find_alias (list->word->word);
|
||||
|
||||
if (alias)
|
||||
remove_alias (alias->name);
|
||||
else
|
||||
{
|
||||
sh_notfound (list->word->word);
|
||||
aflag++;
|
||||
}
|
||||
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
|
||||
}
|
||||
|
||||
/* Output ALIAS in such a way as to allow it to be read back in. */
|
||||
static void
|
||||
print_alias (alias, flags)
|
||||
alias_t *alias;
|
||||
int flags;
|
||||
{
|
||||
char *value;
|
||||
|
||||
value = sh_single_quote (alias->value);
|
||||
if (flags & AL_REUSABLE)
|
||||
printf ("alias ");
|
||||
printf ("%s=%s\n", alias->name, value);
|
||||
free (value);
|
||||
|
||||
fflush (stdout);
|
||||
}
|
||||
#endif /* ALIAS */
|
||||
@@ -0,0 +1,205 @@
|
||||
*** ../bash-4.0-patched/parse.y 2009-03-08 21:24:47.000000000 -0400
|
||||
--- parse.y 2009-03-14 20:24:51.000000000 -0400
|
||||
***************
|
||||
*** 260,263 ****
|
||||
--- 260,266 ----
|
||||
int current_token;
|
||||
|
||||
+ /* The current parser state. */
|
||||
+ int parser_state;
|
||||
+
|
||||
/* Variables to manage the task of reading here documents, because we need to
|
||||
defer the reading until after a complete command has been collected. */
|
||||
***************
|
||||
*** 284,290 ****
|
||||
static int arith_for_lineno;
|
||||
|
||||
- /* The current parser state. */
|
||||
- static int parser_state;
|
||||
-
|
||||
/* The last read token, or NULL. read_token () uses this for context
|
||||
checking. */
|
||||
--- 287,290 ----
|
||||
***************
|
||||
*** 1123,1127 ****
|
||||
REDIRECT *r;
|
||||
|
||||
! tc = $1;
|
||||
rd.dest = 1;
|
||||
r = make_redirection (2, r_duplicating_output, rd);
|
||||
--- 1123,1127 ----
|
||||
REDIRECT *r;
|
||||
|
||||
! tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
|
||||
rd.dest = 1;
|
||||
r = make_redirection (2, r_duplicating_output, rd);
|
||||
***************
|
||||
*** 2397,2401 ****
|
||||
|
||||
#define command_token_position(token) \
|
||||
! (((token) == ASSIGNMENT_WORD) || \
|
||||
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
|
||||
|
||||
--- 2397,2401 ----
|
||||
|
||||
#define command_token_position(token) \
|
||||
! (((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
|
||||
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
|
||||
|
||||
***************
|
||||
*** 2968,2972 ****
|
||||
int retind, retsize, rflags;
|
||||
|
||||
! /* itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */
|
||||
count = 1;
|
||||
tflags = 0;
|
||||
--- 2968,2972 ----
|
||||
int retind, retsize, rflags;
|
||||
|
||||
! /*itrace("parse_matched_pair: open = %c close = %c flags = %d", open, close, flags); */
|
||||
count = 1;
|
||||
tflags = 0;
|
||||
***************
|
||||
*** 3263,3266 ****
|
||||
--- 3263,3283 ----
|
||||
prompt_again ();
|
||||
|
||||
+ /* XXX -- possibly allow here doc to be delimited by ending right
|
||||
+ paren. */
|
||||
+ if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
|
||||
+ {
|
||||
+ int tind;
|
||||
+ /*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
|
||||
+ tind = lex_firstind;
|
||||
+ while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
|
||||
+ tind++;
|
||||
+ if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
|
||||
+ {
|
||||
+ tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
|
||||
+ /*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
|
||||
+ lex_firstind = -1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Don't bother counting parens or doing anything else if in a comment */
|
||||
if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
|
||||
***************
|
||||
*** 3271,3275 ****
|
||||
--- 3288,3295 ----
|
||||
|
||||
if ((tflags & LEX_INCOMMENT) && ch == '\n')
|
||||
+ {
|
||||
+ /*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
|
||||
tflags &= ~LEX_INCOMMENT;
|
||||
+ }
|
||||
|
||||
continue;
|
||||
***************
|
||||
*** 3365,3369 ****
|
||||
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
|
||||
ret[retind++] = peekc;
|
||||
! /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch); */
|
||||
tflags |= LEX_RESWDOK;
|
||||
lex_rwlen = 0;
|
||||
--- 3385,3389 ----
|
||||
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
|
||||
ret[retind++] = peekc;
|
||||
! /*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
|
||||
tflags |= LEX_RESWDOK;
|
||||
lex_rwlen = 0;
|
||||
***************
|
||||
*** 3373,3378 ****
|
||||
{
|
||||
shell_ungetc (peekc);
|
||||
- tflags |= LEX_RESWDOK;
|
||||
/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
|
||||
lex_rwlen = 0;
|
||||
continue;
|
||||
--- 3393,3398 ----
|
||||
{
|
||||
shell_ungetc (peekc);
|
||||
/*itrace("parse_comsub:%d: set lex_reswordok = 1, ch = `%c'", line_number, ch);*/
|
||||
+ tflags |= LEX_RESWDOK;
|
||||
lex_rwlen = 0;
|
||||
continue;
|
||||
***************
|
||||
*** 3404,3413 ****
|
||||
{
|
||||
tflags |= LEX_INCASE;
|
||||
! /*itrace("parse_comsub:%d: found `case', lex_incase -> 1", line_number);*/
|
||||
}
|
||||
else if (STREQN (ret + retind - 4, "esac", 4))
|
||||
{
|
||||
tflags &= ~LEX_INCASE;
|
||||
! /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0", line_number);*/
|
||||
}
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
--- 3424,3433 ----
|
||||
{
|
||||
tflags |= LEX_INCASE;
|
||||
! /*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
|
||||
}
|
||||
else if (STREQN (ret + retind - 4, "esac", 4))
|
||||
{
|
||||
tflags &= ~LEX_INCASE;
|
||||
! /*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
|
||||
}
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
***************
|
||||
*** 3432,3435 ****
|
||||
--- 3452,3456 ----
|
||||
}
|
||||
|
||||
+ /* Might be the start of a here-doc delimiter */
|
||||
if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
|
||||
{
|
||||
***************
|
||||
*** 3488,3492 ****
|
||||
--- 3509,3516 ----
|
||||
}
|
||||
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
|
||||
+ {
|
||||
count++;
|
||||
+ /*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
|
||||
+ }
|
||||
|
||||
/* Add this character. */
|
||||
***************
|
||||
*** 5232,5236 ****
|
||||
if (interactive && EOF_Reached)
|
||||
EOF_Reached = 0;
|
||||
! last_command_exit_value = EX_USAGE;
|
||||
return;
|
||||
}
|
||||
--- 5256,5260 ----
|
||||
if (interactive && EOF_Reached)
|
||||
EOF_Reached = 0;
|
||||
! last_command_exit_value = EX_BADUSAGE;
|
||||
return;
|
||||
}
|
||||
***************
|
||||
*** 5247,5251 ****
|
||||
print_offending_line ();
|
||||
|
||||
! last_command_exit_value = EX_USAGE;
|
||||
return;
|
||||
}
|
||||
--- 5271,5275 ----
|
||||
print_offending_line ();
|
||||
|
||||
! last_command_exit_value = EX_BADUSAGE;
|
||||
return;
|
||||
}
|
||||
***************
|
||||
*** 5278,5282 ****
|
||||
}
|
||||
|
||||
! last_command_exit_value = EX_USAGE;
|
||||
}
|
||||
|
||||
--- 5302,5306 ----
|
||||
}
|
||||
|
||||
! last_command_exit_value = EX_BADUSAGE;
|
||||
}
|
||||
|
||||
+1
-1
@@ -94,7 +94,7 @@ GROFF = groff
|
||||
HSUSER = $(RL_LIBDIR)/doc/hsuser.texi
|
||||
RLUSER = $(RL_LIBDIR)/doc/rluser.texi
|
||||
|
||||
BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/version.texi
|
||||
BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/fdl.texi $(srcdir)/version.texi
|
||||
|
||||
.SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi .html .pdf
|
||||
|
||||
|
||||
Binary file not shown.
+81
-15
@@ -1,6 +1,6 @@
|
||||
<HTML>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<!-- Created on March, 5 2009 by texi2html 1.64 -->
|
||||
<!-- Created on March, 10 2009 by texi2html 1.64 -->
|
||||
<!--
|
||||
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
|
||||
Karl Berry <karl@freefriends.org>
|
||||
@@ -13512,12 +13512,12 @@ The SVR4.2 shell behaves differently when invoked as <CODE>jsh</CODE>
|
||||
<P>
|
||||
|
||||
<center>
|
||||
Version 1.2, November 2002
|
||||
Version 1.3, 3 November 2008
|
||||
</center>
|
||||
</P><P>
|
||||
|
||||
<TABLE><tr><td> </td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
<TABLE><tr><td> </td><td class=display><pre style="font-family: serif">Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
<A HREF="http://fsf.org/">http://fsf.org/</A>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@@ -13635,6 +13635,10 @@ the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
</P><P>
|
||||
|
||||
The "publisher" means any person or entity that distributes copies
|
||||
of the Document to the public.
|
||||
</P><P>
|
||||
|
||||
A section "Entitled XYZ" means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
@@ -13948,13 +13952,33 @@ title.
|
||||
TERMINATION
|
||||
<P>
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document except
|
||||
as expressly provided for under this License. Any other attempt to
|
||||
copy, modify, sublicense or distribute the Document is void, and will
|
||||
automatically terminate your rights under this License. However,
|
||||
parties who have received copies, or rights, from you under this
|
||||
License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
You may not copy, modify, sublicense, or distribute the Document
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense, or distribute it is void, and
|
||||
will automatically terminate your rights under this License.
|
||||
</P><P>
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
</P><P>
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
</P><P>
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, receipt of a copy of some or all of the same material does
|
||||
not give you any rights to use it.
|
||||
</P><P>
|
||||
|
||||
<LI>
|
||||
@@ -13975,7 +13999,49 @@ following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation.
|
||||
as a draft) by the Free Software Foundation. If the Document
|
||||
specifies that a proxy can decide which future versions of this
|
||||
License can be used, that proxy's public statement of acceptance of a
|
||||
version permanently authorizes you to choose that version for the
|
||||
Document.
|
||||
</P><P>
|
||||
|
||||
<LI>
|
||||
RELICENSING
|
||||
<P>
|
||||
|
||||
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
||||
World Wide Web server that publishes copyrightable works and also
|
||||
provides prominent facilities for anybody to edit those works. A
|
||||
public wiki that anybody can edit is an example of such a server. A
|
||||
"Massive Multiauthor Collaboration" (or "MMC") contained in the
|
||||
site means any set of copyrightable works thus published on the MMC
|
||||
site.
|
||||
</P><P>
|
||||
|
||||
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
||||
license published by Creative Commons Corporation, a not-for-profit
|
||||
corporation with a principal place of business in San Francisco,
|
||||
California, as well as future copyleft versions of that license
|
||||
published by that same organization.
|
||||
</P><P>
|
||||
|
||||
"Incorporate" means to publish or republish a Document, in whole or
|
||||
in part, as part of another Document.
|
||||
</P><P>
|
||||
|
||||
An MMC is "eligible for relicensing" if it is licensed under this
|
||||
License, and if all works that were first published under this License
|
||||
somewhere other than this MMC, and subsequently incorporated in whole
|
||||
or in part into the MMC, (1) had no cover texts or invariant sections,
|
||||
and (2) were thus incorporated prior to November 1, 2008.
|
||||
</P><P>
|
||||
|
||||
The operator of an MMC Site may republish an MMC contained in the site
|
||||
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||
provided the MMC is eligible for relicensing.
|
||||
</P><P>
|
||||
|
||||
</OL>
|
||||
<P>
|
||||
|
||||
@@ -13991,7 +14057,7 @@ license notices just after the title page:
|
||||
|
||||
<TABLE><tr><td> </td><td class=smallexample><FONT SIZE=-1><pre> Copyright (C) <VAR>year</VAR> <VAR>your name</VAR>.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
under the terms of the GNU Free Documentation License, Version 1.3
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
@@ -15802,7 +15868,7 @@ to permit their use in free software.
|
||||
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
|
||||
</TR></TABLE>
|
||||
<H1>About this document</H1>
|
||||
This document was generated by <I>Chet Ramey</I> on <I>March, 5 2009</I>
|
||||
This document was generated by <I>Chet Ramey</I> on <I>March, 10 2009</I>
|
||||
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
|
||||
"><I>texi2html</I></A>
|
||||
<P></P>
|
||||
@@ -15964,7 +16030,7 @@ the following structure:
|
||||
<BR>
|
||||
<FONT SIZE="-1">
|
||||
This document was generated
|
||||
by <I>Chet Ramey</I> on <I>March, 5 2009</I>
|
||||
by <I>Chet Ramey</I> on <I>March, 10 2009</I>
|
||||
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
|
||||
"><I>texi2html</I></A>
|
||||
|
||||
|
||||
+71
-17
@@ -8988,10 +8988,10 @@ File: bashref.info, Node: GNU Free Documentation License, Next: Indexes, Prev
|
||||
Appendix C GNU Free Documentation License
|
||||
*****************************************
|
||||
|
||||
Version 1.2, November 2002
|
||||
Version 1.3, 3 November 2008
|
||||
|
||||
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
`http://fsf.org/'
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@@ -9093,6 +9093,9 @@ Appendix C GNU Free Documentation License
|
||||
Page" means the text near the most prominent appearance of the
|
||||
work's title, preceding the beginning of the body of the text.
|
||||
|
||||
The "publisher" means any person or entity that distributes copies
|
||||
of the Document to the public.
|
||||
|
||||
A section "Entitled XYZ" means a named subunit of the Document
|
||||
whose title either is precisely XYZ or contains XYZ in parentheses
|
||||
following text that translates XYZ in another language. (Here XYZ
|
||||
@@ -9358,12 +9361,29 @@ Appendix C GNU Free Documentation License
|
||||
9. TERMINATION
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document
|
||||
except as expressly provided for under this License. Any other
|
||||
attempt to copy, modify, sublicense or distribute the Document is
|
||||
void, and will automatically terminate your rights under this
|
||||
License. However, parties who have received copies, or rights,
|
||||
from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense, or distribute it is void,
|
||||
and will automatically terminate your rights under this License.
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly
|
||||
and finally terminates your license, and (b) permanently, if the
|
||||
copyright holder fails to notify you of the violation by some
|
||||
reasonable means prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from
|
||||
that copyright holder, and you cure the violation prior to 30 days
|
||||
after your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate
|
||||
the licenses of parties who have received copies or rights from
|
||||
you under this License. If your rights have been terminated and
|
||||
not permanently reinstated, receipt of a copy of some or all of
|
||||
the same material does not give you any rights to use it.
|
||||
|
||||
10. FUTURE REVISIONS OF THIS LICENSE
|
||||
|
||||
@@ -9381,7 +9401,41 @@ Appendix C GNU Free Documentation License
|
||||
published (not as a draft) by the Free Software Foundation. If
|
||||
the Document does not specify a version number of this License,
|
||||
you may choose any version ever published (not as a draft) by the
|
||||
Free Software Foundation.
|
||||
Free Software Foundation. If the Document specifies that a proxy
|
||||
can decide which future versions of this License can be used, that
|
||||
proxy's public statement of acceptance of a version permanently
|
||||
authorizes you to choose that version for the Document.
|
||||
|
||||
11. RELICENSING
|
||||
|
||||
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
||||
World Wide Web server that publishes copyrightable works and also
|
||||
provides prominent facilities for anybody to edit those works. A
|
||||
public wiki that anybody can edit is an example of such a server.
|
||||
A "Massive Multiauthor Collaboration" (or "MMC") contained in the
|
||||
site means any set of copyrightable works thus published on the MMC
|
||||
site.
|
||||
|
||||
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
||||
license published by Creative Commons Corporation, a not-for-profit
|
||||
corporation with a principal place of business in San Francisco,
|
||||
California, as well as future copyleft versions of that license
|
||||
published by that same organization.
|
||||
|
||||
"Incorporate" means to publish or republish a Document, in whole or
|
||||
in part, as part of another Document.
|
||||
|
||||
An MMC is "eligible for relicensing" if it is licensed under this
|
||||
License, and if all works that were first published under this
|
||||
License somewhere other than this MMC, and subsequently
|
||||
incorporated in whole or in part into the MMC, (1) had no cover
|
||||
texts or invariant sections, and (2) were thus incorporated prior
|
||||
to November 1, 2008.
|
||||
|
||||
The operator of an MMC Site may republish an MMC contained in the
|
||||
site under CC-BY-SA on the same site at any time before August 1,
|
||||
2009, provided the MMC is eligible for relicensing.
|
||||
|
||||
|
||||
ADDENDUM: How to use this License for your documents
|
||||
====================================================
|
||||
@@ -9392,7 +9446,7 @@ notices just after the title page:
|
||||
|
||||
Copyright (C) YEAR YOUR NAME.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
under the terms of the GNU Free Documentation License, Version 1.3
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
@@ -10133,11 +10187,11 @@ Node: Optional Features339375
|
||||
Node: Reporting Bugs348777
|
||||
Node: Major Differences From The Bourne Shell349974
|
||||
Node: GNU Free Documentation License366661
|
||||
Node: Indexes389122
|
||||
Node: Builtin Index389576
|
||||
Node: Reserved Word Index396403
|
||||
Node: Variable Index398851
|
||||
Node: Function Index410657
|
||||
Node: Concept Index417389
|
||||
Node: Indexes391857
|
||||
Node: Builtin Index392311
|
||||
Node: Reserved Word Index399138
|
||||
Node: Variable Index401586
|
||||
Node: Function Index413392
|
||||
Node: Concept Index420124
|
||||
|
||||
End Tag Table
|
||||
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
This is TeX, Version 3.141592 (Web2C 7.5.4) (format=tex 2008.12.11) 5 MAR 2009 07:54
|
||||
This is TeX, Version 3.141592 (Web2C 7.5.4) (format=tex 2008.12.11) 10 MAR 2009 11:44
|
||||
**/Users/chet/src/bash/src/doc/bashref.texi
|
||||
(/Users/chet/src/bash/src/doc/bashref.texi (./texinfo.tex
|
||||
Loading texinfo [version 2003-02-03.16]: Basics,
|
||||
@@ -339,7 +339,7 @@ s/large_
|
||||
|
||||
[130] [131] [132] Appendix A [133] [134] Appendix B [135] [136] [137] [138]
|
||||
[139] [140] [141] Appendix C [142] (./fdl.texi [143] [144] [145] [146] [147]
|
||||
[148]) Appendix D [149] [150] (./bashref.bts [151]) (./bashref.rws)
|
||||
[148] [149]) Appendix D [150] (./bashref.bts [151]) (./bashref.rws)
|
||||
(./bashref.vrs [152] [153]) (./bashref.fns [154] [155]) (./bashref.cps [156])
|
||||
Overfull \vbox (40.58205pt too high) has occurred while \output is active
|
||||
\vbox(643.19986+0.0)x433.62
|
||||
@@ -374,4 +374,4 @@ Here is how much of TeX's memory you used:
|
||||
19 hyphenation exceptions out of 8191
|
||||
15i,8n,11p,269b,474s stack positions out of 5000i,500n,6000p,200000b,5000s
|
||||
|
||||
Output written on bashref.dvi (164 pages, 639008 bytes).
|
||||
Output written on bashref.dvi (164 pages, 642324 bytes).
|
||||
|
||||
+357
-296
@@ -11,7 +11,7 @@
|
||||
%DVIPSWebPage: (www.radicaleye.com)
|
||||
%DVIPSCommandLine: dvips -D 600 -t letter -o bashref.ps bashref.dvi
|
||||
%DVIPSParameters: dpi=600
|
||||
%DVIPSSource: TeX output 2009.03.05:0754
|
||||
%DVIPSSource: TeX output 2009.03.10:1144
|
||||
%%BeginProcSet: tex.pro 0 0
|
||||
%!
|
||||
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
|
||||
@@ -14493,18 +14493,17 @@ b Ft(The)30 b(SVR4.2)h(shell)g(b)s(eha)m(v)m(es)f(di\013eren)m(tly)h
|
||||
TeXDict begin 143 148 bop 150 -116 a Ft(App)s(endix)29
|
||||
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
|
||||
b(143)150 299 y Fo(App)t(endix)52 b(C)126 b(GNU)53 b(F)-13
|
||||
b(ree)53 b(Do)t(cumen)l(tation)f(License)1396 502 y Ft(V)-8
|
||||
b(ersion)31 b(1.2,)h(No)m(v)m(em)m(b)s(er)g(2002)390
|
||||
b(ree)53 b(Do)t(cumen)l(tation)f(License)1359 502 y Ft(V)-8
|
||||
b(ersion)31 b(1.3,)g(3)g(No)m(v)m(em)m(b)s(er)h(2008)390
|
||||
635 y(Cop)m(yrigh)m(t)842 632 y(c)817 635 y Fp(\015)e
|
||||
Ft(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8
|
||||
b(oundation,)32 b(Inc.)390 745 y(51)f(F)-8 b(ranklin)31
|
||||
b(St,)f(Fifth)h(Flo)s(or,)g(Boston,)h(MA)61 b(02110-1301,)35
|
||||
b(USA)390 964 y(Ev)m(ery)m(one)c(is)g(p)s(ermitted)f(to)h(cop)m(y)g
|
||||
(and)f(distribute)g(v)m(erbatim)h(copies)390 1074 y(of)g(this)f
|
||||
(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo)m
|
||||
(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330 1340 y(The)37
|
||||
b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g(a)g(man)m
|
||||
(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
|
||||
Ft(2000,)j(2001,)f(2002,)g(2007,)h(2008)f(F)-8 b(ree)31
|
||||
b(Soft)m(w)m(are)h(F)-8 b(oundation,)31 b(Inc.)390 745
|
||||
y Fs(http://fsf.org/)390 964 y Ft(Ev)m(ery)m(one)g(is)g(p)s(ermitted)f
|
||||
(to)h(cop)m(y)g(and)f(distribute)g(v)m(erbatim)h(copies)390
|
||||
1074 y(of)g(this)f(license)h(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f
|
||||
(is)f(not)h(allo)m(w)m(ed.)199 1207 y(0.)61 b(PREAMBLE)330
|
||||
1340 y(The)37 b(purp)s(ose)e(of)i(this)g(License)h(is)f(to)h(mak)m(e)g
|
||||
(a)g(man)m(ual,)h(textb)s(o)s(ok,)h(or)d(other)g(functional)h(and)330
|
||||
1450 y(useful)29 b(do)s(cumen)m(t)h Fq(free)36 b Ft(in)29
|
||||
b(the)i(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
|
||||
(the)e(e\013ectiv)m(e)j(freedom)330 1559 y(to)f(cop)m(y)g(and)f
|
||||
@@ -14584,454 +14583,519 @@ b(arian)m(t.)46 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f(con)m(tain)i(zero)
|
||||
e(In)m(v)-5 b(arian)m(t)330 518 y(Sections.)39 b(If)25
|
||||
b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)g(an)m(y)g(In)m(v)
|
||||
-5 b(arian)m(t)25 b(Sections)h(then)e(there)h(are)g(none.)330
|
||||
655 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
|
||||
669 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)g(short)
|
||||
g(passages)g(of)g(text)g(that)h(are)f(listed,)i(as)d(F)-8
|
||||
b(ron)m(t-Co)m(v)m(er)330 765 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
|
||||
b(ron)m(t-Co)m(v)m(er)330 778 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m(er)
|
||||
j(T)-8 b(exts,)27 b(in)d(the)h(notice)i(that)e(sa)m(ys)h(that)g(the)f
|
||||
(Do)s(cumen)m(t)h(is)f(released)g(under)330 874 y(this)h(License.)40
|
||||
(Do)s(cumen)m(t)h(is)f(released)g(under)330 888 y(this)h(License.)40
|
||||
b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29 b(T)-8 b(ext)26
|
||||
b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)g(Bac)m(k-Co)m
|
||||
(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 984 y(b)s(e)k(at)h(most)g(25)g(w)m
|
||||
(ords.)330 1121 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
|
||||
(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 998 y(b)s(e)k(at)h(most)g(25)g(w)m
|
||||
(ords.)330 1148 y(A)36 b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g
|
||||
(the)f(Do)s(cumen)m(t)h(means)g(a)g(mac)m(hine-readable)h(cop)m(y)-8
|
||||
b(,)38 b(represen)m(ted)330 1230 y(in)d(a)h(format)g(whose)g(sp)s
|
||||
b(,)38 b(represen)m(ted)330 1258 y(in)d(a)h(format)g(whose)g(sp)s
|
||||
(eci\014cation)g(is)g(a)m(v)-5 b(ailable)38 b(to)f(the)f(general)g
|
||||
(public,)h(that)f(is)g(suitable)g(for)330 1340 y(revising)c(the)g(do)s
|
||||
(public,)h(that)f(is)g(suitable)g(for)330 1367 y(revising)c(the)g(do)s
|
||||
(cumen)m(t)f(straigh)m(tforw)m(ardly)i(with)e(generic)i(text)g(editors)
|
||||
f(or)f(\(for)h(images)h(com-)330 1450 y(p)s(osed)23 b(of)h(pixels\))g
|
||||
f(or)f(\(for)h(images)h(com-)330 1477 y(p)s(osed)23 b(of)h(pixels\))g
|
||||
(generic)h(pain)m(t)f(programs)g(or)f(\(for)h(dra)m(wings\))g(some)g
|
||||
(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1559
|
||||
(widely)g(a)m(v)-5 b(ailable)26 b(dra)m(wing)330 1587
|
||||
y(editor,)k(and)f(that)g(is)g(suitable)h(for)f(input)f(to)i(text)g
|
||||
(formatters)f(or)g(for)g(automatic)i(translation)f(to)330
|
||||
1669 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
|
||||
1696 y(a)d(v)-5 b(ariet)m(y)28 b(of)f(formats)g(suitable)h(for)e(input)
|
||||
g(to)i(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)g(an)g
|
||||
(otherwise)330 1778 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
|
||||
(otherwise)330 1806 y(T)-8 b(ransparen)m(t)37 b(\014le)h(format)g
|
||||
(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
|
||||
(arranged)g(to)330 1888 y(th)m(w)m(art)27 b(or)g(discourage)g
|
||||
(arranged)g(to)330 1915 y(th)m(w)m(art)27 b(or)g(discourage)g
|
||||
(subsequen)m(t)f(mo)s(di\014cation)h(b)m(y)g(readers)f(is)g(not)h(T)-8
|
||||
b(ransparen)m(t.)39 b(An)27 b(image)330 1998 y(format)35
|
||||
b(ransparen)m(t.)39 b(An)27 b(image)330 2025 y(format)35
|
||||
b(is)f(not)h(T)-8 b(ransparen)m(t)34 b(if)g(used)g(for)g(an)m(y)g
|
||||
(substan)m(tial)h(amoun)m(t)g(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
|
||||
(is)330 2107 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
|
||||
(\\Opaque".)330 2244 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
|
||||
(is)330 2134 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)f(called)i
|
||||
(\\Opaque".)330 2285 y(Examples)53 b(of)g(suitable)h(formats)f(for)g(T)
|
||||
-8 b(ransparen)m(t)53 b(copies)h(include)f(plain)g Fl(asci)r(i)g
|
||||
Ft(without)330 2354 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
|
||||
(LaT)1775 2373 y(E)1826 2354 y(X)d(input)g(format,)k
|
||||
Ft(without)330 2395 y(markup,)41 b(T)-8 b(exinfo)40 b(input)f(format,)j
|
||||
(LaT)1775 2414 y(E)1826 2395 y(X)d(input)g(format,)k
|
||||
Fl(sgml)c Ft(or)g Fl(xml)g Ft(using)g(a)h(publicly)330
|
||||
2463 y(a)m(v)-5 b(ailable)34 b Fl(dtd)p Ft(,)d(and)g
|
||||
2504 y(a)m(v)-5 b(ailable)34 b Fl(dtd)p Ft(,)d(and)g
|
||||
(standard-conforming)g(simple)h Fl(html)p Ft(,)f(P)m(ostScript)h(or)f
|
||||
Fl(pdf)g Ft(designed)g(for)330 2573 y(h)m(uman)37 b(mo)s(di\014cation.)
|
||||
Fl(pdf)g Ft(designed)g(for)330 2614 y(h)m(uman)37 b(mo)s(di\014cation.)
|
||||
65 b(Examples)38 b(of)g(transparen)m(t)g(image)i(formats)e(include)g
|
||||
Fl(png)p Ft(,)i Fl(x)n(cf)e Ft(and)330 2682 y Fl(jpg)p
|
||||
Fl(png)p Ft(,)i Fl(x)n(cf)e Ft(and)330 2724 y Fl(jpg)p
|
||||
Ft(.)63 b(Opaque)38 b(formats)g(include)g(proprietary)g(formats)g(that)
|
||||
h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 2792 y(b)m(y)g
|
||||
h(can)f(b)s(e)g(read)g(and)f(edited)i(only)330 2833 y(b)m(y)g
|
||||
(proprietary)g(w)m(ord)g(pro)s(cessors,)j Fl(sgml)c Ft(or)i
|
||||
Fl(xml)e Ft(for)i(whic)m(h)f(the)g Fl(dtd)g Ft(and/or)g(pro)s(cessing)
|
||||
330 2902 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
|
||||
330 2943 y(to)s(ols)32 b(are)f(not)g(generally)h(a)m(v)-5
|
||||
b(ailable,)34 b(and)c(the)h(mac)m(hine-generated)i Fl(html)p
|
||||
Ft(,)d(P)m(ostScript)i(or)f Fl(pdf)330 3011 y Ft(pro)s(duced)e(b)m(y)h
|
||||
Ft(,)d(P)m(ostScript)i(or)f Fl(pdf)330 3052 y Ft(pro)s(duced)e(b)m(y)h
|
||||
(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
|
||||
b(.)330 3148 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
|
||||
b(.)330 3203 y(The)34 b(\\Title)h(P)m(age")i(means,)e(for)f(a)h(prin)m
|
||||
(ted)f(b)s(o)s(ok,)h(the)f(title)i(page)f(itself,)h(plus)e(suc)m(h)f
|
||||
(follo)m(wing)330 3258 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
|
||||
(follo)m(wing)330 3313 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)g
|
||||
(legibly)-8 b(,)30 b(the)e(material)h(this)e(License)i(requires)e(to)h
|
||||
(app)s(ear)f(in)h(the)330 3367 y(title)g(page.)40 b(F)-8
|
||||
(app)s(ear)f(in)h(the)330 3422 y(title)g(page.)40 b(F)-8
|
||||
b(or)28 b(w)m(orks)e(in)g(formats)h(whic)m(h)g(do)f(not)h(ha)m(v)m(e)h
|
||||
(an)m(y)e(title)j(page)e(as)g(suc)m(h,)g(\\Title)h(P)m(age")330
|
||||
3477 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
|
||||
3532 y(means)j(the)f(text)i(near)e(the)h(most)g(prominen)m(t)g(app)s
|
||||
(earance)f(of)h(the)g(w)m(ork's)g(title,)h(preceding)f(the)330
|
||||
3587 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
|
||||
3724 y(A)f(section)h(\\En)m(titled)g(XYZ")f(means)f(a)h(named)g
|
||||
(subunit)e(of)h(the)h(Do)s(cumen)m(t)h(whose)e(title)i(either)330
|
||||
3833 y(is)d(precisely)g(XYZ)g(or)f(con)m(tains)i(XYZ)f(in)f(paren)m
|
||||
(theses)i(follo)m(wing)g(text)g(that)f(translates)h(XYZ)e(in)330
|
||||
3943 y(another)e(language.)40 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
|
||||
(sp)s(eci\014c)g(section)h(name)f(men)m(tioned)h(b)s(elo)m(w,)g(suc)m
|
||||
(h)330 4052 y(as)i(\\Ac)m(kno)m(wledgemen)m(ts",)33 b(\\Dedications",)e
|
||||
(\\Endorsemen)m(ts",)e(or)f(\\History".\))42 b(T)-8 b(o)29
|
||||
b(\\Preserv)m(e)330 4162 y(the)34 b(Title")h(of)e(suc)m(h)h(a)g
|
||||
(section)g(when)f(y)m(ou)h(mo)s(dify)e(the)i(Do)s(cumen)m(t)h(means)e
|
||||
(that)h(it)g(remains)g(a)330 4271 y(section)e(\\En)m(titled)f(XYZ")g
|
||||
(according)g(to)g(this)g(de\014nition.)330 4408 y(The)c(Do)s(cumen)m(t)
|
||||
i(ma)m(y)f(include)f(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)
|
||||
g(the)g(notice)h(whic)m(h)e(states)i(that)330 4518 y(this)34
|
||||
b(License)g(applies)g(to)h(the)f(Do)s(cumen)m(t.)52 b(These)33
|
||||
b(W)-8 b(arran)m(t)m(y)36 b(Disclaimers)f(are)g(considered)e(to)330
|
||||
4628 y(b)s(e)k(included)g(b)m(y)g(reference)h(in)g(this)f(License,)j
|
||||
(but)d(only)h(as)g(regards)f(disclaiming)i(w)m(arran)m(ties:)330
|
||||
4737 y(an)m(y)e(other)g(implication)i(that)e(these)g(W)-8
|
||||
b(arran)m(t)m(y)39 b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g
|
||||
(and)f(has)h(no)330 4847 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h
|
||||
(this)f(License.)199 4984 y(2.)61 b(VERBA)-8 b(TIM)31
|
||||
b(COPYING)330 5121 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e
|
||||
(distribute)h(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g
|
||||
(commercially)h(or)330 5230 y(noncommercially)-8 b(,)48
|
||||
b(pro)m(vided)42 b(that)h(this)f(License,)47 b(the)42
|
||||
b(cop)m(yrigh)m(t)i(notices,)j(and)42 b(the)h(license)330
|
||||
5340 y(notice)37 b(sa)m(ying)g(this)e(License)i(applies)e(to)i(the)f
|
||||
(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)i(all)g(copies,)j(and)p
|
||||
eop end
|
||||
3641 y(b)s(eginning)f(of)g(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
|
||||
3792 y(The)j(\\publisher")g(means)h(an)m(y)f(p)s(erson)g(or)h(en)m(tit)
|
||||
m(y)h(that)f(distributes)f(copies)i(of)e(the)h(Do)s(cumen)m(t)330
|
||||
3902 y(to)c(the)g(public.)330 4052 y(A)f(section)h(\\En)m(titled)g
|
||||
(XYZ")f(means)f(a)h(named)g(subunit)e(of)h(the)h(Do)s(cumen)m(t)h
|
||||
(whose)e(title)i(either)330 4162 y(is)d(precisely)g(XYZ)g(or)f(con)m
|
||||
(tains)i(XYZ)f(in)f(paren)m(theses)i(follo)m(wing)g(text)g(that)f
|
||||
(translates)h(XYZ)e(in)330 4271 y(another)e(language.)40
|
||||
b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g(sp)s(eci\014c)g(section)h(name)f
|
||||
(men)m(tioned)h(b)s(elo)m(w,)g(suc)m(h)330 4381 y(as)i(\\Ac)m(kno)m
|
||||
(wledgemen)m(ts",)33 b(\\Dedications",)e(\\Endorsemen)m(ts",)e(or)f
|
||||
(\\History".\))42 b(T)-8 b(o)29 b(\\Preserv)m(e)330 4491
|
||||
y(the)34 b(Title")h(of)e(suc)m(h)h(a)g(section)g(when)f(y)m(ou)h(mo)s
|
||||
(dify)e(the)i(Do)s(cumen)m(t)h(means)e(that)h(it)g(remains)g(a)330
|
||||
4600 y(section)e(\\En)m(titled)f(XYZ")g(according)g(to)g(this)g
|
||||
(de\014nition.)330 4751 y(The)c(Do)s(cumen)m(t)i(ma)m(y)f(include)f(W)
|
||||
-8 b(arran)m(t)m(y)30 b(Disclaimers)f(next)f(to)g(the)g(notice)h(whic)m
|
||||
(h)e(states)i(that)330 4861 y(this)34 b(License)g(applies)g(to)h(the)f
|
||||
(Do)s(cumen)m(t.)52 b(These)33 b(W)-8 b(arran)m(t)m(y)36
|
||||
b(Disclaimers)f(are)g(considered)e(to)330 4970 y(b)s(e)k(included)g(b)m
|
||||
(y)g(reference)h(in)g(this)f(License,)j(but)d(only)h(as)g(regards)f
|
||||
(disclaiming)i(w)m(arran)m(ties:)330 5080 y(an)m(y)e(other)g
|
||||
(implication)i(that)e(these)g(W)-8 b(arran)m(t)m(y)39
|
||||
b(Disclaimers)f(ma)m(y)g(ha)m(v)m(e)g(is)f(v)m(oid)g(and)f(has)h(no)330
|
||||
5189 y(e\013ect)32 b(on)e(the)h(meaning)f(of)h(this)f(License.)199
|
||||
5340 y(2.)61 b(VERBA)-8 b(TIM)31 b(COPYING)p eop end
|
||||
%%Page: 145 151
|
||||
TeXDict begin 145 150 bop 150 -116 a Ft(App)s(endix)29
|
||||
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
|
||||
b(145)330 299 y(that)27 b(y)m(ou)g(add)f(no)h(other)f(conditions)h
|
||||
(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f(License.)40
|
||||
b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330 408 y(tec)m(hnical)35
|
||||
b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h(the)f(reading)g(or)g
|
||||
(further)e(cop)m(ying)j(of)f(the)g(copies)330 518 y(y)m(ou)25
|
||||
b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
|
||||
b(145)330 299 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)h
|
||||
(the)g(Do)s(cumen)m(t)h(in)f(an)m(y)g(medium,)h(either)g(commercially)h
|
||||
(or)330 408 y(noncommercially)-8 b(,)48 b(pro)m(vided)42
|
||||
b(that)h(this)f(License,)47 b(the)42 b(cop)m(yrigh)m(t)i(notices,)j
|
||||
(and)42 b(the)h(license)330 518 y(notice)37 b(sa)m(ying)g(this)e
|
||||
(License)i(applies)e(to)i(the)f(Do)s(cumen)m(t)g(are)g(repro)s(duced)e
|
||||
(in)i(all)g(copies,)j(and)330 628 y(that)27 b(y)m(ou)g(add)f(no)h
|
||||
(other)f(conditions)h(whatso)s(ev)m(er)h(to)f(those)g(of)g(this)f
|
||||
(License.)40 b(Y)-8 b(ou)27 b(ma)m(y)g(not)g(use)330
|
||||
737 y(tec)m(hnical)35 b(measures)d(to)i(obstruct)f(or)g(con)m(trol)h
|
||||
(the)f(reading)g(or)g(further)e(cop)m(ying)j(of)f(the)g(copies)330
|
||||
847 y(y)m(ou)25 b(mak)m(e)g(or)g(distribute.)38 b(Ho)m(w)m(ev)m(er,)28
|
||||
b(y)m(ou)d(ma)m(y)g(accept)h(comp)s(ensation)f(in)f(exc)m(hange)j(for)d
|
||||
(copies.)330 628 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
|
||||
(copies.)330 956 y(If)32 b(y)m(ou)g(distribute)g(a)h(large)g(enough)f
|
||||
(n)m(um)m(b)s(er)f(of)h(copies)h(y)m(ou)f(m)m(ust)h(also)g(follo)m(w)g
|
||||
(the)f(conditions)330 737 y(in)e(section)i(3.)330 883
|
||||
(the)f(conditions)330 1066 y(in)e(section)i(3.)330 1200
|
||||
y(Y)-8 b(ou)21 b(ma)m(y)h(also)f(lend)g(copies,)i(under)d(the)h(same)g
|
||||
(conditions)g(stated)h(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
|
||||
(publicly)330 993 y(displa)m(y)31 b(copies.)199 1139
|
||||
y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1285 y(If)25
|
||||
(publicly)330 1310 y(displa)m(y)31 b(copies.)199 1443
|
||||
y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1577 y(If)25
|
||||
b(y)m(ou)g(publish)f(prin)m(ted)g(copies)i(\(or)g(copies)g(in)f(media)g
|
||||
(that)h(commonly)g(ha)m(v)m(e)g(prin)m(ted)f(co)m(v)m(ers\))i(of)330
|
||||
1395 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
|
||||
1687 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)e(more)h(than)f
|
||||
(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)f(notice)h(requires)330
|
||||
1504 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
|
||||
1797 y(Co)m(v)m(er)i(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)i
|
||||
(the)e(copies)h(in)f(co)m(v)m(ers)i(that)f(carry)-8 b(,)36
|
||||
b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1614 y(these)j(Co)m(v)m
|
||||
b(clearly)f(and)f(legibly)-8 b(,)37 b(all)330 1906 y(these)j(Co)m(v)m
|
||||
(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
|
||||
b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
|
||||
b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
|
||||
1724 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
|
||||
2016 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
|
||||
m(ust)e(also)h(clearly)g(and)f(legibly)h(iden)m(tify)f(y)m(ou)h(as)f
|
||||
(the)h(publisher)330 1833 y(of)k(these)h(copies.)53 b(The)34
|
||||
(the)h(publisher)330 2125 y(of)k(these)h(copies.)53 b(The)34
|
||||
b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)f(title)i
|
||||
(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 1943 y(equally)e
|
||||
(with)d(all)j(w)m(ords)d(of)i(the)f(title)330 2235 y(equally)e
|
||||
(prominen)m(t)e(and)g(visible.)43 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
|
||||
(other)g(material)h(on)f(the)g(co)m(v)m(ers)h(in)e(addition.)330
|
||||
2052 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
|
||||
2345 y(Cop)m(ying)36 b(with)g(c)m(hanges)h(limited)g(to)g(the)g(co)m(v)
|
||||
m(ers,)i(as)d(long)h(as)g(they)f(preserv)m(e)g(the)h(title)g(of)g(the)
|
||||
330 2162 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
|
||||
330 2454 y(Do)s(cumen)m(t)h(and)e(satisfy)i(these)f(conditions,)j(can)d
|
||||
(b)s(e)g(treated)h(as)f(v)m(erbatim)h(cop)m(ying)g(in)f(other)330
|
||||
2271 y(resp)s(ects.)330 2418 y(If)32 b(the)h(required)f(texts)i(for)e
|
||||
2564 y(resp)s(ects.)330 2698 y(If)32 b(the)h(required)f(texts)i(for)e
|
||||
(either)h(co)m(v)m(er)i(are)e(to)s(o)g(v)m(oluminous)g(to)g(\014t)g
|
||||
(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2527 y(the)h(\014rst)f
|
||||
(legibly)-8 b(,)35 b(y)m(ou)e(should)f(put)330 2807 y(the)h(\014rst)f
|
||||
(ones)h(listed)g(\(as)h(man)m(y)f(as)g(\014t)g(reasonably\))g(on)g(the)
|
||||
g(actual)h(co)m(v)m(er,)h(and)e(con)m(tin)m(ue)h(the)330
|
||||
2637 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 2783
|
||||
2917 y(rest)d(on)m(to)g(adjacen)m(t)h(pages.)330 3051
|
||||
y(If)27 b(y)m(ou)g(publish)e(or)i(distribute)g(Opaque)f(copies)i(of)f
|
||||
(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)f(more)i(than)e(100,)330
|
||||
2892 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
|
||||
3160 y(y)m(ou)i(m)m(ust)g(either)h(include)e(a)i(mac)m(hine-readable)g
|
||||
(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)g(with)e(eac)m(h)i(Opaque)
|
||||
330 3002 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
|
||||
330 3270 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)f(or)g(with)g(eac)m(h)h
|
||||
(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)h(from)d
|
||||
(whic)m(h)330 3112 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
|
||||
(whic)m(h)330 3380 y(the)24 b(general)i(net)m(w)m(ork-using)f(public)e
|
||||
(has)h(access)i(to)f(do)m(wnload)f(using)g(public-standard)f(net)m(w)m
|
||||
(ork)330 3221 y(proto)s(cols)40 b(a)f(complete)h(T)-8
|
||||
(ork)330 3489 y(proto)s(cols)40 b(a)f(complete)h(T)-8
|
||||
b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
|
||||
(added)f(material.)67 b(If)330 3331 y(y)m(ou)39 b(use)g(the)g(latter)h
|
||||
(added)f(material.)67 b(If)330 3599 y(y)m(ou)39 b(use)g(the)g(latter)h
|
||||
(option,)h(y)m(ou)f(m)m(ust)e(tak)m(e)j(reasonably)e(pruden)m(t)e
|
||||
(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3440 y(distribution)f(of)g
|
||||
(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3708 y(distribution)f(of)g
|
||||
(Opaque)g(copies)h(in)e(quan)m(tit)m(y)-8 b(,)43 b(to)38
|
||||
b(ensure)g(that)h(this)f(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
|
||||
3550 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
|
||||
3818 y(remain)30 b(th)m(us)g(accessible)i(at)f(the)f(stated)h(lo)s
|
||||
(cation)h(un)m(til)e(at)h(least)h(one)e(y)m(ear)h(after)g(the)f(last)h
|
||||
(time)330 3660 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
|
||||
(time)330 3927 y(y)m(ou)37 b(distribute)f(an)h(Opaque)f(cop)m(y)i
|
||||
(\(directly)g(or)e(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))h
|
||||
(of)f(that)330 3769 y(edition)31 b(to)g(the)g(public.)330
|
||||
3915 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
|
||||
(of)f(that)330 4037 y(edition)31 b(to)g(the)g(public.)330
|
||||
4171 y(It)k(is)f(requested,)i(but)e(not)h(required,)g(that)g(y)m(ou)g
|
||||
(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
|
||||
4025 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
|
||||
4281 y(b)s(efore)28 b(redistributing)g(an)m(y)h(large)h(n)m(um)m(b)s
|
||||
(er)d(of)i(copies,)h(to)f(giv)m(e)h(them)f(a)g(c)m(hance)h(to)f(pro)m
|
||||
(vide)g(y)m(ou)330 4134 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
|
||||
(the)f(Do)s(cumen)m(t.)199 4281 y(4.)61 b(MODIFICA)-8
|
||||
b(TIONS)330 4427 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
|
||||
(vide)g(y)m(ou)330 4390 y(with)h(an)g(up)s(dated)f(v)m(ersion)i(of)g
|
||||
(the)f(Do)s(cumen)m(t.)199 4524 y(4.)61 b(MODIFICA)-8
|
||||
b(TIONS)330 4658 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)g(a)
|
||||
h(Mo)s(di\014ed)f(V)-8 b(ersion)26 b(of)g(the)g(Do)s(cumen)m(t)g(under)
|
||||
e(the)h(conditions)330 4536 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
|
||||
e(the)h(conditions)330 4768 y(of)c(sections)h(2)g(and)e(3)h(ab)s(o)m(v)
|
||||
m(e,)k(pro)m(vided)20 b(that)i(y)m(ou)f(release)i(the)e(Mo)s(di\014ed)f
|
||||
(V)-8 b(ersion)22 b(under)d(precisely)330 4646 y(this)29
|
||||
(V)-8 b(ersion)22 b(under)d(precisely)330 4877 y(this)29
|
||||
b(License,)h(with)f(the)g(Mo)s(di\014ed)f(V)-8 b(ersion)30
|
||||
b(\014lling)f(the)g(role)h(of)f(the)g(Do)s(cumen)m(t,)h(th)m(us)f
|
||||
(licensing)330 4755 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
|
||||
(licensing)330 4987 y(distribution)k(and)h(mo)s(di\014cation)g(of)h
|
||||
(the)f(Mo)s(di\014ed)f(V)-8 b(ersion)35 b(to)g(who)s(ev)m(er)f(p)s
|
||||
(ossesses)f(a)i(cop)m(y)g(of)330 4865 y(it.)41 b(In)30
|
||||
(ossesses)f(a)i(cop)m(y)g(of)330 5096 y(it.)41 b(In)30
|
||||
b(addition,)h(y)m(ou)f(m)m(ust)h(do)f(these)h(things)f(in)g(the)h(Mo)s
|
||||
(di\014ed)e(V)-8 b(ersion:)357 5011 y(A.)60 b(Use)33
|
||||
(di\014ed)e(V)-8 b(ersion:)357 5230 y(A.)60 b(Use)33
|
||||
b(in)f(the)h(Title)h(P)m(age)g(\(and)f(on)f(the)h(co)m(v)m(ers,)i(if)e
|
||||
(an)m(y\))g(a)g(title)h(distinct)f(from)g(that)g(of)g(the)510
|
||||
5121 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
|
||||
5340 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f(previous)f(v)m
|
||||
(ersions)h(\(whic)m(h)g(should,)g(if)g(there)g(w)m(ere)g(an)m(y)-8
|
||||
b(,)510 5230 y(b)s(e)31 b(listed)h(in)f(the)g(History)h(section)g(of)g
|
||||
(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32 b(ma)m(y)g(use)f(the)g(same)
|
||||
h(title)h(as)510 5340 y(a)e(previous)f(v)m(ersion)g(if)h(the)f
|
||||
(original)i(publisher)d(of)h(that)h(v)m(ersion)g(giv)m(es)h(p)s
|
||||
(ermission.)p eop end
|
||||
b(,)p eop end
|
||||
%%Page: 146 152
|
||||
TeXDict begin 146 151 bop 150 -116 a Ft(146)2527 b(Bash)31
|
||||
b(Reference)g(Man)m(ual)360 299 y(B.)61 b(List)31 b(on)f(the)h(Title)g
|
||||
(P)m(age,)i(as)d(authors,)h(one)g(or)f(more)h(p)s(ersons)e(or)h(en)m
|
||||
(tities)j(resp)s(onsible)c(for)510 408 y(authorship)c(of)h(the)h(mo)s
|
||||
(di\014cations)f(in)g(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)28
|
||||
b(together)g(with)d(at)i(least)h(\014v)m(e)510 518 y(of)c(the)g
|
||||
(principal)g(authors)f(of)i(the)f(Do)s(cumen)m(t)g(\(all)h(of)g(its)f
|
||||
(principal)g(authors,)h(if)f(it)g(has)g(few)m(er)510
|
||||
628 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m(ou)g(from)
|
||||
f(this)g(requiremen)m(t.)359 766 y(C.)60 b(State)32 b(on)e(the)h(Title)
|
||||
h(page)f(the)g(name)g(of)g(the)g(publisher)e(of)i(the)g(Mo)s(di\014ed)f
|
||||
(V)-8 b(ersion,)32 b(as)f(the)510 876 y(publisher.)355
|
||||
1015 y(D.)61 b(Preserv)m(e)31 b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f
|
||||
(of)g(the)f(Do)s(cumen)m(t.)363 1154 y(E.)60 b(Add)30
|
||||
b(an)i(appropriate)f(cop)m(yrigh)m(t)i(notice)f(for)g(y)m(our)f(mo)s
|
||||
(di\014cations)g(adjacen)m(t)i(to)f(the)g(other)510 1263
|
||||
y(cop)m(yrigh)m(t)g(notices.)365 1402 y(F.)61 b(Include,)28
|
||||
b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g(notices,)h(a)e(license)
|
||||
h(notice)g(giving)g(the)f(public)510 1512 y(p)s(ermission)23
|
||||
b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8 b(ersion)25 b(under)e(the)i
|
||||
(terms)f(of)h(this)f(License,)j(in)d(the)g(form)510 1621
|
||||
y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
|
||||
1760 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
|
||||
b(Reference)g(Man)m(ual)510 299 y(b)s(e)g(listed)h(in)f(the)g(History)h
|
||||
(section)g(of)g(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32
|
||||
b(ma)m(y)g(use)f(the)g(same)h(title)h(as)510 408 y(a)e(previous)f(v)m
|
||||
(ersion)g(if)h(the)f(original)i(publisher)d(of)h(that)h(v)m(ersion)g
|
||||
(giv)m(es)h(p)s(ermission.)360 545 y(B.)61 b(List)31
|
||||
b(on)f(the)h(Title)g(P)m(age,)i(as)d(authors,)h(one)g(or)f(more)h(p)s
|
||||
(ersons)e(or)h(en)m(tities)j(resp)s(onsible)c(for)510
|
||||
655 y(authorship)c(of)h(the)h(mo)s(di\014cations)f(in)g(the)g(Mo)s
|
||||
(di\014ed)f(V)-8 b(ersion,)28 b(together)g(with)d(at)i(least)h(\014v)m
|
||||
(e)510 765 y(of)c(the)g(principal)g(authors)f(of)i(the)f(Do)s(cumen)m
|
||||
(t)g(\(all)h(of)g(its)f(principal)g(authors,)h(if)f(it)g(has)g(few)m
|
||||
(er)510 874 y(than)30 b(\014v)m(e\),)h(unless)f(they)h(release)g(y)m
|
||||
(ou)g(from)f(this)g(requiremen)m(t.)359 1011 y(C.)60
|
||||
b(State)32 b(on)e(the)h(Title)h(page)f(the)g(name)g(of)g(the)g
|
||||
(publisher)e(of)i(the)g(Mo)s(di\014ed)f(V)-8 b(ersion,)32
|
||||
b(as)f(the)510 1121 y(publisher.)355 1258 y(D.)61 b(Preserv)m(e)31
|
||||
b(all)g(the)g(cop)m(yrigh)m(t)h(notices)f(of)g(the)f(Do)s(cumen)m(t.)
|
||||
363 1395 y(E.)60 b(Add)30 b(an)i(appropriate)f(cop)m(yrigh)m(t)i
|
||||
(notice)f(for)g(y)m(our)f(mo)s(di\014cations)g(adjacen)m(t)i(to)f(the)g
|
||||
(other)510 1504 y(cop)m(yrigh)m(t)g(notices.)365 1641
|
||||
y(F.)61 b(Include,)28 b(immediately)h(after)f(the)h(cop)m(yrigh)m(t)g
|
||||
(notices,)h(a)e(license)h(notice)g(giving)g(the)f(public)510
|
||||
1751 y(p)s(ermission)23 b(to)j(use)e(the)g(Mo)s(di\014ed)g(V)-8
|
||||
b(ersion)25 b(under)e(the)i(terms)f(of)h(this)f(License,)j(in)d(the)g
|
||||
(form)510 1861 y(sho)m(wn)30 b(in)g(the)g(Addendum)f(b)s(elo)m(w.)353
|
||||
1998 y(G.)61 b(Preserv)m(e)23 b(in)g(that)g(license)h(notice)g(the)f
|
||||
(full)g(lists)g(of)g(In)m(v)-5 b(arian)m(t)23 b(Sections)h(and)e
|
||||
(required)g(Co)m(v)m(er)510 1870 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
|
||||
(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2008
|
||||
(required)g(Co)m(v)m(er)510 2107 y(T)-8 b(exts)31 b(giv)m(en)g(in)f
|
||||
(the)h(Do)s(cumen)m(t's)g(license)h(notice.)357 2244
|
||||
y(H.)60 b(Include)30 b(an)g(unaltered)g(cop)m(y)h(of)g(this)f(License.)
|
||||
392 2147 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
|
||||
392 2381 y(I.)60 b(Preserv)m(e)33 b(the)f(section)h(En)m(titled)g
|
||||
(\\History",)h(Preserv)m(e)f(its)f(Title,)i(and)d(add)h(to)h(it)f(an)g
|
||||
(item)510 2257 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
|
||||
(item)510 2491 y(stating)d(at)g(least)g(the)g(title,)h(y)m(ear,)g(new)d
|
||||
(authors,)i(and)e(publisher)f(of)j(the)f(Mo)s(di\014ed)f(V)-8
|
||||
b(ersion)510 2366 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
|
||||
b(ersion)510 2600 y(as)32 b(giv)m(en)g(on)f(the)h(Title)g(P)m(age.)45
|
||||
b(If)31 b(there)h(is)f(no)g(section)i(En)m(titled)f(\\History")h(in)e
|
||||
(the)g(Do)s(cu-)510 2476 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
|
||||
(the)g(Do)s(cu-)510 2710 y(men)m(t,)37 b(create)f(one)f(stating)h(the)f
|
||||
(title,)i(y)m(ear,)g(authors,)f(and)e(publisher)f(of)i(the)g(Do)s
|
||||
(cumen)m(t)510 2586 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
|
||||
(cumen)m(t)510 2819 y(as)h(giv)m(en)h(on)f(its)h(Title)g(P)m(age,)i
|
||||
(then)d(add)g(an)g(item)g(describing)g(the)g(Mo)s(di\014ed)g(V)-8
|
||||
b(ersion)37 b(as)510 2695 y(stated)31 b(in)f(the)h(previous)f(sen)m
|
||||
(tence.)378 2834 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
|
||||
b(ersion)37 b(as)510 2929 y(stated)31 b(in)f(the)h(previous)f(sen)m
|
||||
(tence.)378 3066 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
|
||||
(cation,)i(if)d(an)m(y)-8 b(,)34 b(giv)m(en)f(in)g(the)f(Do)s(cumen)m
|
||||
(t)h(for)g(public)e(access)j(to)510 2944 y(a)e(T)-8 b(ransparen)m(t)30
|
||||
(t)h(for)g(public)e(access)j(to)510 3176 y(a)e(T)-8 b(ransparen)m(t)30
|
||||
b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m(ewise)h(the)g(net)
|
||||
m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3053 y(the)g(Do)s(cumen)m
|
||||
m(w)m(ork)g(lo)s(cations)g(giv)m(en)g(in)510 3285 y(the)g(Do)s(cumen)m
|
||||
(t)g(for)g(previous)f(v)m(ersions)h(it)g(w)m(as)g(based)f(on.)45
|
||||
b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3163
|
||||
b(These)31 b(ma)m(y)h(b)s(e)f(placed)h(in)g(the)510 3395
|
||||
y(\\History")27 b(section.)40 b(Y)-8 b(ou)25 b(ma)m(y)h(omit)g(a)f(net)
|
||||
m(w)m(ork)h(lo)s(cation)g(for)f(a)h(w)m(ork)f(that)g(w)m(as)h
|
||||
(published)510 3272 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
|
||||
(published)510 3504 y(at)36 b(least)h(four)e(y)m(ears)i(b)s(efore)e
|
||||
(the)h(Do)s(cumen)m(t)h(itself,)h(or)d(if)h(the)g(original)h(publisher)
|
||||
d(of)i(the)510 3382 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
|
||||
(ermission.)354 3521 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
|
||||
d(of)i(the)510 3614 y(v)m(ersion)31 b(it)g(refers)f(to)h(giv)m(es)h(p)s
|
||||
(ermission.)354 3751 y(K.)60 b(F)-8 b(or)24 b(an)m(y)h(section)f(En)m
|
||||
(titled)h(\\Ac)m(kno)m(wledgemen)m(ts")i(or)d(\\Dedications",)k
|
||||
(Preserv)m(e)c(the)g(Title)510 3630 y(of)j(the)f(section,)j(and)d
|
||||
(Preserv)m(e)c(the)g(Title)510 3861 y(of)j(the)f(section,)j(and)d
|
||||
(preserv)m(e)h(in)f(the)h(section)g(all)h(the)e(substance)h(and)f(tone)
|
||||
h(of)f(eac)m(h)i(of)f(the)510 3740 y(con)m(tributor)k(ac)m(kno)m
|
||||
h(of)f(eac)m(h)i(of)f(the)510 3970 y(con)m(tributor)k(ac)m(kno)m
|
||||
(wledgemen)m(ts)i(and/or)d(dedications)h(giv)m(en)h(therein.)368
|
||||
3879 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
|
||||
4107 y(L.)60 b(Preserv)m(e)36 b(all)g(the)g(In)m(v)-5
|
||||
b(arian)m(t)36 b(Sections)g(of)f(the)h(Do)s(cumen)m(t,)h(unaltered)f
|
||||
(in)f(their)g(text)i(and)510 3988 y(in)f(their)g(titles.)58
|
||||
(in)f(their)g(text)i(and)510 4217 y(in)f(their)g(titles.)58
|
||||
b(Section)37 b(n)m(um)m(b)s(ers)d(or)i(the)g(equiv)-5
|
||||
b(alen)m(t)38 b(are)e(not)g(considered)g(part)g(of)g(the)510
|
||||
4098 y(section)c(titles.)341 4237 y(M.)61 b(Delete)33
|
||||
4326 y(section)c(titles.)341 4463 y(M.)61 b(Delete)33
|
||||
b(an)m(y)e(section)h(En)m(titled)f(\\Endorsemen)m(ts".)42
|
||||
b(Suc)m(h)30 b(a)i(section)f(ma)m(y)h(not)f(b)s(e)f(included)510
|
||||
4346 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
|
||||
4485 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
|
||||
4573 y(in)g(the)h(Mo)s(di\014ed)e(V)-8 b(ersion.)357
|
||||
4710 y(N.)60 b(Do)29 b(not)g(retitle)h(an)m(y)e(existing)i(section)f
|
||||
(to)g(b)s(e)f(En)m(titled)h(\\Endorsemen)m(ts")g(or)f(to)h(con\015ict)g
|
||||
(in)510 4595 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
|
||||
b(Section.)354 4734 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
|
||||
b(arran)m(t)m(y)32 b(Disclaimers.)330 4902 y(If)h(the)g(Mo)s(di\014ed)g
|
||||
(in)510 4819 y(title)j(with)e(an)m(y)h(In)m(v)-5 b(arian)m(t)31
|
||||
b(Section.)354 4956 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
|
||||
b(arran)m(t)m(y)32 b(Disclaimers.)330 5121 y(If)h(the)g(Mo)s(di\014ed)g
|
||||
(V)-8 b(ersion)34 b(includes)f(new)g(fron)m(t-matter)i(sections)f(or)f
|
||||
(app)s(endices)g(that)h(qualify)330 5011 y(as)28 b(Secondary)g
|
||||
(app)s(endices)g(that)h(qualify)330 5230 y(as)28 b(Secondary)g
|
||||
(Sections)g(and)f(con)m(tain)j(no)d(material)j(copied)e(from)f(the)h
|
||||
(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5121 y(y)m(our)k(option)h
|
||||
(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)330 5340 y(y)m(our)k(option)h
|
||||
(designate)h(some)e(or)h(all)g(of)f(these)h(sections)h(as)e(in)m(v)-5
|
||||
b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)330
|
||||
5230 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5 b(arian)m(t)36
|
||||
b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8 b(ersion's)36
|
||||
b(license)g(notice.)57 b(These)330 5340 y(titles)32 b(m)m(ust)e(b)s(e)g
|
||||
(distinct)h(from)e(an)m(y)i(other)g(section)g(titles.)p
|
||||
b(arian)m(t.)48 b(T)-8 b(o)33 b(do)f(this,)h(add)f(their)p
|
||||
eop end
|
||||
%%Page: 147 153
|
||||
TeXDict begin 147 152 bop 150 -116 a Ft(App)s(endix)29
|
||||
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
|
||||
b(147)330 299 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)i(En)m
|
||||
(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
|
||||
(nothing)g(but)330 408 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
|
||||
b(147)330 299 y(titles)37 b(to)f(the)f(list)h(of)g(In)m(v)-5
|
||||
b(arian)m(t)36 b(Sections)g(in)f(the)h(Mo)s(di\014ed)f(V)-8
|
||||
b(ersion's)36 b(license)g(notice.)57 b(These)330 408
|
||||
y(titles)32 b(m)m(ust)e(b)s(e)g(distinct)h(from)e(an)m(y)i(other)g
|
||||
(section)g(titles.)330 551 y(Y)-8 b(ou)43 b(ma)m(y)g(add)f(a)g(section)
|
||||
i(En)m(titled)f(\\Endorsemen)m(ts",)j(pro)m(vided)c(it)h(con)m(tains)g
|
||||
(nothing)g(but)330 661 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s
|
||||
(di\014ed)g(V)-8 b(ersion)31 b(b)m(y)e(v)-5 b(arious)30
|
||||
b(parties|for)g(example,)g(statemen)m(ts)i(of)330 518
|
||||
b(parties|for)g(example,)g(statemen)m(ts)i(of)330 770
|
||||
y(p)s(eer)27 b(review)g(or)g(that)h(the)f(text)i(has)d(b)s(een)h(appro)
|
||||
m(v)m(ed)g(b)m(y)g(an)h(organization)h(as)e(the)h(authoritativ)m(e)330
|
||||
628 y(de\014nition)i(of)h(a)f(standard.)330 757 y(Y)-8
|
||||
880 y(de\014nition)i(of)h(a)f(standard.)330 1022 y(Y)-8
|
||||
b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g(up)e(to)i(\014v)m(e)g(w)m
|
||||
(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)30 b(T)-8
|
||||
b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 867 y(to)g(25)g(w)m(ords)e
|
||||
b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330 1132 y(to)g(25)g(w)m(ords)e
|
||||
(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext,)29 b(to)f(the)f(end)f(of)i
|
||||
(the)f(list)h(of)f(Co)m(v)m(er)h(T)-8 b(exts)27 b(in)g(the)h(Mo)s
|
||||
(di\014ed)330 976 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
|
||||
(di\014ed)330 1241 y(V)-8 b(ersion.)58 b(Only)35 b(one)h(passage)h(of)f
|
||||
(F)-8 b(ron)m(t-Co)m(v)m(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m
|
||||
(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1086
|
||||
(k-Co)m(v)m(er)j(T)-8 b(ext)36 b(ma)m(y)h(b)s(e)330 1351
|
||||
y(added)27 b(b)m(y)g(\(or)h(through)f(arrangemen)m(ts)h(made)g(b)m(y\))
|
||||
g(an)m(y)g(one)f(en)m(tit)m(y)-8 b(.)42 b(If)27 b(the)h(Do)s(cumen)m(t)
|
||||
g(already)330 1196 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
|
||||
g(already)330 1461 y(includes)34 b(a)g(co)m(v)m(er)h(text)g(for)f(the)g
|
||||
(same)h(co)m(v)m(er,)h(previously)e(added)f(b)m(y)h(y)m(ou)g(or)g(b)m
|
||||
(y)g(arrangemen)m(t)330 1305 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
|
||||
(y)g(arrangemen)m(t)330 1570 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m
|
||||
(y)i(y)m(ou)f(are)f(acting)i(on)e(b)s(ehalf)f(of,)j(y)m(ou)f(ma)m(y)g
|
||||
(not)f(add)g(another;)j(but)330 1415 y(y)m(ou)c(ma)m(y)h(replace)g(the)
|
||||
(not)f(add)g(another;)j(but)330 1680 y(y)m(ou)c(ma)m(y)h(replace)g(the)
|
||||
f(old)g(one,)i(on)e(explicit)h(p)s(ermission)e(from)g(the)i(previous)e
|
||||
(publisher)f(that)330 1524 y(added)e(the)g(old)h(one.)330
|
||||
1654 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
|
||||
(publisher)f(that)330 1789 y(added)e(the)g(old)h(one.)330
|
||||
1932 y(The)25 b(author\(s\))h(and)f(publisher\(s\))f(of)i(the)f(Do)s
|
||||
(cumen)m(t)h(do)g(not)f(b)m(y)h(this)f(License)h(giv)m(e)h(p)s
|
||||
(ermission)330 1763 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
|
||||
(ermission)330 2041 y(to)k(use)f(their)g(names)h(for)f(publicit)m(y)g
|
||||
(for)h(or)f(to)h(assert)g(or)f(imply)g(endorsemen)m(t)g(of)h(an)m(y)g
|
||||
(Mo)s(di\014ed)330 1873 y(V)-8 b(ersion.)199 2002 y(5.)61
|
||||
b(COMBINING)31 b(DOCUMENTS)330 2132 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
|
||||
(Mo)s(di\014ed)330 2151 y(V)-8 b(ersion.)199 2293 y(5.)61
|
||||
b(COMBINING)31 b(DOCUMENTS)330 2436 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
|
||||
(bine)h(the)f(Do)s(cumen)m(t)g(with)g(other)f(do)s(cumen)m(ts)h
|
||||
(released)g(under)f(this)g(License,)330 2242 y(under)f(the)h(terms)g
|
||||
(released)g(under)f(this)g(License,)330 2545 y(under)f(the)h(terms)g
|
||||
(de\014ned)f(in)h(section)h(4)g(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)f
|
||||
(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2351
|
||||
(v)m(ersions,)k(pro)m(vided)d(that)h(y)m(ou)330 2655
|
||||
y(include)25 b(in)g(the)g(com)m(bination)i(all)f(of)g(the)f(In)m(v)-5
|
||||
b(arian)m(t)26 b(Sections)g(of)g(all)g(of)f(the)h(original)g(do)s
|
||||
(cumen)m(ts,)330 2461 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
|
||||
(cumen)m(ts,)330 2765 y(unmo)s(di\014ed,)g(and)g(list)h(them)g(all)g
|
||||
(as)g(In)m(v)-5 b(arian)m(t)28 b(Sections)f(of)g(y)m(our)g(com)m(bined)
|
||||
g(w)m(ork)f(in)h(its)g(license)330 2570 y(notice,)32
|
||||
g(w)m(ork)f(in)h(its)g(license)330 2874 y(notice,)32
|
||||
b(and)e(that)h(y)m(ou)f(preserv)m(e)h(all)g(their)g(W)-8
|
||||
b(arran)m(t)m(y)32 b(Disclaimers.)330 2700 y(The)e(com)m(bined)g(w)m
|
||||
b(arran)m(t)m(y)32 b(Disclaimers.)330 3017 y(The)e(com)m(bined)g(w)m
|
||||
(ork)h(need)e(only)i(con)m(tain)g(one)g(cop)m(y)g(of)f(this)g(License,)
|
||||
i(and)d(m)m(ultiple)i(iden)m(tical)330 2809 y(In)m(v)-5
|
||||
i(and)d(m)m(ultiple)i(iden)m(tical)330 3126 y(In)m(v)-5
|
||||
b(arian)m(t)33 b(Sections)g(ma)m(y)g(b)s(e)f(replaced)h(with)f(a)h
|
||||
(single)g(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)g(In)m
|
||||
(v)-5 b(arian)m(t)330 2919 y(Sections)27 b(with)g(the)g(same)g(name)g
|
||||
(v)-5 b(arian)m(t)330 3236 y(Sections)27 b(with)g(the)g(same)g(name)g
|
||||
(but)f(di\013eren)m(t)h(con)m(ten)m(ts,)i(mak)m(e)f(the)f(title)h(of)f
|
||||
(eac)m(h)h(suc)m(h)f(section)330 3029 y(unique)33 b(b)m(y)h(adding)f
|
||||
(eac)m(h)h(suc)m(h)f(section)330 3345 y(unique)33 b(b)m(y)h(adding)f
|
||||
(at)i(the)f(end)g(of)g(it,)h(in)f(paren)m(theses,)i(the)e(name)g(of)g
|
||||
(the)g(original)h(author)f(or)330 3138 y(publisher)23
|
||||
(the)g(original)h(author)f(or)330 3455 y(publisher)23
|
||||
b(of)i(that)h(section)g(if)f(kno)m(wn,)h(or)f(else)h(a)f(unique)f(n)m
|
||||
(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
|
||||
3248 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
|
||||
3565 y(to)g(the)g(section)g(titles)h(in)e(the)h(list)g(of)f(In)m(v)-5
|
||||
b(arian)m(t)26 b(Sections)f(in)f(the)g(license)i(notice)g(of)e(the)h
|
||||
(com)m(bined)330 3357 y(w)m(ork.)330 3487 y(In)41 b(the)g(com)m
|
||||
(com)m(bined)330 3674 y(w)m(ork.)330 3817 y(In)41 b(the)g(com)m
|
||||
(bination,)46 b(y)m(ou)41 b(m)m(ust)g(com)m(bine)h(an)m(y)g(sections)g
|
||||
(En)m(titled)g(\\History")h(in)e(the)g(v)-5 b(ari-)330
|
||||
3597 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
|
||||
3926 y(ous)32 b(original)h(do)s(cumen)m(ts,)g(forming)f(one)g(section)h
|
||||
(En)m(titled)g(\\History";)i(lik)m(ewise)f(com)m(bine)f(an)m(y)330
|
||||
3706 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
|
||||
4036 y(sections)g(En)m(titled)f(\\Ac)m(kno)m(wledgemen)m(ts",)k(and)31
|
||||
b(an)m(y)h(sections)h(En)m(titled)g(\\Dedications".)47
|
||||
b(Y)-8 b(ou)330 3816 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
|
||||
(titled)f(\\Endorsemen)m(ts.")199 3945 y(6.)61 b(COLLECTIONS)28
|
||||
b(OF)i(DOCUMENTS)330 4075 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
|
||||
b(Y)-8 b(ou)330 4145 y(m)m(ust)30 b(delete)i(all)f(sections)h(En)m
|
||||
(titled)f(\\Endorsemen)m(ts.")199 4288 y(6.)61 b(COLLECTIONS)28
|
||||
b(OF)i(DOCUMENTS)330 4430 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
|
||||
(collection)i(consisting)f(of)f(the)g(Do)s(cumen)m(t)g(and)g(other)g
|
||||
(do)s(cumen)m(ts)f(released)330 4184 y(under)41 b(this)h(License,)k
|
||||
(do)s(cumen)m(ts)f(released)330 4540 y(under)41 b(this)h(License,)k
|
||||
(and)c(replace)h(the)g(individual)f(copies)h(of)f(this)g(License)h(in)f
|
||||
(the)h(v)-5 b(arious)330 4294 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
|
||||
(the)h(v)-5 b(arious)330 4650 y(do)s(cumen)m(ts)42 b(with)g(a)h(single)
|
||||
g(cop)m(y)h(that)f(is)f(included)g(in)g(the)h(collection,)48
|
||||
b(pro)m(vided)42 b(that)i(y)m(ou)330 4403 y(follo)m(w)38
|
||||
b(pro)m(vided)42 b(that)i(y)m(ou)330 4759 y(follo)m(w)38
|
||||
b(the)g(rules)e(of)h(this)g(License)h(for)f(v)m(erbatim)h(cop)m(ying)g
|
||||
(of)f(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)h(all)330
|
||||
4513 y(other)31 b(resp)s(ects.)330 4643 y(Y)-8 b(ou)32
|
||||
4869 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
|
||||
b(ma)m(y)g(extract)h(a)f(single)g(do)s(cumen)m(t)f(from)g(suc)m(h)g(a)h
|
||||
(collection,)i(and)d(distribute)g(it)h(individu-)330
|
||||
4752 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
|
||||
5121 y(ally)k(under)d(this)i(License,)i(pro)m(vided)e(y)m(ou)g(insert)g
|
||||
(a)g(cop)m(y)h(of)f(this)g(License)g(in)m(to)h(the)g(extracted)330
|
||||
4862 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
|
||||
5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)i(this)e(License)h(in)g(all)g
|
||||
(other)g(resp)s(ects)f(regarding)h(v)m(erbatim)g(cop)m(ying)h(of)330
|
||||
4971 y(that)d(do)s(cumen)m(t.)199 5101 y(7.)61 b(A)m(GGREGA)-8
|
||||
b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 5230 y(A)d(compilation)i
|
||||
(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
|
||||
b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
|
||||
5340 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
|
||||
(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)p
|
||||
eop end
|
||||
5340 y(that)d(do)s(cumen)m(t.)p eop end
|
||||
%%Page: 148 154
|
||||
TeXDict begin 148 153 bop 150 -116 a Ft(148)2527 b(Bash)31
|
||||
b(Reference)g(Man)m(ual)330 299 y(an)f(\\aggregate")k(if)c(the)g(cop)m
|
||||
(yrigh)m(t)i(resulting)e(from)f(the)i(compilation)g(is)f(not)h(used)e
|
||||
(to)i(limit)g(the)330 408 y(legal)d(righ)m(ts)f(of)g(the)g
|
||||
(compilation's)h(users)e(b)s(ey)m(ond)g(what)g(the)h(individual)f(w)m
|
||||
(orks)g(p)s(ermit.)39 b(When)330 518 y(the)g(Do)s(cumen)m(t)g(is)f
|
||||
(included)g(in)g(an)g(aggregate,)44 b(this)38 b(License)h(do)s(es)f
|
||||
(not)h(apply)f(to)h(the)g(other)330 628 y(w)m(orks)30
|
||||
b(in)g(the)h(aggregate)i(whic)m(h)d(are)h(not)g(themselv)m(es)g(deriv)
|
||||
-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h(Do)s(cumen)m(t.)330
|
||||
762 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8 b(ext)23 b(requiremen)m(t)g(of)g
|
||||
(section)h(3)f(is)g(applicable)h(to)f(these)h(copies)f(of)g(the)g(Do)s
|
||||
(cumen)m(t,)330 872 y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f
|
||||
(than)g(one)h(half)f(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s
|
||||
(cumen)m(t's)g(Co)m(v)m(er)330 981 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f
|
||||
(placed)h(on)g(co)m(v)m(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m
|
||||
(t)g(within)f(the)h(aggregate,)j(or)d(the)330 1091 y(electronic)37
|
||||
b(equiv)-5 b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m
|
||||
(t)h(is)f(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
|
||||
1200 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
|
||||
(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1335 y(8.)61
|
||||
b(TRANSLA)-8 b(TION)330 1469 y(T)g(ranslation)41 b(is)f(considered)f(a)
|
||||
b(Reference)g(Man)m(ual)199 299 y(7.)61 b(A)m(GGREGA)-8
|
||||
b(TION)32 b(WITH)e(INDEPENDENT)h(W)m(ORKS)330 441 y(A)d(compilation)i
|
||||
(of)e(the)g(Do)s(cumen)m(t)h(or)f(its)g(deriv)-5 b(ativ)m(es)30
|
||||
b(with)d(other)i(separate)g(and)e(indep)s(enden)m(t)330
|
||||
551 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)f(or)h(on)f(a)g(v)m
|
||||
(olume)h(of)g(a)f(storage)i(or)e(distribution)g(medium,)g(is)h(called)
|
||||
330 661 y(an)c(\\aggregate")k(if)c(the)g(cop)m(yrigh)m(t)i(resulting)e
|
||||
(from)f(the)i(compilation)g(is)f(not)h(used)e(to)i(limit)g(the)330
|
||||
770 y(legal)d(righ)m(ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m
|
||||
(ond)g(what)g(the)h(individual)f(w)m(orks)g(p)s(ermit.)39
|
||||
b(When)330 880 y(the)g(Do)s(cumen)m(t)g(is)f(included)g(in)g(an)g
|
||||
(aggregate,)44 b(this)38 b(License)h(do)s(es)f(not)h(apply)f(to)h(the)g
|
||||
(other)330 989 y(w)m(orks)30 b(in)g(the)h(aggregate)i(whic)m(h)d(are)h
|
||||
(not)g(themselv)m(es)g(deriv)-5 b(ativ)m(e)32 b(w)m(orks)f(of)f(the)h
|
||||
(Do)s(cumen)m(t.)330 1132 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
|
||||
b(ext)23 b(requiremen)m(t)g(of)g(section)h(3)f(is)g(applicable)h(to)f
|
||||
(these)h(copies)f(of)g(the)g(Do)s(cumen)m(t,)330 1241
|
||||
y(then)f(if)g(the)h(Do)s(cumen)m(t)g(is)g(less)f(than)g(one)h(half)f
|
||||
(of)h(the)g(en)m(tire)g(aggregate,)k(the)c(Do)s(cumen)m(t's)g(Co)m(v)m
|
||||
(er)330 1351 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)h(on)g(co)m(v)m
|
||||
(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)f(the)h
|
||||
(aggregate,)j(or)d(the)330 1461 y(electronic)37 b(equiv)-5
|
||||
b(alen)m(t)36 b(of)g(co)m(v)m(ers)g(if)f(the)g(Do)s(cumen)m(t)h(is)f
|
||||
(in)g(electronic)i(form.)54 b(Otherwise)35 b(they)330
|
||||
1570 y(m)m(ust)30 b(app)s(ear)g(on)g(prin)m(ted)g(co)m(v)m(ers)i(that)f
|
||||
(brac)m(k)m(et)h(the)f(whole)f(aggregate.)199 1713 y(8.)61
|
||||
b(TRANSLA)-8 b(TION)330 1855 y(T)g(ranslation)41 b(is)f(considered)f(a)
|
||||
i(kind)e(of)h(mo)s(di\014cation,)j(so)d(y)m(ou)g(ma)m(y)h(distribute)e
|
||||
(translations)330 1579 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
|
||||
(translations)330 1965 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
|
||||
(terms)h(of)f(section)i(4.)83 b(Replacing)45 b(In)m(v)-5
|
||||
b(arian)m(t)45 b(Sections)g(with)330 1689 y(translations)h(requires)f
|
||||
b(arian)m(t)45 b(Sections)g(with)330 2074 y(translations)h(requires)f
|
||||
(sp)s(ecial)h(p)s(ermission)f(from)g(their)g(cop)m(yrigh)m(t)i
|
||||
(holders,)i(but)c(y)m(ou)g(ma)m(y)330 1798 y(include)24
|
||||
(holders,)i(but)c(y)m(ou)g(ma)m(y)330 2184 y(include)24
|
||||
b(translations)i(of)e(some)h(or)g(all)g(In)m(v)-5 b(arian)m(t)25
|
||||
b(Sections)g(in)f(addition)h(to)g(the)g(original)h(v)m(ersions)330
|
||||
1908 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
|
||||
2293 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)33 b(Sections.)44
|
||||
b(Y)-8 b(ou)32 b(ma)m(y)g(include)f(a)h(translation)g(of)g(this)f
|
||||
(License,)i(and)d(all)j(the)330 2017 y(license)42 b(notices)g(in)f(the)
|
||||
(License,)i(and)d(all)j(the)330 2403 y(license)42 b(notices)g(in)f(the)
|
||||
h(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
|
||||
b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2127
|
||||
b(Disclaimers,)k(pro)m(vided)41 b(that)h(y)m(ou)330 2513
|
||||
y(also)f(include)f(the)g(original)h(English)f(v)m(ersion)g(of)g(this)g
|
||||
(License)h(and)e(the)h(original)h(v)m(ersions)g(of)330
|
||||
2237 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
|
||||
2622 y(those)35 b(notices)g(and)e(disclaimers.)53 b(In)33
|
||||
b(case)i(of)g(a)f(disagreemen)m(t)h(b)s(et)m(w)m(een)g(the)f
|
||||
(translation)i(and)330 2346 y(the)f(original)i(v)m(ersion)e(of)h(this)f
|
||||
(translation)i(and)330 2732 y(the)f(original)i(v)m(ersion)e(of)h(this)f
|
||||
(License)h(or)f(a)g(notice)i(or)e(disclaimer,)i(the)f(original)g(v)m
|
||||
(ersion)g(will)330 2456 y(prev)-5 b(ail.)330 2590 y(If)28
|
||||
(ersion)g(will)330 2841 y(prev)-5 b(ail.)330 2984 y(If)28
|
||||
b(a)h(section)h(in)e(the)h(Do)s(cumen)m(t)h(is)e(En)m(titled)i(\\Ac)m
|
||||
(kno)m(wledgemen)m(ts",)i(\\Dedications",)g(or)d(\\His-)330
|
||||
2700 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
|
||||
3093 y(tory",)f(the)f(requiremen)m(t)f(\(section)i(4\))f(to)g(Preserv)m
|
||||
(e)g(its)f(Title)i(\(section)f(1\))g(will)g(t)m(ypically)h(require)330
|
||||
2809 y(c)m(hanging)j(the)g(actual)h(title.)199 2944 y(9.)61
|
||||
b(TERMINA)-8 b(TION)330 3078 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
|
||||
3203 y(c)m(hanging)j(the)g(actual)h(title.)199 3345 y(9.)61
|
||||
b(TERMINA)-8 b(TION)330 3488 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m(y)-8
|
||||
b(,)31 b(mo)s(dify)-8 b(,)30 b(sublicense,)g(or)g(distribute)f(the)h
|
||||
(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3188 y(pro)m(vided)41
|
||||
b(for)h(under)e(this)i(License.)75 b(An)m(y)42 b(other)g(attempt)h(to)g
|
||||
(cop)m(y)-8 b(,)46 b(mo)s(dify)-8 b(,)44 b(sublicense)e(or)330
|
||||
3298 y(distribute)36 b(the)h(Do)s(cumen)m(t)g(is)g(v)m(oid,)i(and)d
|
||||
(will)h(automatically)i(terminate)f(y)m(our)e(righ)m(ts)h(under)330
|
||||
3407 y(this)28 b(License.)40 b(Ho)m(w)m(ev)m(er,)31 b(parties)d(who)f
|
||||
(ha)m(v)m(e)i(receiv)m(ed)g(copies,)h(or)d(righ)m(ts,)i(from)f(y)m(ou)g
|
||||
(under)e(this)330 3517 y(License)37 b(will)g(not)g(ha)m(v)m(e)h(their)f
|
||||
(licenses)g(terminated)h(so)f(long)g(as)g(suc)m(h)f(parties)h(remain)g
|
||||
(in)f(full)330 3626 y(compliance.)154 3761 y(10.)61 b(FUTURE)30
|
||||
b(REVISIONS)f(OF)i(THIS)e(LICENSE)330 3895 y(The)41 b(F)-8
|
||||
b(ree)43 b(Soft)m(w)m(are)f(F)-8 b(oundation)43 b(ma)m(y)f(publish)e
|
||||
(new,)k(revised)d(v)m(ersions)h(of)g(the)g(GNU)g(F)-8
|
||||
b(ree)330 4005 y(Do)s(cumen)m(tation)34 b(License)e(from)g(time)h(to)g
|
||||
(time.)46 b(Suc)m(h)31 b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h
|
||||
(in)g(spirit)330 4115 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)
|
||||
m(y)h(di\013er)f(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i
|
||||
(concerns.)330 4224 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p
|
||||
Ft(.)330 4359 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m
|
||||
(en)g(a)g(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39
|
||||
b(If)29 b(the)g(Do)s(cumen)m(t)330 4468 y(sp)s(eci\014es)45
|
||||
b(that)h(a)g(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g
|
||||
(License)h(\\or)g(an)m(y)g(later)g(v)m(ersion")330 4578
|
||||
y(applies)33 b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f
|
||||
(follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
|
||||
4687 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
|
||||
(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
|
||||
(b)m(y)330 4797 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
|
||||
b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
|
||||
(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 4907
|
||||
y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
|
||||
(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
|
||||
h(F)-8 b(ree)330 5016 y(Soft)m(w)m(are)31 b(F)-8 b(oundation.)p
|
||||
eop end
|
||||
(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3598 y(pro)m(vided)38
|
||||
b(under)f(this)i(License.)65 b(An)m(y)39 b(attempt)h(otherwise)f(to)g
|
||||
(cop)m(y)-8 b(,)42 b(mo)s(dify)-8 b(,)40 b(sublicense,)h(or)330
|
||||
3707 y(distribute)30 b(it)h(is)f(v)m(oid,)h(and)f(will)h(automatically)
|
||||
i(terminate)f(y)m(our)e(righ)m(ts)h(under)e(this)h(License.)330
|
||||
3850 y(Ho)m(w)m(ev)m(er,)35 b(if)e(y)m(ou)f(cease)i(all)f(violation)i
|
||||
(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f(a)h
|
||||
(particular)330 3959 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h
|
||||
(\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g
|
||||
(cop)m(yrigh)m(t)h(holder)330 4069 y(explicitly)42 b(and)e(\014nally)h
|
||||
(terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8
|
||||
b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 4178 y(holder)34
|
||||
b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h
|
||||
(reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 4288
|
||||
y(after)31 b(the)f(cessation.)330 4430 y(Moreo)m(v)m(er,)k(y)m(our)d
|
||||
(license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h
|
||||
(reinstated)g(p)s(ermanen)m(tly)f(if)330 4540 y(the)d(cop)m(yrigh)m(t)h
|
||||
(holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g
|
||||
(reasonable)h(means,)f(this)g(is)g(the)330 4650 y(\014rst)f(time)i(y)m
|
||||
(ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f
|
||||
(License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330
|
||||
4759 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g
|
||||
(violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h
|
||||
(of)f(the)330 4869 y(notice.)330 5011 y(T)-8 b(ermination)28
|
||||
b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h
|
||||
(terminate)h(the)e(licenses)i(of)f(parties)330 5121 y(who)38
|
||||
b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g
|
||||
(under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e)
|
||||
330 5230 y(b)s(een)25 b(terminated)i(and)e(not)h(p)s(ermanen)m(tly)g
|
||||
(reinstated,)i(receipt)f(of)f(a)g(cop)m(y)h(of)f(some)h(or)f(all)h(of)f
|
||||
(the)330 5340 y(same)31 b(material)h(do)s(es)e(not)g(giv)m(e)i(y)m(ou)f
|
||||
(an)m(y)g(righ)m(ts)f(to)i(use)e(it.)p eop end
|
||||
%%Page: 149 155
|
||||
TeXDict begin 149 154 bop 150 -116 a Ft(App)s(endix)29
|
||||
b(C:)h(GNU)h(F)-8 b(ree)31 b(Do)s(cumen)m(tation)i(License)1560
|
||||
b(149)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g(this)h(License)f
|
||||
(for)g(y)l(our)g(do)t(cumen)l(ts)275 543 y Ft(T)-8 b(o)27
|
||||
b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f(y)m(ou)h(ha)m(v)m(e)
|
||||
g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h(License)g(in)f(the)150
|
||||
653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)m(wing)i(cop)m(yrigh)m
|
||||
(t)g(and)e(license)h(notices)g(just)f(after)h(the)g(title)h(page:)468
|
||||
765 y Fe(Copyright)42 b(\(C\))79 b Fd(year)88 b(your)40
|
||||
b(name)p Fe(.)468 852 y(Permission)i(is)e(granted)g(to)g(copy,)h
|
||||
(distribute)g(and/or)g(modify)f(this)g(document)468 939
|
||||
y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
|
||||
(License,)f(Version)g(1.2)468 1026 y(or)f(any)g(later)g(version)h
|
||||
b(149)154 299 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e(LICENSE)
|
||||
330 433 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
|
||||
b(oundation)43 b(ma)m(y)f(publish)e(new,)k(revised)d(v)m(ersions)h(of)g
|
||||
(the)g(GNU)g(F)-8 b(ree)330 543 y(Do)s(cumen)m(tation)34
|
||||
b(License)e(from)g(time)h(to)g(time.)46 b(Suc)m(h)31
|
||||
b(new)h(v)m(ersions)g(will)h(b)s(e)e(similar)h(in)g(spirit)330
|
||||
653 y(to)j(the)g(presen)m(t)f(v)m(ersion,)i(but)e(ma)m(y)h(di\013er)f
|
||||
(in)g(detail)h(to)g(address)f(new)g(problems)f(or)i(concerns.)330
|
||||
762 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p Ft(.)330
|
||||
897 y(Eac)m(h)f(v)m(ersion)g(of)g(the)f(License)h(is)g(giv)m(en)g(a)g
|
||||
(distinguishing)f(v)m(ersion)h(n)m(um)m(b)s(er.)39 b(If)29
|
||||
b(the)g(Do)s(cumen)m(t)330 1006 y(sp)s(eci\014es)45 b(that)h(a)g
|
||||
(particular)f(n)m(um)m(b)s(ered)f(v)m(ersion)i(of)f(this)g(License)h
|
||||
(\\or)g(an)m(y)g(later)g(v)m(ersion")330 1116 y(applies)33
|
||||
b(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f(follo)m(wing)i
|
||||
(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330
|
||||
1225 y(sp)s(eci\014ed)37 b(v)m(ersion)i(or)e(of)h(an)m(y)h(later)g(v)m
|
||||
(ersion)f(that)g(has)g(b)s(een)f(published)f(\(not)j(as)f(a)g(draft\))g
|
||||
(b)m(y)330 1335 y(the)33 b(F)-8 b(ree)34 b(Soft)m(w)m(are)f(F)-8
|
||||
b(oundation.)49 b(If)32 b(the)h(Do)s(cumen)m(t)g(do)s(es)g(not)g(sp)s
|
||||
(ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)330 1445
|
||||
y(this)i(License,)j(y)m(ou)d(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g(v)m
|
||||
(ersion)g(ev)m(er)g(published)e(\(not)i(as)g(a)f(draft\))h(b)m(y)f(the)
|
||||
h(F)-8 b(ree)330 1554 y(Soft)m(w)m(are)33 b(F)-8 b(oundation.)46
|
||||
b(If)32 b(the)g(Do)s(cumen)m(t)g(sp)s(eci\014es)g(that)g(a)h(pro)m(xy)f
|
||||
(can)g(decide)g(whic)m(h)g(future)330 1664 y(v)m(ersions)h(of)g(this)f
|
||||
(License)h(can)g(b)s(e)f(used,)g(that)i(pro)m(xy's)e(public)g(statemen)
|
||||
m(t)i(of)f(acceptance)i(of)e(a)330 1773 y(v)m(ersion)e(p)s(ermanen)m
|
||||
(tly)f(authorizes)h(y)m(ou)g(to)g(c)m(ho)s(ose)g(that)g(v)m(ersion)g
|
||||
(for)f(the)h(Do)s(cumen)m(t.)154 1908 y(11.)61 b(RELICENSING)330
|
||||
2042 y(\\Massiv)m(e)39 b(Multiauthor)f(Collab)s(oration)g(Site")h(\(or)
|
||||
e(\\MMC)h(Site"\))h(means)e(an)m(y)h(W)-8 b(orld)37 b(Wide)330
|
||||
2152 y(W)-8 b(eb)36 b(serv)m(er)g(that)h(publishes)d(cop)m(yrigh)m
|
||||
(table)k(w)m(orks)e(and)f(also)i(pro)m(vides)e(prominen)m(t)h
|
||||
(facilities)330 2262 y(for)27 b(an)m(yb)s(o)s(dy)g(to)h(edit)g(those)g
|
||||
(w)m(orks.)39 b(A)28 b(public)f(wiki)h(that)g(an)m(yb)s(o)s(dy)e(can)i
|
||||
(edit)g(is)f(an)h(example)g(of)330 2371 y(suc)m(h)33
|
||||
b(a)h(serv)m(er.)51 b(A)34 b(\\Massiv)m(e)i(Multiauthor)e(Collab)s
|
||||
(oration")h(\(or)f(\\MMC"\))h(con)m(tained)g(in)f(the)330
|
||||
2481 y(site)d(means)f(an)m(y)h(set)g(of)g(cop)m(yrigh)m(table)h(w)m
|
||||
(orks)e(th)m(us)g(published)f(on)h(the)h(MMC)f(site.)330
|
||||
2615 y(\\CC-BY-SA")36 b(means)f(the)g(Creativ)m(e)i(Commons)e(A)m
|
||||
(ttribution-Share)g(Alik)m(e)i(3.0)f(license)g(pub-)330
|
||||
2725 y(lished)27 b(b)m(y)f(Creativ)m(e)j(Commons)d(Corp)s(oration,)h(a)
|
||||
g(not-for-pro\014t)g(corp)s(oration)h(with)e(a)h(principal)330
|
||||
2834 y(place)g(of)f(business)e(in)i(San)f(F)-8 b(rancisco,)29
|
||||
b(California,)f(as)e(w)m(ell)h(as)f(future)f(cop)m(yleft)i(v)m(ersions)
|
||||
f(of)g(that)330 2944 y(license)31 b(published)e(b)m(y)h(that)h(same)g
|
||||
(organization.)330 3078 y(\\Incorp)s(orate")h(means)e(to)h(publish)e
|
||||
(or)i(republish)e(a)i(Do)s(cumen)m(t,)g(in)g(whole)g(or)f(in)g(part,)h
|
||||
(as)g(part)330 3188 y(of)g(another)f(Do)s(cumen)m(t.)330
|
||||
3323 y(An)c(MMC)g(is)h(\\eligible)h(for)e(relicensing")h(if)g(it)f(is)h
|
||||
(licensed)f(under)f(this)h(License,)i(and)e(if)g(all)h(w)m(orks)330
|
||||
3432 y(that)43 b(w)m(ere)f(\014rst)f(published)f(under)h(this)h
|
||||
(License)g(somewhere)g(other)g(than)g(this)g(MMC,)h(and)330
|
||||
3542 y(subsequen)m(tly)34 b(incorp)s(orated)h(in)f(whole)h(or)g(in)f
|
||||
(part)h(in)m(to)h(the)f(MMC,)g(\(1\))h(had)e(no)h(co)m(v)m(er)h(texts)
|
||||
330 3651 y(or)30 b(in)m(v)-5 b(arian)m(t)32 b(sections,)g(and)d(\(2\))j
|
||||
(w)m(ere)f(th)m(us)f(incorp)s(orated)g(prior)g(to)h(No)m(v)m(em)m(b)s
|
||||
(er)g(1,)g(2008.)330 3786 y(The)40 b(op)s(erator)h(of)g(an)f(MMC)h
|
||||
(Site)g(ma)m(y)g(republish)e(an)h(MMC)h(con)m(tained)h(in)e(the)h(site)
|
||||
g(under)330 3895 y(CC-BY-SA)30 b(on)g(the)h(same)f(site)h(at)g(an)m(y)g
|
||||
(time)g(b)s(efore)e(August)h(1,)h(2009,)h(pro)m(vided)e(the)g(MMC)h(is)
|
||||
330 4005 y(eligible)h(for)e(relicensing.)p eop end
|
||||
%%Page: 150 156
|
||||
TeXDict begin 150 155 bop 150 -116 a Ft(150)2527 b(Bash)31
|
||||
b(Reference)g(Man)m(ual)150 299 y Fr(ADDENDUM:)45 b(Ho)l(w)h(to)f(use)g
|
||||
(this)h(License)f(for)g(y)l(our)g(do)t(cumen)l(ts)275
|
||||
543 y Ft(T)-8 b(o)27 b(use)g(this)g(License)h(in)f(a)h(do)s(cumen)m(t)f
|
||||
(y)m(ou)h(ha)m(v)m(e)g(written,)g(include)f(a)h(cop)m(y)g(of)f(the)h
|
||||
(License)g(in)f(the)150 653 y(do)s(cumen)m(t)j(and)g(put)g(the)g(follo)
|
||||
m(wing)i(cop)m(yrigh)m(t)g(and)e(license)h(notices)g(just)f(after)h
|
||||
(the)g(title)h(page:)468 765 y Fe(Copyright)42 b(\(C\))79
|
||||
b Fd(year)88 b(your)40 b(name)p Fe(.)468 852 y(Permission)i(is)e
|
||||
(granted)g(to)g(copy,)h(distribute)g(and/or)g(modify)f(this)g(document)
|
||||
468 939 y(under)h(the)f(terms)g(of)g(the)g(GNU)g(Free)g(Documentation)i
|
||||
(License,)f(Version)g(1.3)468 1026 y(or)f(any)g(later)g(version)h
|
||||
(published)h(by)d(the)h(Free)g(Software)h(Foundation;)468
|
||||
1113 y(with)g(no)e(Invariant)j(Sections,)f(no)f(Front-Cover)h(Texts,)g
|
||||
(and)f(no)f(Back-Cover)468 1200 y(Texts.)80 b(A)40 b(copy)g(of)g(the)f
|
||||
@@ -15056,9 +15120,6 @@ y(If)23 b(y)m(our)h(do)s(cumen)m(t)f(con)m(tains)i(non)m(trivial)g
|
||||
b(as)g(the)g(GNU)150 2392 y(General)31 b(Public)f(License,)i(to)f(p)s
|
||||
(ermit)e(their)i(use)f(in)g(free)g(soft)m(w)m(are.)p
|
||||
eop end
|
||||
%%Page: 150 156
|
||||
TeXDict begin 150 155 bop 150 -116 a Ft(150)2527 b(Bash)31
|
||||
b(Reference)g(Man)m(ual)p eop end
|
||||
%%Page: 151 157
|
||||
TeXDict begin 151 156 bop 150 -116 a Ft(App)s(endix)29
|
||||
b(D:)i(Indexes)2623 b(151)150 299 y Fo(App)t(endix)52
|
||||
|
||||
+1
-1
@@ -864,7 +864,7 @@ operator terminates a pattern list.
|
||||
A list of patterns and an associated command-list is known
|
||||
as a @var{clause}.
|
||||
|
||||
Each clause must be terminated with @samp{;;}, @samp{,&}, or @samp{;;&}.
|
||||
Each clause must be terminated with @samp{;;}, @samp{;&}, or @samp{;;&}.
|
||||
The @var{word} undergoes tilde expansion, parameter expansion, command
|
||||
substitution, arithmetic expansion, and quote removal before matching is
|
||||
attempted. Each @var{pattern} undergoes tilde expansion, parameter
|
||||
|
||||
+7860
File diff suppressed because it is too large
Load Diff
+67
-12
@@ -1,12 +1,12 @@
|
||||
@c The GNU Free Documentation License.
|
||||
@center Version 1.2, November 2002
|
||||
@center Version 1.3, 3 November 2008
|
||||
|
||||
@c This file is intended to be included within another document,
|
||||
@c hence no sectioning command or @node.
|
||||
|
||||
@display
|
||||
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
@uref{http://fsf.org/}
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@@ -111,6 +111,9 @@ formats which do not have any title page as such, ``Title Page'' means
|
||||
the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
|
||||
The ``publisher'' means any person or entity that distributes copies
|
||||
of the Document to the public.
|
||||
|
||||
A section ``Entitled XYZ'' means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
@@ -379,13 +382,30 @@ title.
|
||||
@item
|
||||
TERMINATION
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document except
|
||||
as expressly provided for under this License. Any other attempt to
|
||||
copy, modify, sublicense or distribute the Document is void, and will
|
||||
automatically terminate your rights under this License. However,
|
||||
parties who have received copies, or rights, from you under this
|
||||
License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
You may not copy, modify, sublicense, or distribute the Document
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense, or distribute it is void, and
|
||||
will automatically terminate your rights under this License.
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, receipt of a copy of some or all of the same material does
|
||||
not give you any rights to use it.
|
||||
|
||||
@item
|
||||
FUTURE REVISIONS OF THIS LICENSE
|
||||
@@ -403,7 +423,42 @@ following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation.
|
||||
as a draft) by the Free Software Foundation. If the Document
|
||||
specifies that a proxy can decide which future versions of this
|
||||
License can be used, that proxy's public statement of acceptance of a
|
||||
version permanently authorizes you to choose that version for the
|
||||
Document.
|
||||
|
||||
@item
|
||||
RELICENSING
|
||||
|
||||
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
|
||||
World Wide Web server that publishes copyrightable works and also
|
||||
provides prominent facilities for anybody to edit those works. A
|
||||
public wiki that anybody can edit is an example of such a server. A
|
||||
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
|
||||
site means any set of copyrightable works thus published on the MMC
|
||||
site.
|
||||
|
||||
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
|
||||
license published by Creative Commons Corporation, a not-for-profit
|
||||
corporation with a principal place of business in San Francisco,
|
||||
California, as well as future copyleft versions of that license
|
||||
published by that same organization.
|
||||
|
||||
``Incorporate'' means to publish or republish a Document, in whole or
|
||||
in part, as part of another Document.
|
||||
|
||||
An MMC is ``eligible for relicensing'' if it is licensed under this
|
||||
License, and if all works that were first published under this License
|
||||
somewhere other than this MMC, and subsequently incorporated in whole
|
||||
or in part into the MMC, (1) had no cover texts or invariant sections,
|
||||
and (2) were thus incorporated prior to November 1, 2008.
|
||||
|
||||
The operator of an MMC Site may republish an MMC contained in the site
|
||||
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||
provided the MMC is eligible for relicensing.
|
||||
|
||||
@end enumerate
|
||||
|
||||
@page
|
||||
@@ -417,7 +472,7 @@ license notices just after the title page:
|
||||
@group
|
||||
Copyright (C) @var{year} @var{your name}.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
under the terms of the GNU Free Documentation License, Version 1.3
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
|
||||
+92
-38
@@ -1,13 +1,13 @@
|
||||
GNU Free Documentation License
|
||||
Version 1.2, November 2002
|
||||
|
||||
GNU Free Documentation License
|
||||
Version 1.3, 3 November 2008
|
||||
|
||||
|
||||
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
|
||||
<http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
0. PREAMBLE
|
||||
|
||||
The purpose of this License is to make a manual, textbook, or other
|
||||
@@ -50,11 +50,11 @@ modifications and/or translated into another language.
|
||||
|
||||
A "Secondary Section" is a named appendix or a front-matter section of
|
||||
the Document that deals exclusively with the relationship of the
|
||||
publishers or authors of the Document to the Document's overall subject
|
||||
(or to related matters) and contains nothing that could fall directly
|
||||
within that overall subject. (Thus, if the Document is in part a
|
||||
textbook of mathematics, a Secondary Section may not explain any
|
||||
mathematics.) The relationship could be a matter of historical
|
||||
publishers or authors of the Document to the Document's overall
|
||||
subject (or to related matters) and contains nothing that could fall
|
||||
directly within that overall subject. (Thus, if the Document is in
|
||||
part a textbook of mathematics, a Secondary Section may not explain
|
||||
any mathematics.) The relationship could be a matter of historical
|
||||
connection with the subject or with related matters, or of legal,
|
||||
commercial, philosophical, ethical or political position regarding
|
||||
them.
|
||||
@@ -103,6 +103,9 @@ formats which do not have any title page as such, "Title Page" means
|
||||
the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
|
||||
The "publisher" means any person or entity that distributes copies of
|
||||
the Document to the public.
|
||||
|
||||
A section "Entitled XYZ" means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
@@ -118,14 +121,13 @@ License, but only as regards disclaiming warranties: any other
|
||||
implication that these Warranty Disclaimers may have is void and has
|
||||
no effect on the meaning of this License.
|
||||
|
||||
|
||||
2. VERBATIM COPYING
|
||||
|
||||
You may copy and distribute the Document in any medium, either
|
||||
commercially or noncommercially, provided that this License, the
|
||||
copyright notices, and the license notice saying this License applies
|
||||
to the Document are reproduced in all copies, and that you add no other
|
||||
conditions whatsoever to those of this License. You may not use
|
||||
to the Document are reproduced in all copies, and that you add no
|
||||
other conditions whatsoever to those of this License. You may not use
|
||||
technical measures to obstruct or control the reading or further
|
||||
copying of the copies you make or distribute. However, you may accept
|
||||
compensation in exchange for copies. If you distribute a large enough
|
||||
@@ -169,8 +171,9 @@ Opaque copy (directly or through your agents or retailers) of that
|
||||
edition to the public.
|
||||
|
||||
It is requested, but not required, that you contact the authors of the
|
||||
Document well before redistributing any large number of copies, to give
|
||||
them a chance to provide you with an updated version of the Document.
|
||||
Document well before redistributing any large number of copies, to
|
||||
give them a chance to provide you with an updated version of the
|
||||
Document.
|
||||
|
||||
|
||||
4. MODIFICATIONS
|
||||
@@ -285,16 +288,18 @@ Entitled "Endorsements".
|
||||
|
||||
6. COLLECTIONS OF DOCUMENTS
|
||||
|
||||
You may make a collection consisting of the Document and other documents
|
||||
released under this License, and replace the individual copies of this
|
||||
License in the various documents with a single copy that is included in
|
||||
the collection, provided that you follow the rules of this License for
|
||||
verbatim copying of each of the documents in all other respects.
|
||||
You may make a collection consisting of the Document and other
|
||||
documents released under this License, and replace the individual
|
||||
copies of this License in the various documents with a single copy
|
||||
that is included in the collection, provided that you follow the rules
|
||||
of this License for verbatim copying of each of the documents in all
|
||||
other respects.
|
||||
|
||||
You may extract a single document from such a collection, and distribute
|
||||
it individually under this License, provided you insert a copy of this
|
||||
License into the extracted document, and follow this License in all
|
||||
other respects regarding verbatim copying of that document.
|
||||
You may extract a single document from such a collection, and
|
||||
distribute it individually under this License, provided you insert a
|
||||
copy of this License into the extracted document, and follow this
|
||||
License in all other respects regarding verbatim copying of that
|
||||
document.
|
||||
|
||||
|
||||
7. AGGREGATION WITH INDEPENDENT WORKS
|
||||
@@ -304,7 +309,7 @@ and independent documents or works, in or on a volume of a storage or
|
||||
distribution medium, is called an "aggregate" if the copyright
|
||||
resulting from the compilation is not used to limit the legal rights
|
||||
of the compilation's users beyond what the individual works permit.
|
||||
When the Document is included an aggregate, this License does not
|
||||
When the Document is included in an aggregate, this License does not
|
||||
apply to the other works in the aggregate which are not themselves
|
||||
derivative works of the Document.
|
||||
|
||||
@@ -340,21 +345,38 @@ title.
|
||||
|
||||
9. TERMINATION
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document except
|
||||
as expressly provided for under this License. Any other attempt to
|
||||
copy, modify, sublicense or distribute the Document is void, and will
|
||||
automatically terminate your rights under this License. However,
|
||||
parties who have received copies, or rights, from you under this
|
||||
License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
You may not copy, modify, sublicense, or distribute the Document
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense, or distribute it is void, and
|
||||
will automatically terminate your rights under this License.
|
||||
|
||||
However, if you cease all violation of this License, then your license
|
||||
from a particular copyright holder is reinstated (a) provisionally,
|
||||
unless and until the copyright holder explicitly and finally
|
||||
terminates your license, and (b) permanently, if the copyright holder
|
||||
fails to notify you of the violation by some reasonable means prior to
|
||||
60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, receipt of a copy of some or all of the same material does
|
||||
not give you any rights to use it.
|
||||
|
||||
|
||||
10. FUTURE REVISIONS OF THIS LICENSE
|
||||
|
||||
The Free Software Foundation may publish new, revised versions
|
||||
of the GNU Free Documentation License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns. See
|
||||
The Free Software Foundation may publish new, revised versions of the
|
||||
GNU Free Documentation License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in
|
||||
detail to address new problems or concerns. See
|
||||
http://www.gnu.org/copyleft/.
|
||||
|
||||
Each version of the License is given a distinguishing version number.
|
||||
@@ -364,7 +386,39 @@ following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation.
|
||||
as a draft) by the Free Software Foundation. If the Document
|
||||
specifies that a proxy can decide which future versions of this
|
||||
License can be used, that proxy's public statement of acceptance of a
|
||||
version permanently authorizes you to choose that version for the
|
||||
Document.
|
||||
|
||||
11. RELICENSING
|
||||
|
||||
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
||||
World Wide Web server that publishes copyrightable works and also
|
||||
provides prominent facilities for anybody to edit those works. A
|
||||
public wiki that anybody can edit is an example of such a server. A
|
||||
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
|
||||
means any set of copyrightable works thus published on the MMC site.
|
||||
|
||||
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
||||
license published by Creative Commons Corporation, a not-for-profit
|
||||
corporation with a principal place of business in San Francisco,
|
||||
California, as well as future copyleft versions of that license
|
||||
published by that same organization.
|
||||
|
||||
"Incorporate" means to publish or republish a Document, in whole or in
|
||||
part, as part of another Document.
|
||||
|
||||
An MMC is "eligible for relicensing" if it is licensed under this
|
||||
License, and if all works that were first published under this License
|
||||
somewhere other than this MMC, and subsequently incorporated in whole or
|
||||
in part into the MMC, (1) had no cover texts or invariant sections, and
|
||||
(2) were thus incorporated prior to November 1, 2008.
|
||||
|
||||
The operator of an MMC Site may republish an MMC contained in the site
|
||||
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||
provided the MMC is eligible for relicensing.
|
||||
|
||||
|
||||
ADDENDUM: How to use this License for your documents
|
||||
@@ -375,7 +429,7 @@ license notices just after the title page:
|
||||
|
||||
Copyright (c) YEAR YOUR NAME.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
under the terms of the GNU Free Documentation License, Version 1.3
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||
A copy of the license is included in the section entitled "GNU
|
||||
|
||||
@@ -7,11 +7,13 @@
|
||||
# Chet Ramey
|
||||
# chet@po.cwru.edu
|
||||
#
|
||||
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15
|
||||
trap 'rm -f $TMPFILE' 0 1 2 3 6 15
|
||||
|
||||
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
|
||||
|
||||
T=$'\t'
|
||||
|
||||
cat << \EOF >/tmp/cb$$.1
|
||||
cat << \EOF >$TMPFILE
|
||||
mkalias ()
|
||||
{
|
||||
case $2 in
|
||||
@@ -31,9 +33,9 @@ EOF
|
||||
# since they whole thing is going to be surrounded by single quotes when
|
||||
# passed to mkalias
|
||||
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
|
||||
|
||||
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
$BASH $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
|
||||
-e 's/\$term/\$TERM/g' \
|
||||
-e 's/\$home/\$HOME/g' \
|
||||
-e 's/\$user/\$USER/g' \
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
# Chet Ramey
|
||||
# chet@po.cwru.edu
|
||||
#
|
||||
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15
|
||||
|
||||
trap 'rm -f $TMPFILE' 0 1 2 3 6 15
|
||||
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
|
||||
T=' '
|
||||
|
||||
cat << \EOF >/tmp/cb$$.1
|
||||
cat << \EOF >$TMPFILE
|
||||
mkalias ()
|
||||
{
|
||||
case $2 in
|
||||
@@ -31,9 +31,9 @@ EOF
|
||||
# since they whole thing is going to be surrounded by single quotes when
|
||||
# passed to mkalias
|
||||
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1
|
||||
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
|
||||
|
||||
sh /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
sh $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
|
||||
-e 's/\$term/\$TERM/g' \
|
||||
-e 's/\$home/\$HOME/g' \
|
||||
-e 's/\$user/\$USER/g' \
|
||||
|
||||
+22
-13
@@ -15,25 +15,34 @@
|
||||
# Chet Ramey
|
||||
# chet@po.cwru.edu
|
||||
#
|
||||
trap 'rm -f /tmp/cb$$.? cshout cshin' 0 1 2 3 6 15
|
||||
trap 'rm -f $TMPFILE1 $TMPFILEa $TMPFILEe $TMPFILEv $TMPFILEco $TMPFILEci' 0 1 2 3 6 15
|
||||
|
||||
{ TMPFILE1=$(mktemp -t cb.1.XXXXXX) &&
|
||||
TMPFILEa=$(mktemp -t cb.a.XXXXXX) &&
|
||||
TMPFILEe=$(mktemp -t cb.e.XXXXXX) &&
|
||||
TMPFILEv=$(mktemp -t cb.v.XXXXXX) &&
|
||||
TMPFILEco=$(mktemp -t cshout.XXXXXX) &&
|
||||
TMPFILEci=$(mktemp -t cshin.XXXXXX)
|
||||
} || exit 1
|
||||
|
||||
|
||||
T=$'\t'
|
||||
|
||||
SOURCE="${1:+source $1}"
|
||||
|
||||
cat << EOF >cshin
|
||||
cat << EOF >$TMPFILEci
|
||||
$SOURCE
|
||||
alias >! /tmp/cb$$.a
|
||||
setenv >! /tmp/cb$$.e
|
||||
set >! /tmp/cb$$.v
|
||||
alias >! $TMPFILEa
|
||||
setenv >! $TMPFILEe
|
||||
set >! $TMPFILEv
|
||||
EOF
|
||||
|
||||
# give csh a minimal environment, similar to what login would provide
|
||||
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < ./cshin > cshout 2>&1
|
||||
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < $TMPFILEci > $TMPFILEco 2>&1
|
||||
|
||||
# First convert aliases
|
||||
|
||||
cat << \EOF >/tmp/cb$$.1
|
||||
cat << \EOF >$TMPFILE1
|
||||
mkalias ()
|
||||
{
|
||||
case $2 in
|
||||
@@ -49,12 +58,12 @@ mkalias ()
|
||||
}
|
||||
EOF
|
||||
|
||||
sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < /tmp/cb$$.a >>/tmp/cb$$.1
|
||||
sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < $TMPFILEa >>$TMPFILE1
|
||||
|
||||
echo '# csh aliases'
|
||||
echo
|
||||
|
||||
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
$BASH $TMPFILE1 | sed -e 's/\$cwd/\$PWD/g' \
|
||||
-e 's/\$term/\$TERM/g' \
|
||||
-e 's/\$home/\$HOME/g' \
|
||||
-e 's/\$user/\$USER/g' \
|
||||
@@ -70,7 +79,7 @@ sed -e '/^SHLVL/d' \
|
||||
-e '/^PWD/d' \
|
||||
-e "s/'/'"\\\\"''"/g \
|
||||
-e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \
|
||||
-e "s/$/'/" < /tmp/cb$$.e
|
||||
-e "s/$/'/" < $TMPFILEe
|
||||
|
||||
# Finally, convert local variables
|
||||
echo
|
||||
@@ -82,7 +91,7 @@ sed -e 's/'"$T"'/=/' \
|
||||
-e '/^[A-Za-z0-9_]*=[^(]/{
|
||||
s/=/='"'/"'
|
||||
s/$/'"'/"'
|
||||
}' < /tmp/cb$$.v |
|
||||
}' < $TMPFILEv |
|
||||
sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \
|
||||
-e '/^verbose=/d' \
|
||||
-e '/^term=/d' \
|
||||
@@ -110,7 +119,7 @@ echo
|
||||
echo '# special csh variables converted to bash equivalents'
|
||||
echo
|
||||
|
||||
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v |
|
||||
sed -e 's/'"$T"'/=/' < $TMPFILEv |
|
||||
grep "^cdpath=" |
|
||||
sed 's/(//
|
||||
s/ /:/g
|
||||
@@ -118,7 +127,7 @@ sed 's/(//
|
||||
s/cdpath=/CDPATH=/'
|
||||
|
||||
|
||||
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v |
|
||||
sed -e 's/'"$T"'/=/' < $TMPFILEv |
|
||||
grep "^mail=" |
|
||||
sed 's/(//
|
||||
s/ /:/g
|
||||
|
||||
+1
-1
@@ -2930,7 +2930,7 @@ execute_case_command (case_command)
|
||||
retval = execute_command (clauses->action);
|
||||
}
|
||||
while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
|
||||
if ((clauses->flags & CASEPAT_TESTNEXT) == 0)
|
||||
if (clauses == 0 || (clauses->flags & CASEPAT_TESTNEXT) == 0)
|
||||
EXIT_CASE ();
|
||||
else
|
||||
break;
|
||||
|
||||
+1
-2
@@ -2930,7 +2930,7 @@ execute_case_command (case_command)
|
||||
retval = execute_command (clauses->action);
|
||||
}
|
||||
while ((clauses->flags & CASEPAT_FALLTHROUGH) && (clauses = clauses->next));
|
||||
if ((clauses->flags & CASEPAT_TESTNEXT) == 0)
|
||||
if (clauses && (clauses->flags & CASEPAT_TESTNEXT) == 0)
|
||||
EXIT_CASE ();
|
||||
else
|
||||
break;
|
||||
@@ -4083,7 +4083,6 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
|
||||
if (variable_context == 0 || this_shell_function == 0)
|
||||
{
|
||||
make_funcname_visible (0);
|
||||
itrace("execute_function: calling unlink_fifo_list");
|
||||
unlink_fifo_list ();
|
||||
}
|
||||
|
||||
|
||||
+13
-4
@@ -34,6 +34,7 @@
|
||||
|
||||
#include "bashintl.h"
|
||||
|
||||
#include "parser.h"
|
||||
#include "syntax.h"
|
||||
#include "command.h"
|
||||
#include "general.h"
|
||||
@@ -53,7 +54,7 @@
|
||||
|
||||
#include "shmbutil.h"
|
||||
|
||||
extern int line_number, current_command_line_count;
|
||||
extern int line_number, current_command_line_count, parser_state;
|
||||
extern int last_command_exit_value;
|
||||
|
||||
/* Object caching */
|
||||
@@ -528,11 +529,17 @@ make_simple_command (element, command)
|
||||
/* If we are starting from scratch, then make the initial command
|
||||
structure. Also note that we have to fill in all the slots, since
|
||||
malloc doesn't return zeroed space. */
|
||||
if (!command)
|
||||
command = make_bare_simple_command ();
|
||||
if (command == 0)
|
||||
{
|
||||
command = make_bare_simple_command ();
|
||||
parser_state |= PST_REDIRLIST;
|
||||
}
|
||||
|
||||
if (element.word)
|
||||
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
|
||||
{
|
||||
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
|
||||
parser_state &= ~PST_REDIRLIST;
|
||||
}
|
||||
else if (element.redirect)
|
||||
{
|
||||
REDIRECT *r = element.redirect;
|
||||
@@ -544,6 +551,7 @@ make_simple_command (element, command)
|
||||
r->next = command->value.Simple->redirects;
|
||||
command->value.Simple->redirects = element.redirect;
|
||||
}
|
||||
|
||||
return (command);
|
||||
}
|
||||
|
||||
@@ -827,6 +835,7 @@ clean_simple_command (command)
|
||||
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
|
||||
}
|
||||
|
||||
parser_state &= ~PST_REDIRLIST;
|
||||
return (command);
|
||||
}
|
||||
|
||||
|
||||
+887
@@ -0,0 +1,887 @@
|
||||
/* make_cmd.c -- Functions for making instances of the various
|
||||
parser constructs. */
|
||||
|
||||
/* Copyright (C) 1989-2009 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "bashtypes.h"
|
||||
#if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
|
||||
# include <sys/file.h>
|
||||
#endif
|
||||
#include "filecntl.h"
|
||||
#include "bashansi.h"
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "bashintl.h"
|
||||
|
||||
#include "parser.h"
|
||||
#include "syntax.h"
|
||||
#include "command.h"
|
||||
#include "general.h"
|
||||
#include "error.h"
|
||||
#include "flags.h"
|
||||
#include "make_cmd.h"
|
||||
#include "dispose_cmd.h"
|
||||
#include "variables.h"
|
||||
#include "subst.h"
|
||||
#include "input.h"
|
||||
#include "ocache.h"
|
||||
#include "externs.h"
|
||||
|
||||
#if defined (JOB_CONTROL)
|
||||
#include "jobs.h"
|
||||
#endif
|
||||
|
||||
#include "shmbutil.h"
|
||||
|
||||
extern int line_number, current_command_line_count, parser_state;
|
||||
extern int last_command_exit_value;
|
||||
|
||||
/* Object caching */
|
||||
sh_obj_cache_t wdcache = {0, 0, 0};
|
||||
sh_obj_cache_t wlcache = {0, 0, 0};
|
||||
|
||||
#define WDCACHESIZE 60
|
||||
#define WLCACHESIZE 60
|
||||
|
||||
static COMMAND *make_for_or_select __P((enum command_type, WORD_DESC *, WORD_LIST *, COMMAND *, int));
|
||||
#if defined (ARITH_FOR_COMMAND)
|
||||
static WORD_LIST *make_arith_for_expr __P((char *));
|
||||
#endif
|
||||
static COMMAND *make_until_or_while __P((enum command_type, COMMAND *, COMMAND *));
|
||||
|
||||
void
|
||||
cmd_init ()
|
||||
{
|
||||
ocache_create (wdcache, WORD_DESC, WDCACHESIZE);
|
||||
ocache_create (wlcache, WORD_LIST, WLCACHESIZE);
|
||||
}
|
||||
|
||||
WORD_DESC *
|
||||
alloc_word_desc ()
|
||||
{
|
||||
WORD_DESC *temp;
|
||||
|
||||
ocache_alloc (wdcache, WORD_DESC, temp);
|
||||
temp->flags = 0;
|
||||
temp->word = 0;
|
||||
return temp;
|
||||
}
|
||||
|
||||
WORD_DESC *
|
||||
make_bare_word (string)
|
||||
const char *string;
|
||||
{
|
||||
WORD_DESC *temp;
|
||||
|
||||
temp = alloc_word_desc ();
|
||||
|
||||
if (*string)
|
||||
temp->word = savestring (string);
|
||||
else
|
||||
{
|
||||
temp->word = (char *)xmalloc (1);
|
||||
temp->word[0] = '\0';
|
||||
}
|
||||
|
||||
return (temp);
|
||||
}
|
||||
|
||||
WORD_DESC *
|
||||
make_word_flags (w, string)
|
||||
WORD_DESC *w;
|
||||
const char *string;
|
||||
{
|
||||
register int i;
|
||||
size_t slen;
|
||||
DECLARE_MBSTATE;
|
||||
|
||||
i = 0;
|
||||
slen = strlen (string);
|
||||
while (i < slen)
|
||||
{
|
||||
switch (string[i])
|
||||
{
|
||||
case '$':
|
||||
w->flags |= W_HASDOLLAR;
|
||||
break;
|
||||
case '\\':
|
||||
break; /* continue the loop */
|
||||
case '\'':
|
||||
case '`':
|
||||
case '"':
|
||||
w->flags |= W_QUOTED;
|
||||
break;
|
||||
}
|
||||
|
||||
ADVANCE_CHAR (string, slen, i);
|
||||
}
|
||||
|
||||
return (w);
|
||||
}
|
||||
|
||||
WORD_DESC *
|
||||
make_word (string)
|
||||
const char *string;
|
||||
{
|
||||
WORD_DESC *temp;
|
||||
|
||||
temp = make_bare_word (string);
|
||||
return (make_word_flags (temp, string));
|
||||
}
|
||||
|
||||
WORD_DESC *
|
||||
make_word_from_token (token)
|
||||
int token;
|
||||
{
|
||||
char tokenizer[2];
|
||||
|
||||
tokenizer[0] = token;
|
||||
tokenizer[1] = '\0';
|
||||
|
||||
return (make_word (tokenizer));
|
||||
}
|
||||
|
||||
WORD_LIST *
|
||||
make_word_list (word, wlink)
|
||||
WORD_DESC *word;
|
||||
WORD_LIST *wlink;
|
||||
{
|
||||
WORD_LIST *temp;
|
||||
|
||||
ocache_alloc (wlcache, WORD_LIST, temp);
|
||||
|
||||
temp->word = word;
|
||||
temp->next = wlink;
|
||||
return (temp);
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_command (type, pointer)
|
||||
enum command_type type;
|
||||
SIMPLE_COM *pointer;
|
||||
{
|
||||
COMMAND *temp;
|
||||
|
||||
temp = (COMMAND *)xmalloc (sizeof (COMMAND));
|
||||
temp->type = type;
|
||||
temp->value.Simple = pointer;
|
||||
temp->value.Simple->flags = temp->flags = 0;
|
||||
temp->redirects = (REDIRECT *)NULL;
|
||||
return (temp);
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
command_connect (com1, com2, connector)
|
||||
COMMAND *com1, *com2;
|
||||
int connector;
|
||||
{
|
||||
CONNECTION *temp;
|
||||
|
||||
temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
|
||||
temp->connector = connector;
|
||||
temp->first = com1;
|
||||
temp->second = com2;
|
||||
return (make_command (cm_connection, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
static COMMAND *
|
||||
make_for_or_select (type, name, map_list, action, lineno)
|
||||
enum command_type type;
|
||||
WORD_DESC *name;
|
||||
WORD_LIST *map_list;
|
||||
COMMAND *action;
|
||||
int lineno;
|
||||
{
|
||||
FOR_COM *temp;
|
||||
|
||||
temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
|
||||
temp->flags = 0;
|
||||
temp->name = name;
|
||||
temp->line = lineno;
|
||||
temp->map_list = map_list;
|
||||
temp->action = action;
|
||||
return (make_command (type, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_for_command (name, map_list, action, lineno)
|
||||
WORD_DESC *name;
|
||||
WORD_LIST *map_list;
|
||||
COMMAND *action;
|
||||
int lineno;
|
||||
{
|
||||
return (make_for_or_select (cm_for, name, map_list, action, lineno));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_select_command (name, map_list, action, lineno)
|
||||
WORD_DESC *name;
|
||||
WORD_LIST *map_list;
|
||||
COMMAND *action;
|
||||
int lineno;
|
||||
{
|
||||
#if defined (SELECT_COMMAND)
|
||||
return (make_for_or_select (cm_select, name, map_list, action, lineno));
|
||||
#else
|
||||
last_command_exit_value = 2;
|
||||
return ((COMMAND *)NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (ARITH_FOR_COMMAND)
|
||||
static WORD_LIST *
|
||||
make_arith_for_expr (s)
|
||||
char *s;
|
||||
{
|
||||
WORD_LIST *result;
|
||||
WORD_DESC *wd;
|
||||
|
||||
if (s == 0 || *s == '\0')
|
||||
return ((WORD_LIST *)NULL);
|
||||
wd = make_word (s);
|
||||
wd->flags |= W_NOGLOB|W_NOSPLIT|W_QUOTED|W_DQUOTE; /* no word splitting or globbing */
|
||||
result = make_word_list (wd, (WORD_LIST *)NULL);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Note that this function calls dispose_words on EXPRS, since it doesn't
|
||||
use the word list directly. We free it here rather than at the caller
|
||||
because no other function in this file requires that the caller free
|
||||
any arguments. */
|
||||
COMMAND *
|
||||
make_arith_for_command (exprs, action, lineno)
|
||||
WORD_LIST *exprs;
|
||||
COMMAND *action;
|
||||
int lineno;
|
||||
{
|
||||
#if defined (ARITH_FOR_COMMAND)
|
||||
ARITH_FOR_COM *temp;
|
||||
WORD_LIST *init, *test, *step;
|
||||
char *s, *t, *start;
|
||||
int nsemi;
|
||||
|
||||
init = test = step = (WORD_LIST *)NULL;
|
||||
/* Parse the string into the three component sub-expressions. */
|
||||
start = t = s = exprs->word->word;
|
||||
for (nsemi = 0; ;)
|
||||
{
|
||||
/* skip whitespace at the start of each sub-expression. */
|
||||
while (whitespace (*s))
|
||||
s++;
|
||||
start = s;
|
||||
/* skip to the semicolon or EOS */
|
||||
while (*s && *s != ';')
|
||||
s++;
|
||||
|
||||
t = (s > start) ? substring (start, 0, s - start) : (char *)NULL;
|
||||
|
||||
nsemi++;
|
||||
switch (nsemi)
|
||||
{
|
||||
case 1:
|
||||
init = make_arith_for_expr (t);
|
||||
break;
|
||||
case 2:
|
||||
test = make_arith_for_expr (t);
|
||||
break;
|
||||
case 3:
|
||||
step = make_arith_for_expr (t);
|
||||
break;
|
||||
}
|
||||
|
||||
FREE (t);
|
||||
if (*s == '\0')
|
||||
break;
|
||||
s++; /* skip over semicolon */
|
||||
}
|
||||
|
||||
if (nsemi != 3)
|
||||
{
|
||||
if (nsemi < 3)
|
||||
parser_error (lineno, _("syntax error: arithmetic expression required"));
|
||||
else
|
||||
parser_error (lineno, _("syntax error: `;' unexpected"));
|
||||
parser_error (lineno, _("syntax error: `((%s))'"), exprs->word->word);
|
||||
last_command_exit_value = 2;
|
||||
return ((COMMAND *)NULL);
|
||||
}
|
||||
|
||||
temp = (ARITH_FOR_COM *)xmalloc (sizeof (ARITH_FOR_COM));
|
||||
temp->flags = 0;
|
||||
temp->line = lineno;
|
||||
temp->init = init ? init : make_arith_for_expr ("1");
|
||||
temp->test = test ? test : make_arith_for_expr ("1");
|
||||
temp->step = step ? step : make_arith_for_expr ("1");
|
||||
temp->action = action;
|
||||
|
||||
dispose_words (exprs);
|
||||
return (make_command (cm_arith_for, (SIMPLE_COM *)temp));
|
||||
#else
|
||||
dispose_words (exprs);
|
||||
last_command_exit_value = 2;
|
||||
return ((COMMAND *)NULL);
|
||||
#endif /* ARITH_FOR_COMMAND */
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_group_command (command)
|
||||
COMMAND *command;
|
||||
{
|
||||
GROUP_COM *temp;
|
||||
|
||||
temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
|
||||
temp->command = command;
|
||||
return (make_command (cm_group, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_case_command (word, clauses, lineno)
|
||||
WORD_DESC *word;
|
||||
PATTERN_LIST *clauses;
|
||||
int lineno;
|
||||
{
|
||||
CASE_COM *temp;
|
||||
|
||||
temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
|
||||
temp->flags = 0;
|
||||
temp->line = lineno;
|
||||
temp->word = word;
|
||||
temp->clauses = REVERSE_LIST (clauses, PATTERN_LIST *);
|
||||
return (make_command (cm_case, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
PATTERN_LIST *
|
||||
make_pattern_list (patterns, action)
|
||||
WORD_LIST *patterns;
|
||||
COMMAND *action;
|
||||
{
|
||||
PATTERN_LIST *temp;
|
||||
|
||||
temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
|
||||
temp->patterns = REVERSE_LIST (patterns, WORD_LIST *);
|
||||
temp->action = action;
|
||||
temp->next = NULL;
|
||||
temp->flags = 0;
|
||||
return (temp);
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_if_command (test, true_case, false_case)
|
||||
COMMAND *test, *true_case, *false_case;
|
||||
{
|
||||
IF_COM *temp;
|
||||
|
||||
temp = (IF_COM *)xmalloc (sizeof (IF_COM));
|
||||
temp->flags = 0;
|
||||
temp->test = test;
|
||||
temp->true_case = true_case;
|
||||
temp->false_case = false_case;
|
||||
return (make_command (cm_if, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
static COMMAND *
|
||||
make_until_or_while (which, test, action)
|
||||
enum command_type which;
|
||||
COMMAND *test, *action;
|
||||
{
|
||||
WHILE_COM *temp;
|
||||
|
||||
temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
|
||||
temp->flags = 0;
|
||||
temp->test = test;
|
||||
temp->action = action;
|
||||
return (make_command (which, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_while_command (test, action)
|
||||
COMMAND *test, *action;
|
||||
{
|
||||
return (make_until_or_while (cm_while, test, action));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_until_command (test, action)
|
||||
COMMAND *test, *action;
|
||||
{
|
||||
return (make_until_or_while (cm_until, test, action));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_arith_command (exp)
|
||||
WORD_LIST *exp;
|
||||
{
|
||||
#if defined (DPAREN_ARITHMETIC)
|
||||
COMMAND *command;
|
||||
ARITH_COM *temp;
|
||||
|
||||
command = (COMMAND *)xmalloc (sizeof (COMMAND));
|
||||
command->value.Arith = temp = (ARITH_COM *)xmalloc (sizeof (ARITH_COM));
|
||||
|
||||
temp->flags = 0;
|
||||
temp->line = line_number;
|
||||
temp->exp = exp;
|
||||
|
||||
command->type = cm_arith;
|
||||
command->redirects = (REDIRECT *)NULL;
|
||||
command->flags = 0;
|
||||
|
||||
return (command);
|
||||
#else
|
||||
last_command_exit_value = 2;
|
||||
return ((COMMAND *)NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined (COND_COMMAND)
|
||||
struct cond_com *
|
||||
make_cond_node (type, op, left, right)
|
||||
int type;
|
||||
WORD_DESC *op;
|
||||
struct cond_com *left, *right;
|
||||
{
|
||||
COND_COM *temp;
|
||||
|
||||
temp = (COND_COM *)xmalloc (sizeof (COND_COM));
|
||||
temp->flags = 0;
|
||||
temp->line = line_number;
|
||||
temp->type = type;
|
||||
temp->op = op;
|
||||
temp->left = left;
|
||||
temp->right = right;
|
||||
|
||||
return (temp);
|
||||
}
|
||||
#endif
|
||||
|
||||
COMMAND *
|
||||
make_cond_command (cond_node)
|
||||
COND_COM *cond_node;
|
||||
{
|
||||
#if defined (COND_COMMAND)
|
||||
COMMAND *command;
|
||||
|
||||
command = (COMMAND *)xmalloc (sizeof (COMMAND));
|
||||
command->value.Cond = cond_node;
|
||||
|
||||
command->type = cm_cond;
|
||||
command->redirects = (REDIRECT *)NULL;
|
||||
command->flags = 0;
|
||||
command->line = cond_node ? cond_node->line : 0;
|
||||
|
||||
return (command);
|
||||
#else
|
||||
last_command_exit_value = 2;
|
||||
return ((COMMAND *)NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_bare_simple_command ()
|
||||
{
|
||||
COMMAND *command;
|
||||
SIMPLE_COM *temp;
|
||||
|
||||
command = (COMMAND *)xmalloc (sizeof (COMMAND));
|
||||
command->value.Simple = temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
|
||||
|
||||
temp->flags = 0;
|
||||
temp->line = line_number;
|
||||
temp->words = (WORD_LIST *)NULL;
|
||||
temp->redirects = (REDIRECT *)NULL;
|
||||
|
||||
command->type = cm_simple;
|
||||
command->redirects = (REDIRECT *)NULL;
|
||||
command->flags = 0;
|
||||
|
||||
return (command);
|
||||
}
|
||||
|
||||
/* Return a command which is the connection of the word or redirection
|
||||
in ELEMENT, and the command * or NULL in COMMAND. */
|
||||
COMMAND *
|
||||
make_simple_command (element, command)
|
||||
ELEMENT element;
|
||||
COMMAND *command;
|
||||
{
|
||||
itrace("make_simple_command");
|
||||
/* If we are starting from scratch, then make the initial command
|
||||
structure. Also note that we have to fill in all the slots, since
|
||||
malloc doesn't return zeroed space. */
|
||||
if (command == 0)
|
||||
{
|
||||
command = make_bare_simple_command ();
|
||||
parser_state |= PST_REDIRLIST;
|
||||
}
|
||||
|
||||
if (element.word)
|
||||
{
|
||||
command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
|
||||
parser_state &= ~PST_REDIRLIST;
|
||||
}
|
||||
else if (element.redirect)
|
||||
{
|
||||
REDIRECT *r = element.redirect;
|
||||
/* Due to the way <> is implemented, there may be more than a single
|
||||
redirection in element.redirect. We just follow the chain as far
|
||||
as it goes, and hook onto the end. */
|
||||
while (r->next)
|
||||
r = r->next;
|
||||
r->next = command->value.Simple->redirects;
|
||||
command->value.Simple->redirects = element.redirect;
|
||||
}
|
||||
|
||||
return (command);
|
||||
}
|
||||
|
||||
/* Because we are Bourne compatible, we read the input for this
|
||||
<< or <<- redirection now, from wherever input is coming from.
|
||||
We store the input read into a WORD_DESC. Replace the text of
|
||||
the redirectee.word with the new input text. If <<- is on,
|
||||
then remove leading TABS from each line. */
|
||||
void
|
||||
make_here_document (temp, lineno)
|
||||
REDIRECT *temp;
|
||||
int lineno;
|
||||
{
|
||||
int kill_leading, redir_len;
|
||||
char *redir_word, *document, *full_line;
|
||||
int document_index, document_size, delim_unquoted;
|
||||
|
||||
if (temp->instruction != r_deblank_reading_until &&
|
||||
temp->instruction != r_reading_until)
|
||||
{
|
||||
internal_error (_("make_here_document: bad instruction type %d"), temp->instruction);
|
||||
return;
|
||||
}
|
||||
|
||||
kill_leading = temp->instruction == r_deblank_reading_until;
|
||||
|
||||
document = (char *)NULL;
|
||||
document_index = document_size = 0;
|
||||
|
||||
/* Quote removal is the only expansion performed on the delimiter
|
||||
for here documents, making it an extremely special case. */
|
||||
redir_word = string_quote_removal (temp->redirectee.filename->word, 0);
|
||||
|
||||
/* redirection_expand will return NULL if the expansion results in
|
||||
multiple words or no words. Check for that here, and just abort
|
||||
this here document if it does. */
|
||||
if (redir_word)
|
||||
redir_len = strlen (redir_word);
|
||||
else
|
||||
{
|
||||
temp->here_doc_eof = (char *)xmalloc (1);
|
||||
temp->here_doc_eof[0] = '\0';
|
||||
goto document_done;
|
||||
}
|
||||
|
||||
free (temp->redirectee.filename->word);
|
||||
temp->here_doc_eof = redir_word;
|
||||
|
||||
/* Read lines from wherever lines are coming from.
|
||||
For each line read, if kill_leading, then kill the
|
||||
leading tab characters.
|
||||
If the line matches redir_word exactly, then we have
|
||||
manufactured the document. Otherwise, add the line to the
|
||||
list of lines in the document. */
|
||||
|
||||
/* If the here-document delimiter was quoted, the lines should
|
||||
be read verbatim from the input. If it was not quoted, we
|
||||
need to perform backslash-quoted newline removal. */
|
||||
delim_unquoted = (temp->redirectee.filename->flags & W_QUOTED) == 0;
|
||||
while (full_line = read_secondary_line (delim_unquoted))
|
||||
{
|
||||
register char *line;
|
||||
int len;
|
||||
|
||||
line = full_line;
|
||||
line_number++;
|
||||
|
||||
/* If set -v is in effect, echo the line read. read_secondary_line/
|
||||
read_a_line leaves the newline at the end, so don't print another. */
|
||||
if (echo_input_at_read)
|
||||
fprintf (stderr, "%s", line);
|
||||
|
||||
if (kill_leading && *line)
|
||||
{
|
||||
/* Hack: To be compatible with some Bourne shells, we
|
||||
check the word before stripping the whitespace. This
|
||||
is a hack, though. */
|
||||
if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
|
||||
goto document_done;
|
||||
|
||||
while (*line == '\t')
|
||||
line++;
|
||||
}
|
||||
|
||||
if (*line == 0)
|
||||
continue;
|
||||
|
||||
if (STREQN (line, redir_word, redir_len) && line[redir_len] == '\n')
|
||||
goto document_done;
|
||||
|
||||
len = strlen (line);
|
||||
if (len + document_index >= document_size)
|
||||
{
|
||||
document_size = document_size ? 2 * (document_size + len) : len + 2;
|
||||
document = (char *)xrealloc (document, document_size);
|
||||
}
|
||||
|
||||
/* len is guaranteed to be > 0 because of the check for line
|
||||
being an empty string before the call to strlen. */
|
||||
FASTCOPY (line, document + document_index, len);
|
||||
document_index += len;
|
||||
}
|
||||
|
||||
if (full_line == 0)
|
||||
internal_warning (_("here-document at line %d delimited by end-of-file (wanted `%s')"), lineno, redir_word);
|
||||
|
||||
document_done:
|
||||
if (document)
|
||||
document[document_index] = '\0';
|
||||
else
|
||||
{
|
||||
document = (char *)xmalloc (1);
|
||||
document[0] = '\0';
|
||||
}
|
||||
temp->redirectee.filename->word = document;
|
||||
}
|
||||
|
||||
/* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION.
|
||||
INSTRUCTION is the instruction type, SOURCE is a file descriptor,
|
||||
and DEST is a file descriptor or a WORD_DESC *. */
|
||||
REDIRECT *
|
||||
make_redirection (source, instruction, dest_and_filename)
|
||||
int source;
|
||||
enum r_instruction instruction;
|
||||
REDIRECTEE dest_and_filename;
|
||||
{
|
||||
REDIRECT *temp;
|
||||
WORD_DESC *w;
|
||||
int wlen;
|
||||
intmax_t lfd;
|
||||
|
||||
temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
|
||||
|
||||
/* First do the common cases. */
|
||||
temp->redirector = source;
|
||||
temp->redirectee = dest_and_filename;
|
||||
temp->instruction = instruction;
|
||||
temp->flags = 0;
|
||||
temp->next = (REDIRECT *)NULL;
|
||||
|
||||
switch (instruction)
|
||||
{
|
||||
|
||||
case r_output_direction: /* >foo */
|
||||
case r_output_force: /* >| foo */
|
||||
case r_err_and_out: /* &>filename */
|
||||
temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
|
||||
break;
|
||||
|
||||
case r_appending_to: /* >>foo */
|
||||
case r_append_err_and_out: /* &>> filename */
|
||||
temp->flags = O_APPEND | O_WRONLY | O_CREAT;
|
||||
break;
|
||||
|
||||
case r_input_direction: /* <foo */
|
||||
case r_inputa_direction: /* foo & makes this. */
|
||||
temp->flags = O_RDONLY;
|
||||
break;
|
||||
|
||||
case r_input_output: /* <>foo */
|
||||
temp->flags = O_RDWR | O_CREAT;
|
||||
break;
|
||||
|
||||
case r_deblank_reading_until: /* <<-foo */
|
||||
case r_reading_until: /* << foo */
|
||||
case r_reading_string: /* <<< foo */
|
||||
case r_close_this: /* <&- */
|
||||
case r_duplicating_input: /* 1<&2 */
|
||||
case r_duplicating_output: /* 1>&2 */
|
||||
break;
|
||||
|
||||
/* the parser doesn't pass these. */
|
||||
case r_move_input: /* 1<&2- */
|
||||
case r_move_output: /* 1>&2- */
|
||||
case r_move_input_word: /* 1<&$foo- */
|
||||
case r_move_output_word: /* 1>&$foo- */
|
||||
break;
|
||||
|
||||
/* The way the lexer works we have to do this here. */
|
||||
case r_duplicating_input_word: /* 1<&$foo */
|
||||
case r_duplicating_output_word: /* 1>&$foo */
|
||||
w = dest_and_filename.filename;
|
||||
wlen = strlen (w->word) - 1;
|
||||
if (w->word[wlen] == '-') /* Yuck */
|
||||
{
|
||||
w->word[wlen] = '\0';
|
||||
if (all_digits (w->word) && legal_number (w->word, &lfd) && lfd == (int)lfd)
|
||||
{
|
||||
dispose_word (w);
|
||||
temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input : r_move_output;
|
||||
temp->redirectee.dest = lfd;
|
||||
}
|
||||
else
|
||||
temp->instruction = (instruction == r_duplicating_input_word) ? r_move_input_word : r_move_output_word;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction);
|
||||
abort ();
|
||||
break;
|
||||
}
|
||||
return (temp);
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_function_def (name, command, lineno, lstart)
|
||||
WORD_DESC *name;
|
||||
COMMAND *command;
|
||||
int lineno, lstart;
|
||||
{
|
||||
FUNCTION_DEF *temp;
|
||||
#if defined (ARRAY_VARS)
|
||||
SHELL_VAR *bash_source_v;
|
||||
ARRAY *bash_source_a;
|
||||
#endif
|
||||
|
||||
temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
|
||||
temp->command = command;
|
||||
temp->name = name;
|
||||
temp->line = lineno;
|
||||
temp->flags = 0;
|
||||
command->line = lstart;
|
||||
|
||||
/* Information used primarily for debugging. */
|
||||
temp->source_file = 0;
|
||||
#if defined (ARRAY_VARS)
|
||||
GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
|
||||
if (bash_source_a && array_num_elements (bash_source_a) > 0)
|
||||
temp->source_file = array_reference (bash_source_a, 0);
|
||||
#endif
|
||||
#if defined (DEBUGGER)
|
||||
bind_function_def (name->word, temp);
|
||||
#endif
|
||||
|
||||
temp->source_file = 0;
|
||||
return (make_command (cm_function_def, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_subshell_command (command)
|
||||
COMMAND *command;
|
||||
{
|
||||
SUBSHELL_COM *temp;
|
||||
|
||||
temp = (SUBSHELL_COM *)xmalloc (sizeof (SUBSHELL_COM));
|
||||
temp->command = command;
|
||||
temp->flags = CMD_WANT_SUBSHELL;
|
||||
return (make_command (cm_subshell, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
COMMAND *
|
||||
make_coproc_command (name, command)
|
||||
char *name;
|
||||
COMMAND *command;
|
||||
{
|
||||
COPROC_COM *temp;
|
||||
|
||||
temp = (COPROC_COM *)xmalloc (sizeof (COPROC_COM));
|
||||
temp->name = savestring (name);
|
||||
temp->command = command;
|
||||
temp->flags = CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
|
||||
return (make_command (cm_coproc, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
/* Reverse the word list and redirection list in the simple command
|
||||
has just been parsed. It seems simpler to do this here the one
|
||||
time then by any other method that I can think of. */
|
||||
COMMAND *
|
||||
clean_simple_command (command)
|
||||
COMMAND *command;
|
||||
{
|
||||
if (command->type != cm_simple)
|
||||
command_error ("clean_simple_command", CMDERR_BADTYPE, command->type, 0);
|
||||
else
|
||||
{
|
||||
command->value.Simple->words =
|
||||
REVERSE_LIST (command->value.Simple->words, WORD_LIST *);
|
||||
command->value.Simple->redirects =
|
||||
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
|
||||
}
|
||||
|
||||
parser_state &= ~PST_REDIRLIST;
|
||||
return (command);
|
||||
}
|
||||
|
||||
/* The Yacc grammar productions have a problem, in that they take a
|
||||
list followed by an ampersand (`&') and do a simple command connection,
|
||||
making the entire list effectively asynchronous, instead of just
|
||||
the last command. This means that when the list is executed, all
|
||||
the commands have stdin set to /dev/null when job control is not
|
||||
active, instead of just the last. This is wrong, and needs fixing
|
||||
up. This function takes the `&' and applies it to the last command
|
||||
in the list. This is done only for lists connected by `;'; it makes
|
||||
`;' bind `tighter' than `&'. */
|
||||
COMMAND *
|
||||
connect_async_list (command, command2, connector)
|
||||
COMMAND *command, *command2;
|
||||
int connector;
|
||||
{
|
||||
COMMAND *t, *t1, *t2;
|
||||
|
||||
t1 = command;
|
||||
t = command->value.Connection->second;
|
||||
|
||||
if (!t || (command->flags & CMD_WANT_SUBSHELL) ||
|
||||
command->value.Connection->connector != ';')
|
||||
{
|
||||
t = command_connect (command, command2, connector);
|
||||
return t;
|
||||
}
|
||||
|
||||
/* This is just defensive programming. The Yacc precedence rules
|
||||
will generally hand this function a command where t points directly
|
||||
to the command we want (e.g. given a ; b ; c ; d &, t1 will point
|
||||
to the `a ; b ; c' list and t will be the `d'). We only want to do
|
||||
this if the list is not being executed as a unit in the background
|
||||
with `( ... )', so we have to check for CMD_WANT_SUBSHELL. That's
|
||||
the only way to tell. */
|
||||
while (((t->flags & CMD_WANT_SUBSHELL) == 0) && t->type == cm_connection &&
|
||||
t->value.Connection->connector == ';')
|
||||
{
|
||||
t1 = t;
|
||||
t = t->value.Connection->second;
|
||||
}
|
||||
/* Now we have t pointing to the last command in the list, and
|
||||
t1->value.Connection->second == t. */
|
||||
t2 = command_connect (t, command2, connector);
|
||||
t1->value.Connection->second = t2;
|
||||
return command;
|
||||
}
|
||||
@@ -259,6 +259,9 @@ int shell_eof_token;
|
||||
/* The token currently being read. */
|
||||
int current_token;
|
||||
|
||||
/* The current parser state. */
|
||||
int parser_state;
|
||||
|
||||
/* Variables to manage the task of reading here documents, because we need to
|
||||
defer the reading until after a complete command has been collected. */
|
||||
static REDIRECT *redir_stack[10];
|
||||
@@ -283,9 +286,6 @@ static int function_bstart;
|
||||
/* The line number in a script at which an arithmetic for command starts. */
|
||||
static int arith_for_lineno;
|
||||
|
||||
/* The current parser state. */
|
||||
static int parser_state;
|
||||
|
||||
/* The last read token, or NULL. read_token () uses this for context
|
||||
checking. */
|
||||
static int last_read_token;
|
||||
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
|
||||
REDIRECTEE rd;
|
||||
REDIRECT *r;
|
||||
|
||||
tc = $1;
|
||||
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
|
||||
rd.dest = 1;
|
||||
r = make_redirection (2, r_duplicating_output, rd);
|
||||
if (tc->redirects)
|
||||
@@ -2396,7 +2396,7 @@ gather_here_documents ()
|
||||
static int open_brace_count;
|
||||
|
||||
#define command_token_position(token) \
|
||||
(((token) == ASSIGNMENT_WORD) || \
|
||||
(((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
|
||||
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
|
||||
|
||||
#define assignment_acceptable(token) \
|
||||
@@ -3262,6 +3262,23 @@ eof_error:
|
||||
if (ch == '\n' && SHOULD_PROMPT ())
|
||||
prompt_again ();
|
||||
|
||||
/* XXX -- possibly allow here doc to be delimited by ending right
|
||||
paren. */
|
||||
if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
|
||||
{
|
||||
int tind;
|
||||
/*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
|
||||
tind = lex_firstind;
|
||||
while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
|
||||
tind++;
|
||||
if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
|
||||
{
|
||||
tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
|
||||
/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
|
||||
lex_firstind = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't bother counting parens or doing anything else if in a comment */
|
||||
if (tflags & (LEX_INCOMMENT|LEX_INHEREDOC))
|
||||
{
|
||||
|
||||
+40
-31
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
|
||||
REDIRECTEE rd;
|
||||
REDIRECT *r;
|
||||
|
||||
tc = $1;
|
||||
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
|
||||
rd.dest = 1;
|
||||
r = make_redirection (2, r_duplicating_output, rd);
|
||||
if (tc->redirects)
|
||||
@@ -2921,18 +2921,17 @@ tokword:
|
||||
#define P_ARRAYSUB 0x20 /* parsing a [...] array subscript for assignment */
|
||||
|
||||
/* Lexical state while parsing a grouping construct or $(...). */
|
||||
#define LEX_WASDOL 0x0001
|
||||
#define LEX_CKCOMMENT 0x0002
|
||||
#define LEX_INCOMMENT 0x0004
|
||||
#define LEX_PASSNEXT 0x0008
|
||||
#define LEX_RESWDOK 0x0010
|
||||
#define LEX_CKCASE 0x0020
|
||||
#define LEX_INCASE 0x0040
|
||||
#define LEX_INHEREDOC 0x0080
|
||||
#define LEX_HEREDELIM 0x0100 /* reading here-doc delimiter */
|
||||
#define LEX_STRIPDOC 0x0200 /* <<- strip tabs from here doc delim */
|
||||
#define LEX_WASQUOTED 0x0400
|
||||
#define LEX_INWORD 0x0800
|
||||
#define LEX_WASDOL 0x001
|
||||
#define LEX_CKCOMMENT 0x002
|
||||
#define LEX_INCOMMENT 0x004
|
||||
#define LEX_PASSNEXT 0x008
|
||||
#define LEX_RESWDOK 0x010
|
||||
#define LEX_CKCASE 0x020
|
||||
#define LEX_INCASE 0x040
|
||||
#define LEX_INHEREDOC 0x080
|
||||
#define LEX_HEREDELIM 0x100 /* reading here-doc delimiter */
|
||||
#define LEX_STRIPDOC 0x200 /* <<- strip tabs from here doc delim */
|
||||
#define LEX_INWORD 0x400
|
||||
|
||||
#define COMSUB_META(ch) ((ch) == ';' || (ch) == '&' || (ch) == '|')
|
||||
|
||||
@@ -2955,11 +2954,6 @@ tokword:
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/* Not exactly right yet, should handle shell metacharacters, too. If
|
||||
any changes are made to this test, make analogous changes to subst.c:
|
||||
extract_delimited_string(). */
|
||||
#define COMMENT_BEGIN(x) ((x) == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
|
||||
|
||||
static char matched_pair_error;
|
||||
|
||||
static char *
|
||||
@@ -3017,7 +3011,10 @@ parse_matched_pair (qc, open, close, lenp, flags)
|
||||
continue;
|
||||
}
|
||||
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && COMMENT_BEGIN (ch))
|
||||
/* Not exactly right yet, should handle shell metacharacters, too. If
|
||||
any changes are made to this test, make analogous changes to subst.c:
|
||||
extract_delimited_string(). */
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (retind == 0 || ret[retind-1] == '\n' || shellblank (ret[retind - 1])))
|
||||
tflags |= LEX_INCOMMENT;
|
||||
|
||||
if (tflags & LEX_PASSNEXT) /* last char was backslash */
|
||||
@@ -3197,7 +3194,7 @@ parse_comsub (qc, open, close, lenp, flags)
|
||||
|
||||
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
|
||||
count = 1;
|
||||
tflags = LEX_RESWDOK|LEX_INWORD;
|
||||
tflags = LEX_RESWDOK;
|
||||
|
||||
if ((flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0)
|
||||
tflags |= LEX_CKCASE;
|
||||
@@ -3273,7 +3270,10 @@ eof_error:
|
||||
ret[retind++] = ch;
|
||||
|
||||
if ((tflags & LEX_INCOMMENT) && ch == '\n')
|
||||
{
|
||||
/*itrace("parse_comsub:%d: lex_incomment -> 0 ch = `%c'", line_number, ch);*/
|
||||
tflags &= ~LEX_INCOMMENT;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -3357,7 +3357,7 @@ eof_error:
|
||||
}
|
||||
|
||||
/* Meta-characters that can introduce a reserved word. Not perfect yet. */
|
||||
if MBTEST((tflags & LEX_PASSNEXT) == 0 && (tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch))
|
||||
if MBTEST((tflags & LEX_RESWDOK) == 0 && (tflags & LEX_CKCASE) && (tflags & LEX_INCOMMENT) == 0 && shellmeta(ch))
|
||||
{
|
||||
/* Add this character. */
|
||||
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
|
||||
@@ -3406,26 +3406,36 @@ eof_error:
|
||||
if (STREQN (ret + retind - 4, "case", 4))
|
||||
{
|
||||
tflags |= LEX_INCASE;
|
||||
/*itrace("parse_comsub:%d: found `case', lex_incase -> 1", line_number);*/
|
||||
/*itrace("parse_comsub:%d: found `case', lex_incase -> 1 lex_reswdok -> 0", line_number);*/
|
||||
}
|
||||
else if (STREQN (ret + retind - 4, "esac", 4))
|
||||
{
|
||||
tflags &= ~LEX_INCASE;
|
||||
/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0", line_number);*/
|
||||
/*itrace("parse_comsub:%d: found `esac', lex_incase -> 0 lex_reswdok -> 0", line_number);*/
|
||||
}
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
}
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && ((lex_rwlen == 0 && ch == '#') || COMMENT_BEGIN(ch)))
|
||||
; /* don't turn off LEX_RESWDOK if we're starting a comment */
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
|
||||
; /* don't modify LEX_RESWDOK if we're starting a comment */
|
||||
else if MBTEST((tflags & LEX_INCASE) && ch != '\n')
|
||||
/* If we can read a reserved word and we're in case, we're at the
|
||||
point where we can read a new pattern list or an esac. We
|
||||
handle the esac case above. If we read a newline, we want to
|
||||
leave LEX_RESWDOK alone. If we read anything else, we want to
|
||||
turn off LEX_RESWDOK, since we're going to read a pattern list. */
|
||||
{
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
/*itrace("parse_comsub:%d: lex_incase == 1 found `%c', lex_reswordok -> 0", line_number, ch);*/
|
||||
}
|
||||
else if MBTEST(shellbreak (ch) == 0)
|
||||
{
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
/*itrace("parse_comsub:%d: found `%c', lex_reswordok -> 0", line_number, ch);*/
|
||||
}
|
||||
}
|
||||
|
||||
/* Might be the start of a here-doc delimiter */
|
||||
if MBTEST((tflags & (LEX_PASSNEXT|LEX_INCOMMENT)) == 0 && (tflags & LEX_CKCASE) && ch == '<')
|
||||
if MBTEST((tflags & LEX_INCOMMENT) == 0 && (tflags & LEX_CKCASE) && ch == '<')
|
||||
{
|
||||
/* Add this character. */
|
||||
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
|
||||
@@ -3458,11 +3468,7 @@ eof_error:
|
||||
else
|
||||
ch = peekc; /* fall through and continue XXX */
|
||||
}
|
||||
#if 0
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0) || COMMENT_BEGIN(ch)))
|
||||
#else
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
|
||||
#endif
|
||||
{
|
||||
/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
|
||||
tflags |= LEX_INCOMMENT;
|
||||
@@ -3485,7 +3491,10 @@ eof_error:
|
||||
/*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
|
||||
}
|
||||
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
|
||||
{
|
||||
count++;
|
||||
/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
|
||||
}
|
||||
|
||||
/* Add this character. */
|
||||
RESIZE_MALLOCED_BUFFER (ret, retind, 1, retsize, 64);
|
||||
|
||||
@@ -259,6 +259,9 @@ int shell_eof_token;
|
||||
/* The token currently being read. */
|
||||
int current_token;
|
||||
|
||||
/* The current parser state. */
|
||||
int parser_state;
|
||||
|
||||
/* Variables to manage the task of reading here documents, because we need to
|
||||
defer the reading until after a complete command has been collected. */
|
||||
static REDIRECT *redir_stack[10];
|
||||
@@ -283,9 +286,6 @@ static int function_bstart;
|
||||
/* The line number in a script at which an arithmetic for command starts. */
|
||||
static int arith_for_lineno;
|
||||
|
||||
/* The current parser state. */
|
||||
static int parser_state;
|
||||
|
||||
/* The last read token, or NULL. read_token () uses this for context
|
||||
checking. */
|
||||
static int last_read_token;
|
||||
@@ -1122,7 +1122,7 @@ pipeline: pipeline '|' newline_list pipeline
|
||||
REDIRECTEE rd;
|
||||
REDIRECT *r;
|
||||
|
||||
tc = $1;
|
||||
tc = $1->type == cm_simple ? (COMMAND *)$1->value.Simple : $1;
|
||||
rd.dest = 1;
|
||||
r = make_redirection (2, r_duplicating_output, rd);
|
||||
if (tc->redirects)
|
||||
@@ -2396,7 +2396,7 @@ gather_here_documents ()
|
||||
static int open_brace_count;
|
||||
|
||||
#define command_token_position(token) \
|
||||
(((token) == ASSIGNMENT_WORD) || \
|
||||
(((token) == ASSIGNMENT_WORD) || (parser_state&PST_REDIRLIST) || \
|
||||
((token) != SEMI_SEMI && (token) != SEMI_AND && (token) != SEMI_SEMI_AND && reserved_word_acceptable(token)))
|
||||
|
||||
#define assignment_acceptable(token) \
|
||||
@@ -3258,6 +3258,23 @@ eof_error:
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX -- possibly allow here doc to be delimited by ending right
|
||||
paren. */
|
||||
if ((tflags & LEX_INHEREDOC) && ch == close && count == 1)
|
||||
{
|
||||
int tind;
|
||||
/*itrace("parse_comsub: in here doc, ch == close, retind - firstind = %d hdlen = %d retind = %d", retind-lex_firstind, hdlen, retind);*/
|
||||
tind = lex_firstind;
|
||||
while ((tflags & LEX_STRIPDOC) && ret[tind] == '\t')
|
||||
tind++;
|
||||
if (retind-tind == hdlen && STREQN (ret + tind, heredelim, hdlen))
|
||||
{
|
||||
tflags &= ~(LEX_STRIPDOC|LEX_INHEREDOC);
|
||||
/*itrace("parse_comsub:%d: found here doc end `%s'", line_number, ret + tind);*/
|
||||
lex_firstind = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Possible reprompting. */
|
||||
if (ch == '\n' && SHOULD_PROMPT ())
|
||||
prompt_again ();
|
||||
@@ -3470,7 +3487,7 @@ eof_error:
|
||||
}
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && (tflags & LEX_INCOMMENT) == 0 && ch == '#' && (((tflags & LEX_RESWDOK) && lex_rwlen == 0) || ((tflags & LEX_INWORD) && lex_wlen == 0)))
|
||||
{
|
||||
itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);
|
||||
/*itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);*/
|
||||
tflags |= LEX_INCOMMENT;
|
||||
}
|
||||
|
||||
@@ -3488,12 +3505,12 @@ itrace("parse_comsub:%d: lex_incomment -> 1 (%d)", line_number, __LINE__);
|
||||
else if MBTEST(ch == close && (tflags & LEX_INCASE) == 0) /* ending delimiter */
|
||||
{
|
||||
count--;
|
||||
itrace("parse_comsub:%d: found close: count = %d", line_number, count);
|
||||
/*itrace("parse_comsub:%d: found close: count = %d", line_number, count);*/
|
||||
}
|
||||
else if MBTEST(((flags & P_FIRSTCLOSE) == 0) && (tflags & LEX_INCASE) == 0 && ch == open) /* nested begin */
|
||||
{
|
||||
count++;
|
||||
itrace("parse_comsub:%d: found open: count = %d", line_number, count);
|
||||
/*itrace("parse_comsub:%d: found open: count = %d", line_number, count);*/
|
||||
}
|
||||
|
||||
/* Add this character. */
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#define PST_REGEXP 0x10000 /* parsing an ERE/BRE as a single word */
|
||||
#define PST_HEREDOC 0x20000 /* reading body of here-document */
|
||||
#define PST_REPARSE 0x40000 /* re-parsing in parse_string_to_word_list */
|
||||
#define PST_REDIRLIST 0x80000 /* parsing a list of redirctions preceding a simple command name */
|
||||
|
||||
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
|
||||
struct dstack {
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/* parser.h -- Everything you wanted to know about the parser, but were
|
||||
afraid to ask. */
|
||||
|
||||
/* Copyright (C) 1995, 2008,2009 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 3 of the License, 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. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if !defined (_PARSER_H_)
|
||||
# define _PARSER_H_
|
||||
|
||||
# include "command.h"
|
||||
# include "input.h"
|
||||
|
||||
/* Possible states for the parser that require it to do special things. */
|
||||
#define PST_CASEPAT 0x00001 /* in a case pattern list */
|
||||
#define PST_ALEXPNEXT 0x00002 /* expand next word for aliases */
|
||||
#define PST_ALLOWOPNBRC 0x00004 /* allow open brace for function def */
|
||||
#define PST_NEEDCLOSBRC 0x00008 /* need close brace */
|
||||
#define PST_DBLPAREN 0x00010 /* double-paren parsing */
|
||||
#define PST_SUBSHELL 0x00020 /* ( ... ) subshell */
|
||||
#define PST_CMDSUBST 0x00040 /* $( ... ) command substitution */
|
||||
#define PST_CASESTMT 0x00080 /* parsing a case statement */
|
||||
#define PST_CONDCMD 0x00100 /* parsing a [[...]] command */
|
||||
#define PST_CONDEXPR 0x00200 /* parsing the guts of [[...]] */
|
||||
#define PST_ARITHFOR 0x00400 /* parsing an arithmetic for command */
|
||||
#define PST_ALEXPAND 0x00800 /* OK to expand aliases - unused */
|
||||
#define PST_CMDTOKEN 0x01000 /* command token OK - unused */
|
||||
#define PST_COMPASSIGN 0x02000 /* parsing x=(...) compound assignment */
|
||||
#define PST_ASSIGNOK 0x04000 /* assignment statement ok in this context */
|
||||
#define PST_EOFTOKEN 0x08000 /* yylex checks against shell_eof_token */
|
||||
#define PST_REGEXP 0x10000 /* parsing an ERE/BRE as a single word */
|
||||
#define PST_HEREDOC 0x20000 /* reading body of here-document */
|
||||
#define PST_REPARSE 0x40000 /* re-parsing in parse_string_to_word_list */
|
||||
|
||||
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
|
||||
struct dstack {
|
||||
/* DELIMITERS is a stack of the nested delimiters that we have
|
||||
encountered so far. */
|
||||
char *delimiters;
|
||||
|
||||
/* Offset into the stack of delimiters. */
|
||||
int delimiter_depth;
|
||||
|
||||
/* How many slots are allocated to DELIMITERS. */
|
||||
int delimiter_space;
|
||||
};
|
||||
|
||||
#endif /* _PARSER_H_ */
|
||||
+1
-1
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
#define PATCHLEVEL 0
|
||||
#define PATCHLEVEL 10
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
|
||||
@@ -85,6 +85,7 @@ extern int errno;
|
||||
|
||||
/* Flags for the `pflags' argument to param_expand() */
|
||||
#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */
|
||||
#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */
|
||||
|
||||
/* These defs make it easier to use the editor. */
|
||||
#define LBRACE '{'
|
||||
@@ -263,7 +264,7 @@ static int valid_brace_expansion_word __P((char *, int));
|
||||
static int chk_atstar __P((char *, int, int *, int *));
|
||||
static int chk_arithsub __P((const char *, int));
|
||||
|
||||
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int));
|
||||
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int));
|
||||
static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *));
|
||||
static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *));
|
||||
static void parameter_brace_expand_error __P((char *, char *));
|
||||
@@ -2057,7 +2058,7 @@ string_list_dollar_at (list, quoted)
|
||||
#if 0
|
||||
tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
|
||||
#else
|
||||
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
|
||||
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
|
||||
#endif
|
||||
? quote_list (list)
|
||||
: list_quote_escapes (list);
|
||||
@@ -4312,6 +4313,12 @@ expand_word_unsplit (word, quoted)
|
||||
WORD_LIST *result;
|
||||
|
||||
expand_no_split_dollar_star = 1;
|
||||
#if defined (HANDLE_MULTIBYTE)
|
||||
if (ifs_firstc[0] == 0)
|
||||
#else
|
||||
if (ifs_firstc == 0)
|
||||
#endif
|
||||
word->flags |= W_NOSPLIT;
|
||||
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
|
||||
expand_no_split_dollar_star = 0;
|
||||
|
||||
@@ -4319,13 +4326,26 @@ expand_word_unsplit (word, quoted)
|
||||
}
|
||||
|
||||
/* Perform shell expansions on WORD, but do not perform word splitting or
|
||||
quote removal on the result. */
|
||||
quote removal on the result. Virtually identical to expand_word_unsplit;
|
||||
could be combined if implementations don't diverge. */
|
||||
WORD_LIST *
|
||||
expand_word_leave_quoted (word, quoted)
|
||||
WORD_DESC *word;
|
||||
int quoted;
|
||||
{
|
||||
return (call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL));
|
||||
WORD_LIST *result;
|
||||
|
||||
expand_no_split_dollar_star = 1;
|
||||
#if defined (HANDLE_MULTIBYTE)
|
||||
if (ifs_firstc[0] == 0)
|
||||
#else
|
||||
if (ifs_firstc == 0)
|
||||
#endif
|
||||
word->flags |= W_NOSPLIT;
|
||||
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
|
||||
expand_no_split_dollar_star = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#if defined (PROCESS_SUBSTITUTION)
|
||||
@@ -5195,9 +5215,9 @@ chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at)
|
||||
the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that
|
||||
NAME was found inside of a double-quoted expression. */
|
||||
static WORD_DESC *
|
||||
parameter_brace_expand_word (name, var_is_special, quoted)
|
||||
parameter_brace_expand_word (name, var_is_special, quoted, pflags)
|
||||
char *name;
|
||||
int var_is_special, quoted;
|
||||
int var_is_special, quoted, pflags;
|
||||
{
|
||||
WORD_DESC *ret;
|
||||
char *temp, *tt;
|
||||
@@ -5229,7 +5249,7 @@ parameter_brace_expand_word (name, var_is_special, quoted)
|
||||
strcpy (tt + 1, name);
|
||||
|
||||
ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL,
|
||||
(int *)NULL, (int *)NULL, 0);
|
||||
(int *)NULL, (int *)NULL, pflags);
|
||||
free (tt);
|
||||
}
|
||||
#if defined (ARRAY_VARS)
|
||||
@@ -5290,7 +5310,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
|
||||
char *temp, *t;
|
||||
WORD_DESC *w;
|
||||
|
||||
w = parameter_brace_expand_word (name, var_is_special, quoted);
|
||||
w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
|
||||
t = w->word;
|
||||
/* Have to dequote here if necessary */
|
||||
if (t)
|
||||
@@ -5307,7 +5327,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
|
||||
if (t == 0)
|
||||
return (WORD_DESC *)NULL;
|
||||
|
||||
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted);
|
||||
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0);
|
||||
free (t);
|
||||
|
||||
return w;
|
||||
@@ -6658,7 +6678,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
|
||||
if (want_indir)
|
||||
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
|
||||
else
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted);
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
|
||||
|
||||
if (tdesc)
|
||||
{
|
||||
@@ -6989,7 +7009,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
case '*': /* `$*' */
|
||||
list = list_rest_of_args ();
|
||||
|
||||
if (list == 0 && unbound_vars_is_error)
|
||||
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
|
||||
{
|
||||
uerror[0] = '$';
|
||||
uerror[1] = '*';
|
||||
@@ -7004,14 +7024,14 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
even if it's quoted. */
|
||||
if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0)
|
||||
temp = (char *)NULL;
|
||||
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
|
||||
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
|
||||
{
|
||||
/* If we have "$*" we want to make a string of the positional
|
||||
parameters, separated by the first character of $IFS, and
|
||||
quote the whole string, including the separators. If IFS
|
||||
is unset, the parameters are separated by ' '; if $IFS is
|
||||
null, the parameters are concatenated. */
|
||||
temp = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (list) : string_list (list);
|
||||
temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list);
|
||||
temp1 = quote_string (temp);
|
||||
if (*temp == 0)
|
||||
tflag |= W_HASQUOTEDNULL;
|
||||
@@ -7051,7 +7071,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
case '@': /* `$@' */
|
||||
list = list_rest_of_args ();
|
||||
|
||||
if (list == 0 && unbound_vars_is_error)
|
||||
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
|
||||
{
|
||||
uerror[0] = '$';
|
||||
uerror[1] = '@';
|
||||
@@ -7066,6 +7086,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
string might need it (consider "\"$@\""), but we need some
|
||||
way to signal that the final split on the first character
|
||||
of $IFS should be done, even though QUOTED is 1. */
|
||||
/* XXX - should this test include Q_PATQUOTE? */
|
||||
if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
|
||||
*quoted_dollar_at_p = 1;
|
||||
if (contains_dollar_at)
|
||||
|
||||
+8821
File diff suppressed because it is too large
Load Diff
@@ -85,6 +85,7 @@ extern int errno;
|
||||
|
||||
/* Flags for the `pflags' argument to param_expand() */
|
||||
#define PF_NOCOMSUB 0x01 /* Do not perform command substitution */
|
||||
#define PF_IGNUNBOUND 0x02 /* ignore unbound vars even if -u set */
|
||||
|
||||
/* These defs make it easier to use the editor. */
|
||||
#define LBRACE '{'
|
||||
@@ -263,7 +264,7 @@ static int valid_brace_expansion_word __P((char *, int));
|
||||
static int chk_atstar __P((char *, int, int *, int *));
|
||||
static int chk_arithsub __P((const char *, int));
|
||||
|
||||
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int));
|
||||
static WORD_DESC *parameter_brace_expand_word __P((char *, int, int, int));
|
||||
static WORD_DESC *parameter_brace_expand_indir __P((char *, int, int, int *, int *));
|
||||
static WORD_DESC *parameter_brace_expand_rhs __P((char *, char *, int, int, int *, int *));
|
||||
static void parameter_brace_expand_error __P((char *, char *));
|
||||
@@ -1110,7 +1111,7 @@ extract_delimited_string (string, sindex, opener, alt_opener, closer, flags)
|
||||
}
|
||||
|
||||
/* Not exactly right yet; should handle shell metacharacters and
|
||||
multibyte characters, too. */
|
||||
multibyte characters, too. See COMMENT_BEGIN define in parse.y */
|
||||
if ((flags & SX_COMMAND) && c == '#' && (i == 0 || string[i - 1] == '\n' || shellblank (string[i - 1])))
|
||||
{
|
||||
in_comment = 1;
|
||||
@@ -2057,7 +2058,7 @@ string_list_dollar_at (list, quoted)
|
||||
#if 0
|
||||
tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
|
||||
#else
|
||||
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
|
||||
tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
|
||||
#endif
|
||||
? quote_list (list)
|
||||
: list_quote_escapes (list);
|
||||
@@ -4312,6 +4313,7 @@ expand_word_unsplit (word, quoted)
|
||||
WORD_LIST *result;
|
||||
|
||||
expand_no_split_dollar_star = 1;
|
||||
word->flags |= W_NOSPLIT;
|
||||
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
|
||||
expand_no_split_dollar_star = 0;
|
||||
|
||||
@@ -4319,13 +4321,21 @@ expand_word_unsplit (word, quoted)
|
||||
}
|
||||
|
||||
/* Perform shell expansions on WORD, but do not perform word splitting or
|
||||
quote removal on the result. */
|
||||
quote removal on the result. Virtually identical to expand_word_unsplit;
|
||||
could be combined if implementations don't diverge. */
|
||||
WORD_LIST *
|
||||
expand_word_leave_quoted (word, quoted)
|
||||
WORD_DESC *word;
|
||||
int quoted;
|
||||
{
|
||||
return (call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL));
|
||||
WORD_LIST *result;
|
||||
|
||||
expand_no_split_dollar_star = 1;
|
||||
word->flags |= W_NOSPLIT;
|
||||
result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
|
||||
expand_no_split_dollar_star = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#if defined (PROCESS_SUBSTITUTION)
|
||||
@@ -4476,7 +4486,6 @@ unlink_fifo_list ()
|
||||
for (i = 0; nfds && i < totfds; i++)
|
||||
if (dev_fd_list[i])
|
||||
{
|
||||
itrace("unlink_fifo_list: closing %d", i);
|
||||
close (i);
|
||||
dev_fd_list[i] = 0;
|
||||
nfds--;
|
||||
@@ -5196,9 +5205,9 @@ chk_atstar (name, quoted, quoted_dollar_atp, contains_dollar_at)
|
||||
the shell, e.g., "@", "$", "*", etc. QUOTED, if non-zero, means that
|
||||
NAME was found inside of a double-quoted expression. */
|
||||
static WORD_DESC *
|
||||
parameter_brace_expand_word (name, var_is_special, quoted)
|
||||
parameter_brace_expand_word (name, var_is_special, quoted, pflags)
|
||||
char *name;
|
||||
int var_is_special, quoted;
|
||||
int var_is_special, quoted, pflags;
|
||||
{
|
||||
WORD_DESC *ret;
|
||||
char *temp, *tt;
|
||||
@@ -5230,7 +5239,7 @@ parameter_brace_expand_word (name, var_is_special, quoted)
|
||||
strcpy (tt + 1, name);
|
||||
|
||||
ret = param_expand (tt, &sindex, quoted, (int *)NULL, (int *)NULL,
|
||||
(int *)NULL, (int *)NULL, 0);
|
||||
(int *)NULL, (int *)NULL, pflags);
|
||||
free (tt);
|
||||
}
|
||||
#if defined (ARRAY_VARS)
|
||||
@@ -5291,7 +5300,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
|
||||
char *temp, *t;
|
||||
WORD_DESC *w;
|
||||
|
||||
w = parameter_brace_expand_word (name, var_is_special, quoted);
|
||||
w = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
|
||||
t = w->word;
|
||||
/* Have to dequote here if necessary */
|
||||
if (t)
|
||||
@@ -5308,7 +5317,7 @@ parameter_brace_expand_indir (name, var_is_special, quoted, quoted_dollar_atp, c
|
||||
if (t == 0)
|
||||
return (WORD_DESC *)NULL;
|
||||
|
||||
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted);
|
||||
w = parameter_brace_expand_word (t, SPECIAL_VAR(t, 0), quoted, 0);
|
||||
free (t);
|
||||
|
||||
return w;
|
||||
@@ -6659,7 +6668,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
|
||||
if (want_indir)
|
||||
tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
|
||||
else
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted);
|
||||
tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND);
|
||||
|
||||
if (tdesc)
|
||||
{
|
||||
@@ -6990,7 +6999,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
case '*': /* `$*' */
|
||||
list = list_rest_of_args ();
|
||||
|
||||
if (list == 0 && unbound_vars_is_error)
|
||||
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
|
||||
{
|
||||
uerror[0] = '$';
|
||||
uerror[1] = '*';
|
||||
@@ -7005,14 +7014,14 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
even if it's quoted. */
|
||||
if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list == 0)
|
||||
temp = (char *)NULL;
|
||||
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
|
||||
else if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_PATQUOTE))
|
||||
{
|
||||
/* If we have "$*" we want to make a string of the positional
|
||||
parameters, separated by the first character of $IFS, and
|
||||
quote the whole string, including the separators. If IFS
|
||||
is unset, the parameters are separated by ' '; if $IFS is
|
||||
null, the parameters are concatenated. */
|
||||
temp = (quoted & Q_DOUBLE_QUOTES) ? string_list_dollar_star (list) : string_list (list);
|
||||
temp = (quoted & (Q_DOUBLE_QUOTES|Q_PATQUOTE)) ? string_list_dollar_star (list) : string_list (list);
|
||||
temp1 = quote_string (temp);
|
||||
if (*temp == 0)
|
||||
tflag |= W_HASQUOTEDNULL;
|
||||
@@ -7052,7 +7061,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
case '@': /* `$@' */
|
||||
list = list_rest_of_args ();
|
||||
|
||||
if (list == 0 && unbound_vars_is_error)
|
||||
if (list == 0 && unbound_vars_is_error && (pflags & PF_IGNUNBOUND) == 0)
|
||||
{
|
||||
uerror[0] = '$';
|
||||
uerror[1] = '@';
|
||||
@@ -7067,6 +7076,7 @@ param_expand (string, sindex, quoted, expanded_something,
|
||||
string might need it (consider "\"$@\""), but we need some
|
||||
way to signal that the final split on the first character
|
||||
of $IFS should be done, even though QUOTED is 1. */
|
||||
/* XXX - should this test include Q_PATQUOTE? */
|
||||
if (quoted_dollar_at_p && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)))
|
||||
*quoted_dollar_at_p = 1;
|
||||
if (contains_dollar_at)
|
||||
|
||||
@@ -2,3 +2,11 @@ alias: 0
|
||||
alias: 0
|
||||
./alias.tests: line 25: qfoo: command not found
|
||||
quux
|
||||
bar
|
||||
value
|
||||
bar
|
||||
value
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
OK
|
||||
|
||||
@@ -35,3 +35,5 @@ alias baz=quux
|
||||
foo bar
|
||||
|
||||
unalias foo bar baz
|
||||
|
||||
${THIS_SH} ./alias1.sub
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
shopt -s expand_aliases
|
||||
|
||||
alias foo=echo
|
||||
|
||||
< /dev/null foo bar
|
||||
|
||||
< /dev/null x=value
|
||||
echo $x
|
||||
|
||||
< /dev/null x=newvalue foo bar
|
||||
echo $x
|
||||
|
||||
# problem reported by Vincent Lefevre
|
||||
alias a="echo OK >&2"
|
||||
a
|
||||
> /dev/null a
|
||||
|
||||
${THIS_SH} -c 'shopt -s expand_aliases; alias a="echo OK >&2"
|
||||
a
|
||||
> /dev/null a'
|
||||
@@ -3,3 +3,4 @@ to here
|
||||
and here
|
||||
retest
|
||||
and match
|
||||
no more clauses
|
||||
|
||||
@@ -12,3 +12,7 @@ foo*) echo retest ;;&
|
||||
*bar) echo and match ;;&
|
||||
qux) echo but not this ;;
|
||||
esac
|
||||
|
||||
case a in
|
||||
a) echo no more clauses;&
|
||||
esac
|
||||
|
||||
@@ -5,3 +5,5 @@ hi
|
||||
hi
|
||||
./comsub-eof3.sub: line 1: unexpected EOF while looking for matching `)'
|
||||
./comsub-eof3.sub: line 5: syntax error: unexpected end of file
|
||||
./comsub-eof4.sub: line 6: warning: here-document at line 4 delimited by end-of-file (wanted `EOF')
|
||||
contents
|
||||
|
||||
@@ -5,3 +5,5 @@ ${THIS_SH} ./comsub-eof1.sub
|
||||
${THIS_SH} ./comsub-eof2.sub
|
||||
|
||||
${THIS_SH} ./comsub-eof3.sub
|
||||
|
||||
${THIS_SH} ./comsub-eof4.sub
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
e=$(cat <<EOF
|
||||
contents
|
||||
EOF)
|
||||
echo $e
|
||||
@@ -227,4 +227,9 @@ ${THIS_SH} ./dollar-star2.sub
|
||||
# default and the array contains null elements
|
||||
${THIS_SH} ./dollar-star3.sub
|
||||
|
||||
# test for set -u and expansions of $@ when there are no positional parameters
|
||||
${THIS_SH} ./dollar-at3.sub
|
||||
# test for set -u and expansions of $* when there are no positional parameters
|
||||
${THIS_SH} ./dollar-star4.sub
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
set -u
|
||||
|
||||
echo ${#@}
|
||||
echo ${@:-bar}
|
||||
|
||||
echo $@
|
||||
echo after
|
||||
@@ -0,0 +1,7 @@
|
||||
set -u
|
||||
|
||||
echo ${#*}
|
||||
echo ${*:-bar}
|
||||
|
||||
echo ${*}
|
||||
echo after
|
||||
@@ -149,3 +149,9 @@ argv[1] = <ooq>
|
||||
argv[2] = <>
|
||||
argv[3] = <arq>
|
||||
argv[4] = <>
|
||||
0
|
||||
bar
|
||||
./dollar-at3.sub: line 6: $@: unbound variable
|
||||
0
|
||||
bar
|
||||
./dollar-star4.sub: line 6: *: unbound variable
|
||||
|
||||
Reference in New Issue
Block a user