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