int writeESAToFile(char *pFileName, ESA esa, unsigned char *pExtraData, int nExtra) { FILE *f; f = fopen(pFileName, "w"); if(f == 0) { char st[512]; sprintf(st, "Could not open '%s' for writing.", pFileName); setError(st); return 0; } // Initialize file format structure struct ESAFileFormat ff; memset(&ff, 0, sizeof(struct ESAFileFormat)); strcpy(ff.ID, HEADERNAME); ff.major = MAJOR_VERSION; ff.minor = MINOR_VERSION; ff.size = esa->size; ff.alphabetSize = getAlphabetSize(esa); strncpy(ff.alphabet, getAlphabet(esa), getAlphabetSize(esa)); ff.ignoreAlphabetSize = getIgnoreAlphabetSize(esa); strncpy(ff.ignoreAlphabet, getIgnoreAlphabet(esa), getIgnoreAlphabetSize(esa)); if(pExtraData == NULL) { ff.nExtraData = -1; } else { ff.nExtraData = nExtra; } ff.reserved1 = 0; // Presently the reserved values are not used ff.reserved2 = 0; // Write header fwrite(&ff, sizeof(struct ESAFileFormat), 1, f); // Write translated string fwrite(esa->pStr, sizeof(unsigned char), ff.size+1, f); // Write array fwrite(esa->suf, sizeof(int), ff.size, f); fwrite(esa->lcp, sizeof(unsigned char), ff.size, f); // Possibly write extra data if(pExtraData != NULL) { fwrite(pExtraData, sizeof(unsigned char), nExtra, f); } fclose(f); return 1; }
/******************* Assume the right side of the reflector is in alphabet order and the left side of the reflector to be in mapping order. ********************/ int Reflector::map(int pinIn) { int result = Globals::INVALID_PIN_NUMBER; int origPinIn = pinIn; if (! isValidPinNo(pinIn)) { result = Globals::INVALID_PIN_NUMBER; qDebug("requested pin [%d] not in valid range [%d...%d]", pinIn, 1, getAlphabetSize()); return result; } QString x = alphabetMap.at(pinIn); result = reflectorMap.indexOf(x, 0, Qt::CaseSensitive ); if (result == -1) { result = Globals::INVALID_PIN_NUMBER; qDebug("reflector map pin number [%d] not found", pinIn); return result; } qDebug("map origPinIn [%d] calcPinIn [%d] pinOut [%d]", origPinIn, pinIn, result); return result; }
/*********************************************************************** * Switching to BPR2 over SAIS because SAIS became unruley and BPR2 * seems to have better performance characteristics. Still * investigating. ***********************************************************************/ size_t* getSortedSuffixArray(const u8 *input, const size_t length){ //DECLARATIONS////////////////////////////////////////////////////////// sequence toReturn, intermediate, runsRem; //INITIALIZATIONS/////////////////////////////////////////////////////// runsRem = removeRuns(input, length); //OPERATIONS//////////////////////////////////////////////////////////// if((runsRem.size * 1.0) / length > DEREFERENCE_BREAK_EVEN){ free(runsRem.S); toReturn = bpr2direct(input, length); }else{ u8 alphabetSize = getAlphabetSize(input, length); intermediate = SAIS(input, length, runsRem, alphabetSize); toReturn = addRuns(input, length, intermediate); free(runsRem.S); free(intermediate.S); } //CLEAN UP////////////////////////////////////////////////////////////// //free(intermediate.S); return toReturn.S; }
bool Reflector::isValidPinNo(int pinNo) { bool result = true; if ((pinNo < 1) || (pinNo > getAlphabetSize())) { result = false; } return result; }