State *post2nfa(char *postfix) { FragStack stk; int index = 0; for (char *p = postfix; *p; p++, index++) { switch (*p) { case '&': { FragPtr f2 = stk.back(); stk.pop_back(); FragPtr f1 = stk.back(); stk.pop_back(); f1->patchTo(f2->start); stk.push_back(newFrag(f1->start, f2->out)); } break; case '|': { FragPtr f2 = stk.back(); stk.pop_back(); FragPtr f1 = stk.back(); stk.pop_back(); State *s = new State(SPLIT, f1->start, f2->start); stk.push_back(newFrag(s, append(f1->out, f2->out))); } break; case '?': { FragPtr f = stk.back(); stk.pop_back(); State *s = new State(SPLIT, f->start, NULL); stk.push_back(newFrag(s, append(f->out, list1(&s->out1)))); } break; case '*': { FragPtr f = stk.back(); stk.pop_back(); State *s = new State(SPLIT, f->start, NULL); f->patchTo(s); stk.push_back(newFrag(s, list1(&s->out1))); } break; case '+': { FragPtr f = stk.back(); stk.pop_back(); State *s = new State(SPLIT, f->start, NULL); f->patchTo(s); stk.push_back(newFrag(f->start, list1(&s->out1))); } break; default: { State *s = new State(*p, NULL, NULL); stk.push_back(newFrag(s, list1(&s->out))); } break; } begin(index); drawNfa(stk, index); end(); } assert(stk.size() == 1); FragPtr f = stk.back(); stk.pop_back(); f->patchTo(&match); stk.push_back(f); begin(index); drawNfa(stk, index); end(); return f->start; }
void readFinfFiles(char *gsDir) /* Read in .finf files and save info in cloneHash/cloneList. */ { struct lineFile *lf; struct clone *clone = NULL; struct endInfo *end; char fileName[512]; int i; char *words[7]; char lastClone[64]; char cloneName[64]; int gsInfoCount = 0; struct frag *frag; boolean isFin; char *s, *e; strcpy(lastClone, ""); for (i=0; i<ArraySize(gsFiles); ++i) { isFin = (i <= 0); sprintf(fileName, "%s/%s", gsDir, gsFiles[i]); printf("Reading info from %s\n", fileName); lf = lineFileOpen(fileName, TRUE); while (lineFileRow(lf, words)) { if (!sameString(words[1], lastClone)) { struct clone *oldClone; strcpy(lastClone, words[1]); strcpy(cloneName, words[1]); AllocVar(clone); s = strchr(cloneName, '.'); if (s == NULL) errAbort("Bad clone name format line %d of %s\n", lf->lineIx, lf->fileName); if (strlen(s) >= sizeof(clone->version)) errAbort("Bad clone name format line %d of %s\n", lf->lineIx, lf->fileName); strcpy(clone->version, s); chopSuffix(cloneName); clone->size = atoi(words[3]); if ((oldClone = hashFindVal(cloneHash, cloneName)) != NULL) { if (isFin && clone->size == oldClone->size && sameString(clone->version, oldClone->version)) warn("Apparently benign duplication of %s line %d of %s", cloneName, lf->lineIx, lf->fileName); else warn("%s duplicated line %d of %s (size %d oldSize %d)", cloneName, lf->lineIx, lf->fileName, clone->size, oldClone->size); } hashAddSaveName(cloneHash, cloneName, clone, &clone->name); clone->isFin = isFin; slAddHead(&cloneList, clone); } frag = newFrag(words[0], lf); slAddTail(&clone->fragList, frag); ++clone->fragCount; if (!clone->isFin && !sameString(words[6], "?") && !sameString(words[6], "i") && !sameString(words[6], "w")) { char *s = strchr(words[0], '~'); char c; if (s == NULL) errAbort("Expecting ~ in fragment name line %d of %s\n", lf->lineIx, lf->fileName); ++s; AllocVar(end); end->contig = cloneString(s); subChar(s, '.', '_'); end->text = cloneString(words[6]); c = lastChar(end->text); if (!(c == 'L' || c == 'R')) c = '?'; end->lr = c; slAddHead(&clone->gsList, end); ++gsInfoCount; } } lineFileClose(&lf); } printf("Found %d ends in %d clones\n", gsInfoCount, slCount(cloneList)); }