Re-introduced Yosys::readsome() helper function

(f.read() + f.gcount() made problems with lines > 16kB)
This commit is contained in:
Clifford Wolf 2014-10-23 10:47:21 +02:00
parent 750c615e7f
commit c5eb5e56b8
6 changed files with 25 additions and 21 deletions

View File

@ -35,11 +35,7 @@
USING_YOSYS_NAMESPACE USING_YOSYS_NAMESPACE
#define YY_INPUT(buf,result,max_size) \ #define YY_INPUT(buf,result,max_size) \
do { \ result = readsome(*ILANG_FRONTEND::lexin, buf, max_size)
ILANG_FRONTEND::lexin->read(buf, max_size-1); \
result = ILANG_FRONTEND::lexin->gcount(); \
if (result >= 0) buf[result] = '\0'; \
} while (0)
%} %}

View File

@ -196,16 +196,14 @@ static std::string next_token(bool pass_newline = false)
static void input_file(std::istream &f, std::string filename) static void input_file(std::istream &f, std::string filename)
{ {
char buffer[513]; char buffer[513];
int rc;
insert_input(""); insert_input("");
auto it = input_buffer.begin(); auto it = input_buffer.begin();
input_buffer.insert(it, "`file_push " + filename + "\n"); input_buffer.insert(it, "`file_push " + filename + "\n");
while (1) { while ((rc = readsome(f, buffer, sizeof(buffer)-1)) > 0) {
f.read(buffer, sizeof(buffer)-1); buffer[rc] = 0;
if (f.gcount() <= 0)
break;
buffer[f.gcount()] = 0;
input_buffer.insert(it, buffer); input_buffer.insert(it, buffer);
} }
input_buffer.insert(it, "\n`file_pop\n"); input_buffer.insert(it, "\n`file_pop\n");

View File

@ -64,11 +64,7 @@ YOSYS_NAMESPACE_END
return TOK_ID; return TOK_ID;
#define YY_INPUT(buf,result,max_size) \ #define YY_INPUT(buf,result,max_size) \
do { \ result = readsome(*VERILOG_FRONTEND::lexin, buf, max_size)
lexin->read(buf, max_size-1); \
result = lexin->gcount(); \
if (result >= 0) buf[result] = '\0'; \
} while (0)
%} %}

View File

@ -97,6 +97,22 @@ std::string vstringf(const char *fmt, va_list ap)
return string; 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) std::string next_token(std::string &text, const char *sep)
{ {
size_t pos_begin = text.find_first_not_of(sep); size_t pos_begin = text.find_first_not_of(sep);

View File

@ -127,6 +127,7 @@ namespace RTLIL {
std::string stringf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); std::string stringf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
std::string vstringf(const char *fmt, va_list ap); 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); std::string next_token(std::string &text, const char *sep);
bool patmatch(const char *pattern, const char *string); 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&)>()); int run_command(const std::string &command, std::function<void(const std::string&)> process_line = std::function<void(const std::string&)>());

View File

@ -68,13 +68,10 @@ struct WriteFileFrontend : public Frontend {
FILE *of = fopen(output_filename.c_str(), append_mode ? "a" : "w"); FILE *of = fopen(output_filename.c_str(), append_mode ? "a" : "w");
char buffer[64 * 1024]; char buffer[64 * 1024];
int bytes;
while (1) { while (0 < (bytes = readsome(*f, buffer, sizeof(buffer))))
f->read(buffer, sizeof(buffer)); fwrite(buffer, bytes, 1, of);
if (f->gcount() <= 0)
break;
fwrite(buffer, f->gcount(), 1, of);
}
fclose(of); fclose(of);
} }