Пример #1
0
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);
	}
Пример #2
0
int in_member_list(variant_info* variant, size_t index) {
	size_t i, *r;
	for(i = 0; i < sblist_getsize(variant->members); i++) {
		r = sblist_get(variant->members, i);
		if (*r == index) return 1;
	}
	return 0;
}
Пример #3
0
variant_info* find_variant(sblist* variants, int c) {
	size_t i;
	variant_info* res;
	for(i = 0; i < sblist_getsize(variants); i++) {
		res = sblist_get(variants, i);
		if(res->c == c) return res;
	}
	return NULL;
}
Пример #4
0
int is_in_queue(stringptr* packagename, sblist* queue) {
	size_t i;
	pkg_exec* listitem;
	for(i = 0; i < sblist_getsize(queue); i++) {
		listitem = sblist_get(queue, i);
		if(EQ(listitem->name, packagename))
			return 1;
	}
	return 0;
}
Пример #5
0
// checks if all dependencies are installed
// then checks if the tarball is downloaded
// then checks if its either a metapackage or doesnt require a tarball.
int has_all_deps(pkgstate* state, pkgdata* item) {
	size_t i;
	pkg_exec* dlitem;
	for(i = 0; i < stringptrlist_getsize(item->deps); i++)
		if(!is_installed(state->installed_packages, stringptrlist_get(item->deps, i))) return 0;
	for(i = 0; i < sblist_getsize(state->dl_queue); i++) {
		dlitem = sblist_get(state->dl_queue, i);
		if(EQ(dlitem->name, item->name)) {
			return (dlitem->pid == 0); //download finished?
		}
	}
	return (!stringptrlist_getsize(item->mirrors) || has_tarball(&state->cfg, item));
}
Пример #6
0
// initialise with members list, containing all ids
variant_info_list* get_variants(size_t_ptrlist* members, stringptr* last_prefix, stringptrlist* block_strings, size_t block_len) {
	size_t i;
	variant_info vr, *vp;
	stringptr* next_prefix, *act;
	size_t* id;
	if(last_prefix->size == block_len) return NULL;
	variant_info_list* res = NULL;
	stringptr temp;
	char c;
	
	for(i = 0; i < sblist_getsize(members); i++)  {
		id = sblist_get(members, i);
		act = stringptrlist_get(block_strings, *id);
		if(last_prefix->size == 0 || stringptr_here(act, 0, last_prefix)) {
			if(!res) res = sblist_new(sizeof(variant_info), 16);
			if(!(vp = find_variant(res, act->ptr[last_prefix->size]))) {
				vr.c = act->ptr[last_prefix->size];
				vr.members = sblist_new(sizeof(size_t), stringptrlist_getsize(members));
				vr.variants = NULL;
				sblist_add(res, &vr);
				vp = find_variant(res, vr.c);
			}
			sblist_add(vp->members, id);
		}
	}
	if(res) {
		for (i = 0; i < sblist_getsize(res); i++) {
			vp = sblist_get(res, i);
			c = vp->c;
			temp.size = 1;
			temp.ptr = &c;
			next_prefix = stringptr_concat(last_prefix, &temp, NULL);
			vp->variants = get_variants(vp->members, next_prefix, block_strings, block_len);
		}
	}
	return res;
}
Пример #7
0
void fill_slots(jobtype ptype, pkgstate* state) {
	size_t i;
	pkg_exec* item;
	pkgdata* pkg;
	int* slots = (ptype == JT_DOWNLOAD) ? &state->slots.dl_slots : &state->slots.build_slots;
	sblist* queue = (ptype == JT_DOWNLOAD) ? state->dl_queue : state->build_queue;
	for(i = 0; *slots && i < sblist_getsize(queue); i++) {
		item = sblist_get(queue, i);
		if(item->pid == -1) {
			pkg = packagelist_get(state->package_list, item->name, stringptr_hash(item->name));
			if(ptype == JT_DOWNLOAD || has_all_deps(state, pkg)) {
				if(ptype == JT_BUILD && !pkg->verified) {
					if (! (pkg->verified = !(verify_tarball(&state->cfg, pkg)))) {
						log_put(2, VARISL("WARNING: "), VARIS(item->name), VARISL(" failed to verify! please delete its tarball and retry downloading it."), NULL);
						continue;
					}
				}
				launch_thread(ptype, state, item, pkg);
				(*slots)--;
			}
		}
	}
}
Пример #8
0
void sblist_delete(sblist* l, size_t item) {
	if (l->count && item < l->count) {
		memmove(sblist_item_from_index(l, item), sblist_item_from_index(l, item + 1), (sblist_getsize(l) - (item + 1)) * l->itemsize);
		l->count--;
	}
}