]> www.ginac.de Git - ginac.git/blobdiff - ginsh/ginsh_lexer.lpp
[BUGFIX] Fix crash in parser.
[ginac.git] / ginsh / ginsh_lexer.lpp
index 000b1333addaa1bda1b725ac253c5fa9aa0bc2d2..449ce6b5c44234dbab7ca977d6142313f9abb36d 100644 (file)
@@ -4,7 +4,7 @@
  *  This file must be processed with flex. */
 
 /*
- *  GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2024 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -38,6 +38,9 @@
 #include "ginsh.h"
 #include "ginsh_parser.hpp"
 
+using namespace std;
+using namespace GiNaC;
+
 #define YY_INPUT(buf, result, max_size) (result = ginsh_input(buf, max_size))
 
 // Table of all used symbols
@@ -200,8 +203,16 @@ static int ginsh_input(char *buf, int max_size)
                        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");
+       } else {
+               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;
+       }
 
        return result;
 }