X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginsh%2Fginsh_lexer.ll;h=293e46b5c15aeb41d810d4332ea068cff99db83a;hp=51076f9ace5fd54a9d7b28cc3e598257e0712f47;hb=a6bb52b00bf185271774e7d56215923700a3ec40;hpb=4ea0576bb1199004d3a4ecbe4fd906301a5bad64 diff --git a/ginsh/ginsh_lexer.ll b/ginsh/ginsh_lexer.ll index 51076f9a..293e46b5 100644 --- a/ginsh/ginsh_lexer.ll +++ b/ginsh/ginsh_lexer.ll @@ -28,16 +28,7 @@ %{ #include "config.h" -#include -extern "C" { -#include -#include -} -#include - -#include #include "ginsh.h" - #include "ginsh_parser.h" #define YY_INPUT(buf, result, max_size) (result = ginsh_input(buf, max_size)) @@ -131,9 +122,9 @@ static int ginsh_input(char *buf, int max_size) { int result; if (yy_current_buffer->yy_is_interactive) { - int actual; - +#ifdef HAVE_LIBREADLINE // Do we need to read a new line? + int actual; if (line_length == 0) { // Free old line @@ -164,15 +155,44 @@ static int ginsh_input(char *buf, int max_size) line_length -= actual; line_ptr += actual; result = actual; - +#else + printf("> "); fflush(stdout); + int c = '*', n; + for (n = 0; n < max_size && (c = getc(yyin)) != EOF && c != '\n'; ++n) + buf[n] = (char)c; + if (c == '\n') + buf[n++] = (char)c; + if (c == EOF && ferror(yyin)) + YY_FATAL_ERROR("input in flex scanner failed"); + result = n; +#endif } else if (((result = fread(buf, 1, max_size, yyin)) == 0) && ferror(yyin)) YY_FATAL_ERROR("input in flex scanner failed"); return result; } -// Scanner terminates on EOF +// List of input files to be processed +int num_files = 0; +char **file_list = NULL; + +// EOF encountered, connect to next file. If this was the last file, +// connect to stdin. If this was stdin, terminate the scanner. int yywrap() { - return 1; + if (yyin == stdin) + return 1; + + fclose(yyin); + if (num_files) { + yyin = fopen(*file_list, "r"); + if (yyin == NULL) { + cerr << "Can't open " << *file_list << endl; + return 1; + } + num_files--; + file_list++; + } else + yyin = stdin; + return 0; }