Commit a patch by Larry Doolittle which fixes recursive calls to file_peek,
authorMatt Kraai <kraai@debian.org>
Wed, 23 May 2001 17:43:00 +0000 (17:43 -0000)
committerMatt Kraai <kraai@debian.org>
Wed, 23 May 2001 17:43:00 +0000 (17:43 -0000)
and improves some debugging messages.

hush.c
shell/hush.c

diff --git a/hush.c b/hush.c
index 40787a4647011fae764bd19c812fc50f644f42ae..0dc2d62f87e9775224722a79dfdbcd13f61d3c70 100644 (file)
--- a/hush.c
+++ b/hush.c
@@ -278,6 +278,7 @@ typedef struct {
  * available?  Where is it documented? */
 struct in_str {
        const char *p;
+       char peek_buf[2];
        int __promptme;
        int promptmode;
        FILE *file;
@@ -932,12 +933,11 @@ static int file_peek(struct in_str *i)
        if (i->p && *i->p) {
                return *i->p;
        } else {
-               static char buffer[2];
-               buffer[0] = fgetc(i->file);
-               buffer[1] = '\0';
-               i->p = buffer;
+               i->peek_buf[0] = fgetc(i->file);
+               i->peek_buf[1] = '\0';
+               i->p = i->peek_buf;
                debug_printf("b_peek: got a %d\n", *i->p);
-               return *i->p; 
+               return *i->p;
        }
 }
 
@@ -1513,8 +1513,8 @@ static int run_list_real(struct pipe *pi)
                                        perror_msg("tcsetpgrp-4");
                        } else {
                                rcode = pipe_wait(pi);
-                               debug_printf("pipe_wait returned %d\n",rcode);
                        }
+                       debug_printf("pipe_wait returned %d\n",rcode);
                }
                last_return_code=rcode;
                if ( rmode == RES_IF || rmode == RES_ELIF )
@@ -2347,7 +2347,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
                                        done_pipe(ctx,PIPE_SEQ);
                        }
                        if (ch == end_trigger && !dest->quote && ctx->w==RES_NONE) {
-                               debug_printf("leaving parse_stream\n");
+                               debug_printf("leaving parse_stream (triggered)\n");
                                return 0;
                        }
 #if 0
@@ -2471,6 +2471,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
         * that is, we were really supposed to get end_trigger, and never got
         * one before the EOF.  Can't use the standard "syntax error" return code,
         * so that parse_stream_outer can distinguish the EOF and exit smoothly. */
+       debug_printf("leaving parse_stream (EOF)\n");
        if (end_trigger != '\0') return -1;
        return 0;
 }
index 40787a4647011fae764bd19c812fc50f644f42ae..0dc2d62f87e9775224722a79dfdbcd13f61d3c70 100644 (file)
@@ -278,6 +278,7 @@ typedef struct {
  * available?  Where is it documented? */
 struct in_str {
        const char *p;
+       char peek_buf[2];
        int __promptme;
        int promptmode;
        FILE *file;
@@ -932,12 +933,11 @@ static int file_peek(struct in_str *i)
        if (i->p && *i->p) {
                return *i->p;
        } else {
-               static char buffer[2];
-               buffer[0] = fgetc(i->file);
-               buffer[1] = '\0';
-               i->p = buffer;
+               i->peek_buf[0] = fgetc(i->file);
+               i->peek_buf[1] = '\0';
+               i->p = i->peek_buf;
                debug_printf("b_peek: got a %d\n", *i->p);
-               return *i->p; 
+               return *i->p;
        }
 }
 
@@ -1513,8 +1513,8 @@ static int run_list_real(struct pipe *pi)
                                        perror_msg("tcsetpgrp-4");
                        } else {
                                rcode = pipe_wait(pi);
-                               debug_printf("pipe_wait returned %d\n",rcode);
                        }
+                       debug_printf("pipe_wait returned %d\n",rcode);
                }
                last_return_code=rcode;
                if ( rmode == RES_IF || rmode == RES_ELIF )
@@ -2347,7 +2347,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
                                        done_pipe(ctx,PIPE_SEQ);
                        }
                        if (ch == end_trigger && !dest->quote && ctx->w==RES_NONE) {
-                               debug_printf("leaving parse_stream\n");
+                               debug_printf("leaving parse_stream (triggered)\n");
                                return 0;
                        }
 #if 0
@@ -2471,6 +2471,7 @@ int parse_stream(o_string *dest, struct p_context *ctx,
         * that is, we were really supposed to get end_trigger, and never got
         * one before the EOF.  Can't use the standard "syntax error" return code,
         * so that parse_stream_outer can distinguish the EOF and exit smoothly. */
+       debug_printf("leaving parse_stream (EOF)\n");
        if (end_trigger != '\0') return -1;
        return 0;
 }