changeset 9674:e5a897cf215d

(getline): When a search of already-read input for CRLF fails, store the fact that we've searched it and don't search it again after reading more data. (getline): When determining whether or not it's necessary to grow the input buffer, take into account the null that's stored at the end of already-read input in the buffer.
author Richard M. Stallman <rms@gnu.org>
date Mon, 24 Oct 1994 04:41:21 +0000
parents 5ec29dee380c
children 5186676f806f
files lib-src/pop.c
diffstat 1 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/pop.c	Sun Oct 23 22:56:32 1994 +0000
+++ b/lib-src/pop.c	Mon Oct 24 04:41:21 1994 +0000
@@ -1184,7 +1184,8 @@
 #define GETLINE_ERROR "Error reading from server: "
 
   int ret;
-     
+  int search_offset = 0;
+
   if (server->data)
     {
       char *cp = find_crlf (server->buffer + server->buffer_index);
@@ -1208,6 +1209,14 @@
 	{
 	  bcopy (server->buffer + server->buffer_index,
 		 server->buffer, server->data);
+	  /* Record the fact that we've searched the data already in
+             the buffer for a CRLF, so that when we search below, we
+             don't have to search the same data twice.  There's a "-
+             1" here to account for the fact that the last character
+             of the data we have may be the CR of a CRLF pair, of
+             which we haven't read the second half yet, so we may have
+             to search it again when we read more data. */
+	  search_offset = server->data - 1;
 	  server->buffer_index = 0;
 	}
     }
@@ -1218,7 +1227,10 @@
 
   while (1)
     {
-      if (server->data == server->buffer_size)
+      /* There's a "- 1" here to leave room for the null that we put
+         at the end of the read data below.  We put the null there so
+         that find_crlf knows where to stop when we call it. */
+      if (server->data == server->buffer_size - 1)
 	{
 	  server->buffer_size += GETLINE_INCR;
 	  server->buffer = realloc (server->buffer, server->buffer_size);
@@ -1251,7 +1263,7 @@
 	  server->data += ret;
 	  server->buffer[server->data] = '\0';
 	       
-	  cp = find_crlf (server->buffer);
+	  cp = find_crlf (server->buffer + search_offset);
 	  if (cp)
 	    {
 	      int data_used = (cp + 2) - server->buffer;
@@ -1263,6 +1275,7 @@
 		fprintf (stderr, "<<< %s\n", server->buffer);
 	      return (server->buffer);
 	    }
+	  search_offset += ret;
 	}
     }