X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-findpkg.c;h=c3ce4e4ceb80fb217373ca10b7abf32ca94071c9;hb=ddeb616cccad9c19467be36be9415cbb82a836ce;hp=68baecad2d6889040ba0788f63eab836bdd7453d;hpb=324303554d33d5a3643fa73ec53c5c41e71cd54a;p=zpackage diff --git a/zpm-findpkg.c b/zpm-findpkg.c index 68baeca..c3ce4e4 100644 --- a/zpm-findpkg.c +++ b/zpm-findpkg.c @@ -1,12 +1,16 @@ #include #include +#include + #include "zpm.h" static int prow(void *f, int ncols, char **vals, char **cols) { FILE *out = f; int i; - cols = 0; /* suppress warning */ + if (cols == 0) { + fprintf(stderr, "sqlite can't get column names\n"); + } for (i=3;i3) fprintf(out, "\t"); fprintf(out, "%s", vals[i]); @@ -15,6 +19,51 @@ static int prow(void *f, int ncols, char **vals, char **cols) { return 0; } +void parse_package(char *pstr, char *name, char *ver, int *rel) { + if (name) *name = 0; + if (ver) *ver = 0; + if (rel) *rel = -1; + + /* string - ver - rel */ + /* rel is all digits */ + /* possible forms: + * ^(.+)-([0-9][^-]*)-([\d+])$ + * ^(.+)-([0-9][^-]*)$ + * ^(.+)$ + * The main problem in parsing is that the package name itself + * can contain a '-', so you can't just split on '-' + * Also, the version can be just digits. + */ + + /* everything up to the first '-' is in the name */ + while (*pstr) { + if (*pstr == '-' && isdigit(*(pstr+1))) { + break; + } + if (name) { + *name++ = *pstr; + } + pstr++; + } + if (name) *name = 0; + if (*pstr == '-') { + pstr++; + } + while (*pstr && *pstr != '-') { + if (ver) { + *ver++ = *pstr; + } + pstr++; + } + if (ver) *ver = 0; + if (*pstr == '-') { + pstr++; + } + if (rel && *pstr) { + *rel = atoi(pstr); + } +} + int main(int ac, char **av){ struct zpm pkg; char *select = "select package, version, release, package||'-'||version||'-'||release as pkgid from packages"; @@ -41,8 +90,26 @@ int main(int ac, char **av){ /* TODO allow more args to nail down version and release */ if (ac >= 3) { + int release; + char version[32]; + char package[32]; + + parse_package(av[2], package, version, &release); + if (release != -1) { + /* all three */ + sprintf(sql, "%s where package = '%s' and version = " + "'%s' and release = %d %s;", select, + package, version, release, group); + } else if (*version != 0) { + sprintf(sql, "%s where package = '%s' and version = " + "'%s' %s;", select, + package, version, group); + + } else { + sprintf(sql, "%s where package = '%s' %s;", select, av[2], group); + } } else { sprintf(sql, "%s %s;", select, group); }