static struct slName *setup_labels(char *long_form, struct slName *bw_list, struct slName **labels_from_bw_list) { struct slName *lf_labels = NULL; if (long_form && !sameString(long_form, "on")) /* first check labels from CL */ { lf_labels = slNameListFromComma(long_form); int num_labels = slCount(lf_labels); if (num_labels != slCount(bw_list)) errAbort("number of labels provided should equal the number of bigWigs given"); } /* from file */ else { if (*labels_from_bw_list) { if (slCount(*labels_from_bw_list) == slCount(bw_list)) lf_labels = *labels_from_bw_list; else slNameFreeList(labels_from_bw_list); } if (!lf_labels) lf_labels = slNameCloneList(bw_list); } return lf_labels; }
static struct joinerTable *tableFromField(struct joinerField *jf) /* Extract database/table info out of field. */ { struct joinerTable *table; AllocVar(table); table->table = cloneString(jf->table); table->dbList = slNameCloneList(jf->dbList); return table; }
struct annoOption *annoOptionCloneList(struct annoOption *list) /* Return a newly allocated copy of list. */ { struct annoOption *newList = NULL, *afo; for (afo = list; afo != NULL; afo = afo->next) { struct annoOption *newAfo = CloneVar(afo); newAfo->spec.name = cloneString(afo->spec.name); newAfo->value = NULL; unsigned opFlags = opFlags; if (opFlags & OPTION_MULTI) { switch (opFlags & OPTION_TYPE_MASK) { case OPTION_STRING: newAfo->value = slNameCloneList((struct slName *)(afo->value)); break; default: errAbort("annoOptionCloneList: OPTION_MULTI implemented only for " "OPTION_STRING (not 0x%x)", opFlags); } } else { switch (opFlags & OPTION_TYPE_MASK) { // For numeric singleton values, we are overloading value. case OPTION_DOUBLE: case OPTION_FLOAT: case OPTION_LONG_LONG: case OPTION_INT: case OPTION_BOOLEAN: newAfo->value = afo->value; break; case OPTION_STRING: newAfo->value = cloneString((char *)afo->value); break; default: errAbort("annoOptionCloneList: unrecognized op type 0x%x", opFlags); } } slAddHead(&newList, newAfo); } slReverse(&newList); return newList; }
static void joinerExpand(struct joiner *joiner) /* Expand joiners that have [] in them. */ { struct joinerSet *js, *nextJs, *newJs, *newList = NULL; for (js=joiner->jsList; js != NULL; js = nextJs) { char *startBracket, *endBracket; nextJs = js->next; if ((startBracket = strchr(js->name, '[')) != NULL) { char *dbStart,*dbEnd; char *dbCommaList; struct joinerField *jf, *newJf; struct dyString *dy = dyStringNew(0); endBracket = strchr(startBracket, ']'); if (endBracket == NULL) errAbort("[ without ] line %d of %s", js->lineIx, joiner->fileName); dbCommaList = cloneStringZ(startBracket+1, endBracket - startBracket - 1); dbStart = dbCommaList; while (dbStart != NULL) { /* Parse out comma-separated list. */ dbEnd = strchr(dbStart, ','); if (dbEnd != NULL) { *dbEnd++ = 0; if (dbEnd[0] == 0) dbEnd = NULL; } if (dbStart[0] == 0) errAbort("Empty element in comma separated list line %d of %s", js->lineIx, joiner->fileName); /* Make up name for new joiner. */ dyStringClear(dy); dyStringAppendN(dy, js->name, startBracket-js->name); dyStringAppend(dy, dbStart); dyStringAppend(dy, endBracket+1); /* Allocate new joiner and fill in most data elements. */ AllocVar(newJs); newJs->name = cloneString(dy->string); newJs->typeOf = cloneString(js->typeOf); newJs->external = cloneString(js->external); newJs->description = cloneString(js->description); newJs->isFuzzy = js->isFuzzy; newJs->lineIx = js->lineIx; newJs->isDependency = js->isDependency; /* Fill in new joiner fieldList */ for (jf = js->fieldList; jf != NULL; jf = jf->next) { char *bs = NULL, *be = NULL; /* Allocate vars and do basic fields. */ AllocVar(newJf); newJf->dbList = slNameCloneList(jf->dbList); newJf->field = cloneString(jf->field); newJf->chopBefore = slNameCloneList(jf->chopBefore); newJf->chopAfter = slNameCloneList(jf->chopBefore); newJf->separator = cloneString(jf->separator); newJf->indexOf = jf->indexOf; newJf->isPrimary = jf->isPrimary; newJf->unique = jf->unique; newJf->full = jf->full; newJf->minCheck = jf->minCheck; newJf->splitPrefix = cloneString(jf->splitPrefix); newJf->exclude = slNameCloneList(jf->exclude); /* Do substituted table field. */ if ((bs = strchr(jf->table, '[')) != NULL) be = strchr(bs, ']'); if (bs == NULL || be == NULL) errAbort("Missing [] in field '%s' line %d of %s", jf->table, jf->lineIx, joiner->fileName); dyStringClear(dy); dyStringAppendN(dy, jf->table, bs - jf->table); dyStringAppend(dy, dbStart); dyStringAppend(dy, be+1); newJf->table = cloneString(dy->string); slAddHead(&newJs->fieldList, newJf); } newJs->expanded = TRUE; slReverse(&newJs->fieldList); slAddHead(&newList, newJs); dbStart = dbEnd; } dyStringFree(&dy); freez(&dbCommaList); joinerSetFree(&js); } else { slAddHead(&newList, js); } } slReverse(&newList); joiner->jsList = newList; }