void dump_variants(int outfd, stringptr* section_name, variant_info_list* variants, stringptrlist* block_strings, size_t level, size_t previous_membercount, ssize_t backindent) { if(variants == NULL) return; variant_info* vp; stringptr* act, normalized; char norm_buf[1024]; size_t membercount; size_t* id; int switched = 0; sblist_iter(variants, vp) { membercount = sblist_getsize(vp->members); if(membercount == previous_membercount) { print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "if(str[%zu]!='%c') goto main_default;\n", level, vp->c); backindent++; } else { if(!switched) { print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "switch(str[%zu]) {\n", level); switched = 1; backindent--; } print_level_tabs(outfd, level - backindent); ulz_fprintf(outfd, "case '%c':\n", vp->c); } if(!vp->variants) { print_level_tabs(outfd, level - backindent); id = sblist_get(vp->members, 0); act = sblist_get(block_strings, *id); normalized = normalize(act, norm_buf, sizeof(norm_buf)); log_put(outfd, VARISL("\treturn stringswitch_enumerator_member_name("), VARIS(section_name), VARISL(", "), VARIS(&normalized), VARISL(");"), NULL); } dump_variants(outfd, section_name, vp->variants, block_strings, level+1, membercount, backindent); }
void queue_package(pkgstate* state, stringptr* packagename, jobtype jt, int force) { if(!packagename->size) return; sblist* queue = (jt == JT_DOWNLOAD) ? state->dl_queue : state->build_queue; if(is_in_queue(packagename, queue)) return; if(!force && is_installed(state->installed_packages, packagename)) { ulz_fprintf(1, "package %s is already installed, skipping %s\n", packagename->ptr, jt == JT_DOWNLOAD ? "download" : "build"); return; } uint32_t hash = stringptr_hash(packagename); pkgdata* pkg = packagelist_get(state->package_list, packagename, hash); unsigned i; if(!pkg) { pkg = packagelist_add(state->package_list, packagename, hash); get_package_contents(&state->cfg, packagename, pkg); } for(i = 0; i < stringptrlist_getsize(pkg->deps); i++) queue_package(state, stringptrlist_get(pkg->deps, i), jt, 0); // omg recursion if( // if sizeof mirrors is 0, it is a meta package (jt == JT_DOWNLOAD && stringptrlist_getsize(pkg->mirrors) && !has_tarball(&state->cfg, pkg)) || (jt == JT_BUILD && stringptrlist_getsize(pkg->buildscript)) ) { add_queue(packagename, queue); } }
void print_level_tabs(int fd, size_t level) { size_t i; for (i = 0; i < level + 3; i++) ulz_fprintf(fd, "\t"); }