(ds_read_line): Add argument to limit the length of the line to be
authorBen Pfaff <blp@gnu.org>
Tue, 19 Feb 2008 06:45:11 +0000 (06:45 +0000)
committerBen Pfaff <blp@gnu.org>
Tue, 19 Feb 2008 06:45:11 +0000 (06:45 +0000)
read.  Update all callers.

src/language/data-io/data-reader.c
src/language/syntax-file.c
src/libpspp/ChangeLog
src/libpspp/str.c
src/libpspp/str.h
src/ui/terminal/read-line.c

index 9b08625efaa93df7b68dd530d7c9f023a57d8eda..7fd722a81e3f9737a424f6dfb256c46d005d88c0 100644 (file)
@@ -340,7 +340,7 @@ read_file_record (struct dfm_reader *r)
   switch (fh_get_mode (r->fh))
     {
     case FH_MODE_TEXT:
-      if (ds_read_line (&r->line, r->file))
+      if (ds_read_line (&r->line, r->file, SIZE_MAX))
         {
           ds_chomp (&r->line, '\n');
           return true;
index a48dba4a136cad55c78f873b5b395b2cdb60da13..678d2f51fa96b9217f6b172d190d7abf4dfbc01f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <errno.h>
+#include <stdint.h>
 #include <stdlib.h>
 
 #include <data/file-name.h>
@@ -99,7 +100,7 @@ read_syntax_file (struct getl_interface *s,
   do
     {
       sfs->ln++;
-      if (!ds_read_line (line, sfs->syntax_file))
+      if (!ds_read_line (line, sfs->syntax_file, SIZE_MAX))
         {
           if (ferror (sfs->syntax_file))
             msg (ME, _("Reading `%s': %s."), sfs->fn, strerror (errno));
index 8547567e76f8f28df5115dd1e4fc33edb3a437d7..7f22461015354ef809cacf86114490aa0406032e 100644 (file)
@@ -1,3 +1,10 @@
+2008-02-18  Ben Pfaff  <blp@gnu.org>
+
+       Patch #6426.  Thanks to John Darrington for review.
+
+       * str.c (ds_read_line): Add argument to limit the length of the
+       line to be read.  Update all callers.
+
 2008-02-01  Ben Pfaff  <blp@gnu.org>
 
        Patch #6386.  Thanks to John Darrington for review.
index b169f0d7613ee556e7a5a32e746a36ac2f06af23..b88493d47fabafff46fd36a724cdcc1ad3e26d68 100644 (file)
@@ -1170,30 +1170,47 @@ ds_cstr (const struct string *st_)
   return st->ss.string;
 }
 
-/* Appends to ST a newline-terminated line read from STREAM.
-   Newline is the last character of ST on return, unless an I/O error
-   or end of file is encountered after reading some characters.
-   Returns true if a line is successfully read, false if no characters at
-   all were read before an I/O error or end of file was
-   encountered. */
+/* Appends to ST a newline-terminated line read from STREAM, but
+   no more than MAX_LENGTH characters.
+   Newline is the last character of ST on return, if encountering
+   a newline was the reason for terminating.
+   Returns true if at least one character was read from STREAM
+   and appended to ST, false if no characters at all were read
+   before an I/O error or end of file was encountered (or
+   MAX_LENGTH was 0). */
 bool
-ds_read_line (struct string *st, FILE *stream)
+ds_read_line (struct string *st, FILE *stream, size_t max_length)
 {
-  int c;
+  if (!st->ss.length && max_length == SIZE_MAX)
+    {
+      size_t capacity = st->capacity ? st->capacity + 1 : 0;
+      ssize_t n = getline (&st->ss.string, &capacity, stream);
+      if (capacity)
+        st->capacity = capacity - 1;
+      if (n > 0)
+        {
+          st->ss.length = n;
+          return true;
+        }
+      else
+        return false;
+    }
+  else
+    {
+      size_t length;
 
-  c = getc (stream);
-  if (c == EOF)
-    return false;
+      for (length = 0; length < max_length; length++)
+        {
+          int c = getc (stream);
+          if (c == EOF)
+            break;
 
-  for (;;)
-    {
-      ds_put_char (st, c);
-      if (c == '\n')
-       return true;
+          ds_put_char (st, c);
+          if (c == '\n')
+            return true;
+        }
 
-      c = getc (stream);
-      if (c == EOF)
-       return true;
+      return length > 0;
     }
 }
 
@@ -1240,7 +1257,7 @@ ds_read_config_line (struct string *st, int *line_number, FILE *stream)
   ds_clear (st);
   do
     {
-      if (!ds_read_line (st, stream))
+      if (!ds_read_line (st, stream, SIZE_MAX))
         return false;
       (*line_number)++;
       ds_rtrim (st, ss_cstr (CC_SPACES));
index 50671d90c5133bc481ddad49ba400bbe8cde8b2c..0d48bd9bf02229a15b920e2c33280ffa326f62b8 100644 (file)
@@ -202,7 +202,7 @@ size_t ds_capacity (const struct string *);
 char *ds_cstr (const struct string *);
 
 /* File input. */
-bool ds_read_line (struct string *, FILE *);
+bool ds_read_line (struct string *, FILE *, size_t max_length);
 bool ds_read_config_line (struct string *, int *line_number, FILE *);
 bool ds_read_stream (struct string *, size_t size, size_t cnt, FILE *stream);
 
index e72f11458ac4112ede5e78c701dfb8cb9b153960..1cd65c0ae73530f485fe1d3e6b835e28c6638d23 100644 (file)
@@ -173,7 +173,7 @@ readln_read (struct string *line, enum prompt_style style)
 #else
   fputs (prompt, stdout);
   fflush (stdout);
-  if (ds_read_line (line, stdin))
+  if (ds_read_line (line, stdin, SIZE_MAX))
     {
       ds_chomp (line, '\n');
       eof = false;