/* Visits every cell in one block before moving to another block. * It is a checked run-time error to pass a NULL T to any function in this * interface */ extern void UArray2b_map(T array2b, void apply(int i, int j, T array2b, void *element, void *cl), void *cl) { assert(array2b && cl); int i, j; void *element = NULL; for(i = 0; i < array2b->WidInBlocks; i++) { for(j = 0; j < array2b->HgtInBlocks; j ++) { mapBlock(array2b, array2b->width, array2b->height, element, cl, apply, i, j); } } }
struct psl* pslTransMap(unsigned opts, struct psl *inPsl, struct psl *mapPsl) /* map a psl via a mapping psl, a single psl is returned, or NULL if it * couldn't be mapped. */ { int mappedPslMax = 8; /* allocated space in output psl */ int iMapBlk = 0; char inPslOrigStrand[3]; boolean rcInPsl = (pslTStrand(inPsl) != pslQStrand(mapPsl)); boolean cnv1 = (pslIsProtein(inPsl) && !pslIsProtein(mapPsl)); boolean cnv2 = (pslIsProtein(mapPsl) && !pslIsProtein(inPsl)); int iBlock; struct psl* mappedPsl; /* sanity check size, but allow names to vary to allow ids to have * unique-ifying suffixes. */ if (inPsl->tSize != mapPsl->qSize) errAbort("Error: inPsl %s tSize (%d) != mapPsl %s qSize (%d)", inPsl->tName, inPsl->tSize, mapPsl->qName, mapPsl->qSize); /* convert protein PSLs */ if (cnv1) pslProtToNA(inPsl); if (cnv2) pslProtToNA(mapPsl); /* need to ensure common sequence is in same orientation, save strand for later */ safef(inPslOrigStrand, sizeof(inPslOrigStrand), "%s", inPsl->strand); if (rcInPsl) pslRc(inPsl); mappedPsl = createMappedPsl(inPsl, mapPsl, mappedPslMax); /* Fill in ungapped blocks. */ for (iBlock = 0; iBlock < inPsl->blockCount; iBlock++) { struct block align1Blk = blockFromPslBlock(inPsl, iBlock); while (mapBlock(inPsl, mapPsl, &iMapBlk, &align1Blk, mappedPsl, &mappedPslMax)) continue; } /* finish up psl, or free if no blocks were added */ assert(mappedPsl->blockCount <= mappedPslMax); if (mappedPsl->blockCount == 0) pslFree(&mappedPsl); /* nothing made it */ else { setPslBounds(mappedPsl); adjustOrientation(opts, inPsl, inPslOrigStrand, mappedPsl); } /* restore input */ if (rcInPsl) { pslRc(inPsl); strcpy(inPsl->strand, inPslOrigStrand); } if (cnv1) pslNAToProt(inPsl); if (cnv2) pslNAToProt(mapPsl); return mappedPsl; }