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