The following commit has been merged in the master branch:
commit 3d8951fdf5cc2fe3209540bc43c489208db8c306
Author: Guillem Jover <guil...@debian.org>
Date:   Thu Jul 14 04:37:31 2011 +0200

    libdpkg: Move dataptr and endptr from parsedb() to struct parsedb_state

diff --git a/lib/dpkg/parse.c b/lib/dpkg/parse.c
index 3b32572..e5048f9 100644
--- a/lib/dpkg/parse.c
+++ b/lib/dpkg/parse.c
@@ -311,6 +311,10 @@ pkg_parse_copy(struct parsedb_state *ps,
   }
 }
 
+#define EOF_mmap(ps)           ((ps)->dataptr >= (ps)->endptr)
+#define getc_mmap(ps)          *(ps)->dataptr++
+#define ungetc_mmap(c, ps)     (ps)->dataptr--
+
 /**
  * Parse an RFC-822 style file.
  *
@@ -325,7 +329,7 @@ int parsedb(const char *filename, enum parsedbflags flags,
   struct pkginfo *new_pkg, *db_pkg;
   struct pkgbin *new_pkgbin, *db_pkgbin;
   int pdone;
-  char *data, *dataptr, *endptr;
+  char *data;
   struct stat st;
   struct parsedb_state ps;
   struct field_state fs;
@@ -355,25 +359,22 @@ int parsedb(const char *filename, enum parsedbflags flags,
 
   if (st.st_size > 0) {
 #ifdef USE_MMAP
-    dataptr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
-    if (dataptr == MAP_FAILED)
+    ps.dataptr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+    if (ps.dataptr == MAP_FAILED)
       ohshite(_("can't mmap package info file `%.255s'"),filename);
 #else
-    dataptr = m_malloc(st.st_size);
+    ps.dataptr = m_malloc(st.st_size);
 
-    if (fd_read(fd, dataptr, st.st_size) < 0)
+    if (fd_read(fd, ps.dataptr, st.st_size) < 0)
       ohshite(_("reading package info file '%.255s'"), filename);
 #endif
-    data= dataptr;
-    endptr = dataptr + st.st_size;
+    data = ps.dataptr;
+    ps.endptr = ps.dataptr + st.st_size;
   } else {
-    data= dataptr= endptr= NULL;
+    data = ps.dataptr = ps.endptr = NULL;
   }
 
   pdone= 0;
-#define EOF_mmap(dataptr, endptr)      (dataptr >= endptr)
-#define getc_mmap(dataptr)             *dataptr++
-#define ungetc_mmap(c, dataptr, data)  dataptr--
 
   /* Loop per package. */
   for (;;) {
@@ -383,22 +384,26 @@ int parsedb(const char *filename, enum parsedbflags flags,
     pkg_blank(new_pkg);
 
     /* Skip adjacent new lines. */
-    while(!EOF_mmap(dataptr, endptr)) {
-      c= getc_mmap(dataptr); if (c!='\n' && c!=MSDOS_EOF_CHAR ) break;
+    while (!EOF_mmap(&ps)) {
+      c = getc_mmap(&ps);
+      if (c != '\n' && c != MSDOS_EOF_CHAR)
+        break;
       ps.lno++;
     }
-    if (EOF_mmap(dataptr, endptr)) break;
+    if (EOF_mmap(&ps))
+      break;
 
     /* Loop per field. */
     for (;;) {
       bool blank_line;
 
-      fs.fieldstart = dataptr - 1;
-      while (!EOF_mmap(dataptr, endptr) && !isspace(c) && c!=':' && 
c!=MSDOS_EOF_CHAR)
-        c= getc_mmap(dataptr);
-      fs.fieldlen = dataptr - fs.fieldstart - 1;
-      while (!EOF_mmap(dataptr, endptr) && c != '\n' && isspace(c)) c= 
getc_mmap(dataptr);
-      if (EOF_mmap(dataptr, endptr))
+      fs.fieldstart = ps.dataptr - 1;
+      while (!EOF_mmap(&ps) && !isspace(c) && c != ':' && c != MSDOS_EOF_CHAR)
+        c = getc_mmap(&ps);
+      fs.fieldlen = ps.dataptr - fs.fieldstart - 1;
+      while (!EOF_mmap(&ps) && c != '\n' && isspace(c))
+        c = getc_mmap(&ps);
+      if (EOF_mmap(&ps))
         parse_error(&ps,
                     _("EOF after field name `%.*s'"), fs.fieldlen, 
fs.fieldstart);
       if (c == '\n')
@@ -413,11 +418,11 @@ int parsedb(const char *filename, enum parsedbflags flags,
                     _("field name `%.*s' must be followed by colon"),
                     fs.fieldlen, fs.fieldstart);
       /* Skip space after ‘:’ but before value and EOL. */
-      while(!EOF_mmap(dataptr, endptr)) {
-        c= getc_mmap(dataptr);
+      while (!EOF_mmap(&ps)) {
+        c = getc_mmap(&ps);
         if (c == '\n' || !isspace(c)) break;
       }
-      if (EOF_mmap(dataptr, endptr))
+      if (EOF_mmap(&ps))
         parse_error(&ps,
                     _("EOF before value of field `%.*s' (missing final 
newline)"),
                     fs.fieldlen, fs.fieldstart);
@@ -428,7 +433,7 @@ int parsedb(const char *filename, enum parsedbflags flags,
 
       blank_line = false;
 
-      fs.valuestart = dataptr - 1;
+      fs.valuestart = ps.dataptr - 1;
       for (;;) {
         if (c == '\n' || c == MSDOS_EOF_CHAR) {
           if (blank_line)
@@ -436,32 +441,35 @@ int parsedb(const char *filename, enum parsedbflags flags,
                         _("blank line in value of field '%.*s'"),
                         fs.fieldlen, fs.fieldstart);
           ps.lno++;
-         if (EOF_mmap(dataptr, endptr)) break;
-          c= getc_mmap(dataptr);
+          if (EOF_mmap(&ps))
+            break;
+          c = getc_mmap(&ps);
           /* Found double EOL, or start of new field. */
-          if (EOF_mmap(dataptr, endptr) || c == '\n' || !isspace(c)) break;
-          ungetc_mmap(c,dataptr, data);
+          if (EOF_mmap(&ps) || c == '\n' || !isspace(c))
+            break;
+          ungetc_mmap(c, &ps);
           c= '\n';
           blank_line = true;
         } else if (blank_line && !isspace(c)) {
           blank_line = false;
         }
 
-        if (EOF_mmap(dataptr, endptr))
+        if (EOF_mmap(&ps))
           parse_error(&ps,
                       _("EOF during value of field `%.*s' (missing final 
newline)"),
                       fs.fieldlen, fs.fieldstart);
 
-        c= getc_mmap(dataptr);
+        c = getc_mmap(&ps);
       }
-      fs.valuelen = dataptr - fs.valuestart - 1;
+      fs.valuelen = ps.dataptr - fs.valuestart - 1;
       /* Trim ending space on value. */
       while (fs.valuelen && isspace(*(fs.valuestart + fs.valuelen - 1)))
         fs.valuelen--;
 
       pkg_parse_field(&ps, &fs, new_pkg, new_pkgbin);
 
-      if (EOF_mmap(dataptr, endptr) || c == '\n' || c == MSDOS_EOF_CHAR) break;
+      if (EOF_mmap(&ps) || c == '\n' || c == MSDOS_EOF_CHAR)
+        break;
     } /* Loop per field. */
 
     if (pdone && donep)
@@ -485,7 +493,8 @@ int parsedb(const char *filename, enum parsedbflags flags,
     if (donep)
       *donep = db_pkg;
     pdone++;
-    if (EOF_mmap(dataptr, endptr)) break;
+    if (EOF_mmap(&ps))
+      break;
     if (c == '\n')
       ps.lno++;
   }
diff --git a/lib/dpkg/parsedump.h b/lib/dpkg/parsedump.h
index bf8759e..08c34cd 100644
--- a/lib/dpkg/parsedump.h
+++ b/lib/dpkg/parsedump.h
@@ -28,6 +28,8 @@ struct parsedb_state {
        enum parsedbflags flags;
        struct pkginfo *pkg;
        struct pkgbin *pkgbin;
+       char *dataptr;
+       char *endptr;
        const char *filename;
        int lno;
 };

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to