/***************************************************************************/
//              "Меркурий"-"Правда" - open source переводчик
//          распространяется в соответсвии с лицензией GNU v 2.0
//
//                                 main()
//     Анисимов Д.В.                                         сегодня
/***************************************************************************/

# include <string.h>
# include <unistd.h>
# include "video.h"
# include "core.h"
# include "face.h"
# include "edit1.h"
# include "resource1.h"

extern t_Option    Option ;
extern t_EditTrans Edit1 ;
extern char        MercuryDir[] ;
// ------- места, где могут размещаться словари и пр. данные ----------
char *MercuryDir00[]={ "/usr/share/prawda",
                       "/usr/local/share/prawda/",
                        NULL
		     };
// ------- место, где они действительно размещаются -------------------
char *MercuryDir0 ;
// ------- места, где могут размещаться подсказки ----------
char *HelpDir00[]={ "/usr/share/doc/prawda/help",
                    "/usr/local/share/doc/prawda/help",
                     NULL
                  };
// ------- место, где они действительно размещаются -------------------
char  HelpDir0[200] ;
char *HelpDir ;

void null_menu( void ) ;
char is_number( char *Str );
void preproc_rc( char *File );

/***************************************************************************/
//          скопировать каталог Меркурия в домашний каталог
/***************************************************************************/
char copy_mercury_dir( char *h )
{  int   i,r0,r1,r2,r3 ;
   char  MercuryDir[300] ;

   strcpy( MercuryDir,h );
   strcat( MercuryDir,"/prawda" );
   
   for( i=0 ; MercuryDir00[i]!=NULL ; i++ )
   {  if( 0==access( MercuryDir00[i],R_OK ) )
      {   MercuryDir0=MercuryDir00[i] ; break ;  }
   }
   r0=access( MercuryDir0,R_OK );
   r1=access( MercuryDir ,R_OK );
   if( r0<0 )
   {   printf("\n Каталог %s отсутствует.",MercuryDir0 );
       return -1 ;
   }
   if( r1<0 )
   {  char Cmd[1000] ;

      printf("\n Подготовка к первому запуску \"Правды\". Ждите...\n" );
      sprintf( Cmd,"cp -r %s %s",MercuryDir0,MercuryDir );
      r1=system( Cmd );
      sprintf( Cmd,"cp %s/grammar/prawdarc.local %s/.prawdarc",MercuryDir0,h );
      r2=system( Cmd );
      if( r1<0 || r2<0 )
      {   printf("\n Копирование не произошло" );
          return -1 ;
      }
   }
   else
   {
      printf("\n Странная ситуация:" );
      printf("\n Каталог ~/prawda есть, а файл ~/.prawdarc отсутствует" );
      return -1 ;
   }
   return 0 ;
}
/***************************************************************************/

/***************************************************************************/
int main( short argc, char *argv[] )
{  char r,r1 ;
   char *h,Str[200]="" ;
   short sx=80,sy=50 ;

try
{  
   h=getenv( "HOME" );
   if( h!=NULL ) {  Strcpy( Str,h,200 );  }
   Strcat( Str,"/.prawdarc",200 );

   // --- если настроечного файла нет, скопировать Mercury в домашний каталог
   r=access( Str,R_OK );
   if( r<0 )
   {   r1=copy_mercury_dir( h );
       if( r1<0 ) return -1 ;
   }
   // --------- прочесть настроечный файл ----------
   r=Option.read( Str );
   if( r<0 )
   {   
       printf("\n Файл %s отсутствует или некорректен.",Str );
       return -1 ;
   }
   // --------- установить размеры х у -------------
   Strcpy( Str,Option.get("size_x"),200 );
   if( is_number( Str ) && Str[0]!=0 ) sx=atoi(Str);
   Strcpy( Str,Option.get("size_y"),200 );
   if( is_number( Str ) && Str[0]!=0 ) sy=atoi(Str);

   // --------- установить шрифт -------------------
   Strcpy( Str,Option.get("font"),200 );
   if( Str[0]!=0 ) s_set_font( Str );
   s_begin_schone( );
   s_set_size( sx,sy );
   s_nacht( );
   // --------- установить MercuryDir --------------
   short i,j ;
   Strcpy( Str,Option.get("path"),200 );
   if( Str[0]!=0 )
   {  for( i=j=0 ; i<199 && Str[i]!=0 ; i++ )
      {  if( Str[i]=='~' )
         {   MercuryDir[j++]=0 ;
             if( h!=NULL ) 
	     {  Strcat( MercuryDir,h,200 ); j=strlen( MercuryDir );  }
         }
         else
             MercuryDir[j++]=Str[i] ;
      }
      MercuryDir[j++]=0 ;
   }
   // --------- установить HelpDir -----------------
   HelpDir=HelpDir0 ;
   Strcpy( HelpDir0,MercuryDir ,200 );
   Strcat( HelpDir0,"/doc/help",200 );
   for( i=0 ; HelpDir00[i]!=NULL ; i++ )
   {  if( 0==access( HelpDir,R_OK ) ) break ;
      HelpDir=HelpDir00[i] ;
   }
   // --------- установить препроцессоры -----------
   Strcpy( Str,MercuryDir,200 );
   Strcat( Str,"/grammar/z_preproc.rc",200 );
   preproc_rc( Str );

   // --------- собственно работа ------------------
   Windows.init( );
   null_menu( );
   message("Идет загрузка данных.\n        Ждите...");
# ifndef __WIN__
   HelpData.make();
# endif
   r=read_grammar( MercuryDir );
   if( r<0 ) 
   {  Edit1.read("mercury.err");
      error_add("Грамматика или словари не прочитаны!!!\n");
      error_add("Корректная работа невозможна!!!");
      figna( error_get() );
   }
   Windows.main_loop( ) ;

   return 0 ;
}
catch( int E )
{
   s_end_schone();
   return -1 ;
}
}