chip@ateng.ateng.com (Chip Salzenberg) (01/23/90)
Bash 1.04 uses two constructs which cause linkage trouble for some compilers,
in particular the Microsoft compiler provided with SCO Xenix 2.3. These
constructs are:
extern int foo;
func() {
foo = 1;
}
static int foo = 0;
and:
extern int xyzzy();
func() {
xyzzy();
}
static xyzzy() {
printf("hello\n");
}
These constructs are both legal ANSI C, but they confuse compilers of older
vintage. The patches below:
avoid forward references to statically declared objects, and
declare static functions static in all declarations.
Index: builtins.c
***************
*** 1229,1232 ****
--- 1233,1238 ----
WORD_LIST *list;
{
+ extern int interactive;
+
if (!login_shell && interactive)
{
***************
*** 2383,2387 ****
int no_modifiers;
{
! extern int variable_context;
int flags_on = 0, flags_off = 0;
--- 2389,2393 ----
int no_modifiers;
{
! extern int array_needs_making, variable_context;
int flags_on = 0, flags_off = 0;
Index: readline/funmap.c
***************
*** 25,28 ****
--- 25,29 ----
#else
static char *xmalloc (), *xrealloc ();
+ static memory_error_and_abort ();
#endif
***************
*** 183,187 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)malloc (bytes);
--- 184,187 ----
***************
*** 196,200 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)realloc (pointer, bytes);
--- 196,199 ----
Index: readline/history.c
***************
*** 31,34 ****
--- 31,35 ----
#else
static char *xmalloc (), *xrealloc ();
+ static memory_error_and_abort ();
#endif
***************
*** 1350,1354 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)malloc (bytes);
--- 1351,1354 ----
***************
*** 1363,1367 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)realloc (pointer, bytes);
--- 1363,1366 ----
Index: readline/keymaps.c
***************
*** 33,36 ****
--- 33,37 ----
#else
static char *xmalloc (), *xrealloc ();
+ static memory_error_and_abort ();
#endif
***************
*** 143,147 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)malloc (bytes);
--- 144,147 ----
***************
*** 156,160 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)realloc (pointer, bytes);
--- 156,159 ----
Index: readline/readline.c
***************
*** 115,118 ****
--- 119,123 ----
static start_insert ();
static end_insert ();
+ static memory_error_and_abort();
#ifdef VOID_SIGHANDLER
***************
*** 696,703 ****
Keymap map;
{
! extern int defining_kbd_macro;
!
! if (defining_kbd_macro)
! add_macro_char (key);
if (key > 127 && key < 256)
--- 701,705 ----
Keymap map;
{
! add_macro_char (key);
if (key > 127 && key < 256)
***************
*** 879,882 ****
--- 881,887 ----
int c;
{
+ if (!defining_kbd_macro)
+ return;
+
if (current_macro_index + 1 >= current_macro_size)
{
***************
*** 990,997 ****
/* Parsing of key-bindings begins in an enabled state. */
! {
! extern unsigned char parsing_conditionalized_out;
! parsing_conditionalized_out = 0;
! }
}
--- 995,999 ----
/* Parsing of key-bindings begins in an enabled state. */
! parser_enable ();
}
Index: readline/readline.c
***************
*** 1595,1599 ****
{
register int i;
- static void output_character_function ();
/* It may be faster to output a CR, and then move forwards instead
--- 1616,1619 ----
***************
*** 1641,1645 ****
int to;
{
- void output_character_function ();
register int delta, i;
--- 1661,1664 ----
***************
*** 2465,2469 ****
{
extern char *term_clrpag;
- static void output_character_function ();
if (rl_explicit_arg)
--- 2484,2487 ----
***************
*** 2592,2603 ****
#ifdef VI_MODE
! {
! extern int vi_doing_insert;
! if (vi_doing_insert)
! {
! rl_end_undo_group ();
! vi_doing_insert = 0;
! }
! }
#endif /* VI_MODE */
--- 2610,2614 ----
#ifdef VI_MODE
! vi_done_inserting ();
#endif /* VI_MODE */
***************
*** 5026,5029 ****
--- 5037,5045 ----
static int if_stack_size = 0;
+ parser_enable ()
+ {
+ parsing_conditionalized_out = 0;
+ }
+
/* Push parsing_conditionalized_out, and set parser state based on ARGS. */
parser_if (args)
***************
*** 5481,5485 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)malloc (bytes);
--- 5497,5500 ----
***************
*** 5494,5498 ****
int bytes;
{
- static memory_error_and_abort ();
char *temp = (char *)realloc (pointer, bytes);
--- 5509,5512 ----
Index: readline/vi_mode.c
***************
*** 362,365 ****
--- 362,370 ----
keymap = vi_movement_keymap;
+ vi_done_inserting ();
+ }
+
+ vi_done_inserting ()
+ {
if (vi_doing_insert)
{