=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/parse/lex.c,v retrieving revision 1.11 retrieving revision 1.17 diff -u -p -r1.11 -r1.17 --- OpenXM_contrib2/asir2000/parse/lex.c 2000/12/18 01:28:27 1.11 +++ OpenXM_contrib2/asir2000/parse/lex.c 2001/09/03 07:01:10 1.17 @@ -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.10 2000/12/06 01:27:16 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/parse/lex.c,v 1.16 2001/06/15 07:56:06 noro Exp $ */ #include #include "ca.h" @@ -369,6 +369,8 @@ yylex() Ungetc(c); REALLOC_TBUF tbuf[i] = 0; if ( !strcmp(tbuf,"@p") ) return GFPNGEN; + else if ( !strcmp(tbuf,"@s") ) + return GFSNGEN; else if ( !strcmp(tbuf,"@i") ) { extern pointer IU; @@ -411,8 +413,10 @@ void purge_stdin() stdin->_IO_read_ptr = stdin->_IO_read_base; #elif defined(VISUAL_LIB) w_purge_stdin(); -#elif defined(sparc) || defined(__alpha) || defined(__SVR4) || defined(mips) || defined(VISUAL) +#elif defined(sparc) || defined(__alpha) || defined(__SVR4) || defined(mips) || defined(VISUAL) || defined(_IBMR2) stdin->_ptr = stdin->_base; stdin->_cnt = 0; +#elif defined(__MACH__) && defined(__ppc__) + stdin->_r = 0; stdin->_p = stdin->_bf._base; #else --->FIXIT #endif @@ -423,7 +427,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; @@ -523,7 +527,12 @@ 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 @@ -559,7 +568,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; } @@ -612,3 +626,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