From 75f4f1ac04a17d1deda0e3a8c82428df784e7f5a Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 30 Jan 2009 15:46:03 +0000 Subject: [PATCH] (detect_eol, decode_eol): Handle text with DOS-style EOLs that also has stray ^M characters. --- src/ChangeLog | 5 +++++ src/coding.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 91d39e7b58..f86e3c5afd 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-01-30 Eli Zaretskii + + * coding.c (detect_eol, decode_eol): Handle text with DOS-style + EOLs that also has stray ^M characters. + 2009-01-30 Juanma Barranquero * atimer.c (run_timers, alarm_signal_handler): diff --git a/src/coding.c b/src/coding.c index 8c7ddf34db..38cb360546 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5819,16 +5819,26 @@ detect_eol (source, src_bytes, category) || src[lsb + 2] != '\n') this_eol = EOL_SEEN_CR; else - this_eol = EOL_SEEN_CRLF; + { + this_eol = EOL_SEEN_CRLF; + src += 2; + } if (eol_seen == EOL_SEEN_NONE) /* This is the first end-of-line. */ eol_seen = this_eol; else if (eol_seen != this_eol) { - /* The found type is different from what found before. */ - eol_seen = EOL_SEEN_LF; - break; + /* The found type is different from what found before. + Allow for stray ^M characters in DOS EOL files. */ + if (eol_seen == EOL_SEEN_CR && this_eol == EOL_SEEN_CRLF + || eol_seen == EOL_SEEN_CRLF && this_eol == EOL_SEEN_CR) + eol_seen = EOL_SEEN_CRLF; + else + { + eol_seen = EOL_SEEN_LF; + break; + } } if (++total == MAX_EOL_CHECK_COUNT) break; @@ -5857,9 +5867,16 @@ detect_eol (source, src_bytes, category) eol_seen = this_eol; else if (eol_seen != this_eol) { - /* The found type is different from what found before. */ - eol_seen = EOL_SEEN_LF; - break; + /* The found type is different from what found before. + Allow for stray ^M characters in DOS EOL files. */ + if (eol_seen == EOL_SEEN_CR && this_eol == EOL_SEEN_CRLF + || eol_seen == EOL_SEEN_CRLF && this_eol == EOL_SEEN_CR) + eol_seen = EOL_SEEN_CRLF; + else + { + eol_seen = EOL_SEEN_LF; + break; + } } if (++total == MAX_EOL_CHECK_COUNT) break; @@ -6114,7 +6131,12 @@ decode_eol (coding) eol_seen |= EOL_SEEN_CR; } } - if (eol_seen != EOL_SEEN_NONE + /* Handle DOS-style EOLs in a file with stray ^M characters. */ + if ((eol_seen & EOL_SEEN_CRLF) != 0 + && (eol_seen & EOL_SEEN_CR) != 0 + && (eol_seen & EOL_SEEN_LF) == 0) + eol_seen = EOL_SEEN_CRLF; + else if (eol_seen != EOL_SEEN_NONE && eol_seen != EOL_SEEN_LF && eol_seen != EOL_SEEN_CRLF && eol_seen != EOL_SEEN_CR) -- 2.20.1