[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:
- References:
- f
- From: Adrian Bridgett <adrian.bridgett@iname.com>