From 877ff7267584b40c082ddcc49ce6c539f05f16f4 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Mon, 3 Apr 2023 12:07:25 -0400 Subject: [PATCH] rest of work to convert unwind-protects to ANSI/ISO C; size_t updates; function prototype changes for ANSI/ISO C --- CWRU/CWRU.chlog | 27 +++++ builtins/cd.def | 2 +- builtins/command.def | 4 +- builtins/evalfile.c | 4 +- builtins/evalstring.c | 37 +++++-- builtins/fc.def | 12 +- builtins/jobs.def | 4 +- builtins/read.def | 45 ++++++-- builtins/source.def | 10 +- builtins/times.def | 5 +- dispose_cmd.c | 14 ++- dispose_cmd.h | 5 +- doc/bash.1 | 2 +- doc/bashref.texi | 2 +- execute_cmd.c | 116 +++++++++++++------ execute_cmd.h | 5 + externs.h | 12 +- files | 226 ++++++++++++++++++++++++++++++++++++++ general.h | 23 ++-- jobs.c | 2 +- lib/readline/histexpand.c | 2 +- lib/readline/mbutil.c | 2 +- lib/readline/rltypedefs.h | 7 -- pcomplete.c | 28 +++-- print_cmd.c | 12 +- subst.c | 6 +- tests/assoc.right | 2 +- tests/assoc13.sub | 14 ++- trap.c | 18 ++- trap.h | 9 +- unwind_prot.c | 30 ++--- unwind_prot.h | 2 +- variables.c | 12 +- variables.h | 6 +- 34 files changed, 560 insertions(+), 147 deletions(-) create mode 100644 files diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 403f645f..20cd75cb 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -5917,3 +5917,30 @@ unwind_prot.h - introduce new unwind-protect function pointer type to replace Function From Paul Eggert + + 3/30 + ---- +builtins/command.def,builtins/fc.def,builtins/read.def,builtins/source.def +builtins/evalfile.c,builtins/evalstring.c +dispose_cmd.c,execute_cmd.c,pcomplete.c,print_cmd.c,subst.c,jobs.c,variables.c +dispose_cmd.h,general.h,trap.h +unwind_prot.c,unwind_prot.h + - rest of work to convert unwind-protect framework to ANSI/ISO C. + Convert unwind-protects to use new shim functions that obey the new + unwind-protect function type + From Paul Eggert + +general.h + - STREQ, STREQN: now static inline functions to take advantage of arg + type conversion + +pcomplete.c,subst.c +lib/readline/histexpand.c,lib/readline/mbutil.c + - fix size_t subtractions in comparisons to avoid unsigned underflow + +externs.h +execute_cmd.c +builtins/times.h + - add prototypes for functions taking clock_t and timeval, make their + declaration in externs.h conditional on NEED_CLOCK_FUNCS_DECL and + NEED_TIMEVAL_FUNCS_DECL, respectively diff --git a/builtins/cd.def b/builtins/cd.def index 35d95f67..de123f8b 100644 --- a/builtins/cd.def +++ b/builtins/cd.def @@ -75,7 +75,7 @@ static int xattrfd = -1; $BUILTIN cd $FUNCTION cd_builtin -$SHORT_DOC cd [-L|[-P [-e]] [-@]] [dir] +$SHORT_DOC cd [-L|[-P [-e]]] [-@] [dir] Change the shell working directory. Change the current directory to DIR. The default DIR is the value of the diff --git a/builtins/command.def b/builtins/command.def index e695fdd1..a681c9f1 100644 --- a/builtins/command.def +++ b/builtins/command.def @@ -1,7 +1,7 @@ This file is command.def, from which is created command.c. It implements the builtin "command" in Bash. -Copyright (C) 1987-2022 Free Software Foundation, Inc. +Copyright (C) 1987-2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -131,7 +131,7 @@ command_builtin (WORD_LIST *list) command->flags |= COMMAND_BUILTIN_FLAGS; command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS; - add_unwind_protect ((char *)dispose_command, command); + add_unwind_protect (uw_dispose_command, command); result = execute_command (command); run_unwind_frame ("command_builtin"); diff --git a/builtins/evalfile.c b/builtins/evalfile.c index 9b6f4215..548c563f 100644 --- a/builtins/evalfile.c +++ b/builtins/evalfile.c @@ -247,7 +247,7 @@ file_error_and_exit: fa->funcname_a = funcname_a; fa->funcname_v = funcname_v; if (flags & FEVAL_UNWINDPROT) - add_unwind_protect (restore_funcarray_state, fa); + add_unwind_protect (uw_restore_funcarray_state, fa); # if defined (DEBUGGER) /* Have to figure out a better way to do this when `source' is supplied @@ -260,7 +260,7 @@ file_error_and_exit: tt[0] = '1'; tt[1] = '\0'; array_push (bash_argc_a, tt); if (flags & FEVAL_UNWINDPROT) - add_unwind_protect (pop_args, 0); + add_unwind_protect (uw_pop_args, 0); } # endif #endif diff --git a/builtins/evalstring.c b/builtins/evalstring.c index 243becbc..554ebc48 100644 --- a/builtins/evalstring.c +++ b/builtins/evalstring.c @@ -70,19 +70,38 @@ static int cat_file (REDIRECT *); #if defined (HISTORY) static void -set_history_remembering (void) +uw_set_history_remembering (void *ignore) { remember_on_history = enable_history_list; } + #endif static void -restore_lastcom (char *x) +uw_restore_lastcom (void *x) { FREE (the_printed_command_except_trap); the_printed_command_except_trap = x; } +static void +uw_set_current_prompt_level (void *x) +{ + set_current_prompt_level ((intptr_t) x); +} + +static void +uw_pop_stream (void *x) +{ + pop_stream (); +} + +static void +uw_parser_restore_alias (void *x) +{ + parser_restore_alias (); +} + int should_optimize_fork (COMMAND *command, int subshell) { @@ -227,7 +246,7 @@ parse_prologue (char *string, int flags, char *tag) #if defined (HISTORY) if (parse_and_execute_level == 0) - add_unwind_protect (set_history_remembering, (char *)NULL); + add_unwind_protect (uw_set_history_remembering, (char *)NULL); else unwind_protect_int (remember_on_history); /* can be used in scripts */ # if defined (BANG_HISTORY) @@ -238,18 +257,18 @@ parse_prologue (char *string, int flags, char *tag) if (interactive_shell) { x = get_current_prompt_level (); - add_unwind_protect (set_current_prompt_level, x); + add_unwind_protect (uw_set_current_prompt_level, (void *) (intptr_t) x); } if (the_printed_command_except_trap) { lastcom = savestring (the_printed_command_except_trap); - add_unwind_protect (restore_lastcom, lastcom); + add_unwind_protect (uw_restore_lastcom, lastcom); } - add_unwind_protect (pop_stream, (char *)NULL); + add_unwind_protect (uw_pop_stream, (char *)NULL); if (parser_expanding_alias ()) - add_unwind_protect (parser_restore_alias, (char *)NULL); + add_unwind_protect (uw_parser_restore_alias, (char *)NULL); if (orig_string && ((flags & SEVAL_NOFREE) == 0)) add_unwind_protect (xfree, orig_string); @@ -455,8 +474,8 @@ parse_and_execute (char *string, const char *from_file, int flags) bitmap = new_fd_bitmap (FD_BITMAP_SIZE); begin_unwind_frame ("pe_dispose"); - add_unwind_protect (dispose_fd_bitmap, bitmap); - add_unwind_protect (dispose_command, command); /* XXX */ + add_unwind_protect (uw_dispose_fd_bitmap, bitmap); + add_unwind_protect (uw_dispose_command, command); /* XXX */ global_command = (COMMAND *)NULL; diff --git a/builtins/fc.def b/builtins/fc.def index 06f0f610..c530c122 100644 --- a/builtins/fc.def +++ b/builtins/fc.def @@ -167,11 +167,17 @@ static void fc_addhist (char *); #endif static void -set_verbose_flag (void) +uw_set_verbose_flag (void *ignore) { echo_input_at_read = verbose_flag; } +static void +uw_unlink (void *fn) +{ + unlink ((const char *)fn); +} + /* String to execute on a file that we want to edit. */ #define FC_EDIT_COMMAND "${FCEDIT:-${EDITOR:-vi}}" #if defined (STRICT_POSIX) @@ -525,8 +531,8 @@ fc_builtin (WORD_LIST *list) will be echoed as they are read by the parser. */ begin_unwind_frame ("fc builtin"); add_unwind_protect (xfree, fn); - add_unwind_protect (unlink, fn); - add_unwind_protect (set_verbose_flag, (char *)NULL); + add_unwind_protect (uw_unlink, fn); + add_unwind_protect (uw_set_verbose_flag, (char *)NULL); unwind_protect_int (suppress_debug_trap_verbose); echo_input_at_read = 1; suppress_debug_trap_verbose = 1; diff --git a/builtins/jobs.def b/builtins/jobs.def index 316f34bd..56529705 100644 --- a/builtins/jobs.def +++ b/builtins/jobs.def @@ -1,7 +1,7 @@ This file is jobs.def, from which is created jobs.c. It implements the builtins "jobs" and "disown" in Bash. -Copyright (C) 1987-2022 Free Software Foundation, Inc. +Copyright (C) 1987-2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -206,7 +206,7 @@ execute_list_with_replacements (WORD_LIST *list) command->flags |= CMD_INHIBIT_EXPANSION; command->value.Simple->flags |= CMD_INHIBIT_EXPANSION; - add_unwind_protect (dispose_command, command); + add_unwind_protect (uw_dispose_command, command); result = execute_command (command); dispose_command (command); diff --git a/builtins/read.def b/builtins/read.def index e0f73749..cb4e1e59 100644 --- a/builtins/read.def +++ b/builtins/read.def @@ -1,7 +1,7 @@ This file is read.def, from which is created read.c. It implements the builtin "read" in Bash. -Copyright (C) 1987-2022 Free Software Foundation, Inc. +Copyright (C) 1987-2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -119,21 +119,24 @@ struct ttsave }; #if defined (READLINE) -static void reset_attempted_completion_function (char *); +static void uw_reset_attempted_completion_function (void *); static int set_itext (void); static char *edit_line (char *, char *); static void set_eol_delim (int); -static void reset_eol_delim (char *); +static void reset_eol_delim (void *); static void set_readline_timeout (sh_timer *t, time_t, long); +static void uw_bashline_reset_event_hook (void *); #endif static SHELL_VAR *bind_read_variable (char *, char *, int); #if defined (HANDLE_MULTIBYTE) static int read_mbchar (int, char *, int, int, int); #endif static void ttyrestore (struct ttsave *); +static void uw_ttyrestore (void *); static sighandler sigalrm (int); static void reset_timeout (void); +static void uw_reset_timeout (void *); /* Try this to see what the rest of the shell can do with the information. */ sh_timer *read_timeout; @@ -169,6 +172,12 @@ reset_timeout (void) read_timeout = 0; } +static void +uw_reset_timeout (void *ignore) +{ + reset_timeout (); +} + void check_read_timeout (void) { @@ -509,12 +518,12 @@ read_builtin (WORD_LIST *list) } if (interactive_shell == 0) initialize_terminating_signals (); - add_unwind_protect (reset_timeout, (char *)NULL); + add_unwind_protect (uw_reset_timeout, NULL); #if defined (READLINE) if (edit) { - add_unwind_protect (reset_attempted_completion_function, (char *)NULL); - add_unwind_protect (bashline_reset_event_hook, (char *)NULL); + add_unwind_protect (uw_reset_attempted_completion_function, NULL); + add_unwind_protect (uw_bashline_reset_event_hook, NULL); set_readline_timeout (read_timeout, tmsec, tmusec); } else @@ -538,7 +547,7 @@ read_builtin (WORD_LIST *list) if (delim != '\n') { set_eol_delim (delim); - add_unwind_protect (reset_eol_delim, (char *)NULL); + add_unwind_protect (reset_eol_delim, NULL); } } else @@ -555,7 +564,7 @@ read_builtin (WORD_LIST *list) if (i < 0) sh_ttyerror (1); tty_modified = 1; - add_unwind_protect ((Function *)ttyrestore, (char *)&termsave); + add_unwind_protect (uw_ttyrestore, &termsave); if (interactive_shell == 0) initialize_terminating_signals (); } @@ -573,7 +582,7 @@ read_builtin (WORD_LIST *list) sh_ttyerror (1); tty_modified = 1; - add_unwind_protect ((Function *)ttyrestore, (char *)&termsave); + add_unwind_protect (uw_ttyrestore, &termsave); if (interactive_shell == 0) initialize_terminating_signals (); } @@ -840,7 +849,7 @@ add_char: if (nchars > 0) rl_num_chars_to_read = 0; if (delim != '\n') - reset_eol_delim ((char *)NULL); + reset_eol_delim (NULL); } else #endif @@ -1114,6 +1123,12 @@ ttyrestore (struct ttsave *ttp) tty_modified = 0; } +static void +uw_ttyrestore (void *ttp) +{ + ttyrestore (ttp); +} + void read_tty_cleanup (void) { @@ -1133,12 +1148,18 @@ static rl_hook_func_t *old_startup_hook; static char *deftext; static void -reset_attempted_completion_function (char *cp) +uw_reset_attempted_completion_function (void *cp) { if (rl_attempted_completion_function == 0 && old_attempted_completion_function) rl_attempted_completion_function = old_attempted_completion_function; } +static void +uw_bashline_reset_event_hook (void *ignore) +{ + bashline_reset_event_hook (); +} + static int set_itext (void) { @@ -1241,7 +1262,7 @@ set_eol_delim (int c) } static void -reset_eol_delim (char *cp) +reset_eol_delim (void *ignore) { Keymap cmap; diff --git a/builtins/source.def b/builtins/source.def index c15dbc51..b68d16a5 100644 --- a/builtins/source.def +++ b/builtins/source.def @@ -1,7 +1,7 @@ This file is source.def, from which is created source.c. It implements the builtins "." and "source" in Bash. -Copyright (C) 1987-2022 Free Software Foundation, Inc. +Copyright (C) 1987-2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -80,7 +80,7 @@ $END extern int errno; #endif /* !errno */ -static void maybe_pop_dollar_vars (void); +static void uw_maybe_pop_dollar_vars (void *); /* If non-zero, `.' uses $PATH to look up the script to be sourced. */ int source_uses_path = 1; @@ -96,7 +96,7 @@ int source_searches_cwd = 1; not executing a shell function, we leave the new values alone and free the saved values. */ static void -maybe_pop_dollar_vars (void) +uw_maybe_pop_dollar_vars (void *ignore) { if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN)) dispose_saved_dollar_vars (); @@ -170,7 +170,7 @@ source_builtin (WORD_LIST *list) if (list->next) { push_dollar_vars (); - add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL); + add_unwind_protect (uw_maybe_pop_dollar_vars, NULL); if (debugging_mode || shell_compatibility_level <= 44) init_bash_argv (); /* Initialize BASH_ARGV and BASH_ARGC */ remember_args (list->next, 1); @@ -187,7 +187,7 @@ source_builtin (WORD_LIST *list) { debug_trap = savestring (debug_trap); add_unwind_protect (xfree, debug_trap); - add_unwind_protect (maybe_set_debug_trap, debug_trap); + add_unwind_protect (uw_maybe_set_debug_trap, debug_trap); restore_default_signal (DEBUG_TRAP); } diff --git a/builtins/times.def b/builtins/times.def index c7e5874c..b6d9faf2 100644 --- a/builtins/times.def +++ b/builtins/times.def @@ -43,7 +43,6 @@ $END #include #include "../bashtypes.h" -#include "../shell.h" #include @@ -55,6 +54,10 @@ $END # include #endif +#define NEED_CLOCK_FUNCS_DECL +#define NEED_TIMEVAL_FUNCS_DECL + +#include "../shell.h" #include "common.h" /* Print the totals for system and user time used. */ diff --git a/dispose_cmd.c b/dispose_cmd.c index a79201ab..d2821fed 100644 --- a/dispose_cmd.c +++ b/dispose_cmd.c @@ -1,6 +1,6 @@ /* dispose_command.c -- dispose of a COMMAND structure. */ -/* Copyright (C) 1987-2009,2022 Free Software Foundation, Inc. +/* Copyright (C) 1987-2009,2022,2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -204,6 +204,12 @@ dispose_command (COMMAND *command) free (command); } +void +uw_dispose_command (void *command) +{ + dispose_command (command); +} + #if defined (COND_COMMAND) /* How to free a node in a conditional command. */ void @@ -272,6 +278,12 @@ dispose_words (WORD_LIST *list) } } +void +uw_dispose_words (void *list) +{ + dispose_words (list); +} + #ifdef INCLUDE_UNUSED /* How to dispose of an array of pointers to char. This is identical to free_array in stringlib.c. */ diff --git a/dispose_cmd.h b/dispose_cmd.h index 0e6eabc9..5ac900aa 100644 --- a/dispose_cmd.h +++ b/dispose_cmd.h @@ -1,6 +1,6 @@ /* dispose_cmd.h -- Functions appearing in dispose_cmd.c. */ -/* Copyright (C) 1993-2022 Free Software Foundation, Inc. +/* Copyright (C) 1993-2023 Free Software Foundation, Inc. This file is part of GNU Bash, the Bourne Again SHell. @@ -37,4 +37,7 @@ extern void dispose_cond_node (COND_COM *); extern void dispose_function_def_contents (FUNCTION_DEF *); extern void dispose_function_def (FUNCTION_DEF *); +extern void uw_dispose_command (void *); +extern void uw_dispose_words (void *); + #endif /* !_DISPOSE_CMD_H_ */ diff --git a/doc/bash.1 b/doc/bash.1 index 7b5de933..0d42fcf5 100644 --- a/doc/bash.1 +++ b/doc/bash.1 @@ -7957,7 +7957,7 @@ The return value is 0 unless the shell is not executing a subroutine call or \fIexpr\fP does not correspond to a valid position in the call stack. .TP -\fBcd\fP [\fB\-L\fP|[\fB\-P\fP [\fB\-e\fP]] [\-@]] [\fIdir\fP] +\fBcd\fP [\fB\-L\fP|[\fB\-P\fP [\fB\-e\fP]]] [\-@] [\fIdir\fP] Change the current directory to \fIdir\fP. if \fIdir\fP is not supplied, the value of the .SM diff --git a/doc/bashref.texi b/doc/bashref.texi index 57a2915c..e34a6717 100644 --- a/doc/bashref.texi +++ b/doc/bashref.texi @@ -3816,7 +3816,7 @@ The return status is zero unless @var{n} is not greater than or equal to 1. @item cd @btindex cd @example -cd [-L|[-P [-e]] [-@@] [@var{directory}] +cd [-L|[-P [-e]]] [-@@] [@var{directory}] @end example Change the current working directory to @var{directory}. diff --git a/execute_cmd.c b/execute_cmd.c index 88f195a5..e7bdcdc9 100644 --- a/execute_cmd.c +++ b/execute_cmd.c @@ -59,6 +59,8 @@ extern int errno; #define NEED_FPURGE_DECL #define NEED_SH_SETLINEBUF_DECL +#define NEED_CLOCK_FUNCS_DECL +#define NEED_TIMEVAL_FUNCS_DECL #include "bashansi.h" #include "bashintl.h" @@ -123,7 +125,7 @@ static int shell_control_structure (enum command_type); static void cleanup_redirects (REDIRECT *); #if defined (JOB_CONTROL) -static void restore_signal_mask (void *); +static void uw_restore_signal_mask (void *); #endif static int builtin_status (int); @@ -344,6 +346,12 @@ dispose_fd_bitmap (struct fd_bitmap *fdbp) free (fdbp); } +void +uw_dispose_fd_bitmap (void *fdbp) +{ + dispose_fd_bitmap (fdbp); +} + void close_fd_bitmap (struct fd_bitmap *fdbp) { @@ -360,6 +368,18 @@ close_fd_bitmap (struct fd_bitmap *fdbp) } } +static void +uw_close_fd_bitmap (void *fdbp) +{ + close_fd_bitmap (fdbp); +} + +void +uw_close (void *fd) +{ + close ((intptr_t) fd); /* XXX */ +} + /* Return the line number of the currently executing command. */ int executing_line_number (void) @@ -403,7 +423,7 @@ execute_command (COMMAND *command) current_fds_to_close = (struct fd_bitmap *)NULL; bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE); begin_unwind_frame ("execute-command"); - add_unwind_protect (dispose_fd_bitmap, (char *)bitmap); + add_unwind_protect (uw_dispose_fd_bitmap, (char *)bitmap); /* Just do the command, but not asynchronously. */ result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap); @@ -463,6 +483,18 @@ cleanup_redirects (REDIRECT *list) dispose_redirects (list); } +static void +uw_cleanup_redirects (void *list) +{ + cleanup_redirects (list); +} + +static void +uw_dispose_redirects (void *list) +{ + dispose_redirects (list); +} + void undo_partial_redirects (void) { @@ -506,7 +538,7 @@ dispose_partial_redirects (void) /* A function to restore the signal mask to its proper value when the shell is interrupted or errors occur while creating a pipeline. */ static void -restore_signal_mask (void *set) +uw_restore_signal_mask (void *set) { sigprocmask (SIG_SETMASK, set, NULL); } @@ -826,10 +858,10 @@ execute_command_internal (COMMAND *command, int asynchronous, int pipe_in, int p begin_unwind_frame ("loop_redirections"); if (my_undo_list) - add_unwind_protect ((Function *)cleanup_redirects, my_undo_list); + add_unwind_protect (uw_cleanup_redirects, my_undo_list); if (exec_undo_list) - add_unwind_protect ((Function *)dispose_redirects, exec_undo_list); + add_unwind_protect (uw_dispose_redirects, exec_undo_list); QUIT; @@ -2438,11 +2470,23 @@ restore_stdin (int s) } } +static void +uw_restore_stdin (void *s) +{ + restore_stdin ((intptr_t)s); +} + +static void +uw_merge_temporary_env (void *ignore) +{ + merge_temporary_env (); +} + /* Catch-all cleanup function for lastpipe code for unwind-protects */ static void -lastpipe_cleanup (int s) +uw_lastpipe_cleanup (void *s) { - set_jobs_list_frozen (s); + set_jobs_list_frozen ((intptr_t) s); } static int @@ -2516,15 +2560,15 @@ execute_pipeline (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, unwind-protects are run, and the storage used for the bitmaps freed up. */ begin_unwind_frame ("pipe-file-descriptors"); - add_unwind_protect (dispose_fd_bitmap, fd_bitmap); - add_unwind_protect (close_fd_bitmap, fd_bitmap); + add_unwind_protect (uw_dispose_fd_bitmap, fd_bitmap); + add_unwind_protect (uw_close_fd_bitmap, fd_bitmap); if (prev >= 0) - add_unwind_protect (close, prev); + add_unwind_protect (uw_close, (void *) (intptr_t) prev); dummyfd = fildes[1]; - add_unwind_protect (close, dummyfd); + add_unwind_protect (uw_close, (void *) (intptr_t) dummyfd); #if defined (JOB_CONTROL) - add_unwind_protect (restore_signal_mask, &oset); + add_unwind_protect (uw_restore_signal_mask, &oset); #endif /* JOB_CONTROL */ if (ignore_return && cmd->value.Connection->first) @@ -2568,11 +2612,11 @@ execute_pipeline (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, { do_piping (prev, pipe_out); prev = NO_PIPE; - add_unwind_protect (restore_stdin, lstdin); + add_unwind_protect (uw_restore_stdin, (void *) (intptr_t) lstdin); lastpipe_flag = 1; old_frozen = freeze_jobs_list (); lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL); /* XXX */ - add_unwind_protect (lastpipe_cleanup, old_frozen); + add_unwind_protect (uw_lastpipe_cleanup, (void *) (intptr_t) old_frozen); #if defined (JOB_CONTROL) UNBLOCK_CHILD (oset); /* XXX */ #endif @@ -2581,7 +2625,7 @@ execute_pipeline (COMMAND *command, int asynchronous, int pipe_in, int pipe_out, cmd->flags |= CMD_LASTPIPE; } if (prev >= 0) - add_unwind_protect (close, prev); + add_unwind_protect (uw_close, (void *) (intptr_t) prev); exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close); @@ -2841,14 +2885,14 @@ execute_for_command (FOR_COM *for_command) list = releaser = expand_words_no_vars (for_command->map_list); begin_unwind_frame ("for"); - add_unwind_protect (dispose_words, releaser); + add_unwind_protect (uw_dispose_words, releaser); #if 0 if (lexical_scoping) { old_value = copy_variable (find_variable (identifier)); if (old_value) - add_unwind_protect (dispose_variable, old_value); + add_unwind_protect (uw_dispose_variable, old_value); } #endif @@ -3375,7 +3419,7 @@ execute_select_command (SELECT_COM *select_command) } begin_unwind_frame ("select"); - add_unwind_protect (dispose_words, releaser); + add_unwind_protect (uw_dispose_words, releaser); if (select_command->flags & CMD_IGNORE_RETURN) select_command->action->flags |= CMD_IGNORE_RETURN; @@ -4539,7 +4583,7 @@ itrace("execute_simple_command: posix mode tempenv assignment error"); builtin = 0; } - add_unwind_protect (dispose_words, words); + add_unwind_protect (uw_dispose_words, words); QUIT; /* Bind the last word in this command to "$_" after execution. */ @@ -4798,7 +4842,7 @@ execute_builtin (sh_builtin_func_t *builtin, WORD_LIST *words, int flags, int su { error_trap = savestring (error_trap); add_unwind_protect (xfree, error_trap); - add_unwind_protect (set_error_trap, error_trap); + add_unwind_protect (uw_set_error_trap, error_trap); restore_default_signal (ERROR_TRAP); } exit_immediately_on_error = 0; @@ -4838,7 +4882,7 @@ execute_builtin (sh_builtin_func_t *builtin, WORD_LIST *words, int flags, int su if (flags & CMD_COMMAND_BUILTIN) should_keep = 0; if (subshell == 0) - add_unwind_protect (pop_scope, should_keep ? "1" : 0); + add_unwind_protect (pop_scope, (void *) (intptr_t) should_keep); temporary_env = (HASH_TABLE *)NULL; } } @@ -4877,7 +4921,7 @@ execute_builtin (sh_builtin_func_t *builtin, WORD_LIST *words, int flags, int su if (posixly_correct && subshell == 0 && builtin == return_builtin && (flags & CMD_COMMAND_BUILTIN) == 0 && temporary_env) { begin_unwind_frame ("return_temp_env"); - add_unwind_protect (merge_temporary_env, (char *)NULL); + add_unwind_protect (uw_merge_temporary_env, NULL); } executing_builtin++; @@ -4908,7 +4952,7 @@ execute_builtin (sh_builtin_func_t *builtin, WORD_LIST *words, int flags, int su } static void -maybe_restore_getopt_state (void *arg) +uw_maybe_restore_getopt_state (void *arg) { sh_getopt_state_t *gs; @@ -4939,6 +4983,12 @@ restore_funcarray_state (struct func_array_state *fa) free (fa); } + +void +uw_restore_funcarray_state (void *fa) +{ + restore_funcarray_state (fa); +} #endif static int @@ -4998,14 +5048,14 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap /* This has to be before the pop_context(), because the unwinding of local variables may cause the restore of a local declaration of OPTIND to force a getopts state reset. */ - add_unwind_protect (maybe_restore_getopt_state, gs); - add_unwind_protect (pop_context, (char *)NULL); + add_unwind_protect (uw_maybe_restore_getopt_state, gs); + add_unwind_protect (pop_context, NULL); unwind_protect_int (line_number); unwind_protect_int (line_number_for_err_trap); unwind_protect_int (function_line_number); unwind_protect_int (return_catch_flag); unwind_protect_jmp_buf (return_catch); - add_unwind_protect (dispose_command, (char *)tc); + add_unwind_protect (uw_dispose_command, (char *)tc); unwind_protect_pointer (this_shell_function); unwind_protect_int (funcnest); unwind_protect_int (loop_level); @@ -5035,7 +5085,7 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap { debug_trap = savestring (debug_trap); add_unwind_protect (xfree, debug_trap); - add_unwind_protect (maybe_set_debug_trap, debug_trap); + add_unwind_protect (uw_maybe_set_debug_trap, debug_trap); } restore_default_signal (DEBUG_TRAP); } @@ -5047,7 +5097,7 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap { error_trap = savestring (error_trap); add_unwind_protect (xfree, error_trap); - add_unwind_protect (maybe_set_error_trap, error_trap); + add_unwind_protect (uw_maybe_set_error_trap, error_trap); } restore_default_signal (ERROR_TRAP); } @@ -5060,7 +5110,7 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap { return_trap = savestring (return_trap); add_unwind_protect (xfree, return_trap); - add_unwind_protect (maybe_set_return_trap, return_trap); + add_unwind_protect (uw_maybe_set_return_trap, return_trap); } restore_default_signal (RETURN_TRAP); } @@ -5088,7 +5138,7 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap fa->funcname_a = (ARRAY *)funcname_a; fa->funcname_v = funcname_v; if (subshell == 0) - add_unwind_protect (restore_funcarray_state, fa); + add_unwind_protect (uw_restore_funcarray_state, fa); #endif /* The temporary environment for a function is supposed to apply to @@ -5106,7 +5156,7 @@ execute_function (SHELL_VAR *var, WORD_LIST *words, int flags, struct fd_bitmap { push_args (words->next); if (subshell == 0) - add_unwind_protect (pop_args, 0); + add_unwind_protect (uw_pop_args, 0); } /* Number of the line on which the function body starts. */ @@ -5205,7 +5255,7 @@ execute_shell_function (SHELL_VAR *var, WORD_LIST *words) bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE); begin_unwind_frame ("execute-shell-function"); - add_unwind_protect (dispose_fd_bitmap, (char *)bitmap); + add_unwind_protect (uw_dispose_fd_bitmap, (char *)bitmap); ret = execute_function (var, words, 0, bitmap, 0, 0); @@ -5386,7 +5436,7 @@ execute_builtin_or_function (WORD_LIST *words, if (saved_undo_list) { begin_unwind_frame ("saved-redirects"); - add_unwind_protect (cleanup_redirects, (char *)saved_undo_list); + add_unwind_protect (uw_cleanup_redirects, (char *)saved_undo_list); } redirection_undo_list = (REDIRECT *)NULL; diff --git a/execute_cmd.h b/execute_cmd.h index d9c3e7b1..3bd3af44 100644 --- a/execute_cmd.h +++ b/execute_cmd.h @@ -118,7 +118,12 @@ extern void close_all_files (void); #if defined (ARRAY_VARS) extern void restore_funcarray_state (struct func_array_state *); +extern void uw_restore_funcarray_state (void *); #endif extern void bind_lastarg (char *); + +extern void uw_dispose_fd_bitmap (void *); +extern void uw_close (void *); + #endif /* _EXECUTE_CMD_H_ */ diff --git a/externs.h b/externs.h index b8b3321e..7c70da92 100644 --- a/externs.h +++ b/externs.h @@ -201,8 +201,10 @@ extern long get_clk_tck (void); /* declarations for functions defined in lib/sh/clock.c */ /* No prototypes so we don't have to have clock_t defined when this file is included. */ -extern void clock_t_to_secs (); -extern void print_clock_t (); +#ifdef NEED_CLOCK_FUNCS_DECL +extern void clock_t_to_secs (clock_t, time_t *, int *); +extern void print_clock_t (FILE *, clock_t); +#endif /* Declarations for functions defined in lib/sh/dprintf.c */ #if !defined (HAVE_DPRINTF) @@ -484,8 +486,10 @@ extern char *sh_strvis (const char *); /* declarations for functions defined in lib/sh/timeval.c. No prototypes so we don't have to count on having a definition of struct timeval in scope when this file is included. */ -extern void timeval_to_secs (); -extern void print_timeval (); +#ifdef NEED_TIMEVAL_FUNCS_DECL +extern void timeval_to_secs (struct timeval *, time_t *, int *); +extern void print_timeval (FILE *, struct timeval *); +#endif /* declarations for functions defined in lib/sh/tmpfile.c */ #define MT_USETMPDIR 0x0001 diff --git a/files b/files new file mode 100644 index 00000000..7c5f7e6a --- /dev/null +++ b/files @@ -0,0 +1,226 @@ +./configure~: Do not test the value of __STDC__, because some compilers set it to 0 +./configure~:#if !defined __STDC__ +./configure~:#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) +./configure~:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./configure.ac~:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./configure.ac:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./config-bot.h~:/* Try this without testing __STDC__ for the time being. */ +./configure: Do not test the value of __STDC__, because some compilers set it to 0 +./configure:#if !defined __STDC__ +./configure:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./autom4te.cache/traces.0: && !(defined __SUNPRO_C && __STDC__))) \\ +./autom4te.cache/traces.1: && !(defined __SUNPRO_C && __STDC__))) \\ +./autom4te.cache/output.0: Do not test the value of __STDC__, because some compilers set it to 0 +./autom4te.cache/output.0:#if !defined __STDC__ +./autom4te.cache/output.0:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./autom4te.cache/output.1: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.1:#ifdef __STDC__ +./autom4te.cache/output.1: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.1:@%:@ifdef __STDC__ +./autom4te.cache/output.1: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.1:@%:@ifdef __STDC__ +./autom4te.cache/output.1:#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) +./autom4te.cache/output.1:#ifndef __STDC__ +./autom4te.cache/output.1:#ifndef __STDC__ +./autom4te.cache/output.1:#ifndef __STDC__ +./autom4te.cache/output.1:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./autom4te.cache/output.3: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.3:#ifdef __STDC__ +./autom4te.cache/output.3: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.3:@%:@ifdef __STDC__ +./autom4te.cache/output.3: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.3:@%:@ifdef __STDC__ +./autom4te.cache/output.3:#if defined(__STDC__) || defined(__cplusplus) +./autom4te.cache/output.3:#ifndef __STDC__ +./autom4te.cache/output.3:#ifndef __STDC__ +./autom4te.cache/output.3:#ifndef __STDC__ +./autom4te.cache/output.3:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./autom4te.cache/output.2: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:@%:@ifdef __STDC__ +./autom4te.cache/output.2: # Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:@%:@ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2:#if defined(__STDC__) || defined(__cplusplus) +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2:#ifndef __STDC__ +./autom4te.cache/output.2:#ifndef __STDC__ +./autom4te.cache/output.2:#ifndef __STDC__ +./autom4te.cache/output.2: Prefer to if __STDC__ is defined, since +./autom4te.cache/output.2:#ifdef __STDC__ +./autom4te.cache/output.2:ibmrt-*bsd4*) LOCAL_CFLAGS="-ma -U__STDC__" ;; +./include/memalloc.h~:# if defined (__STDC__) +./include/memalloc.h~:# endif /* !__STDC__ */ +./include/stdc.h:# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) || defined (PROTOTYPES) +./include/stdc.h:#if !defined (__STDC__) +./include/stdc.h:#endif /* !__STDC__ */ +./include/stdc.h~:# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) || defined (PROTOTYPES) +./include/stdc.h~:#if !defined (__STDC__) +./include/stdc.h~:#endif /* !__STDC__ */ +./CWRU/old-conf/machines.h: /* SGI cc uses ansi c features *without* defining __STDC__ */ +./CWRU/old-conf/machines.h:# if defined (__EXTENSIONS__) && !defined (__STDC__) +./CWRU/old-conf/machines.h:# define ANSIC -D__STDC__ +./CWRU/old-conf/machines.h:# endif /* !__EXTENSIONS__ || __STDC__ */ +./CWRU/old-conf/machines.h:# define SYSDEP_CFLAGS -ma -U__STDC__ +./CWRU/old-conf/machines.h:# if defined (__STDC__) +./CWRU/old-conf/machines.h:# endif /* __STDC__ */ +./CWRU/old-changelogs/CWRU.chlog.v11: - hpux_9 needs alloca declared as `extern void *' if __STDC__ +./CWRU/old-changelogs/CWRU.chlog.v11: if __STDC__ is defined and we're using stdarg +./CWRU/old-changelogs/CWRU.chlog.v10: - add a __STDC__ definition for getpwnam() for isc386 machines +./CWRU/old-changelogs/CWRU.chlog.v10: - correctly declare the second argument as a size_t if __STDC__ +./CWRU/old-changelogs/CWRU.chlog.v10: on whether __STDC__ is defined and > 0. The `stdc' version uses +./CWRU/old-changelogs/CWRU.chlog.v10: - sgi needs __STDC__ defined if __EXTENSIONS__ is defined +./CWRU/old-changelogs/CWRU.chlog.v10: - moved the #if defined (__P) inside the check for __STDC__, so +./CWRU/old-changelogs/CWRU.chlog.v10: - if __STDC__ is defined but we're not using gcc (__GNUC__ not +./CWRU/old-changelogs/CWRU.chlog.v10: - only test for and possibly define __STDC__ if __GNUC__ is not +./CWRU/old-changelogs/CWRU.chlog.v10: - removed support for outputting -D__STDC__; it's rarely right +./CWRU/old-changelogs/CHANGES.090393:__STDC__ is defined +./CWRU/old-changelogs/CWRU.chlog.v12: - add prototypes for extern function declarations if __STDC__ +./CWRU/old-changelogs/CWRU.chlog.v12: - break the definition of __P out from a strict __STDC__ block, +./CWRU/old-changelogs/CWRU.chlog.v12: as either `__const' (gcc -traditional) or nothing if __STDC__ and +./CWRU/old-changelogs/CWRU.chlog.v13: use `void *' and prototype if __STDC__ is defined +./CWRU/old-changelogs/CWRU.chlog.v13: - don't test __STDC__ when deciding whether or not to use stdarg.h; +./CWRU/old-changelogs/CWRU.chlog.v13: - don't try to use \a and \v unless __STDC__ is defined; use the +./CWRU/old-changelogs/CWRU.chlog.v9: __STDC__ is defined +./CWRU/old-changelogs/CWRU.chlog.v9: - add extern declaration of strcpy if __STDC__ and strcpy not defined +./CWRU/old-changelogs/CWRU.chlog.v9: ANSI C environment (__STDC__) +./CWRU/old-changelogs/CWRU.chlog.v9: - recognize __GNUC__ and __STDC__ and pass them along as output +./CWRU/old-changelogs/CWRU.chlog.v9: where __STDC__ is not defined and _POSIX_SOURCE is +./CWRU/old/RELEASE.113:__STDC__ is defined +./CWRU/CWRU.chlog~: - restrict: make sure we have a definition if __STDC__ is not defined +./CWRU/CWRU.chlog~: - don't bother with __STDC__ if we are just using C89 features like +./CWRU/CWRU.chlog: - restrict: make sure we have a definition if __STDC__ is not defined +./CWRU/CWRU.chlog: - don't bother with __STDC__ if we are just using C89 features like +./lib/intl/explodename.c:# if defined __STDC__ && __STDC__ +./lib/intl/gmo.h:#if __STDC__ +./lib/intl/gettextP.h:# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +./lib/intl/loadinfo.h:# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:# if defined (__STDC__) || defined (__cplusplus) +./lib/intl/plural.c:#if defined (__STDC__) || defined (__cplusplus) +./lib/intl/localcharset.c:#if __STDC__ != 1 +./lib/intl/l10nflist.c:# if defined __STDC__ && __STDC__ +./lib/intl/libgnuintl.h.in:# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES +./lib/intl/libgnuintl.h.in:# if __GNUC__ >= 2 && !defined __APPLE_CC__ && (defined __STDC__ || defined __cplusplus) +./lib/readline/histlib.h~:# if !defined (strchr) && !defined (__STDC__) +./lib/readline/histlib.h~:# endif /* !strchr && !__STDC__ */ +./lib/readline/rldefs.h~:#if !defined (strchr) && !defined (__STDC__) +./lib/readline/rldefs.h~:#endif /* !strchr && !__STDC__ */ +./lib/readline/bind.c~:#if !defined (strchr) && !defined (__STDC__) +./lib/readline/bind.c~:#endif /* !strchr && !__STDC__ */ +./lib/readline/parens.c:#if !defined (strchr) && !defined (__STDC__) +./lib/readline/parens.c:#endif /* !strchr && !__STDC__ */ +./lib/readline/complete.c~:#ifdef __STDC__ +./lib/readline/rlstdc.h:# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +./lib/readline/display.c~:#if !defined (strchr) && !defined (__STDC__) +./lib/readline/display.c~:#endif /* !strchr && !__STDC__ */ +./lib/readline/rlstdc.h~:# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) +./lib/readline/rlstdc.h~:#if defined (__STDC__) && defined (HAVE_STDARG_H) +./lib/readline/funmap.c~:#ifdef __STDC__ +./lib/sh/vprint.c:# if defined (__STDC__) +./lib/sh/vprint.c:# endif /* __STDC__ */ +./lib/termcap/grot/ChangeLog: * termcap.h [__STDC__]: Add consts. From Franc,ois Pinard. +./lib/malloc/OLD/ogmalloc.c:#if defined (__GNU_LIBRARY__) || (defined (__STDC__) && __STDC__) +./lib/malloc/OLD/ogmalloc.c:#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) +./lib/malloc/OLD/ogmalloc.c:#if defined (__STDC__) && __STDC__ +./lib/malloc/OLD/omalloc.c:# if defined (__STDC__) +./lib/malloc/OLD/omalloc.c:#if defined (__STDC__) +./lib/malloc/OLD/gmalloc.c:#if __STDC__ +./lib/malloc/OLD/gmalloc.c:#endif /* !__STDC__ */ +./lib/malloc/OLD/old-nmalloc.c:# if defined (__STDC__) +./lib/malloc/OLD/old-nmalloc.c:#if defined (__STDC__) +./lib/malloc/shmalloc.h~:#if defined (__STDC__) +./lib/malloc/alloca.c~:#if __STDC__ +./lib/malloc/imalloc.h~:# if defined (__STDC__) +./lib/malloc/imalloc.h~:# if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus) || defined (PROTOTYPES) +./lib/malloc/xmalloc.c~:#if defined (__STDC__) +./m4/iconv.m4~:#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) +./m4/extern-inline.m4: && !(defined __SUNPRO_C && __STDC__))) \ +./aclocal.m4~:#ifdef __STDC__ +./general.h~:#ifdef __STDC__ +./aclocal.m4:#ifdef __STDC__ diff --git a/general.h b/general.h index 16d7c093..6426c3c6 100644 --- a/general.h +++ b/general.h @@ -150,9 +150,17 @@ typedef struct { #endif /* !__GNUC__ */ /* String comparisons that possibly save a function call each. */ -#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp(a, b) == 0) -#define STREQN(a, b, n) ((n == 0) ? (1) \ - : ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)) +static inline int +STREQ(const char *a, const char *b) +{ + return ((a)[0] == (b)[0] && strcmp(a, b) == 0); +} + +static inline int +STREQN(const char *a, const char *b, size_t n) +{ + return ((n == 0) || ((a)[0] == (b)[0] && strncmp(a, b, n) == 0)); +} /* More convenience definitions that possibly save system or libc calls. */ #define STRLEN(s) (((s) && (s)[0]) ? ((s)[1] ? ((s)[2] ? strlen(s) : 2) : 1) : 0) @@ -177,15 +185,6 @@ typedef struct { } \ } while (0) -/* Function pointers can be declared as (Function *)foo. */ -#if !defined (_FUNCTION_DEF) -# define _FUNCTION_DEF -typedef int Function (); -typedef void VFunction (); -typedef char *CPFunction (); /* no longer used */ -typedef char **CPPFunction (); /* no longer used */ -#endif /* _FUNCTION_DEF */ - #ifndef SH_FUNCTION_TYPEDEF # define SH_FUNCTION_TYPEDEF diff --git a/jobs.c b/jobs.c index 96939855..1e8955bd 100644 --- a/jobs.c +++ b/jobs.c @@ -4148,7 +4148,7 @@ run_sigchld_trap (int nchild) in reverse order of adding. We don't want maybe_set_sigchld_trap () to reference freed memory. */ add_unwind_protect (xfree, trap_command); - add_unwind_protect (maybe_set_sigchld_trap, trap_command); + add_unwind_protect (uw_maybe_set_sigchld_trap, trap_command); subst_assign_varlist = (WORD_LIST *)NULL; the_pipeline = (PROCESS *)NULL; diff --git a/lib/readline/histexpand.c b/lib/readline/histexpand.c index 78cc25bf..f2eb18f6 100644 --- a/lib/readline/histexpand.c +++ b/lib/readline/histexpand.c @@ -896,7 +896,7 @@ history_expand_internal (const char *string, int start, int qc, int *end_index_p #define ADD_CHAR(c) \ do \ { \ - if (j >= result_len - 1) \ + if ((j + 1) >= result_len) \ result = (char *)xrealloc (result, result_len += 64); \ result[j++] = c; \ result[j] = '\0'; \ diff --git a/lib/readline/mbutil.c b/lib/readline/mbutil.c index 0844e286..93d7b7bc 100644 --- a/lib/readline/mbutil.c +++ b/lib/readline/mbutil.c @@ -482,7 +482,7 @@ _rl_char_value (const char *buf, int ind) if (_rl_utf8locale && UTF8_SINGLEBYTE(buf[ind])) return ((WCHAR_T) buf[ind]); l = strlen (buf); - if (ind >= l - 1) + if (ind + 1 >= l) return ((WCHAR_T) buf[ind]); if (l < ind) /* Sanity check */ l = strlen (buf+ind); diff --git a/lib/readline/rltypedefs.h b/lib/readline/rltypedefs.h index 16365492..b1ffeb05 100644 --- a/lib/readline/rltypedefs.h +++ b/lib/readline/rltypedefs.h @@ -31,17 +31,10 @@ extern "C" { #if !defined (_FUNCTION_DEF) # define _FUNCTION_DEF -#if defined(__GNUC__) || defined(__clang__) typedef int Function () __attribute__((deprecated)); typedef void VFunction () __attribute__((deprecated)); typedef char *CPFunction () __attribute__((deprecated)); typedef char **CPPFunction () __attribute__((deprecated)); -#else -typedef int Function (); -typedef void VFunction (); -typedef char *CPFunction (); -typedef char **CPPFunction (); -#endif #endif /* _FUNCTION_DEF */ diff --git a/pcomplete.c b/pcomplete.c index b9ca25b1..553623d5 100644 --- a/pcomplete.c +++ b/pcomplete.c @@ -135,7 +135,7 @@ static char *pcomp_filename_completion_function (const char *, int); static SHELL_VAR *bind_comp_words (WORD_LIST *); #endif static void bind_compfunc_variables (char *, int, WORD_LIST *, int, int); -static void unbind_compfunc_variables (int); +static void unbind_compfunc_variables (void *); /* XXX uw_ */ static WORD_LIST *build_arg_list (const char *, const char *, const char *, WORD_LIST *, int); static WORD_LIST *command_line_to_word_list (char *, int, int, int *, int *); @@ -982,7 +982,7 @@ bind_compfunc_variables (char *line, int ind, WORD_LIST *lwords, int cw, int exp } static void -unbind_compfunc_variables (int exported) +unbind_compfunc_variables (void *exported) { unbind_variable_noref ("COMP_LINE"); unbind_variable_noref ("COMP_POINT"); @@ -1035,6 +1035,18 @@ build_arg_list (const char *cmd, const char *cname, const char *text, WORD_LIST return ret; } +static void +uw_restore_parser_state (void *ps) +{ + restore_parser_state (ps); +} + +static void +uw_rl_set_signals (void *ignore) +{ + rl_set_signals (); +} + /* Build a command string with $0 == cs->funcname (function to execute for completion list) $1 == command name (command being completed) @@ -1091,12 +1103,12 @@ gen_shell_function_matches (COMPSPEC *cs, const char *cmd, const char *text, pps = &ps; save_parser_state (pps); begin_unwind_frame ("gen-shell-function-matches"); - add_unwind_protect (restore_parser_state, (char *)pps); - add_unwind_protect (dispose_words, (char *)cmdlist); - add_unwind_protect (unbind_compfunc_variables, (char *)0); + add_unwind_protect (uw_restore_parser_state, pps); + add_unwind_protect (uw_dispose_words, cmdlist); + add_unwind_protect (unbind_compfunc_variables, NULL); if (local_compgen == 0) { - add_unwind_protect (rl_set_signals, (char *)NULL); + add_unwind_protect (uw_rl_set_signals, (char *)NULL); rl_clear_signals (); } @@ -1206,7 +1218,7 @@ gen_command_matches (COMPSPEC *cs, const char *cmd, const char *text, /* Now clean up and destroy everything. */ dispose_words (cmdlist); free (cscmd); - unbind_compfunc_variables (1); + unbind_compfunc_variables (""); if (csbuf == 0 || *csbuf == '\0') { @@ -1227,7 +1239,7 @@ gen_command_matches (COMPSPEC *cs, const char *cmd, const char *text, we++; } t = substring (csbuf, ws, we); - if (sl->list_len >= sl->list_size - 1) + if (sl->list_len + 1 >= sl->list_size) strlist_resize (sl, sl->list_size + 16); sl->list[sl->list_len++] = t; while (csbuf[we] == '\n') we++; diff --git a/print_cmd.c b/print_cmd.c index 2410b8a2..f7fca28c 100644 --- a/print_cmd.c +++ b/print_cmd.c @@ -57,7 +57,8 @@ typedef void PFUNC (const char *, ...); static void cprintf (const char *, ...) __attribute__((__format__ (printf, 1, 2))); static void xprintf (const char *, ...) __attribute__((__format__ (printf, 1, 2))); -static void reset_locals (void); +static void uw_reset_locals (void *); + static void newline (char *); static void indent (int); static void semicolon (void); @@ -93,6 +94,11 @@ static void print_cond_node (COND_COM *); #endif static void print_function_def (FUNCTION_DEF *); +#ifdef DEBUG +void debug_print_word_list (char *, WORD_LIST *, char *); +void debug_print_cond_command (COND_COM *); +#endif + #define PRINTED_COMMAND_INITIAL_SIZE 64 #define PRINTED_COMMAND_GROW_SIZE 128 @@ -1241,7 +1247,7 @@ print_redirection (REDIRECT *redirect) } static void -reset_locals (void) +uw_reset_locals (void *ignore) { inside_function_def = 0; indentation = 0; @@ -1267,7 +1273,7 @@ print_function_def (FUNCTION_DEF *func) cprintf ("%s () \n", func->name->word); begin_unwind_frame ("function-def"); - add_unwind_protect (reset_locals, 0); + add_unwind_protect (uw_reset_locals, 0); indent (indentation); cprintf ("{ \n"); /* } */ diff --git a/subst.c b/subst.c index 2ff9b7c2..3c16749c 100644 --- a/subst.c +++ b/subst.c @@ -732,7 +732,7 @@ sub_append_string (char *source, char *target, size_t *indx, size_t *size) size_t n, srclen; srclen = STRLEN (source); - if (srclen >= (*size - *indx)) + if ((srclen + *indx) >= *size) { n = srclen + *indx; n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE); @@ -6028,7 +6028,7 @@ static pid_t *dev_fd_list = (pid_t *)NULL; static int nfds; static int totfds; /* The highest possible number of open files. */ -void +static void clear_fifo (int i) { if (dev_fd_list[i]) @@ -6960,7 +6960,7 @@ command_substitute (char *string, int quoted, int flags) begin_unwind_frame ("read-comsub"); dummyfd = fildes[0]; - add_unwind_protect (close, dummyfd); + add_unwind_protect (uw_close, (void *) (intptr_t) dummyfd); /* Block SIGINT while we're reading from the pipe. If the child process gets a SIGINT, it will either handle it or die, and the diff --git a/tests/assoc.right b/tests/assoc.right index bb4a1ba5..8cf91f95 100644 --- a/tests/assoc.right +++ b/tests/assoc.right @@ -283,7 +283,7 @@ declare -A assoc=(["*"]="star" ["!"]="bang" ["@"]="at" ) at star declare -A a=(["@"]="at" ) -./assoc13.sub: line 22: ia[@]: bad array subscript +./assoc13.sub: line 35: ia[@]: bad array subscript declare -a ia declare -A a=(["@"]="at2" ) declare -A a=(["@"]=" string" ) diff --git a/tests/assoc13.sub b/tests/assoc13.sub index 7e669727..ae651677 100644 --- a/tests/assoc13.sub +++ b/tests/assoc13.sub @@ -1,3 +1,16 @@ +# This program 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. +# +# This program 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 this program. If not, see . +# # assignment to @ and * declare -A assoc @@ -41,4 +54,3 @@ declare a[*]=star2 declare -p a unset a - diff --git a/trap.c b/trap.c index 07e7ddec..fd771cb8 100644 --- a/trap.c +++ b/trap.c @@ -652,10 +652,10 @@ set_sigchld_trap (const char *command_string) reset the disposition to the default and not have the original signal accidentally restored, undoing the user's command. */ void -maybe_set_sigchld_trap (const char *command_string) +uw_maybe_set_sigchld_trap (void *command_string) { if ((sigmodes[SIGCHLD] & SIG_TRAPPED) == 0 && trap_list[SIGCHLD] == (char *)IMPOSSIBLE_TRAP_HANDLER) - set_signal (SIGCHLD, command_string); + set_signal (SIGCHLD, (const char *)command_string); } /* Temporarily set the SIGCHLD trap string to IMPOSSIBLE_TRAP_HANDLER. Used @@ -666,7 +666,7 @@ set_impossible_sigchld_trap (void) { restore_default_signal (SIGCHLD); change_signal (SIGCHLD, (char *)IMPOSSIBLE_TRAP_HANDLER); - sigmodes[SIGCHLD] &= ~SIG_TRAPPED; /* maybe_set_sigchld_trap checks this */ + sigmodes[SIGCHLD] &= ~SIG_TRAPPED; /* uw_maybe_set_sigchld_trap checks this */ } /* Act as if we received SIGCHLD NCHILD times and increment @@ -705,7 +705,7 @@ set_debug_trap (const char *command) SIG_TRAPPED will be set and we don't bother restoring the original trap string. This is used by both functions and the source builtin. */ void -maybe_set_debug_trap (const char *command) +uw_maybe_set_debug_trap (void *command) { trap_if_untrapped (DEBUG_TRAP, command); } @@ -717,7 +717,13 @@ set_error_trap (const char *command) } void -maybe_set_error_trap (const char *command) +uw_set_error_trap (void *command) +{ + set_error_trap (command); +} + +void +uw_maybe_set_error_trap (void *command) { trap_if_untrapped (ERROR_TRAP, command); } @@ -729,7 +735,7 @@ set_return_trap (const char *command) } void -maybe_set_return_trap (const char *command) +uw_maybe_set_return_trap (void *command) { trap_if_untrapped (RETURN_TRAP, command); } diff --git a/trap.h b/trap.h index e031e5fe..82a3c651 100644 --- a/trap.h +++ b/trap.h @@ -73,7 +73,6 @@ extern void initialize_traps (void); extern void run_pending_traps (void); extern void queue_sigchld_trap (int); -extern void maybe_set_sigchld_trap (const char *); extern void set_impossible_sigchld_trap (void); extern void set_sigchld_trap (const char *); @@ -81,9 +80,11 @@ extern void set_debug_trap (const char *); extern void set_error_trap (const char *); extern void set_return_trap (const char *); -extern void maybe_set_debug_trap (const char *); -extern void maybe_set_error_trap (const char *); -extern void maybe_set_return_trap (const char *); +extern void uw_set_error_trap (void *); +extern void uw_maybe_set_sigchld_trap (void *); +extern void uw_maybe_set_debug_trap (void *); +extern void uw_maybe_set_error_trap (void *); +extern void uw_maybe_set_return_trap (void *); extern void set_sigint_trap (const char *); extern void set_signal (int, const char *); diff --git a/unwind_prot.c b/unwind_prot.c index c0d384fe..da9218ba 100644 --- a/unwind_prot.c +++ b/unwind_prot.c @@ -65,11 +65,11 @@ typedef struct { typedef union uwp { struct uwp_head { union uwp *next; - Function *cleanup; + sh_uwfunc_t *cleanup; } head; struct { struct uwp_head uwp_head; - char *v; + void *v; } arg; struct { struct uwp_head uwp_head; @@ -79,12 +79,12 @@ typedef union uwp { static void unwind_frame_discard_internal (char *); static void unwind_frame_run_internal (char *); -static void add_unwind_protect_internal (Function *, char *); +static void add_unwind_protect_internal (sh_uwfunc_t *, void *); static void remove_unwind_protect_internal (void); static void run_unwind_protects_internal (void); static void clear_unwind_protects_internal (int); -static inline void restore_variable (SAVED_VAR *); -static void unwind_protect_mem_internal (char *, char *); +static inline void restore_variable (void *); +static void unwind_protect_mem_internal (void *, int); static UNWIND_ELT *unwind_protect_list = (UNWIND_ELT *)NULL; @@ -132,7 +132,7 @@ run_unwind_frame (char *tag) /* Add the function CLEANUP with ARG to the list of unwindable things. */ void -add_unwind_protect (Function *cleanup, char *arg) +add_unwind_protect (sh_uwfunc_t *cleanup, void *arg) { add_unwind_protect_internal (cleanup, arg); } @@ -189,7 +189,7 @@ unwind_protect_tag_on_stack (const char *tag) /* **************************************************************** */ static void -add_unwind_protect_internal (Function *cleanup, char *arg) +add_unwind_protect_internal (sh_uwfunc_t *cleanup, void *arg) { UNWIND_ELT *elt; @@ -258,8 +258,10 @@ unwind_frame_discard_internal (char *tag) sv->desired_setting is a block of memory SIZE bytes long holding the value itself. This block of memory is copied back into the variable. */ static inline void -restore_variable (SAVED_VAR *sv) +restore_variable (void *arg) { + SAVED_VAR *sv; + sv = arg; FASTCOPY (sv->desired_setting, sv->variable, sv->size); } @@ -286,7 +288,7 @@ unwind_frame_run_internal (char *tag) } else { - if (elt->head.cleanup == (Function *) restore_variable) + if (elt->head.cleanup == restore_variable) restore_variable (&elt->sv.v); else (*(elt->head.cleanup)) (elt->arg.v); @@ -299,19 +301,17 @@ unwind_frame_run_internal (char *tag) } static void -unwind_protect_mem_internal (char *var, char *psize) +unwind_protect_mem_internal (void *var, int size) { - int size; size_t allocated; UNWIND_ELT *elt; - size = *(int *) psize; allocated = size + offsetof (UNWIND_ELT, sv.v.desired_setting[0]); if (allocated < sizeof (UNWIND_ELT)) allocated = sizeof (UNWIND_ELT); elt = (UNWIND_ELT *)xmalloc (allocated); elt->head.next = unwind_protect_list; - elt->head.cleanup = (Function *) restore_variable; + elt->head.cleanup = restore_variable; elt->sv.v.variable = var; elt->sv.v.size = size; FASTCOPY (var, elt->sv.v.desired_setting, size); @@ -324,7 +324,7 @@ unwind_protect_mem_internal (char *var, char *psize) void unwind_protect_mem (char *var, int size) { - unwind_protect_mem_internal (var, (char *) &size); + unwind_protect_mem_internal (var, size); } #if defined (DEBUG) @@ -339,7 +339,7 @@ print_unwind_protect_tags (void) while (elt) { if (elt->head.cleanup == 0) - fprintf(stderr, "tag: %s\n", elt->arg.v); + fprintf(stderr, "tag: %s\n", (char *)elt->arg.v); elt = elt->head.next; } } diff --git a/unwind_prot.h b/unwind_prot.h index 27fb8206..3236f294 100644 --- a/unwind_prot.h +++ b/unwind_prot.h @@ -35,7 +35,7 @@ extern void uwp_init (void); extern void begin_unwind_frame (char *); extern void discard_unwind_frame (char *); extern void run_unwind_frame (char *); -extern void add_unwind_protect (); /* Not portable to arbitrary C99 hosts. */ +extern void add_unwind_protect (sh_uwfunc_t *, void *); extern void remove_unwind_protect (void); extern void run_unwind_protects (void); extern void clear_unwind_protect_list (int); diff --git a/variables.c b/variables.c index 1d67cc8c..868b34b0 100644 --- a/variables.c +++ b/variables.c @@ -5330,7 +5330,7 @@ push_exported_var (PTR_T data) variables in its temporary environment. In the first case, we call push_builtin_var, which does the right thing. */ void -pop_scope (int is_special) +pop_scope (void *is_special) { VAR_CONTEXT *vcxt, *ret; int is_bltinenv; @@ -5354,7 +5354,7 @@ pop_scope (int is_special) FREE (vcxt->name); if (vcxt->table) { - if (is_special) + if ((intptr_t) is_special) hash_flush (vcxt->table, push_builtin_var); else hash_flush (vcxt->table, push_exported_var); @@ -5453,7 +5453,7 @@ push_context (char *name, int is_subshell, HASH_TABLE *tempvars) /* Only called when subshell == 0, so we don't need to check, and can unconditionally pop the dollar vars off the stack. */ void -pop_context (void) +pop_context (void *ignore) { pop_dollar_vars (); variable_context--; @@ -5592,6 +5592,12 @@ pop_args (void) #endif /* ARRAY_VARS && DEBUGGER */ } +void +uw_pop_args (void *ignore) +{ + pop_args (); +} + /************************************************* * * * Functions to manage special variables * diff --git a/variables.h b/variables.h index 1616d455..f469a3f3 100644 --- a/variables.h +++ b/variables.h @@ -345,12 +345,12 @@ extern void dispose_var_context (VAR_CONTEXT *); extern VAR_CONTEXT *push_var_context (char *, int, HASH_TABLE *); extern void pop_var_context (void); extern VAR_CONTEXT *push_scope (int, HASH_TABLE *); -extern void pop_scope (int); +extern void pop_scope (void *); /* XXX uw_ */ extern void clear_dollar_vars (void); extern void push_context (char *, int, HASH_TABLE *); -extern void pop_context (void); +extern void pop_context (void *); /* XXX uw_ */ extern void push_dollar_vars (void); extern void pop_dollar_vars (void); extern void dispose_saved_dollar_vars (void); @@ -359,6 +359,7 @@ extern void init_bash_argv (void); extern void save_bash_argv (void); extern void push_args (WORD_LIST *); extern void pop_args (void); +extern void uw_pop_args (void *); extern void adjust_shell_level (int); extern void non_unsettable (char *); @@ -367,6 +368,7 @@ extern void dispose_used_env_vars (void); extern void dispose_function_env (void); extern void dispose_builtin_env (void); extern void merge_temporary_env (void); +extern void merge_function_temporary_env (void); extern void flush_temporary_env (void); extern void merge_builtin_env (void); extern void kill_all_local_variables (void);