[Pkg-gnupg-commit] [libassuan] 59/437: 2002-11-23 Neal H. Walfield <neal at g10code.de>

Eric Dorland eric at moszumanska.debian.org
Fri May 22 05:33:23 UTC 2015


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository libassuan.

commit 68ddb41f7c56bf92cc31efcdd4f1fa3df836bf94
Author: Neal Walfield <neal at walfield.org>
Date:   Sat Nov 23 19:11:22 2002 +0000

    2002-11-23  Neal H. Walfield  <neal at g10code.de>
    
    	* assuan-buffer.c (readline): Use memrchr.
    	(_assuan_read_line): Rewritten to use the string functions.
---
 src/ChangeLog       |   5 +++
 src/assuan-buffer.c | 112 +++++++++++++++++++++++++++-------------------------
 2 files changed, 63 insertions(+), 54 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 4bb8434..7931b2a 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2002-11-23  Neal H. Walfield  <neal at g10code.de>
+
+	* assuan-buffer.c (readline): Use memrchr.
+	(_assuan_read_line): Rewritten to use the string functions.
+
 2002-11-20  Neal H. Walfield  <neal at g10code.de>
 
 	* assuan-socket-connect.c (assuan_socket_connect): Pass PF_LOCAL
diff --git a/src/assuan-buffer.c b/src/assuan-buffer.c
index 515dbf9..8ccd3bd 100644
--- a/src/assuan-buffer.c
+++ b/src/assuan-buffer.c
@@ -91,10 +91,9 @@ readline (ASSUAN_CONTEXT ctx, char *buf, size_t buflen,
       nleft -= n;
       buf += n;
       *r_nread += n;
-      
-      for (; n && *p != '\n'; n--, p++)
-        ;
-      if (n)
+
+      p = memrchr (p, '\n', n);
+      if (p)
         break; /* at least one full line available - that's enough for now */
     }
 
@@ -106,8 +105,9 @@ int
 _assuan_read_line (ASSUAN_CONTEXT ctx)
 {
   char *line = ctx->inbound.line;
-  int n, nread, atticlen;
+  int nread, atticlen;
   int rc;
+  char *endp = 0;
 
   if (ctx->inbound.eof)
     return -1;
@@ -117,22 +117,25 @@ _assuan_read_line (ASSUAN_CONTEXT ctx)
     {
       memcpy (line, ctx->inbound.attic.line, atticlen);
       ctx->inbound.attic.linelen = 0;
-      for (n=0; n < atticlen && line[n] != '\n'; n++)
-        ;
-      if (n < atticlen)
+
+      endp = memchr (line, '\n', atticlen);
+      if (endp)
+	/* Found another line in the attic.  */
 	{
-	  rc = 0; /* found another line in the attic */
+	  rc = 0;
 	  nread = atticlen;
 	  atticlen = 0;
 	}
       else
-        { /* read the rest */
+	/* There is pending data but not a full line.  */
+        {
           assert (atticlen < LINELENGTH);
           rc = readline (ctx, line + atticlen,
 			 LINELENGTH - atticlen, &nread, &ctx->inbound.eof);
         }
     }
   else
+    /* No pending data.  */
     rc = readline (ctx, line, LINELENGTH,
                    &nread, &ctx->inbound.eof);
   if (rc)
@@ -152,51 +155,52 @@ _assuan_read_line (ASSUAN_CONTEXT ctx)
 
   ctx->inbound.attic.pending = 0;
   nread += atticlen;
-  for (n=0; n < nread; n++)
+
+  if (! endp)
+    endp = memchr (line, '\n', nread);
+
+  if (endp)
     {
-      if (line[n] == '\n')
-        {
-          if (n+1 < nread)
-            {
-              char *s, *d;
-              int i;
-
-              n++;
-              /* we have to copy the rest because the handlers are
-                 allowed to modify the passed buffer */
-              for (d=ctx->inbound.attic.line, s=line+n, i=nread-n; i; i--)
-                {
-                  if (*s=='\n')
-                    ctx->inbound.attic.pending = 1;
-                  *d++ = *s++;
-                }
-              ctx->inbound.attic.linelen = nread-n;
-              n--;
-            }
-          if (n && line[n-1] == '\r')
-            n--;
-          line[n] = 0;
-          ctx->inbound.linelen = n;
-          if (ctx->log_fp)
-            {
-              fprintf (ctx->log_fp, "%s[%p] <- ", my_log_prefix (), ctx); 
-              if (ctx->confidential)
-                fputs ("[Confidential data not shown]", ctx->log_fp);
-              else
-                _assuan_log_print_buffer (ctx->log_fp, 
-                                          ctx->inbound.line,
-                                          ctx->inbound.linelen);
-              putc ('\n', ctx->log_fp);
-            }
-          return 0;
-        }
-    }
+      int n = endp - line + 1;
+      if (n < nread)
+	/* LINE contains more than one line.  We copy it to the attic
+	   now as handlers are allowed to modify the passed
+	   buffer.  */
+	{
+	  int len = nread - n;
+	  memcpy (ctx->inbound.attic.line, endp + 1, len);
+	  ctx->inbound.attic.pending = memrchr (endp + 1, '\n', len) ? 1 : 0;
+	  ctx->inbound.attic.linelen = len;
+	}
 
-  if (ctx->log_fp)
-    fprintf (ctx->log_fp, "%s[%p] <- [Invalid line]\n", my_log_prefix (), ctx);
-  *line = 0;
-  ctx->inbound.linelen = 0;
-  return ctx->inbound.eof? ASSUAN_Line_Not_Terminated : ASSUAN_Line_Too_Long;
+      if (endp != line && endp[-1] == '\r')
+	endp --;
+      *endp = 0;
+
+      ctx->inbound.linelen = endp - line;
+      if (ctx->log_fp)
+	{
+	  fprintf (ctx->log_fp, "%s[%p] <- ", my_log_prefix (), ctx); 
+	  if (ctx->confidential)
+	    fputs ("[Confidential data not shown]", ctx->log_fp);
+	  else
+	    _assuan_log_print_buffer (ctx->log_fp, 
+				      ctx->inbound.line,
+				      ctx->inbound.linelen);
+	  putc ('\n', ctx->log_fp);
+	}
+      return 0;
+    }
+  else
+    {
+      if (ctx->log_fp)
+	fprintf (ctx->log_fp, "%s[%p] <- [Invalid line]\n",
+		 my_log_prefix (), ctx);
+      *line = 0;
+      ctx->inbound.linelen = 0;
+      return ctx->inbound.eof ? ASSUAN_Line_Not_Terminated
+	: ASSUAN_Line_Too_Long;
+    }
 }
 
 
@@ -376,7 +380,7 @@ _assuan_cookie_write_flush (void *cookie)
                                       ctx->outbound.data.line,
                                       linelen);
           putc ('\n', ctx->log_fp);
-            }
+	}
       *line++ = '\n';
       linelen++;
       if (writen (ctx, ctx->outbound.data.line, linelen))

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/libassuan.git



More information about the Pkg-gnupg-commit mailing list