示例#1
0
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;
}
示例#2
0
/*******************
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;
}
示例#3
0
/***********************************************************************
 * 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;
}
示例#4
0
bool Reflector::isValidPinNo(int pinNo)
{
    bool result = true;

    if ((pinNo < 1) || (pinNo > getAlphabetSize()))
    {
        result = false;
    }

    return result;
}