]> granicus.if.org Git - php/commitdiff
MFB5.3 fix for bug #44034 (FILE_IGNORE_NEW_LINES in file() does not work as
authorArnaud Le Blanc <lbarnaud@php.net>
Fri, 8 May 2009 09:50:11 +0000 (09:50 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Fri, 8 May 2009 09:50:11 +0000 (09:50 +0000)
expected when lines end in \r\n) (fixes #48175)

ext/standard/file.c
ext/standard/tests/file/bug44034.phpt [new file with mode: 0644]

index 5ea095de0f08c16865923b7f51717fcb59e7b707..4345349ddf70af2f3ea21d24d2e7e7369af2d972 100644 (file)
@@ -852,11 +852,15 @@ uparse_eol:
                        } while ((p = u_memchr(p, eol_marker, (e-p))));
                } else {
                        do {
-                               if (skip_blank_lines && !(p-s)) {
+                               int windows_eol = 0;
+                               if (eol_marker == '\n' && *(p - 1) == '\r') {
+                                       windows_eol++;
+                               }
+                               if (skip_blank_lines && !(p-s-windows_eol)) {
                                        s = ++p;
                                        continue;
                                }
-                               add_index_unicodel(return_value, i++, eustrndup(s, p-s), p-s, 0);
+                               add_index_unicodel(return_value, i++, eustrndup(s, p-s-windows_eol), p-s-windows_eol, 0);
                                s = ++p;
                        } while ((p = u_memchr(p, eol_marker, (e-p))));
                }
@@ -889,11 +893,15 @@ parse_eol:
                        } while ((p = memchr(p, eol_marker, (e-p))));
                } else {
                        do {
-                               if (skip_blank_lines && !(p-s)) {
+                               int windows_eol = 0;
+                               if (p != target_buf && eol_marker == '\n' && *(p - 1) == '\r') {
+                                       windows_eol++;
+                               }
+                               if (skip_blank_lines && !(p-s-windows_eol)) {
                                        s = ++p;
                                        continue;
                                }
-                               add_index_stringl(return_value, i++, estrndup(s, p-s), p-s, 0);
+                               add_index_stringl(return_value, i++, estrndup(s, p-s-windows_eol), p-s-windows_eol, 0);
                                s = ++p;
                        } while ((p = memchr(p, eol_marker, (e-p))));
                }
diff --git a/ext/standard/tests/file/bug44034.phpt b/ext/standard/tests/file/bug44034.phpt
new file mode 100644 (file)
index 0000000..21d3197
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+Bug #44034
+--FILE--
+<?php
+
+$urls = array();
+$urls[] = "data://text/plain,foo\r\nbar\r\n";
+$urls[] = "data://text/plain,\r\nfoo\r\nbar\r\n";
+$urls[] = "data://text/plain,foo\r\nbar";
+
+foreach($urls as $url) {
+       echo strtr($url, array("\r" => "\\r", "\n" => "\\n")) . "\n";
+       var_dump(file($url, FILE_IGNORE_NEW_LINES|FILE_TEXT));
+}
+?>
+--EXPECTF--
+data://text/plain,foo\r\nbar\r\n
+array(2) {
+  [0]=>
+  %unicode|string%(3) "foo"
+  [1]=>
+  %unicode|string%(3) "bar"
+}
+data://text/plain,\r\nfoo\r\nbar\r\n
+array(3) {
+  [0]=>
+  %unicode|string%(0) ""
+  [1]=>
+  %unicode|string%(3) "foo"
+  [2]=>
+  %unicode|string%(3) "bar"
+}
+data://text/plain,foo\r\nbar
+array(2) {
+  [0]=>
+  %unicode|string%(3) "foo"
+  [1]=>
+  %unicode|string%(3) "bar"
+}