# include # include # include # include # define Err_Memory -2 # define Err_Fopen -3 # define Err_Fread -4 # define Err_Fwrite -5 # define Err_Data -6 # define uchar unsigned char # define max(a,b) (((a) > (b)) ? (a) : (b)) # define min(a,b) (((a) < (b)) ? (a) : (b)) # define Free( a ) if( a!=NULL ) { free(a); a=NULL ; } # define Fclose( f ) if( f!=NULL ) { fclose(f); f=NULL ; } /***************************************************************************/ struct t_SlowoLine // структура для сортировки грамматических словарей { char *str ; long index ; }; static uchar SC[256] ; struct t_SC{ t_SC(void); }; t_SC SC1 ; /***************************************************************************/ void *Calloc( long N, long S ) { void *v ; if( N*S <0 ) return NULL ; v=calloc( N,S ); if( v==NULL ) throw(Err_Memory); return v ; } /***************************************************************************/ void *Malloc( long N, long S ) { void *v ; if( N*S <0 ) return NULL ; v=malloc( N*S ); if( v==NULL ) throw(Err_Memory); return v ; } /***************************************************************************/ void *Realloc( void *M, long L ) { void *v ; if( L <0 ) return NULL ; v=realloc( M,L ); if( v==NULL ) throw(Err_Memory); return v ; } /***************************************************************************/ FILE *Fopen( char *Name, char *a ) { FILE *f ; f=fopen( Name, a ); if( f==NULL ) throw(Err_Fopen); return f ; } /***************************************************************************/ void Fread( void *M, long S, long N, FILE *File ) { long n ; n=fread( M, S, N, File ); if( n!=N ) throw(Err_Fread); } /***************************************************************************/ void Fwrite( void *M, long S, long N, FILE *File ) { long n ; n=fwrite( M, S, N, File ); if( n!=N ) throw(Err_Fwrite); } /***************************************************************************/ void Fseek( FILE *fw, long Offset, long Mode ) { if( 0!=fseek( fw, Offset, Mode ) )throw(-1); } /***************************************************************************/ long FileLength( FILE *fw ) { fpos_t Cur ; long L ; if( 0!=fgetpos( fw,&Cur ) ) throw( -1 ); if( 0!=fseek( fw,0L,SEEK_END) ) throw( -1 ); L = ftell( fw ); if( 0!=fsetpos( fw,&Cur) ) throw( -1 ); return (long )L ; } /***************************************************************************/ long file_to_mass( char *File, char **_Mass ) { char *Mass ; long L ; FILE *fr ; fr=Fopen( File,"r" ); L=FileLength( fr ); Mass=(char *)Calloc( L,1 ); Fread( Mass,L,1,fr ); Fclose(fr); *_Mass=Mass ; return L ; } /***************************************************************************/ t_SC :: t_SC( void ) { short i ; for( i=0 ; i<256 ; i++ ) SC[i]=i ; // ----- соответствие латинских больших и маленьких ---- for( i=65 ; i<91 ; i++ ) SC[i]=i+32 ; // ----- соответствие русских больших и маленьких ---- SC[(uchar)'а']=SC[(uchar)'А']=128 ; SC[(uchar)'б']=SC[(uchar)'Б']=129 ; SC[(uchar)'в']=SC[(uchar)'В']=130 ; SC[(uchar)'г']=SC[(uchar)'Г']=131 ; SC[(uchar)'д']=SC[(uchar)'Д']=132 ; SC[(uchar)'е']=SC[(uchar)'Е']=133 ; SC[(uchar)'ё']=SC[(uchar)'Ё']=134 ; SC[(uchar)'ж']=SC[(uchar)'Ж']=135 ; SC[(uchar)'з']=SC[(uchar)'З']=136 ; SC[(uchar)'и']=SC[(uchar)'И']=137 ; SC[(uchar)'й']=SC[(uchar)'Й']=138 ; SC[(uchar)'к']=SC[(uchar)'К']=139 ; SC[(uchar)'л']=SC[(uchar)'Л']=140 ; SC[(uchar)'м']=SC[(uchar)'М']=141 ; SC[(uchar)'н']=SC[(uchar)'Н']=142 ; SC[(uchar)'о']=SC[(uchar)'О']=143 ; SC[(uchar)'п']=SC[(uchar)'П']=144 ; SC[(uchar)'р']=SC[(uchar)'Р']=145 ; SC[(uchar)'с']=SC[(uchar)'С']=146 ; SC[(uchar)'т']=SC[(uchar)'Т']=147 ; SC[(uchar)'у']=SC[(uchar)'У']=148 ; SC[(uchar)'ф']=SC[(uchar)'Ф']=149 ; SC[(uchar)'х']=SC[(uchar)'Х']=150 ; SC[(uchar)'ц']=SC[(uchar)'Ц']=151 ; SC[(uchar)'ч']=SC[(uchar)'Ч']=152 ; SC[(uchar)'ш']=SC[(uchar)'Ш']=153 ; SC[(uchar)'щ']=SC[(uchar)'Щ']=154 ; SC[(uchar)'ъ']=SC[(uchar)'Ъ']=155 ; SC[(uchar)'ы']=SC[(uchar)'Ы']=156 ; SC[(uchar)'ь']=SC[(uchar)'Ь']=157 ; SC[(uchar)'э']=SC[(uchar)'Э']=158 ; SC[(uchar)'ю']=SC[(uchar)'Ю']=160 ; SC[(uchar)'я']=SC[(uchar)'Я']=161 ; } /***************************************************************************/ uchar *SortChar( void ) { return SC ; } /***************************************************************************/ // сравнить две строки // /***************************************************************************/ short Strcmp( char *Str1, char *Str2 ) { short i,c ; register uchar c1,c2 ; for( i=0 ; ; i++ ) { c1=(uchar)Str1[i] ; c2=(uchar)Str2[i] ; //if( c1==0 && c2==0 ) return 0 ; if( c1 || c2 ) ; else return 0 ; if( c1==c2 ) continue ; if( c1==0 ) return -1 ; if( c2==0 ) return 1 ; c = SC[c1] - SC[c2] ; if( c!=0 ) return c ; } } /***************************************************************************/ // сравнить строки // /***************************************************************************/ short Strncmp( char *Str1, char *Str2, short L ) { short i,c ; for( i=0 ; istr, ((t_SlowoLine *)s2)->str ); } /***************************************************************************/ long FileToMass( char *File, char **_Mass ) { char *Mass ; long L ; FILE *fr ; fr=Fopen( File,"r" ); L=FileLength( fr ); Mass=(char *)Calloc( L,1 ); fread( Mass,L,1,fr ); Fclose(fr); *_Mass=Mass ; return L ; } /***************************************************************************/ long FileToString( char *File, char ***_Str ) { long i,j,L ; char *Mass,**ss ; L=FileToMass( File, &Mass ); for( i=j=0 ; i