SIS
Symmetric Index Structures
/Users/dbr/ma/src/bas/lml/alphabet.c
Go to the documentation of this file.
00001 #include "base.h"
00002 
00003 Alphabet * AlphabetInit(){
00004     Alphabet * alph;
00005     UINT i;
00006 
00007     alph = Malloc( 1, sizeof(Alphabet) );
00008     alph->symbolToCode = Malloc( ALPHABET_FIRST_MARKER, sizeof(U16) );
00009     for( i = 0; i < ALPHABET_FIRST_MARKER; i++ ){
00010         alph->symbolToCode[i] = NO_CODE;
00011     }
00012     alph->numberOfSymbols = 0;
00013     alph->maxMarker = NO_CODE;
00014     return alph;
00015 }
00016 
00017 static void Add( Alphabet * alph, const void * symbol, UINT symbolSize ){
00018     UINT c;
00019     U16 u16;
00020 
00021     c = SymbolToUINT( symbol, symbolSize );
00022     if( c >= ALPHABET_FIRST_MARKER ){
00023         if( alph->maxMarker < c ){
00024             alph->maxMarker = c;
00025         }
00026         return;
00027     }
00028     u16 = (U16)(c);
00029     if( alph->symbolToCode[u16] == NO_CODE ){
00030         if( alph->numberOfSymbols == NO_CODE ){
00031             Throw( "Cannot maintain alphabet: too many different symbols." );
00032         }
00033         alph->symbolToCode[u16] = alph->numberOfSymbols;
00034         alph->numberOfSymbols++;
00035     }
00036 }
00037 
00038 void AlphabetAdd( Alphabet * alph, const Automaton * aut ){
00039     UINT symbolSize = NO;
00040     UINT i;
00041 
00042     switch( aut->type ){
00043         case AUTOMATON_TYPE_SYMBOL:
00044             symbolSize = mAutomatonGetLabelSize( aut );
00045             break;
00046         case AUTOMATON_TYPE_SYMBOL_UINT:
00047             symbolSize = mAutomatonGetLabelSize( aut ) - sizeof(UINT);
00048             break;
00049     }
00050     for( i = 0; i < mAutomatonGetTransitionsStored( aut ); i++ ){
00051         Add( alph, mVoidSequenceElement(aut->transitionsLabel, i), symbolSize );
00052     }
00053 }
00054 
00055 void AlphabetFree( Alphabet * alph ){
00056     Free( alph->symbolToCode );
00057     Free( alph );
00058 }
00059 
00060 void AlphabetWrite( Alphabet * alph, FILE * fp ){
00061     UINT i;
00062     U8 * element;
00063 
00064     if( endiannessOfThisMachine != endiannessOnWrite ){
00065         for( i = 0; i < ALPHABET_FIRST_MARKER; i++ ){
00066             element = (U8 *)( alph->symbolToCode + i );
00067             mReverseBytes( element, sizeof(U16) )
00068         }
00069         element = (U8 *)(&(alph->numberOfSymbols)); mReverseBytes( element, sizeof(UINT) )
00070         element = (U8 *)(&(alph->maxMarker)); mReverseBytes( element, sizeof(UINT) )
00071     }
00072     mWriteEndianness( fp, endiannessOnWrite )
00073     Fwrite( alph->symbolToCode, sizeof(U16), ALPHABET_FIRST_MARKER, fp );
00074     Fwrite( &(alph->numberOfSymbols), sizeof(UINT), 1, fp );
00075     Fwrite( &(alph->maxMarker), sizeof(UINT), 1, fp );
00076     if( endiannessOfThisMachine != endiannessOnWrite ){
00077         for( i = 0; i < ALPHABET_FIRST_MARKER; i++ ){
00078             element = (U8 *)( alph->symbolToCode + i );
00079             mReverseBytes( element, sizeof(U16) )
00080         }
00081         element = (U8 *)(&(alph->numberOfSymbols)); mReverseBytes( element, sizeof(UINT) )
00082         element = (U8 *)(&(alph->maxMarker)); mReverseBytes( element, sizeof(UINT) )
00083     }
00084 }
00085 
00086 Alphabet * AlphabetRead( FILE * fp ){
00087     Alphabet * alph;
00088     U8 * element;
00089     UINT i, endianness;
00090 
00091     mReadEndianness( fp, endianness )
00092     alph = Malloc( 1, sizeof(Alphabet) );
00093     alph->symbolToCode = Malloc( ALPHABET_FIRST_MARKER, sizeof(U16) );
00094     Fread( alph->symbolToCode, sizeof(U16), ALPHABET_FIRST_MARKER, fp );
00095     Fread( &(alph->numberOfSymbols), sizeof(UINT), 1, fp );
00096     Fread( &(alph->maxMarker), sizeof(UINT), 1, fp );
00097     if( endiannessOfThisMachine != endianness ){
00098         for( i = 0; i < ALPHABET_FIRST_MARKER; i++ ){
00099             element = (U8 *)( alph->symbolToCode + i );
00100             mReverseBytes( element, sizeof(U16) )
00101         }
00102         element = (U8 *)(&(alph->numberOfSymbols)); mReverseBytes( element, sizeof(UINT) )
00103         element = (U8 *)(&(alph->maxMarker)); mReverseBytes( element, sizeof(UINT) )
00104     }
00105     return alph;
00106 }