string.c: Simplify and improve for_each_line().
authorAndre Noll <maan@tuebingen.mpg.de>
Thu, 2 Oct 2014 21:12:34 +0000 (21:12 +0000)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 18 Jan 2015 14:45:49 +0000 (15:45 +0100)
Much faster for large buffers. Idea: Search for zero byte
only until next cr.

string.c

index 453a61c..d75dbac 100644 (file)
--- a/string.c
+++ b/string.c
@@ -380,14 +380,13 @@ int for_each_line(unsigned flags, char *buf, size_t size,
                char *next_cr;
 
                next_cr = memchr(start, '\n', buf + size - start);
-               next_null = memchr(start, '\0', buf + size - start);
+               next_null = memchr(start, '\0', next_cr?
+                       next_cr - start : buf + size - start);
                if (!next_cr && !next_null)
                        break;
-               if (next_cr && next_null) {
-                       end = next_cr < next_null? next_cr : next_null;
-               } else if (next_null) {
+               if (next_null)
                        end = next_null;
-               else
+               else
                        end = next_cr;
                num_lines++;
                if (!(flags & FELF_DISCARD_FIRST) || start != buf) {