=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/lex.c,v retrieving revision 1.9 retrieving revision 1.15 diff -u -p -r1.9 -r1.15 --- OpenXM_contrib2/asir2000/parse/lex.c 2000/12/05 01:51:35 1.9 +++ OpenXM_contrib2/asir2000/parse/lex.c 2001/06/04 02:49:48 1.15 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/parse/lex.c,v 1.8 2000/12/05 01:24:57 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/lex.c,v 1.14 2001/03/08 07:49:13 noro Exp $ */ #include #include "ca.h" @@ -54,7 +54,11 @@ #include "parse.h" #include #include +#if defined(VISUAL) +#include "ytab.h" +#else #include "y.tab.h" +#endif extern IN asir_infile; extern struct oTKWD kwd[]; @@ -65,6 +69,7 @@ int aftercomment(); extern int main_parser; extern char *parse_strp; +extern int recv_intr; static int skipspace(); static int Getc(); @@ -404,10 +409,12 @@ void purge_stdin() #elif defined(linux) stdin->_IO_read_end = stdin->_IO_read_base; stdin->_IO_read_ptr = stdin->_IO_read_base; -#elif defined(sparc) || defined(__alpha) || defined(__SVR4) || defined(mips) - stdin->_ptr = stdin->_base; stdin->_cnt = 0; -#elif defined(VISUAL) +#elif defined(VISUAL_LIB) w_purge_stdin(); +#elif defined(sparc) || defined(__alpha) || defined(__SVR4) || defined(mips) || defined(VISUAL) + stdin->_ptr = stdin->_base; stdin->_cnt = 0; +#elif defined(__MACH__) && defined(__ppc__) + stdin->_r = 0; stdin->_p = stdin->_bf._base; #else --->FIXIT #endif @@ -418,7 +425,7 @@ static int skipspace() { for ( c = Getc(); ; ) switch ( c ) { - case ' ': case '\t': + case ' ': case '\t': case '\r': c = Getc(); break; case '\n': c = afternl(); break; @@ -518,7 +525,24 @@ FILE *fp; int c; if ( fp ) { - c = getc(fp); +#if FEP + if ( do_fep && isatty(fileno(fp)) ) + c = readline_getc(); + else +#endif + c = getc(fp); +#if defined(VISUAL) + if ( recv_intr ) { +#include + if ( recv_intr == 1 ) { + recv_intr = 0; + int_handler(SIGINT); + } else { + recv_intr = 0; + ox_usr1_handler(0); + } + } +#endif if ( c == EOF ) return c; if ( asir_infile->encoded ) @@ -542,7 +566,12 @@ FILE *fp; if ( fp ) { if ( asir_infile->encoded ) c = (int)encrypt_char((unsigned char)c); - ungetc(c,fp); +#if FEP + if ( do_fep && isatty(fileno(fp)) ) + readline_ungetc(); + else +#endif + ungetc(c,fp); } else *--parse_strp = c; } @@ -595,3 +624,58 @@ char *s; *s++ = c; *s = 0; } + +#if FEP + +static char *readline_line; +static int readline_nc,readline_index; +char *readline_console(); + +int readline_getc() +{ + char buf[BUFSIZ]; + + if ( !readline_nc ) { + if ( readline_line ) + free(readline_line); + sprompt(buf); + readline_line = readline_console(buf); + readline_nc = strlen(readline_line); + readline_index = 0; + } + readline_nc--; + return readline_line[readline_index++]; +} + +void readline_ungetc() +{ + readline_nc++; readline_index--; +} + +char *readline_console(prompt) +char *prompt; +{ + char *line; + int exp_result; + char *expansion; + + while ( 1 ) { + line = (char *)readline(prompt); + if ( line && *line ) { + using_history(); + exp_result = history_expand(line,&expansion); + if ( !exp_result ) { + free(expansion); + for ( ; isspace(*line); line++ ); + add_history(line); + break; + } else if ( exp_result > 0 ) { + free(line); + line = expansion; + break; + } + } + } + return line; +} +#endif