[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[patch] fields.c should use varbuf



So this time I rembered a subject :)

lib/fields.c rolls it's own varbufc (albeit one without the 80 byte overhead
I mentioned). Patch follows:

--- /home/bridgett/dpkg.orig/lib/fields.c	Fri Dec 29 20:25:13 2000
+++ fields.c	Fri Dec 29 21:19:09 2000
@@ -266,9 +266,8 @@
   char c1, c2;
   const char *p, *emsg;
   const char *depnamestart, *versionstart;
-  int depnamelength, versionlength;
-  static int depnameused= 0, versionused= 0;
-  static char *depname= NULL, *version= NULL;
+  /* note that this is allocated static so we don't need to init or free it */
+  static struct varbuf version, depname;
 
   struct dependency *dyp, **ldypp;
   struct deppossi *dop, **ldopp;
@@ -290,23 +289,20 @@
       while (*p && !isspace(*p) && *p != '(' && *p != ',' && *p != '|') {
 	p++;
       }
-      depnamelength= p - depnamestart ;
-      if (depnamelength >= depnameused) {
-	depnameused= depnamelength;
-	depname= realloc(depname,depnamelength+1);
-      }
-      strncpy(depname, depnamestart, depnamelength);
-      *(depname + depnamelength)= 0;
-      if (!*depname)
+
+      varbufreset(&depname);
+      varbufaddbuf(&depname, depnamestart, p - depnamestart + 1);
+      depname.buf[p-depnamestart]='\0';
+      if (!*(depname.buf))
         parseerr(0,filename,lno, warnto,warncount,pigp,0, _("`%s' field, missing"
                  " package name, or garbage where package name expected"), fip->name);
-      emsg= illegal_packagename(depname,0);
+      emsg= illegal_packagename(depname.buf,0);
       if (emsg) parseerr(0,filename,lno, warnto,warncount,pigp,0, _("`%s' field,"
                          " invalid package name `%.255s': %s"),
-                         fip->name,depname,emsg);
+                         fip->name,depname.buf,emsg);
       dop= nfmalloc(sizeof(struct deppossi));
       dop->up= dyp;
-      dop->ed= findpackage(depname);
+      dop->ed= findpackage(depname.buf);
       dop->next= 0; *ldopp= dop; ldopp= &dop->next;
       dop->nextrev= 0; /* Don't link this (which is after all only `newpig' from */
       dop->backrev= 0; /* the main parsing loop in parsedb) into the depended on
@@ -334,13 +330,13 @@
             parseerr(0,filename,lno, warnto,warncount,pigp,0,
                     _("`%s' field, reference to `%.255s':\n"
                     " bad version relationship %c%c"),
-                    fip->name,depname,c1,c2);
+                    fip->name,depname.buf,c1,c2);
             dop->verrel= dvr_none;
           } else {
             parseerr(0,filename,lno, warnto,warncount,pigp,1,
                      _("`%s' field, reference to `%.255s':\n"
                      " `%c' is obsolete, use `%c=' or `%c%c' instead"),
-                     fip->name,depname,c1,c1,c1,c1);
+                     fip->name,depname.buf,c1,c1,c1,c1);
             dop->verrel |= (dvrf_orequal | dvrf_builtup);
           }
         } else if (c1 == '=') {
@@ -350,7 +346,7 @@
           parseerr(0,filename,lno, warnto,warncount,pigp,1,
                    _("`%s' field, reference to `%.255s':\n"
                    " implicit exact match on version number, suggest using `=' instead"),
-                   fip->name,depname);
+                   fip->name,depname.buf);
           dop->verrel= dvr_exact;
         }
 	if ((dop->verrel!=dvr_exact) && (fip->integer==dep_provides))
@@ -361,7 +357,7 @@
           parseerr(0,filename,lno, warnto,warncount,pigp,1,
                    _("`%s' field, reference to `%.255s':\n"
                    " version value starts with non-alphanumeric, suggest adding a space"),
-                   fip->name,depname);
+                   fip->name,depname.buf);
         }
 /* skip spaces between the relation and the version */
         while (isspace(*p)) p++;
@@ -374,24 +370,20 @@
         while (isspace(*p)) p++;
         if (*p == '(') parseerr(0,filename,lno, warnto,warncount,pigp,0,
                                 _("`%s' field, reference to `%.255s': "
-                                "version contains `('"),fip->name,depname);
+                                "version contains `('"),fip->name,depname.buf);
 	else if (*p != ')') parseerr(0,filename,lno, warnto,warncount,pigp,0,
                                 _("`%s' field, reference to `%.255s': "
-                                "version contains ` '"),fip->name,depname);
+                                "version contains ` '"),fip->name,depname.buf);
         else if (*p == 0) parseerr(0,filename,lno, warnto,warncount,pigp,0,
                                    _("`%s' field, reference to `%.255s': "
-                                   "version unterminated"),fip->name,depname);
-	versionlength= p - versionstart;
-	if (versionlength >=  versionused) {
-	  versionused= versionlength;
-	  version= realloc(version,versionlength+1);
-	}
-	strncpy(version,  versionstart, versionlength);
-	*(version + versionlength)= 0;
-        emsg= parseversion(&dop->version,version);
+                                   "version unterminated"),fip->name,depname.buf);
+        varbufreset(&version);
+        varbufaddbuf(&version, versionstart, p - versionstart + 1);
+        version.buf[p-versionstart] = '\0';
+        emsg= parseversion(&dop->version,version.buf);
         if (emsg) parseerr(0,filename,lno, warnto,warncount,pigp,0,
                            _("`%s' field, reference to `%.255s': "
-                           "error in version: %.255s"),fip->name,depname,emsg);
+                           "error in version: %.255s"),fip->name,depname.buf,emsg);
         p++; while (isspace(*p)) p++;
       } else {
         dop->verrel= dvr_none;


Email: adrian.bridgett@iname.com
Windows NT - Unix in beta-testing. GPG/PGP keys available on public key servers
Debian GNU/Linux  -*-  By professionals for professionals  -*-  www.debian.org



Reply to: