/* Create a category map with a category for each feature type in a GFF_Set. Category numbers are assigned in order of appearance of types */ CategoryMap* cm_new_from_features(GFF_Set *feats) { int i; CategoryMap *retval; Hashtable *hash; List *types; /* first scan features for all types */ hash = hsh_new(10); types = lst_new_ptr(10); for (i = 0; i < lst_size(feats->features); i++) { GFF_Feature *f = lst_get_ptr(feats->features, i); checkInterruptN(i, 10000); if (hsh_get(hash, f->feature->chars) == (void*)-1) { lst_push_ptr(types, f->feature); hsh_put_int(hash, f->feature->chars, 1); } } hsh_free(hash); /* now create a simple category map */ retval = cm_new(lst_size(types)); for (i = 0; i <= retval->ncats; i++) { String *type = i == 0 ? str_new_charstr(BACKGD_CAT_NAME) : str_dup(lst_get_ptr(types, i-1)); retval->ranges[i] = cm_new_category_range(type, i, i); } lst_free(types); return retval; }
/* Closes all outfiles. If already closed, reopen with append, add #eof closer, and close again. see comment above at get_outfile */ void close_outfiles(List *outfileList, Hashtable *outfileHash) { List *keys = hsh_keys(outfileHash); int *done, idx, i; char *fname; FILE *outfile; done = smalloc(lst_size(keys)*sizeof(int)); for (i=0; i<lst_size(keys); i++) { done[i]=0; fname = (char*)lst_get_ptr(keys, i); idx = hsh_get_int(outfileHash, fname); outfile = (FILE*)lst_get_ptr(outfileList, idx); if (outfile != NULL) { mafBlock_close_outfile(outfile); done[i]=1; } } for (i=0; i<lst_size(keys); i++) { if (done[i]) continue; fname = (char*)lst_get_ptr(keys, i); outfile = phast_fopen(fname, "a"); mafBlock_close_outfile(outfile); } sfree(done); lst_free(keys); lst_free(outfileList); hsh_free(outfileHash); }
void rb_config_free() { hsh_free(g_state.poll_by_key); /* Note that rb_item's are owned by pollers */ free_pollers(g_state.polls); }
//frees all elements of block except prev and next pointers void mafBlock_free(MafBlock *block) { if (block->aLine != NULL) { str_free(block->aLine); block->aLine = NULL; } if (block->specMap != NULL) { hsh_free(block->specMap); block->specMap = NULL; } mafBlock_free_data(block); sfree(block); }
void mafBlock_reorder(MafBlock *block, List *specNameOrder) { String *str; MafSubBlock *sub; List *newData; Hashtable *newSpecMap; int i, idx, *found, oldSize = lst_size(block->data), newSize = lst_size(specNameOrder); found = smalloc(oldSize*sizeof(int)); for (i=0; i<oldSize; i++) found[i]=0; newData = lst_new_ptr(oldSize); newSpecMap = hsh_new(100); for (i=0; i<newSize; i++) { str = (String*)lst_get_ptr(specNameOrder, i); idx = hsh_get_int(block->specMap, str->chars); if (idx != -1) { if (found[idx]==1) die("ERROR: species %s appears twice in reorder list\n", str->chars); sub = (MafSubBlock*)lst_get_ptr(block->data, idx); hsh_put_int(newSpecMap, sub->src->chars, lst_size(newData)); hsh_put_int(newSpecMap, sub->specName->chars, lst_size(newData)); lst_push_ptr(newData, (void*)sub); found[idx] = 1; } } for (i=0; i<oldSize; i++) { if (found[i]==0) { sub = (MafSubBlock*)lst_get_ptr(block->data, i); mafSubBlock_free(sub); } } hsh_free(block->specMap); lst_free(block->data); block->specMap = newSpecMap; block->data = newData; sfree(found); }