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