]> pd.if.org Git - zpackage/blobdiff - src/findpkg.c
add range search to findpkg
[zpackage] / src / findpkg.c
index 4ee3f120e9131d84efd401fd5c9b9dd1b8ce6981..775269ff9a24dcf7f64cd1561d40faaac4526464 100644 (file)
@@ -15,6 +15,8 @@ int main(int ac, char **av){
        int opt, argn;
        struct zpm zpm;
        char *dbfile = 0, *pkgstr = 0, *pkgid = 0;
+       int range = 0, wantleast = 0, argismax = 0;
+       char *minpkg = 0, *maxpkg = 0;
 
        char *sql;
        sqlite3_str *include;
@@ -29,7 +31,7 @@ int main(int ac, char **av){
        include = sqlite3_str_new(NULL);
        exclude = sqlite3_str_new(NULL);
 
-       while ((opt = getopt(ac, av, "f:s:S:I")) != -1) {
+       while ((opt = getopt(ac, av, "f:s:S:Imrl")) != -1) {
                switch (opt) {
                        case 'f': dbfile = optarg; break;
                        case 's': sqlite3_str_appendf(include,",%Q", optarg);
@@ -38,6 +40,9 @@ int main(int ac, char **av){
                                  break;
                        case 'I': sqlite3_str_appendall(include,",'installed'");
                                  break;
+                       case 'l': wantleast = 1; break;
+                       case 'r': range = 1; break;
+                       case 'm': argismax = 1; range = 1; break;
                        default:
                                  usage();
                                  exit(EXIT_FAILURE);
@@ -46,6 +51,20 @@ int main(int ac, char **av){
        }
        argn = optind;
 
+       if (ac < argn) {
+               usage();
+               exit(EXIT_FAILURE);
+       }
+
+       pkgstr = minpkg = av[argn];
+       if (ac > argn) {
+               maxpkg = av[argn+1];
+       }
+
+       if (maxpkg) {
+               range = 1;
+       }
+
        if (!dbfile) {
                fprintf(stderr, "must specify db\n");
                return 1;
@@ -68,13 +87,18 @@ int main(int ac, char **av){
                                       excludes+1);
                }
 
-               if (ac >= argn) {
-                       pkgstr = av[argn];
-               }
-
                sql = sqlite3_str_value(query);
 
-               pkgid = zpm_findpkg(&zpm, pkgstr, sql);
+               if (range) {
+                       if (argismax) {
+                               /* swap the sense of the arguments */
+                               minpkg = maxpkg;
+                               maxpkg = pkgstr;
+                       }
+                       pkgid = zpm_findpkg_range(&zpm, minpkg, maxpkg, sql, wantleast);
+               } else {
+                       pkgid = zpm_findpkg(&zpm, pkgstr, sql);
+               }
 
                sqlite3_free(sql);
                if (pkgid) {