/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // Всякие мелкие, но очень полезные штучки // Анисимов Д.В. сегодня /***************************************************************************/ # include <stdlib.h> # include <string.h> # include "mylib.h" static uchar SC[256] ; static char Error[10000]="" ; 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 ) { sprintf( Error,"Error fopen(%s)\n",Name ); 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 && c2) ) return c2-c1 ; if( !(c1 && c2) ) return c1-c2 ; if( c1==c2 ) continue ; c = SC[c1] - SC[c2] ; if( c!=0 ) return c ; } } /***************************************************************************/ // сравнить строки // /***************************************************************************/ short Strncmp( char *Str1, char *Str2, short L ) { short i,c ; for( i=0 ; i<L ; i++ ) { if( Str1[i]==0 && Str2[i]!=0 ) return -1 ; if( Str1[i]!=0 && Str2[i]==0 ) return 1 ; if( Str1[i]==0 && Str2[i]==0 ) return 0 ; c = SC[(uchar)Str1[i]] - SC[(uchar)Str2[i]] ; if( c!=0 ) return c ; } return 0 ; } /***************************************************************************/ void Strcpy( char *Str1, char *Str2, int Lmax ) { short i ; for( i=0 ; i<Lmax-1 ; i++ ) { Str1[i]=Str2[i] ; if( Str2[i]==0 ) return ; } Str1[Lmax-1]=0 ; } /***************************************************************************/ void Strcat( char *Str1, char *Str2, int Lmax ) { short i,j ; j=strlen( Str1 ); for( i=0 ; i<Lmax-1 ; i++ ) { if( j==Lmax-1 ) break ; Str1[j++]=Str2[i] ; if( Str2[i]==0 ) return ; } Str1[Lmax-1]=0 ; } /***************************************************************************/ /* удалить коментарии */ /***************************************************************************/ long remark( char *Mass, long l_Mass ) { long i,j ; char f=0 ; for( i=j=0 ; i<l_Mass-1 ; i++ ) { if( f==0 && Mass[i]=='/' && Mass[i+1]=='/' ) f=1 ; // if( f==0 && Mass[i]=='#' ) f=1 ; if( f==0 && Mass[i]=='/' && Mass[i+1]=='*' ) f=2 ; if( f==0 || Mass[i]=='\n' ) Mass[j++]=Mass[i] ; if( 0<i ) if( f==2 && Mass[i-1]=='*' && Mass[i]=='/' ) f=0 ; if( f==1 && Mass[i]=='\n') f=0 ; } if( f==0 ) Mass[j++]=Mass[i] ; return j ; } /***************************************************************************/ static char Emptystr[300] ; char *emptystr( short n ) { short i ; if( 299<n ) { printf("Какому дураку понадобилась такая длинная пустая строка?"); exit(-1); } for( i=0 ; i<n ; i++ ) Emptystr[i]=' ' ; Emptystr[i]=0 ; return Emptystr ; } /***************************************************************************/ void error_set( char *s ) { strcpy( Error,s ); } /***************************************************************************/ void error_add( char *s ) { strcat( Error,s ); } /***************************************************************************/ char *error_get( void ) { return Error ; } /***************************************************************************/ void provokator( ) { for( long i=0 ; i<10000 ; i++ ) { char *c=(char *)Malloc( i,3 ); Free( c ); } } /***************************************************************************/ void list_error( void ) { error_set( "Ошибка в t_List\n" ); throw(-1); }