SIS
Symmetric Index Structures
|
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 }