/****************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Грамматический словарь // Анисимов Д.В. сегодня /****************************************************************************/ # include # include # include # include # include # define Strcmp strcmp # define Strcmp1 strcmp extern uchar T_to_lower[] ; struct t_Sort { long i ; char *s ; }; struct t_Decompress { char str[80] ; long i ; }; t_Form Form0 ; /****************************************************************************/ char * to_lower( char *Str ) { long i ; static char Str1[200] ; // ------ перевести строку в маленькие буквы ------- for( i=0 ; i<200 && Str[i]!=0 ; i++ ) Str1[i]=T_to_lower[(uchar)Str[i]] ; Str1[i]=0 ; return Str1 ; } /****************************************************************************/ // инициировать нулями /****************************************************************************/ t_Slowo2 :: t_Slowo2( void ) { f_compress=0 ; Lang =NULL ; Format =NULL ; n_Word=0 ; n_Form=0 ; Mass =NULL ; Word =NULL ; reverce=NULL ; Word1 =NULL ; sy_Word1=NULL ; Shabl =NULL ; n_Word1=0 ; n_Shabl=0 ; Form0.init(); } /***************************************************************************/ // освободить данные от словаря /***************************************************************************/ void t_Slowo2 :: clr( ) { f_compress=0 ; Lang =NULL ; Format =NULL ; n_Word=0 ; n_Form=0 ; Free( Mass ); Free( Word ); Free( reverce ) ; Free( Word1 ) ; Free( sy_Word1 ) ; Free( Shabl ); n_Word1=0 ; n_Shabl=0 ; } /***************************************************************************/ // установить Lang и формат /***************************************************************************/ void t_Slowo2 :: set_lf( t_Lang *_Lang, t_Format *_Format ) { Lang = _Lang ; Format= _Format ; } /***************************************************************************/ // сравнить два слова из словаря (для сортировки) /***************************************************************************/ int wordcmp( const void *s1, const void *s2 ) { return Strcmp( ((t_Sort *)s1)->s,((t_Sort *)s2)->s ); } /***************************************************************************/ // прочесть словарь из файла в соответствии с форматом // File - имя файла // Lang - язык (источник или приемник), которому принадлежит словарь // _Format - формат, которому соответствует этот язык /***************************************************************************/ void t_Slowo2 :: read( char *File, t_Lang *_Lang, t_Format *_Format ) { long i,L ; FILE *fr ; t_Lexer Lexer ; try { Lang = _Lang ; Format= _Format ; n_Form=Format->Record.j ; fr=Fopen( File,"r" ); L=FileLength( fr ); Mass=(char *)Calloc( L,sizeof(char) ); Fread( Mass,L,sizeof(char),fr ); for( i=0 ; in_end ; i1++) { strcpy( Tmp0[i1].str,decompress( ss[i].i,S->index[i1] ) ); Tmp0[i1].i=i_rever[ss[i].i]+S->index[i1] ; } n+=S->n_end ; n0=i1 ; if( iindex[0] ) ); } // ---------- а теперь собственно сортировка слиянием ------- char flag1=0 ; j0=j1=j2=0 ; while( 1 ) { if( n0<=j0 && n1<=j1 ) break ; if( j1Strcmp( Tmp0[j0].str,Tmp1[j1].str ) ) TT=&Tmp0[j0++] ; else TT=&Tmp1[j1++] ; M1: if( flag1==0 && (0>=Strcmp( TT->str,zWord1.str ) || i==n_Word1-1) ) reverce[j++]=TT->i ; else { Tmp2[j2++] =*TT ; flag1=1 ; } } T=Tmp1 ; Tmp1=Tmp2 ; Tmp2=T ; n1=j2 ; } Free( ss ); Free( i_rever ); Free( Tmp0 ); Free( Tmp1 ); Free( Tmp2 ); } /***************************************************************************/ // вернуть слово в начальной форме // index - индекс слова (строки) /***************************************************************************/ char * t_Slowo2 :: normal( long index ) { if( f_compress==1 ) return Word1[sy_Word1[index]].str ; else return Mass + Word[index*n_Form] ; } /***************************************************************************/ // вернуть слово в заданной форме // index - индекс слова (строки) // Form - форма слова /***************************************************************************/ char * t_Slowo2 :: form( long index, t_Form *Form ) { long i,i1,i_Form ; t_Form *R ; t_Param1List *Param ; Param=&Lang->Part[Format->i_part].Param ; // параметры этой части речи i_Form=0 ; for( i=0 ; iRecord.j ; i++ ) { R=&Format->Record[i] ; for( i1=0 ; i1j ; i1++ ) if( Param->list[i1].Dir==0 && // переменный параметр слова Form->value[i1]>=0 && // параметр задан в конструкции R->value[i1]>=0 && // параметр задан в словаре Form->value[i1]!=R->value[i1] ) // параметр не соответствует goto M_No; i_Form=i ; break ; M_No:; } if( f_compress==1 ) { long n_end,z ; for( z=0,i=sy_Word1[index] ; if ) S2=SS ; if( f==0 ) { for( i=SS ; S1<=i ; i--) if( 0!=Strcmp( Str1,word_internal(reverce[i]) ) ) { S1=i+1 ; break ; } break ; } } // -------------- заполнить масивы ответов --------------------------- for( j=0,i=S1 ; iRecord[ i1%n_Form ] ; j++ ; if( 20<=j ) break ; } return j ; } /***************************************************************************/ // найти номер слова в словаре // Str - слово в начальной форме /***************************************************************************/ long t_Slowo2 :: find( char *str ) { long a,b,c,i ; char *s1 ; a=0 ; b=n_Word-1 ; while( 1 ) { if( b-a<10 ) { for( i=a ; i<=b ; i++ ) { if( 0==Strncmp( str,normal( i ),40 ) ) return i ; } return -1 ; } c=(a+b)>>1 ; if( 0find( Str1 ) ) return -1 ; else return 0 ; } /***************************************************************************/ // напечатать все формы слова в заданный файл /***************************************************************************/ void t_Slowo2 :: print_word( FILE *fw, long index ) { long i,N ; if( f_compress==0 ) { N=Format->Record.j ; for( i=0 ; i