From: Jiaxing Wang Subject: regedit: Remove next '\n' in the stream when '\r' is at the end of buffer. Message-Id: <555DBF0E.60807@gmail.com> Date: Thu, 21 May 2015 19:18:38 +0800 --- programs/regedit/regproc.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) From 2eaf72afaceccc06e5547be9f975c2905757a1be Mon Sep 17 00:00:00 2001 From: Jiaxing Wang Date: Thu, 21 May 2015 17:27:37 +0800 Subject: regedit: Remove next '\n' in the stream when '\r' is at the end of buffer. There are two cases: Case one: Buffer is filled as [..., '\\', '\r', 0], if the next character in stream is '\n', the line will be truncated. So a line like @=hex(2):00,11,22,33,44,55,66,77,\<0d><0a> 88,99,00,11,22,33,44,55<0d><0a> will get: @=hex(2):00,11,22,33,44,55,66,77, Case two: Buffer is filled as [..., '\r', 0], if the next character in stream is '\n', it will be interpreted as a blank line in the next round, causing the current key closed prematurely. --- programs/regedit/regproc.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c index df17d74..1f277f1 100644 --- a/programs/regedit/regproc.c +++ b/programs/regedit/regproc.c @@ -846,6 +846,27 @@ static void processRegLinesW(FILE *in) if (*(s_eol-1) == '\\') { WCHAR* NextLine = s_eol + 1; + /* If '\r' is at the end of the buffer, remove next '\n' and spaces in + * the beginning of next line from the stream. + */ + if (*s_eol == '\r' && *(s_eol+1) == 0) { + wint_t ch; + do { + ch = fgetwc(in); + } while(ch == '\n' || ch == ' ' || ch == '\t'); + if (ch == WEOF) { + if (ferror(in)) { + perror ("While reading input"); + exit (IO_ERROR); + } else { + assert (feof(in)); + } + } else { + /* Put back other characters other than '\n' in the stream */ + ungetwc(ch, in); + } + } + if(*s_eol == '\r' && *(s_eol+1) == '\n') NextLine++; @@ -858,6 +879,22 @@ static void processRegLinesW(FILE *in) continue; } + /* If '\r' is at the end of the buffer, remove next '\n' in the stream */ + if (*s_eol == '\r' && *(s_eol+1) == 0) { + wint_t ch = fgetwc(in); + if (ch == WEOF) { + if (ferror(in)) { + perror ("While reading input"); + exit (IO_ERROR); + } else { + assert (feof(in)); + } + } else if (ch != '\n') { + /* Put back other characters other than '\n' in the stream */ + ungetwc(ch, in); + } + } + /* Remove any line feed. Leave s_eol on the last \0 */ if (*s_eol == '\r' && *(s_eol + 1) == '\n') *s_eol++ = '\0'; -- 1.9.1