]> pd.if.org Git - zpackage/blobdiff - zpm-search.c
rewrite zpm-add in C
[zpackage] / zpm-search.c
index a98aa002cd3abe8b570bb6454d4c5de3d2a419ac..9b6ec887cd015f45b88f72e0de32df74d31303a2 100644 (file)
@@ -271,6 +271,10 @@ with pkglibs as (\
      where PL.pkgid = %Q\
      ";
 
+static int afind_strcmp(const void *a, const void *b) {
+       return strcmp(a, b);
+}
+
 void checklibs(struct search_ctl *opts,
                jsw_hash_t *check, jsw_hash_t *forlibs, jsw_hash_t *nfound) {
        char *pkgid = 0, *pkgfile = 0;
@@ -286,8 +290,8 @@ void checklibs(struct search_ctl *opts,
        jsw_atrav_t *i;
        char *soname;
        
-       checked = jsw_anew((cmp_f)strcmp, (dup_f)strdup, (rel_f)free);
-       checked_libs = jsw_anew((cmp_f)strcmp, (dup_f)strdup, (rel_f)free);
+       checked = jsw_anew(afind_strcmp, (dup_f)strdup, (rel_f)free);
+       checked_libs = jsw_anew(afind_strcmp, (dup_f)strdup, (rel_f)free);
 
        while (jsw_hsize(check) > 0) {
                free(pkgid);
@@ -306,11 +310,22 @@ void checklibs(struct search_ctl *opts,
 
                if (jsw_afind(checked, pkgid)) {
                        /* already checked this one */
+                       /* fprintf(stderr, "already checked %s\n", pkgid); */
                        continue;
                }
 
+               fprintf(stderr, "checking libs for %s\n", pkgid);
                /* we do this now so we catch self deps */
-               jsw_ainsert(checked, pkgid);
+               if (!jsw_ainsert(checked, pkgid)) {
+                       fprintf(stderr, "checked insert failed\n");
+                       exit(EXIT_FAILURE);
+               }
+
+               if (!jsw_afind(checked, pkgid)) {
+                       /* already checked this one */
+                       fprintf(stderr, "checked find failed\n");
+                       exit(EXIT_FAILURE);
+               }
 
                /* get the libraries needed by this package */
                if (!zpm_open(&src, pkgfile)) {
@@ -319,7 +334,7 @@ void checklibs(struct search_ctl *opts,
                }
 
                if (needed) jsw_adelete(needed);
-               needed = jsw_anew((cmp_f)strcmp, (dup_f)strdup, (rel_f)free);
+               needed = jsw_anew(afind_strcmp, (dup_f)strdup, (rel_f)free);
                libs = zpm_libraries_needed(&src, pkgid, needed);
                zpm_close(&src);
 
@@ -333,16 +348,18 @@ void checklibs(struct search_ctl *opts,
                        int found;
                        struct pkgloc pkginfo;
 
-                       if (opts->verbose > 1) {
-                               fprintf(stderr, "checking for %s\n", soname);
-                       }
                        /* if it's in checked_libs, we've already looked at this one */
                        if (jsw_afind(checked_libs, soname)) {
                                if (opts->verbose > 1) {
-                                       fprintf(stderr, "already checked for %s\n", soname);
+                                       fprintf(stderr, "already checked %s\n", soname);
                                }
                                continue;
                        }
+#if 0
+                       if (opts->verbose > 1) {
+                               fprintf(stderr, "checking for %s\n", soname);
+                       }
+#endif
 
                        /* haven't found this soname */
                        jsw_ainsert(checked_libs, soname);
@@ -497,15 +514,24 @@ int main(int ac, char *av[]) {
                fprintf(stderr, "\n");
        }
 
-       packages = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,
+       /* direct packages asked for */
+       packages = jsw_hnew(ac,NULL,afind_strcmp,(keydup_f)strdup,
                        (itemdup_f)strdup,free,free);
-       check = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,
+
+       /* packages we need to check for libs */
+       check = jsw_hnew(ac,NULL,afind_strcmp,(keydup_f)strdup,
                        (itemdup_f)strdup,free,free);
-       forlibs = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,
+
+       /* packages we will also need for library dependences */
+       forlibs = jsw_hnew(ac,NULL,afind_strcmp,(keydup_f)strdup,
                        (itemdup_f)strdup,free,free);
-       nolib = jsw_hnew(ac,NULL,(cmp_f)strcmp,(keydup_f)strdup,
+
+       /* libraries we didn't find */
+       nolib = jsw_hnew(ac,NULL,afind_strcmp,(keydup_f)strdup,
                        (itemdup_f)strdup,free,free);
-       nfound = jsw_anew((cmp_f)strcmp, (dup_f)strdup, (rel_f)free);
+
+       /* packages asked for that we can't find */
+       nfound = jsw_anew(afind_strcmp, (dup_f)strdup, (rel_f)free);
 
        int arg;
        for (arg = argn; arg < ac; arg++) {
@@ -522,7 +548,6 @@ int main(int ac, char *av[]) {
                } else {
                        jsw_ainsert(nfound, av[arg]);
                }
-
        }
 
        if (findlibs) {