/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // данные, для отображения подсказки // Анисимов Д.В. сегодня /***************************************************************************/ # include <string.h> # ifndef __WIN__ # include <unistd.h> #endif # include <list.h> # include <mylib.h> # include <help.h> extern char *HelpDir ; /***************************************************************************/ long FileToMass( char *File, char **_Mass ) { char *Mass ; long L ; FILE *fr ; fr=Fopen( File,"r" ); L=FileLength( fr ); Mass=(char *)Calloc( L+1,1 ); fread( Mass,L,1,fr ); Fclose(fr); *_Mass=Mass ; return L ; } /***************************************************************************/ long FileToWord( char *File, char ***_Str ) { long i,j,L ; char *m,**ss ; L=FileToMass( File, &m ); for( i=0 ; i<L ; i++ ) if( m[i]==' ' || m[i]=='\n' || m[i]=='\r' || m[i]=='\t' ) m[i]=0 ; for( i=j=0 ; i<L ; i++ ) if( m[i]==0 && m[i+1]!=0 ) j++ ; ss=(char **)Calloc(j+1,sizeof(char *)); j=0 ; if( m[0]!=0 ) ss[j++]=m ; for( i=0 ; i<L ; i++ ) if( m[i]==0 && m[i+1]!=0 ) ss[j++]=m+i+1 ; *_Str=ss ; return j ; } /******************************************************************************/ void t_HelpData :: make( void ) { long i,i1,z ; char **ss ; char Str[200] ; Strcpy( Path,HelpDir,200 ); unlink( "mkhelp.tmp" ); sprintf( Str,"ls %s/*.html >> mkhelp.tmp",Path ); system( Str ); n_File=FileToWord( "mkhelp.tmp",&ss ); File=(t_HelpFile *)Calloc( n_File,sizeof(t_HelpFile) ); for( i=0 ; i<n_File ; i++ ) { for( i1=z=0 ; ss[i][i1]!=0 ; i1++ ) if( ss[i][i1]=='/' ) z=i1+1 ; strcpy( File[i].Name,ss[i]+z ); } unlink( "mkhelp.tmp" ); for( i=0 ; i<n_File ; i++ ) read_file( i ) ; mk_href( ); } /******************************************************************************/ void t_HelpData :: read_file( long i_File ) { long i,i1,j,j1,z,L ; char *Text,f ; char Str[200] ; t_HelpLink L1 ; sprintf( Str,"%s/%s",Path,File[i_File].Name ); L=FileToMass( Str,&Text ); strcpy( L1.Name,File[i_File].Name ) ; L1.i_file=i_File ; L1.i_pos =0 ; Link.add( L1 ); f=0 ; for( i=j=0 ; i<L ; i++ ) { if( 0==strncmp(Text+i,"<pre>" ,5) ) { f=1 ; i+=5 ; } if( 0==strncmp(Text+i,"</pre>",6) ) break ; if( 0==strncmp(Text+i,"<b>" ,3) ) { Text[j++]=3 ; i+=3 ; } if( 0==strncmp(Text+i,"</b>",4) ) { Text[j++]=1 ; i+=4 ; } if( 0==strncmp(Text+i,"<a name=",8) ) { for( i1=i+9,j1=0 ; i1<L && Text[i1]!='"' ; i1++ ) L1.Name[j1]=Text[i1] ; L1.Name[j1]=0 ; L1.i_file=i_File ; L1.i_pos =j ; Link1.add( L1 ); i=i1+5 ; continue ; } if( 0==strncmp(Text+i,"<a href=",8) ) { Text[j++]=2 ; for( i1=i+9,j1=0 ; i1<L && Text[i1]!='<' ; i1++ ) { if( Text[i1]=='>' ) z=i1 ; L1.Name[j1++]=Text[i1] ; } L1.i_file=0 ; L1.i_pos =0 ; L1.Name[j1]=0 ; Link.add( L1 ); i=z+1 ; } if( 0==strncmp(Text+i,"</a>",4) ) { Text[j++]=1 ; i+=3 ; continue ; } if( f==1 ) Text[j++]=Text[i] ; } Text[j]=0 ; File[i_File].Text =Text ; File[i_File].l_Text=j ; } /******************************************************************************/ void t_HelpData :: mk_href( void ) { long i,i1,z,z1 ; char *Str ; for( i=0 ; i<Link.j ; i++ ) { // ------- найти начало имени ссылки -------------- Str=Link[i].Name ; for( i1=0,z=-1 ; Str[i1]!=0 ; i1++ ) if( Str[i1]=='>' ) { z=i1 ; break ; } // ------- проставить файл и позицию -------------- z1=find_link( Link[i].Name ); if( 0<=z1 ) { Link[i].i_file=Link1[z1].i_file ; Link[i].i_pos =Link1[z1].i_pos ; } strcpy( Str,Str+z+1 ); } } /******************************************************************************/ long t_HelpData :: find_link( char *Str ) { char *Str1="" ; long i,i_File=-1 ; for( i=0 ; Str[i]!=0 ; i++ ) if( Str[i]=='"' ) { Str[i]=0 ; break ; } for( i=0 ; Str[i]!=0 ; i++ ) if( Str[i]=='#' ) { Str[i]=0 ; Str1=Str+i+1 ; } for( i=0 ; i<n_File ; i++ ) if( 0==strcmp(File[i].Name,Str) ) { i_File=i ; break ; } if( i_File<0 ) return -1 ; for( i=0 ; i<Link1.j ; i++ ) if( Link1[i].i_file==i_File && 0==strcmp(Link1[i].Name,Str1) ) return i ; return -1 ; } /******************************************************************************/ char * t_HelpData :: get_help( char *Str ) { long i ; static char *ss="\nПодсказка на эту тему не найдена.\n" ; for( i=0 ; i<Link.j ; i++ ) { if( 0==strcmp(Link[i].Name,Str) ) return File[Link[i].i_file].Text ; } return ss ; } /******************************************************************************/ void t_HelpData :: hprint( void ) { long i ; for( i=0 ; i<Link.j ; i++ ) printf("\n %s %ld",File[Link[i].i_file].Name,Link[i].i_pos ); printf("\n"); } DEFINE_LIST_BTYPE( t_HelpLink, t_HL_List )