/***************************************************************************/
// "Меркурий"-"Правда" - 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);
}