Fixed win32 troubles with f.readsome()
authorClifford Wolf <clifford@clifford.at>
Sat, 11 Oct 2014 09:36:22 +0000 (11:36 +0200)
committerClifford Wolf <clifford@clifford.at>
Sat, 11 Oct 2014 09:36:22 +0000 (11:36 +0200)
frontends/ilang/lexer.l
frontends/verilog/lexer.l
frontends/verilog/preproc.cc
kernel/yosys.cc
kernel/yosys.h
passes/cmds/write_file.cc

index 292321e88f6e653ecd8d9de03ffba4118a832c36..9669f09240cd0ea4100edc0614eea7c713e17d47 100644 (file)
@@ -35,7 +35,7 @@
 USING_YOSYS_NAMESPACE
 
 #define YY_INPUT(buf,result,max_size) \
-        result = ILANG_FRONTEND::lexin->readsome(buf, max_size);
+        result = readsome(*ILANG_FRONTEND::lexin, buf, max_size);
 
 %}
 
index c9302aba83070e987ea7973accb7e0db2b4f053d..98f36088556268233dd3504c13860a39ad6fa6f4 100644 (file)
@@ -64,7 +64,7 @@ YOSYS_NAMESPACE_END
        return TOK_ID;
 
 #define YY_INPUT(buf,result,max_size) \
-       result = lexin->readsome(buf, max_size);
+       result = readsome(*lexin, buf, max_size);
 
 %}
 
index 7e14fcb84de71f4cfa5a448beedbe26e34e9d662..b4e77c31bf53af4c3c5c2dc53f252a354fd61303 100644 (file)
@@ -202,7 +202,7 @@ static void input_file(std::istream &f, std::string filename)
        auto it = input_buffer.begin();
 
        input_buffer.insert(it, "`file_push " + filename + "\n");
-       while ((rc = f.readsome(buffer, sizeof(buffer)-1)) > 0) {
+       while ((rc = readsome(f, buffer, sizeof(buffer)-1)) > 0) {
                buffer[rc] = 0;
                input_buffer.insert(it, buffer);
        }
index 921f2b3838d887acf9adbdd1b1e53c3ea8b8c9f5..a40ad4372fb4ad5b300c64bb3839b551f2ede86b 100644 (file)
@@ -166,6 +166,22 @@ bool patmatch(const char *pattern, const char *string)
        return false;
 }
 
+int readsome(std::istream &f, char *s, int n)
+{
+       int rc = f.readsome(s, n);
+
+       // win32 sometimes returns 0 on a non-empty stream..
+       if (rc == 0) {
+               int c = f.get();
+               if (c != EOF) {
+                       *s = c;
+                       rc = 1;
+               }
+       }
+
+       return rc;
+}
+
 int GetSize(RTLIL::Wire *wire)
 {
        return wire->width;
index 919e3bb984fe0788d7705e718ef226759f9d5e5c..d38e60ceba53170b8a8d01638710ef3ab7e76c61 100644 (file)
@@ -86,6 +86,7 @@ std::string stringf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))
 std::string vstringf(const char *fmt, va_list ap);
 std::string next_token(std::string &text, const char *sep);
 bool patmatch(const char *pattern, const char *string);
+int readsome(std::istream &f, char *s, int n);
 
 template<typename T> int GetSize(const T &obj) { return obj.size(); }
 int GetSize(RTLIL::Wire *wire);
index 9f22861a5055df54a0398fd8c49d671690651216..3f441972420d8086d0e7a5c2cdc0e5053e4c320b 100644 (file)
@@ -70,7 +70,7 @@ struct WriteFileFrontend : public Frontend {
                char buffer[64 * 1024];
                size_t bytes;
 
-               while (0 < (bytes = f->readsome(buffer, sizeof(buffer))))
+               while (0 < (bytes = readsome(*f, buffer, sizeof(buffer))))
                        fwrite(buffer, bytes, 1, of);
 
                fclose(of);