From: Ulya Trofimovich Date: Fri, 11 Nov 2016 13:54:33 +0000 (+0000) Subject: Convert all line endings to LF before writing the generated code to file. X-Git-Tag: 1.0~50 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a51c7c858c99641d473bfbb375b082605f74f83b;p=re2c Convert all line endings to LF before writing the generated code to file. This commit should fix bug #163 reported by pauloscustodio: Reading files with "rb" causes issues in Windows re2c reads input files in binary mode and writes the generated output in text mode. This caused CR LF conversion to CR CR LF on Windows: first CR comes from reading input in binary mode, second CR is added when writing output in text mode. This only happened to those parts of input which are not transformed by re2c: we used to copy-paste verbatim, now we patch line endings. --- diff --git a/re2c/src/codegen/output.cc b/re2c/src/codegen/output.cc index 8d4f3945..ef57ad66 100644 --- a/re2c/src/codegen/output.cc +++ b/re2c/src/codegen/output.cc @@ -95,7 +95,20 @@ std::ostream & OutputFile::stream () OutputFile & OutputFile::wraw (const char * s, size_t n) { - stream ().write (s, static_cast (n)); + std::ostream &o = stream(); + const char *const e = s + n; + + // convert CR LF to LF + for (const char *p = s; p < e; ++p) { + if (*p == '\n') continue; + + std::streamsize l = p - s; + if (p > s && p[-1] == '\r') --l; + o.write(s, l); + s = p; + } + o.write(s, e - s); + return *this; }