Re-introduced Yosys::readsome() helper function
authorClifford Wolf <clifford@clifford.at>
Thu, 23 Oct 2014 08:47:21 +0000 (10:47 +0200)
committerClifford Wolf <clifford@clifford.at>
Thu, 23 Oct 2014 08:58:36 +0000 (10:58 +0200)
(f.read() + f.gcount() made problems with lines > 16kB)

frontends/ilang/ilang_lexer.l
frontends/verilog/preproc.cc
frontends/verilog/verilog_lexer.l
kernel/yosys.cc
kernel/yosys.h
passes/cmds/write_file.cc

index dcbc6b6d70f5f1403b6ad8e9ae7e214d73b35993..ace992fbd74ff40fc34661c03407a88adb1498ab 100644 (file)
 USING_YOSYS_NAMESPACE
 
 #define YY_INPUT(buf,result,max_size) \
-       do { \
-               ILANG_FRONTEND::lexin->read(buf, max_size-1); \
-               result = ILANG_FRONTEND::lexin->gcount(); \
-               if (result >= 0) buf[result] = '\0'; \
-       } while (0)
+       result = readsome(*ILANG_FRONTEND::lexin, buf, max_size)
 
 %}
 
index da658410d4993a35aa8a99d57fcc555c6d687bc0..b4e77c31bf53af4c3c5c2dc53f252a354fd61303 100644 (file)
@@ -196,16 +196,14 @@ static std::string next_token(bool pass_newline = false)
 static void input_file(std::istream &f, std::string filename)
 {
        char buffer[513];
+       int rc;
 
        insert_input("");
        auto it = input_buffer.begin();
 
        input_buffer.insert(it, "`file_push " + filename + "\n");
-       while (1) {
-               f.read(buffer, sizeof(buffer)-1);
-               if (f.gcount() <= 0)
-                       break;
-               buffer[f.gcount()] = 0;
+       while ((rc = readsome(f, buffer, sizeof(buffer)-1)) > 0) {
+               buffer[rc] = 0;
                input_buffer.insert(it, buffer);
        }
        input_buffer.insert(it, "\n`file_pop\n");
index 0d28e2e7fcfe05c9311dafba7ccd809568972d62..ae16ebf78021ea34e203ec34c840001ca9dc7268 100644 (file)
@@ -64,11 +64,7 @@ YOSYS_NAMESPACE_END
        return TOK_ID;
 
 #define YY_INPUT(buf,result,max_size) \
-       do { \
-               lexin->read(buf, max_size-1); \
-               result = lexin->gcount(); \
-               if (result >= 0) buf[result] = '\0'; \
-       } while (0)
+       result = readsome(*VERILOG_FRONTEND::lexin, buf, max_size)
 
 %}
 
index ad0aa5a6d5e7b657e839c009e72d5c3978179255..d4365ee00ee403602f9f179f120dc9301faa5ac2 100644 (file)
@@ -97,6 +97,22 @@ std::string vstringf(const char *fmt, va_list ap)
        return string;
 }
 
+int readsome(std::istream &f, char *s, int n)
+{
+       int rc = f.readsome(s, n);
+
+       // f.readsome() sometimes returns 0 on a non-empty stream..
+       if (rc == 0) {
+               int c = f.get();
+               if (c != EOF) {
+                       *s = c;
+                       rc = 1;
+               }
+       }
+
+       return rc;
+}
+
 std::string next_token(std::string &text, const char *sep)
 {
        size_t pos_begin = text.find_first_not_of(sep);
index b9182c1dfd85f3fbcea27c83a66de2b1dc401943..11f356adcaed6353cafb3922656da904c02eb514 100644 (file)
@@ -127,6 +127,7 @@ namespace RTLIL {
 
 std::string stringf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
 std::string vstringf(const char *fmt, va_list ap);
+int readsome(std::istream &f, char *s, int n);
 std::string next_token(std::string &text, const char *sep);
 bool patmatch(const char *pattern, const char *string);
 int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>());
index 9bf1a75a8803eecae4642abf0d5fff41cc410f3b..25ec4acc2cc14342753a00769d27683cc9c17d01 100644 (file)
@@ -68,13 +68,10 @@ struct WriteFileFrontend : public Frontend {
 
                FILE *of = fopen(output_filename.c_str(), append_mode ? "a" : "w");
                char buffer[64 * 1024];
+               int bytes;
 
-               while (1) {
-                       f->read(buffer, sizeof(buffer));
-                       if (f->gcount() <= 0)
-                               break;
-                       fwrite(buffer, f->gcount(), 1, of);
-               }
+               while (0 < (bytes = readsome(*f, buffer, sizeof(buffer))))
+                       fwrite(buffer, bytes, 1, of);
 
                fclose(of);
        }