Imported from ../bash-2.0.tar.gz.
This commit is contained in:
parent
726f63884d
commit
ccc6cda312
502 changed files with 91988 additions and 69123 deletions
|
|
@ -19,6 +19,12 @@ You should have received a copy of the GNU General Public License along
|
|||
with Bash; see the file COPYING. If not, write to the Free Software
|
||||
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#if defined (HAVE_UNISTD_H)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "../bashansi.h"
|
||||
#include "../config.h"
|
||||
#include <stdio.h>
|
||||
|
|
@ -50,6 +56,7 @@ extern char *strcpy ();
|
|||
|
||||
/* Flag values that builtins can have. */
|
||||
#define BUILTIN_FLAG_SPECIAL 0x01
|
||||
#define BUILTIN_FLAG_ASSIGNMENT 0x02
|
||||
|
||||
/* If this stream descriptor is non-zero, then write
|
||||
texinfo documentation to it. */
|
||||
|
|
@ -115,12 +122,41 @@ char *special_builtins[] =
|
|||
"export", "readonly", "return", "set", "shift", "trap", "unset",
|
||||
(char *)NULL
|
||||
};
|
||||
static int is_special_builtin ();
|
||||
|
||||
/* The builtin commands that take assignment statements as arguments. */
|
||||
char *assignment_builtins[] =
|
||||
{
|
||||
"alias", "declare", "export", "local", "readonly", "typeset",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
/* Forward declarations. */
|
||||
static int is_special_builtin ();
|
||||
static int is_assignment_builtin ();
|
||||
|
||||
void extract_info ();
|
||||
|
||||
void file_error ();
|
||||
void line_error ();
|
||||
|
||||
void write_file_headers ();
|
||||
void write_file_footers ();
|
||||
void write_ifdefs ();
|
||||
void write_endifs ();
|
||||
void write_documentation ();
|
||||
void write_longdocs ();
|
||||
void write_builtins ();
|
||||
|
||||
void free_defs ();
|
||||
void add_documentation ();
|
||||
|
||||
void must_be_building ();
|
||||
void remove_trailing_whitespace ();
|
||||
|
||||
/* For each file mentioned on the command line, process it and
|
||||
write the information to STRUCTFILE and EXTERNFILE, while
|
||||
creating the production file if neccessary. */
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
|
|
@ -305,6 +341,7 @@ copy_string_array (array)
|
|||
}
|
||||
|
||||
/* Add ELEMENT to ARRAY, growing the array if neccessary. */
|
||||
void
|
||||
array_add (element, array)
|
||||
char *element;
|
||||
ARRAY *array;
|
||||
|
|
@ -324,6 +361,7 @@ array_add (element, array)
|
|||
}
|
||||
|
||||
/* Free an allocated array and data pointer. */
|
||||
void
|
||||
array_free (array)
|
||||
ARRAY *array;
|
||||
{
|
||||
|
|
@ -397,6 +435,7 @@ int output_cpp_line_info = 0;
|
|||
target. After the file has been processed, write out the names of
|
||||
builtins found in each $BUILTIN. Plain text found before the $PRODUCES
|
||||
is ignored, as is "$$ comment text". */
|
||||
void
|
||||
extract_info (filename, structfile, externfile)
|
||||
char *filename;
|
||||
FILE *structfile, *externfile;
|
||||
|
|
@ -548,6 +587,7 @@ free_builtin (builtin)
|
|||
}
|
||||
|
||||
/* Free all of the memory allocated to a DEF_FILE. */
|
||||
void
|
||||
free_defs (defs)
|
||||
DEF_FILE *defs;
|
||||
{
|
||||
|
|
@ -592,6 +632,7 @@ strip_whitespace (string)
|
|||
}
|
||||
|
||||
/* Remove only the trailing whitespace from STRING. */
|
||||
void
|
||||
remove_trailing_whitespace (string)
|
||||
char *string;
|
||||
{
|
||||
|
|
@ -625,6 +666,7 @@ get_arg (for_whom, defs, string)
|
|||
}
|
||||
|
||||
/* Error if not building a builtin. */
|
||||
void
|
||||
must_be_building (directive, defs)
|
||||
char *directive;
|
||||
DEF_FILE *defs;
|
||||
|
|
@ -645,6 +687,7 @@ current_builtin (directive, defs)
|
|||
|
||||
/* Add LINE to the long documentation for the current builtin.
|
||||
Ignore blank lines until the first non-blank line has been seen. */
|
||||
void
|
||||
add_documentation (defs, line)
|
||||
DEF_FILE *defs;
|
||||
char *line;
|
||||
|
|
@ -670,38 +713,42 @@ builtin_handler (self, defs, arg)
|
|||
char *self, *arg;
|
||||
DEF_FILE *defs;
|
||||
{
|
||||
BUILTIN_DESC *new;
|
||||
char *name;
|
||||
|
||||
/* If we are already building a builtin, we cannot start a new one. */
|
||||
if (building_builtin)
|
||||
return (line_error (defs, "%s found before $END", self));
|
||||
{
|
||||
line_error (defs, "%s found before $END", self);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
output_cpp_line_info++;
|
||||
|
||||
/* Get the name of this builtin, and stick it in the array. */
|
||||
{
|
||||
BUILTIN_DESC *new;
|
||||
char *name;
|
||||
name = get_arg (self, defs, arg);
|
||||
|
||||
name = get_arg (self, defs, arg);
|
||||
/* If this is the first builtin, create the array to hold them. */
|
||||
if (!defs->builtins)
|
||||
defs->builtins = array_create (sizeof (BUILTIN_DESC *));
|
||||
|
||||
/* If this is the first builtin, create the array to hold them. */
|
||||
if (!defs->builtins)
|
||||
defs->builtins = array_create (sizeof (BUILTIN_DESC *));
|
||||
new = (BUILTIN_DESC *)xmalloc (sizeof (BUILTIN_DESC));
|
||||
new->name = name;
|
||||
new->function = (char *)NULL;
|
||||
new->shortdoc = (char *)NULL;
|
||||
new->docname = (char *)NULL;
|
||||
new->longdoc = (ARRAY *)NULL;
|
||||
new->dependencies = (ARRAY *)NULL;
|
||||
new->flags = 0;
|
||||
|
||||
new = (BUILTIN_DESC *)xmalloc (sizeof (BUILTIN_DESC));
|
||||
new->name = name;
|
||||
new->function = (char *)NULL;
|
||||
new->shortdoc = (char *)NULL;
|
||||
new->docname = (char *)NULL;
|
||||
new->longdoc = (ARRAY *)NULL;
|
||||
new->dependencies = (ARRAY *)NULL;
|
||||
new->flags = 0;
|
||||
if (is_special_builtin (name))
|
||||
new->flags |= BUILTIN_FLAG_SPECIAL;
|
||||
if (is_assignment_builtin (name))
|
||||
new->flags |= BUILTIN_FLAG_ASSIGNMENT;
|
||||
|
||||
if (is_special_builtin (name))
|
||||
new->flags |= BUILTIN_FLAG_SPECIAL;
|
||||
array_add ((char *)new, defs->builtins);
|
||||
building_builtin = 1;
|
||||
|
||||
array_add ((char *)new, defs->builtins);
|
||||
building_builtin = 1;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -744,6 +791,7 @@ docname_handler (self, defs, arg)
|
|||
}
|
||||
|
||||
/* How to handle the $SHORT_DOC directive. */
|
||||
int
|
||||
short_doc_handler (self, defs, arg)
|
||||
char *self, *arg;
|
||||
DEF_FILE *defs;
|
||||
|
|
@ -762,13 +810,16 @@ short_doc_handler (self, defs, arg)
|
|||
}
|
||||
|
||||
/* How to handle the $COMMENT directive. */
|
||||
int
|
||||
comment_handler (self, defs)
|
||||
char *self;
|
||||
DEF_FILE *defs;
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* How to handle the $DEPENDS_ON directive. */
|
||||
int
|
||||
depends_on_handler (self, defs, arg)
|
||||
char *self, *arg;
|
||||
DEF_FILE *defs;
|
||||
|
|
@ -788,6 +839,7 @@ depends_on_handler (self, defs, arg)
|
|||
}
|
||||
|
||||
/* How to handle the $PRODUCES directive. */
|
||||
int
|
||||
produces_handler (self, defs, arg)
|
||||
char *self, *arg;
|
||||
DEF_FILE *defs;
|
||||
|
|
@ -820,12 +872,14 @@ produces_handler (self, defs, arg)
|
|||
}
|
||||
|
||||
/* How to handle the $END directive. */
|
||||
int
|
||||
end_handler (self, defs, arg)
|
||||
char *self, *arg;
|
||||
DEF_FILE *defs;
|
||||
{
|
||||
must_be_building (self, defs);
|
||||
building_builtin = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* **************************************************************** */
|
||||
|
|
@ -835,6 +889,7 @@ end_handler (self, defs, arg)
|
|||
/* **************************************************************** */
|
||||
|
||||
/* Produce an error for DEFS with FORMAT and ARGS. */
|
||||
void
|
||||
line_error (defs, format, arg1, arg2)
|
||||
DEF_FILE *defs;
|
||||
char *format, *arg1, *arg2;
|
||||
|
|
@ -848,6 +903,7 @@ line_error (defs, format, arg1, arg2)
|
|||
}
|
||||
|
||||
/* Print error message for FILENAME. */
|
||||
void
|
||||
file_error (filename)
|
||||
char *filename;
|
||||
{
|
||||
|
|
@ -895,7 +951,7 @@ xrealloc (pointer, bytes)
|
|||
static void
|
||||
memory_error_and_abort ()
|
||||
{
|
||||
fprintf (stderr, "mkbuiltins: Out of virtual memory!\n");
|
||||
fprintf (stderr, "mkbuiltins: out of virtual memory\n");
|
||||
abort ();
|
||||
}
|
||||
|
||||
|
|
@ -929,6 +985,7 @@ copy_builtin (builtin)
|
|||
}
|
||||
|
||||
/* How to save away a builtin. */
|
||||
void
|
||||
save_builtin (builtin)
|
||||
BUILTIN_DESC *builtin;
|
||||
{
|
||||
|
|
@ -972,7 +1029,7 @@ char *structfile_header[] = {
|
|||
" along with Bash; see the file COPYING. If not, write to the Free",
|
||||
" Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */",
|
||||
"",
|
||||
"/* The list of shell builtins. Each element is name, function, enabled-p,",
|
||||
"/* The list of shell builtins. Each element is name, function, flags,",
|
||||
" long-doc, short-doc. The long-doc field contains a pointer to an array",
|
||||
" of help lines. The function takes a WORD_LIST *; the first word in the",
|
||||
" list is the first arg to the command. The list has already had word",
|
||||
|
|
@ -992,13 +1049,17 @@ char *structfile_footer[] = {
|
|||
" { (char *)0x0, (Function *)0x0, 0, (char **)0x0, (char *)0x0 }",
|
||||
"};",
|
||||
"",
|
||||
"struct builtin *shell_builtins = static_shell_builtins;",
|
||||
"struct builtin *current_builtin;",
|
||||
"",
|
||||
"int num_shell_builtins =",
|
||||
"\tsizeof (shell_builtins) / sizeof (struct builtin) - 1;",
|
||||
"\tsizeof (static_shell_builtins) / sizeof (struct builtin) - 1;",
|
||||
(char *)NULL
|
||||
};
|
||||
|
||||
/* Write out any neccessary opening information for
|
||||
STRUCTFILE and EXTERNFILE. */
|
||||
void
|
||||
write_file_headers (structfile, externfile)
|
||||
FILE *structfile, *externfile;
|
||||
{
|
||||
|
|
@ -1011,7 +1072,7 @@ write_file_headers (structfile, externfile)
|
|||
|
||||
fprintf (structfile, "#include \"%s\"\n",
|
||||
extern_filename ? extern_filename : "builtext.h");
|
||||
fprintf (structfile, "\nstruct builtin shell_builtins[] = {\n");
|
||||
fprintf (structfile, "\nstruct builtin static_shell_builtins[] = {\n");
|
||||
}
|
||||
|
||||
if (externfile)
|
||||
|
|
@ -1022,6 +1083,7 @@ write_file_headers (structfile, externfile)
|
|||
|
||||
/* Write out any necessary closing information for
|
||||
STRUCTFILE and EXTERNFILE. */
|
||||
void
|
||||
write_file_footers (structfile, externfile)
|
||||
FILE *structfile, *externfile;
|
||||
{
|
||||
|
|
@ -1037,6 +1099,7 @@ write_file_footers (structfile, externfile)
|
|||
|
||||
/* Write out the information accumulated in DEFS to
|
||||
STRUCTFILE and EXTERNFILE. */
|
||||
void
|
||||
write_builtins (defs, structfile, externfile)
|
||||
DEF_FILE *defs;
|
||||
FILE *structfile, *externfile;
|
||||
|
|
@ -1057,8 +1120,7 @@ write_builtins (defs, structfile, externfile)
|
|||
{
|
||||
if (builtin->dependencies)
|
||||
{
|
||||
if (builtin->function)
|
||||
write_ifdefs (externfile, builtin->dependencies->array);
|
||||
write_ifdefs (externfile, builtin->dependencies->array);
|
||||
write_ifdefs (structfile, builtin->dependencies->array);
|
||||
}
|
||||
|
||||
|
|
@ -1083,20 +1145,14 @@ write_builtins (defs, structfile, externfile)
|
|||
else
|
||||
fprintf (structfile, "(Function *)0x0, ");
|
||||
|
||||
#define SPECIAL_FLAG_STRING "BUILTIN_ENABLED | STATIC_BUILTIN | SPECIAL_BUILTIN"
|
||||
#define NORMAL_FLAG_STRING "BUILTIN_ENABLED | STATIC_BUILTIN"
|
||||
|
||||
fprintf (structfile, "%s, %s_doc,\n",
|
||||
(builtin->flags & BUILTIN_FLAG_SPECIAL) ?
|
||||
SPECIAL_FLAG_STRING :
|
||||
NORMAL_FLAG_STRING,
|
||||
fprintf (structfile, "%s%s%s, %s_doc,\n",
|
||||
"BUILTIN_ENABLED | STATIC_BUILTIN",
|
||||
(builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
|
||||
(builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
|
||||
builtin->docname ? builtin->docname : builtin->name);
|
||||
|
||||
#undef SPECIAL_FLAG_STRING
|
||||
#undef NORMAL_FLAG_STRING
|
||||
|
||||
fprintf
|
||||
(structfile, " \"%s\" },\n",
|
||||
(structfile, " \"%s\", (char *)NULL },\n",
|
||||
builtin->shortdoc ? builtin->shortdoc : builtin->name);
|
||||
|
||||
/* Save away this builtin for later writing of the
|
||||
|
|
@ -1126,6 +1182,7 @@ write_builtins (defs, structfile, externfile)
|
|||
}
|
||||
|
||||
/* Write out the long documentation strings in BUILTINS to STREAM. */
|
||||
void
|
||||
write_longdocs (stream, builtins)
|
||||
FILE *stream;
|
||||
ARRAY *builtins;
|
||||
|
|
@ -1157,6 +1214,7 @@ write_longdocs (stream, builtins)
|
|||
DEFINES is a null terminated array of define names.
|
||||
If a define is preceded by an `!', then the sense of the test is
|
||||
reversed. */
|
||||
void
|
||||
write_ifdefs (stream, defines)
|
||||
FILE *stream;
|
||||
char **defines;
|
||||
|
|
@ -1187,6 +1245,7 @@ write_ifdefs (stream, defines)
|
|||
of the immediately preceding code.
|
||||
STREAM is the stream to write the information to.
|
||||
DEFINES is a null terminated array of define names. */
|
||||
void
|
||||
write_endifs (stream, defines)
|
||||
FILE *stream;
|
||||
char **defines;
|
||||
|
|
@ -1211,6 +1270,7 @@ write_endifs (stream, defines)
|
|||
|
||||
/* Write DOCUMENTAION to STREAM, perhaps surrounding it with double-quotes
|
||||
and quoting special characters in the string. */
|
||||
void
|
||||
write_documentation (stream, documentation, indentation, flags)
|
||||
FILE *stream;
|
||||
char **documentation;
|
||||
|
|
@ -1218,14 +1278,14 @@ write_documentation (stream, documentation, indentation, flags)
|
|||
{
|
||||
register int i, j;
|
||||
register char *line;
|
||||
int string_array = (flags & STRING_ARRAY); /* Mutually exclusive. */
|
||||
int texinfo = (flags & TEXINFO);
|
||||
int string_array, texinfo;
|
||||
|
||||
if (!stream)
|
||||
return;
|
||||
|
||||
string_array = flags & STRING_ARRAY;
|
||||
if (string_array)
|
||||
fprintf (stream, " {\n");
|
||||
fprintf (stream, " {\n#if defined (HELP_BUILTIN)\n");
|
||||
|
||||
#if !defined (OLDCODE)
|
||||
/* XXX -- clean me up; for experiment only */
|
||||
|
|
@ -1233,7 +1293,7 @@ write_documentation (stream, documentation, indentation, flags)
|
|||
goto end_of_document;
|
||||
#endif /* !OLDCODE */
|
||||
|
||||
for (i = 0; line = documentation[i]; i++)
|
||||
for (i = 0, texinfo = (flags & TEXINFO); line = documentation[i]; i++)
|
||||
{
|
||||
/* Allow #ifdef's to be written out verbatim. */
|
||||
if (*line == '#')
|
||||
|
|
@ -1295,17 +1355,31 @@ end_of_document:
|
|||
#endif /* !OLDCODE */
|
||||
|
||||
if (string_array)
|
||||
fprintf (stream, " (char *)NULL\n};\n");
|
||||
fprintf (stream, "#endif /* HELP_BUILTIN */\n (char *)NULL\n};\n");
|
||||
}
|
||||
|
||||
static int
|
||||
_find_in_table (name, name_table)
|
||||
char *name, *name_table[];
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; name_table[i]; i++)
|
||||
if (strcmp (name, name_table[i]) == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
is_special_builtin (name)
|
||||
char *name;
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; special_builtins[i]; i++)
|
||||
if (strcmp (name, special_builtins[i]) == 0)
|
||||
return 1;
|
||||
return 0;
|
||||
return (_find_in_table (name, special_builtins));
|
||||
}
|
||||
|
||||
static int
|
||||
is_assignment_builtin (name)
|
||||
char *name;
|
||||
{
|
||||
return (_find_in_table (name, assignment_builtins));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue