Author: stsp
Date: Tue May 31 17:05:34 2011
New Revision: 1129804

URL: http://svn.apache.org/viewvc?rev=1129804&view=rev
Log:
* subversion/libsvn_diff/parse-diff.c
  (scan_eol): Handle the edge-case where the newline is "\r\n" but '\r'
   happens to be the last character in the read buffer.

Suggested by: rhuijben

Modified:
    subversion/trunk/subversion/libsvn_diff/parse-diff.c

Modified: subversion/trunk/subversion/libsvn_diff/parse-diff.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/parse-diff.c?rev=1129804&r1=1129803&r2=1129804&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/trunk/subversion/libsvn_diff/parse-diff.c Tue May 31 17:05:34 
2011
@@ -303,10 +303,21 @@ scan_eol(const char **eol, apr_file_t *f
           buf[len] = '\0';
           total_len += len;
 
-          /* ### BH: Does this properly detect the case where '\r' is on byte
-             ###     254 (last character of buffer) and '\n' is on byte 255
-             ###     (first character of next buffer)? */
           eol_str = svn_eol__detect_eol(buf, buf + len);
+
+          /* Detect the case where '\r' is the last character in the buffer
+           * and '\n' would be the first character in the next buffer. */
+          if (eol_str && eol_str[0] == '\r' && eol_str[1] == '\0' &&
+              buf[len - 1] == '\r')
+            {
+              len = 1;
+              SVN_ERR(svn_io_file_read_full2(file, buf, 1, &len, &eof, pool));
+              if (!eof && len == 1 && buf[0] == '\n')
+                eol_str = "\r\n";
+
+              /* We got either \r or \r\n, get outta here. */
+              break;
+            }
         }
 
       if (eof)


Reply via email to