/** * @return number of symbols actually read */ size_t gt_MRAEncReadAndTransform(const MRAEnc *mralpha, FILE *fp, size_t numSyms, Symbol *dest) { int retval = 0; switch (mralpha->encType) { case sourceUInt8: { const MRAEncUInt8 *ui8alpha; size_t i; ui8alpha = constMRAEnc2MRAEncUInt8(mralpha); for (i = 0; i < numSyms; ++i) { int c = getc(fp); if (c != EOF) dest[i] = ui8alpha->mappings[c]; else break; } retval = i; } break; default: abort(); break; } return retval; }
MRAEnc * gt_MRAEncCopy(const MRAEnc *alpha) { gt_assert(alpha); switch (alpha->encType) { case sourceUInt8: { MRAEncUInt8 *newAlpha = NULL; const MRAEncUInt8 *srcAlpha = constMRAEnc2MRAEncUInt8(alpha); int numRanges = alpha->numRanges; gt_assert(numRanges > 0); if ((newAlpha = gt_calloc(sizeof (MRAEncUInt8), 1)) && (newAlpha->baseClass.rangeEndIndices = gt_malloc(sizeof (newAlpha->baseClass.rangeEndIndices[0]) * numRanges)) && (newAlpha->baseClass.symbolsPerRange = gt_malloc(sizeof (newAlpha->baseClass.rangeEndIndices[0]) * numRanges))) { newAlpha->baseClass.encType = sourceUInt8; newAlpha->baseClass.numRanges = srcAlpha->baseClass.numRanges; memcpy(newAlpha->mappings, srcAlpha->mappings, UINT8_MAX+1); memcpy(newAlpha->revMappings, srcAlpha->revMappings, UINT8_MAX+1); memcpy(newAlpha->baseClass.rangeEndIndices, srcAlpha->baseClass.rangeEndIndices, sizeof (newAlpha->baseClass.rangeEndIndices[0]) * numRanges); memcpy(newAlpha->baseClass.symbolsPerRange, srcAlpha->baseClass.symbolsPerRange, sizeof (newAlpha->baseClass.symbolsPerRange[0]) * numRanges); return &(newAlpha->baseClass); } else { if (newAlpha) { if (newAlpha->baseClass.symbolsPerRange) gt_free(newAlpha->baseClass.symbolsPerRange); if (newAlpha->baseClass.rangeEndIndices) gt_free(newAlpha->baseClass.rangeEndIndices); gt_free(newAlpha); } return NULL; } } break; default: return NULL; break; } }
MRAEnc * gt_MRAEncSecondaryMapping(const MRAEnc *srcAlpha, int selection, const int *rangeSel, Symbol fallback) { MRAEnc *newAlpha; switch (srcAlpha->encType) { case sourceUInt8: { GT_UNUSED const MRAEncUInt8 *ui8alpha; uint8_t *mappings, destSym; AlphabetRangeSize *newRanges, sym; AlphabetRangeID range, numRanges = MRAEncGetNumRanges(srcAlpha); ui8alpha = constMRAEnc2MRAEncUInt8(srcAlpha); mappings = gt_malloc(sizeof (uint8_t) * (UINT8_MAX + 1)); memset(mappings, UNDEF_UCHAR, UINT8_MAX+1); newRanges = gt_malloc(sizeof (newRanges[0]) * numRanges); sym = 0; destSym = 0; for (range = 0; range < numRanges; ++range) { if (rangeSel[range] == selection) { for (; sym < srcAlpha->rangeEndIndices[range]; ++sym) mappings[sym] = destSym++; newRanges[range] = srcAlpha->symbolsPerRange[range]; } else { for (; sym < srcAlpha->rangeEndIndices[range]; ++sym) mappings[sym] = fallback; newRanges[range] = 0; } } newAlpha = gt_newMultiRangeAlphabetEncodingUInt8(numRanges, newRanges, mappings); gt_free(mappings); gt_free(newRanges); } break; default: abort(); break; } return newAlpha; }
void MRAEncSymbolsTransform(const MRAEnc *mralpha, Symbol *symbols, size_t numSyms) { switch (mralpha->encType) { case sourceUInt8: { const MRAEncUInt8 *ui8alpha; size_t i; ui8alpha = constMRAEnc2MRAEncUInt8(mralpha); for (i = 0; i < numSyms; ++i) { symbols[i] = ui8alpha->mappings[symbols[i]]; } } break; default: abort(); break; } }