]> pd.if.org Git - zpackage/blobdiff - lib/findpkg.c
add where filter argument to foreach-path
[zpackage] / lib / findpkg.c
index 6f69876f76915149e2e4d5b276a2477b36d98100..072f9f1cbd21745259eeb1c0b59e412424bd490a 100644 (file)
@@ -9,65 +9,7 @@
 
 #include "sqlite3.h"
 
-int zpm_parse_package(char *pstr, char *name, char *ver, int *rel) {
-       if (name) *name = 0;
-       if (ver) *ver = 0;
-       if (rel) *rel = 0;
-       int havename = 0;
-       int havever = 0;
-       int haverel = 0;
-
-       /* 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 == '\'' || !isgraph(*pstr)) {
-                       return 0;
-               }
-               if (*pstr == '-' && isdigit(*(pstr+1))) {
-                       break;
-               }
-               if (name) {
-                       *name++ = *pstr;
-               }
-               pstr++;
-               havename = 1;
-       }
-       if (name) *name = 0;
-       if (*pstr == '-') {
-               pstr++;
-       }
-       while (*pstr && *pstr != '-') {
-               if (*pstr == '\'' || !isgraph(*pstr)) {
-                       return 0;
-               }
-               if (ver) {
-                       *ver++ = *pstr;
-               }
-               pstr++;
-               havever = 1;
-       }
-       if (ver) *ver = 0;
-       if (*pstr == '-') {
-               pstr++;
-       }
-       /* TODO use strtol */
-       if (rel && *pstr) {
-               haverel = 1;
-               *rel = atoi(pstr);
-       }
-
-       return havename + havever + haverel;
-}
+#define DMARK fprintf(stderr, "mark %s %s:%d\n", __FILE__, __func__, __LINE__)
 
 /*
  * flags 0 = find installed
@@ -106,11 +48,16 @@ char *zpm_findpkg(struct zpm *zpm, char *pkgstr) {
 //     char *order = "order by package, version collate vercmp, cast(release as integer)";
        sqlite3_str *sql;
        sqlite3_stmt *stmt;
-       char *query, *pkgid;
+       char *query, *pkgid = 0;
        char package[32];
        char version[32];
        int release;
 
+       if (pkgstr == NULL) {
+               fprintf(stderr, "trying to parse null string\n");
+               return NULL;
+       }
+
        /* null pkgstr find "best" package
         * best is shortest complete package if any are complete
         * shortest incomplete if any are incomplete