/***************************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// t_Debug смотрелка для t_Core->Variants
// t_GrammarView смотрелка для t_All_Struct таблицы правил перевода
// t_Slowo3View смотрелка для t_Slowo3
// Анисимов Д.В. сегодня
/***************************************************************************/
# include <string.h>
# include <mylib.h>
# include <video.h>
# include <s_defkey.h>
# include <color.h>
# include <debug.h>
void Window_help( void *Void );
void remove_wk( char *Str )
;
/***************************************************************************/
// смотрелка для t_Core->Variants (основной таблицы разбора) //
/***************************************************************************/
t_Debug :: t_Debug( void ) : t_Win()
{
strcpy( Name, "Отладчик" );
i_start_struct =0 ;
Current.i_struct =0 ;
Current.i_word =0 ;
Current.i_last_word=0 ;
Current.i_variant =0 ;
i_Select =0 ;
Begin_S =0 ;
Begin_V =0 ;
Begin_R =0 ;
SelectVision.init();
z_Vision =0 ;
Reg =DSTRUCT ;
Reg1 =D1STRUCT ;
}
/***************************************************************************/
void t_Debug :: init( void )
{ short i ;
e_Type t ;
SelectVision.j=0 ;
for( i=0 ; i<Grammar.n_trans() ; i++ )
{ t=Grammar[i].From.type ;
if( t==TWORD || t==TSTRUCT2 || t==TSELECT || t==TSELECT1 )
SelectVision.add( i );
}
}
/***************************************************************************/
void t_Debug :: paint( void )
{ short xx ;
char *s1="",*s2="" ;
t_Win::paint();
xx=x1+(x2-x1)/3 ;
// ----------------- нарисовать рамки ------------------------
s_rame2_F( y1, x1, y1+4, x2 , 0x07 );
s_rame2_F( y1, x1, y1+2, x2 , 0x07 );
s_rame2_F( y1+5, x1, y2, xx-1, 0x07 );
s_rame2_F( y1+5, xx, y2, x2 , 0x07 );
s_text_yxf( y1, x1+2, 0x0a, "Переводимая фраза" );
s_text_yxf( y1+2, x1+2, 0x0a, "Вершина стека" );
switch( Reg )
{ case DSTRUCT : s1 = "Конструкции" ;
if( Reg1==D1SELECT ) s1 = "Выборы " ;
s2 = "Варианты" ;
break ;
case DVARIANT : s1 = "Варианты " ;
s2 = "Потроха " ;
break ;
case DREAL : s1 = "Стек " ;
s2 = "Потроха " ;
break ;
}
s_text_yxf( y1+5, x1+2, 0x0a, s1 );
s_text_yxf( y1+5, xx+2, 0x0a, s2 );
if( 0==Core.fn_word() ) return ;
paint_frasa( );
paint_stack( xx );
if( Reg==DSTRUCT )
paint_variant( xx );
if( Reg==DVARIANT || Reg==DREAL )
paint_struct( xx );
}
/***************************************************************************/
// нарисовать переводимую фразу
/***************************************************************************/
void t_Debug :: paint_frasa( void )
{
short i,l,L,z,z1,z2,Z1,Z2,begin=0 ;
short first_word,last_word ;
char *S,Str[200] ;
t_Variants *VV ;
t_rStruct *V ;
t_rWord R ;
switch( Reg )
{ case DSTRUCT :
first_word=0 ;
last_word=-1 ;
break ;
case DVARIANT :
stack[0]=Current ;
VV=Core.variants( Current.i_word,Current.i_struct );
if( VV->Variant.j<=Current.i_variant )
{ first_word=0 ;
last_word=-1 ;
}else
{ V=&VV->Variant[Current.i_variant];
first_word=V->i_word ;
last_word =V->i_last_word ;
}
break ;
case DREAL :
V=Core.variant( Current ) ;
R=Core.rword(V->r_word+Begin_R+i_Select) ;
first_word=R.i_word ;
last_word =R.i_last_word ;
break ;
}
strcpy( Str,emptystr(199) );
begin=0 ; L=x2-x1-4 ; Z1=Z2=0 ;
for( i=z=0 ; i<Core.from().j ; i++ )
{ S=Core.from()[i].Str ;
l=strlen( S );
if( 200<z+l ) break ;
strncpy( Str+z,S,l );
if( i==Current.i_word ) { z1=z ; z2=z+l ; }
if( i==first_word ) Z1=z ;
if( i==last_word-1 ) Z2=z+l ;
z+=l+1 ;
}
Str[z]=0 ;
remove_wk( Str );
if( L<z2 ) begin=z2-L ;
if( L<z-begin ) Str[L+begin]=0 ;
if( Z1<begin ) Z1=begin ;
if( begin+L<Z2 ) Z2=begin+L ;
s_text_yxf( y1+1, x1+2, 0x07, emptystr(L) ); // вот тут строка выходит за размеры экрана
s_text_yxf( y1+1, x1+2, 0x07, Str+begin );
Str[Z2]=0 ;
if( Z1<Z2 )
s_text_yxf( y1+1, x1+2+Z1-begin, 0x70, Str+Z1 );
S=Core.from()[Current.i_word].Str ;
if( first_word<=Current.i_word && Current.i_word<last_word )
s_text_yxf( y1+1, x1+2+z1-begin, 0x7b, S );
else s_text_yxf( y1+1, x1+2+z1-begin, 0x0b, S );
}
/***************************************************************************/
// нарисовать стек
/***************************************************************************/
void t_Debug :: paint_stack( short xx )
{ long i,z ;
char Str[80] ;
t_Variants *VV ;
char f ;
// ---------------- нарисовать вершину стека ------------------
if( Reg==DVARIANT )
{ if( 0<Core.n_antwort() && stack[0].i_variant < Core.n_antwort() )
{ t_Form Form0 ;
Core.antwort().make( 0,i_main_struct,stack[0].i_variant,Form0 );
s_text_yxf( y1+3, x1+2, 0x07, Core.antwort().str() );
}
char *Str1 ;
VV=Core.variants( Current.i_word,Current.i_struct );
if( VV->Variant.j<=Current.i_variant ) Current.i_variant=VV->Variant.j-1 ;
Str1=Core.get_meaning( &VV->Variant[Current.i_variant] );
s_text_yxf( y1+3, x1+2, 0x07, Str1 );
}
if( Reg==DSTRUCT )
{ for( i=0 ; i<size_y-6 ; i++ )
{ strcpy( Str,emptystr(79) );
if( Reg1==D1STRUCT && Begin_S+i<Grammar.n_trans() )
{ VV=Core.variants( Current.i_word,Begin_S+i );
sprintf( Str,"%2ld %s",VV->Variant.j,Grammar[Begin_S+i].From.Name );
}
if( Reg1==D1SELECT && Begin_S+i<SelectVision.j )
{ z=SelectVision[Begin_S+i] ;
VV=Core.variants( Current.i_word,z );
sprintf( Str,"%2ld %s",VV->Variant.j,Grammar[z].From.Name );
}
if( Begin_S+i==z_Vision ) f=0x70 ; else f=0x07 ;
Str[xx-x1-3]=0 ;
s_text_yxf( y1+6+i, x1+2, f, Str );
}
}
if( Reg==DVARIANT )
{ VV=Core.variants( Current.i_word,Current.i_struct );
for( i=0 ; i<size_y-7 ; i++ )
{ strcpy( Str,emptystr(79) );
if( Begin_V+i<VV->Variant.j )
{ sprintf( Str,"%2ld %d-%d",
Begin_V+i,
VV->Variant[Begin_V+i].i_word,
VV->Variant[Begin_V+i].i_last_word
);
}
Str[xx-x1-5]=0 ;
if( Begin_V+i==Current.i_variant ) f=0x70 ; else f=0x07 ;
s_text_yxf( y1+7+i, x1+4, f, Str );
}
}
if( Reg==DREAL )
{ stack[j_stack]=Current ;
for( i=0 ; i<size_y-6 ; i++ )
{ sprintf( Str,"%s",Grammar[stack[i].i_struct].From.Name );
Str[xx-x1-3]=0 ;
s_text_yxf( y1+6+i, x1+2, 0x07, Str );
if( j_stack<=i ) break ;
}
}
}
/***************************************************************************/
// нарисовать варианты "0 1-13" в правом окошке
/***************************************************************************/
void t_Debug :: paint_variant( short xx )
{ long i ;
t_Variants *VV ;
char Str[80] ;
VV=Core.variants( Current.i_word,Current.i_struct );
for( i=0 ; i<size_y-7 ; i++ )
{ strcpy( Str,emptystr(79) );
if( i<VV->Variant.j )
{ sprintf( Str,"%2ld %d-%d",
i,VV->Variant[i].i_word,VV->Variant[i].i_last_word );
}
Str[x2-xx-5]=0 ;
s_text_yxf( y1+7+i, xx+2, 0x07, Str );
}
}
/***************************************************************************/
// нарисовать стуктуры
/***************************************************************************/
void t_Debug :: paint_struct( short xx )
{ long i ;
t_Variants *VV ;
t_rStruct *V,*V1 ;
t_rWord R ;
t_Struct *SS ;
t_Word *W ;
char c,Str1[100],Str2[100] ;
VV=Core.variants( Current.i_word,Current.i_struct ) ;
if( VV->Variant.j<=Current.i_variant ) return ;
V =Core.variant( Current ) ;
SS=&Grammar[VV->i_struct].From ;
s_text_yxf( y1+6, xx+4, 0x0f, " " );
if( SS->type==TSTRUCT || SS->type==TSTRUCT1 )
{ if( SS->type==TSTRUCT ) s_text_yxf( y1+6, xx+4 , 0x0f, "Структура" );
if( SS->type==TSTRUCT1 ) s_text_yxf( y1+6, xx+4 , 0x0f, "Структура1" );
s_text_yxf( y1+7, x2-18, 0x0f, "q3 n_word" );
for( i=0 ; i<size_y-7 ; i++ )
{
if( Begin_R+i==i_Select && Reg==DREAL ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+7+i, xx+4, c, emptystr(x2-xx-6) );
if( SS->Word.j<=Begin_R+i ) continue ;
W =&SS->Word[Begin_R+i] ;
R =Core.rword( V->r_word+Begin_R+i ) ;
sprintf( Str1,"%s",W->Name );
if( W->type==TCONST ) sprintf( Str1,"@0[%s]",W->literal );
if( W->type==TWORD0 ) strcpy( Str1,"@00" );
// ----------- нарисовать параметры структуры -----------
if( W->type!=TCONST && W->type!=TCONST1 && W->type!=TWORD0 )
{
V1=Core.variant( R ) ;
sprint_param( Str1+strlen(Str1), W );
s_text_yxf( y1+7+i, xx+4, c, Str1 );
sprintf( Str2,"%d-%d", R.i_word,R.i_last_word );
s_text_yxf( y1+8+i, x2-18, c, Str2 );
}
s_text_yxf( y1+8+i, xx+4, c, Str1 );
}
}
if( SS->type==TSTRUCT2 )
{
t_sStruct *sS ;
t_sWord *sW ;
e_Type t ;
sS=Perevod.get_from( V->i_slowo );
s_text_yxf( y1+6, xx+4 , 0x0f, "Структура2" );
s_text_yxf( y1+6, x2-18, 0x0f, "q3 n_word" );
for( i=0 ; i<size_y-7 ; i++ )
{
if( Begin_R+i==i_Select && Reg==DREAL ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+7+i, xx+4, c, emptystr(x2-xx-6) );
if( sS->n_Word<=Begin_R+i ) continue ;
sW =&sS->Word[Begin_R+i] ;
R =Core.rword( V->r_word+Begin_R+i ) ;
t =R.type ;
Str1[0]=0 ;
if( sW->i_struct>=0 )
sprintf( Str1,"%s",Grammar[sW->i_struct].From.Name );
if( t==TCONST ) sprintf( Str1,"@0[%s]",sW->str );
if( t==TCONST1) sprintf( Str1,"@1[%s]",sW->str );
if( t==TWORD0 ) strcpy( Str1,"@00" );
if( t!=TCONST && t!=TCONST1 && t!=TWORD0 )
{
V1=Core.variant( R ) ;
s_text_yxf( y1+8+i, xx+4, c, Str1 );
sprintf( Str2,"%d-%d",R.i_word,R.i_last_word );
s_text_yxf( y1+7+i, x2-18, c, Str2 );
}
s_text_yxf( y1+7+i, xx+4, c, Str1 );
}
}
if( SS->type==TSELECT || SS->type==TSELECT1 )
{ if( SS->type==TSELECT ) s_text_yxf( y1+6, xx+4, 0x0f, "Выбор " );
if( SS->type==TSELECT1 ) s_text_yxf( y1+6, xx+4, 0x0f, "Множество" );
s_text_yxf( y1+6, x2-18, 0x0f, "q3 n_word" );
if( Reg==DREAL ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+7, xx+4, c, emptystr(x2-xx-6) );
V1 =Core.variant(Current) ;
R =Core.rword( V1->r_word ) ;
if( 0<R.i_struct )
sprintf( Str1,"%s",Grammar[R.i_struct].From.Name );
else strcpy ( Str1,"@0" );
W=&SS->Word[R.index] ;
if( W->type==TCONST ) sprintf( Str1,"@0[%s]",W->literal );
if( W->type==TWORD0 ) strcpy( Str1,"@00" );
sprint_param( Str1+strlen(Str1), W );
s_text_yxf( y1+7, xx+4, c, Str1 );
sprintf( Str1,"%d-%d",R.i_word,R.i_last_word );
s_text_yxf( y1+7, x2-18, c, Str1 );
}
}
/***************************************************************************/
// нарисовать параметры структуры
/***************************************************************************/
void t_Debug :: sprint_param( char *Str, t_Word *W )
{
long i1,i2,i3 ;
char *s1 ;
Str[0]=0 ;
if( 0<W->Param.j ) strcat( Str,"(" );
for( i1=0 ; i1<W->Param.j ; i1++ )
{ i2 = W->Param[i1].param ;
i3 = W->Param[i1].value ;
if( i3<0 ) s1 = "@0" ;
else s1 = Grammar.from().Param[i2].Value[i3].Name ;
strcat( Str," " );
strcat( Str,s1 );
}
if( 0<W->Param.j ) strcat( Str," )" );
}
/***************************************************************************/
e_WinMsg t_Debug :: loop( void )
{
short ZZ,key1,key2 ;
long i ;
t_Struct *SS ;
e_Type t ;
t_Variants *VV ;
t_rWord R ;
t_Form Form0 ;
init();
while( 1 )
{ paint( );
s_getch( &key1,&key2 ) ;
ZZ=s_shiftstatus();
if( key1==0 )
{ switch( key2 )
{ case S_key_F1 : Window_help( (void *)"debug.html") ; continue ;
// -------------- переход в другие окна ------------
case S_key_F2 : return WM_FIRST ;
case S_key_F3 : return WM_SRC ;
case S_key_F4 : return WM_DST ;
case S_key_F5 : return WM_DEBUG ;
case S_key_F6 : return WM_PATH ;
case S_key_F10 :return WM_ESC ;
}
}
if( 0==Core.fn_word() ) continue ;
switch( Reg )
{ case DSTRUCT:
switch( key1 )
{ case S_key_Esc : return WM_ESC ;
case S_key_TabR :
if( Reg1==D1SELECT )
{ Reg1=D1STRUCT ;
z_Vision=SelectVision[z_Vision] ;
}
else
{ Reg1=D1SELECT ;
for( i=0 ; i<SelectVision.j ; i++ )
if( z_Vision<=SelectVision[i] )
{ z_Vision=i ; break ; }
}
break ;
case S_key_Enter :
VV=Core.variants( Current.i_word,Current.i_struct ) ;
if( VV->Variant.j<=0 ) break ;
Reg=DVARIANT ;
break ;
case 0:
switch( key2 )
{
case S_key_Left :
if( Current.i_word>0 ) Current.i_word-- ;
break ;
case S_key_Right :
if( Current.i_word<Core.from().j-1 ) Current.i_word++ ;
break ;
case S_key_Up : z_Vision-- ; break ;
case S_key_Down : z_Vision++ ; break ;
case S_key_PgUp : z_Vision-=size_y-7 ; break ;
case S_key_PgDn : z_Vision+=size_y-7 ; break ;
case S_key_Home : z_Vision=0 ; break ;
case S_key_End : z_Vision=32000 ; break ;
}
}
// ------- поставить курсоры на место --------------------------
if( z_Vision<0 ) z_Vision=0 ;
if( z_Vision<Begin_S ) Begin_S=z_Vision ;
if( Reg1==D1SELECT )
{ if( SelectVision.j<=z_Vision ) z_Vision=SelectVision.j-1 ;
if( size_y-7<=z_Vision-Begin_S ) Begin_S=z_Vision-(size_y-7) ;
Current.i_struct=SelectVision[z_Vision] ;
}
else
{
if( Grammar.n_trans()<=z_Vision ) z_Vision=Grammar.n_trans()-1 ;
if( size_y-7<=z_Vision-Begin_S ) Begin_S=z_Vision-(size_y-7) ;
Current.i_struct=z_Vision ;
}
break;
case DVARIANT:
switch( key1 )
{ case S_key_Esc : return WM_ESC ;
case S_key_Enter :
Reg=DREAL ;
if( Current.i_struct==i_main_struct )
Core.antwort().make( 0, i_main_struct, Current.i_variant, Form0 );
break ;
case S_key_Back : Reg=DSTRUCT ; break ;
case 0:
switch( key2 )
{ case S_key_Up :
if( 0<Current.i_variant ) Current.i_variant-- ;
if( Current.i_variant<Begin_V ) Begin_V=Current.i_variant ;
break ;
case S_key_Down :
VV=Core.variants( Current.i_word,Current.i_struct ) ;
if( Current.i_variant<VV->Variant.j-1 )
Current.i_variant++ ;
if( size_y-8<=Current.i_variant-Begin_V )
Begin_V=Current.i_variant-(size_y-8) ;
break ;
}
}
break;
case DREAL:
switch( key1 )
{ case S_key_Esc : return WM_ESC ;
case S_key_Back :
if( j_stack<=0 ) { Reg=DVARIANT ; break ; }
Current =stack[--j_stack] ;
Begin_R=i_Select=0 ;
break ;
case S_key_Enter :
VV=Core.variants( Current.i_word, Current.i_struct );
SS=&Grammar[Current.i_struct].From ;
if( IF_STRUCT( SS->type ) )
{ t=SS->Word[i_Select].type ;
if( t==TCONST ||t==TCONST1 || t==TWORD0 || t==TWORD ) break ;
R=Core.rword( VV->Variant[Current.i_variant].r_word+i_Select ) ;
stack[j_stack++] = Current ;
Current =R ;
i_Select =0 ;
}
if( IF_SELECT( SS->type ) )
{ t=SS->Word[i_Select].type ;
if( t==TCONST || t==TWORD0 || t==TWORD ) break ;
R=Core.rword( VV->Variant[Current.i_variant].r_word ) ;
if( R.i_struct<0 ) break ;
stack[j_stack++] = Current ;
Current =R ;
i_Select =0 ;
}
break ;
case 0:
switch( key2 )
{
case S_key_Up :
if( i_Select>0 ) i_Select-- ;
if( i_Select<Begin_R ) Begin_R=i_Select ;
break ;
case S_key_Down :
SS=&Grammar[Current.i_struct].From ;
//if( IF_CONSTR( SS->type ) )
if( SS->type==TSTRUCT || SS->type==TSTRUCT1 )
{ if( i_Select<SS->Word.j-1 )
i_Select++ ;
}
if( size_y-7<=i_Select-Begin_R )
Begin_R=i_Select-(size_y-8) ;
break ;
}
break;
}
}
}
return WM_ESC ;
}
/***************************************************************************/
// смотрелка для t_Grammar (таблицы правил перевода) //
/***************************************************************************/
t_GrammarView :: t_GrammarView( void ) : t_Win()
{ strcpy( Name,"База грамматики" );
}
/***************************************************************************/
void t_GrammarView :: set_pos( short _x1, short _y1, short _x2, short _y2 )
{
t_Win::set_pos( _x1,_y1,_x2,_y2 );
n_stack = 0 ;
i_Select= 0 ;
Begin_Y = 0 ;
Half = FROM ;
}
/***************************************************************************/
void t_GrammarView :: restart( void )
{
stack[0]=i_main_struct ;
n_stack=1 ;
}
/***************************************************************************/
void t_GrammarView :: paint( void )
{ short xx ;
t_Win::paint();
xx=x1+(x2-x1)/2 ;
// ----------------- нарисовать рамки ------------------------
s_rame2_F( y1, x1 , y2, xx, 0x07 );
s_rame2_F( y1, xx+1, y2, x2, 0x07 );
s_text_yxf( y1, x1+3, 0x0a, "Стек" );
s_text_yxf( y1, xx+3, 0x0a, "Структура" );
if( Half==FROM ) s_text_yxf( y1, x1+20, 0x0f, "Источник" );
else s_text_yxf( y1, x1+20, 0x0f, "Приемник" );
// ---------------- нарисовать стек --------------------------
{ short i,i1,b=0,z ;
char Str[100] ;
t_Struct *St ;
if( (size_y-4)<b+n_stack ) b=n_stack-(size_y-4) ;
for( i=0 ; i<size_y ; i++ )
{ if( n_stack<=b+i ) break ;
z=stack[b+i] ;
if( Half==FROM ) St=&Grammar[z].From ;
else St=&Grammar[z].To ;
sprintf( Str,"%3d %s",z,St->Name );
// ----------- нарисовать параметры структуры -----------
if( 0<St->Param.j ) strcat( Str,"(" );
for( i1=0 ; i1<St->Param.j ; i1++ )
{ strcat( Str," " );
if( St->Param[i1].Dir!=0 ) strcat( Str,"&" );
strcat( Str,St->Param[i1].Name );
}
if( 0<St->Param.j ) strcat( Str," )" );
Str[xx-x1-3]=0 ;
s_text_yxf( y1+i+1, x1+2, 0x07, Str );
}
}
// ---------------- нарисовать составляющие ------------------
{ short i,i1 ;
char c,Str[100] ;
t_Struct *St ;
t_Word *W ;
if( Half==FROM ) St=&Grammar[stack[n_stack-1]].From ;
else St=&Grammar[stack[n_stack-1]].To ;
for( i=0 ; i<size_y-3 ; i++ )
{ if( St->Word.j<=Begin_Y+i ) break ;
W=&St->Word[Begin_Y+i] ;
strcpy( Str,W->Name );
if( W->literal[0]!=0 )
{ strcat( Str,"[" );
strcat( Str,W->literal );
strcat( Str,"]" );
}
// ----------- нарисовать параметры структуры -----------
if( 0<W->Param.j ) strcat( Str,"(" );
for( i1=0 ; i1<W->Param.j ; i1++ )
{ strcat( Str," " );
if( W->Param[i1].Dir!=0 ) strcat( Str,"&" );
strcat( Str,W->Param[i1].Name );
}
if( 0<W->Param.j ) strcat( Str," )" );
Str[xx-x1-3]=0 ;
if( Begin_Y+i==i_Select ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+i+1, xx+3, c, emptystr(xx-x1-3) );
s_text_yxf( y1+i+1, xx+3, c, Str );
}
}
}
/********************************************************************/
e_WinMsg t_GrammarView :: loop( void )
{
short ZZ,key1,key2 ;
restart();
while( 1 )
{
paint( );
s_getch( &key1,&key2 ) ;
ZZ=s_shiftstatus();
switch( key1 )
{ case S_key_Esc : return WM_ESC ;
case S_key_space :
if( Half==FROM ) Half=TO ; else Half=FROM ;
break ;
case S_key_Back :
{ if( 1<n_stack ) n_stack-- ;
i_Select=0 ;
} break ;
case S_key_Enter :
{ t_Struct *St ;
if( Half==FROM ) St=&Grammar[stack[n_stack-1]].From ;
else St=&Grammar[stack[n_stack-1]].To ;
t_Word *W =&St->Word[i_Select] ;
if( W->type==TWORD || W->type==TCONST || W->type==TWORD0 )
break ;
stack[n_stack++]=W->i_struct ;
i_Select=Begin_Y=0 ;
} break ;
case 0:
{ switch( key2 )
{
case S_key_Up :
if( i_Select>0 ) i_Select-- ;
if( i_Select<Begin_Y ) Begin_Y=i_Select ;
break ;
case S_key_Down :
{
t_Struct *St ;
if( Half==FROM ) St=&Grammar[stack[n_stack-1]].From ;
else St=&Grammar[stack[n_stack-1]].To ;
if( i_Select<St->Word.j-1 ) i_Select++ ;
if( size_y-3<=i_Select-Begin_Y ) Begin_Y=i_Select-(size_y-4) ;
}
break ;
case S_key_F8 :
{ short yy1,yy2,xx1,xx2 ;
t_ViewTransParam TransParam( stack[n_stack-1],Half );
xx1=(x1+x2-size_x/2)/2 ;
xx2=(x1+x2+size_x/2)/2 ;
yy1=(y1+y2-size_y/2)/2 ;
yy2=(y1+y2+size_y/2)/2 ;
s_save( yy1, xx1, yy2, xx2 );
s_rame2_F( yy1, xx1, yy2, xx2, 0x0f );
s_text_yxf( yy1, xx1+3, name_Color, "Внутренняя передача параметров" );
TransParam.set_pos( xx1+1, yy1+1, xx2-1, yy2-1 );
TransParam.loop( );
s_restore( );
}
break ;
case S_key_F10 : return WM_ESC ;
case S_key_F1 : Window_help( (void *)"grammar.html") ; continue ;
}
}
}
}
}
/********************************************************************/
/********************************************************************/
t_ViewTransParam :: t_ViewTransParam( short _i_struct, e_Half _Half )
{
i_struct=_i_struct ; Half=_Half;
}
/********************************************************************/
void t_ViewTransParam :: paint1( short i, char current )
{
t_Struct *St ;
t_Relation R;
char c,*s1,Str[80] ;
s1=emptystr( size_x );
s_text_yxf( y1+i,x1+1 ,0x07, s1 );
if( Half==FROM ) St=&Grammar[i_struct].From ;
else St=&Grammar[i_struct].To ;
MaxY=St->Relation.j ;
if( MaxY<=Begin+i ) return ;
if( current ) c=0x70 ; else c=0x07 ;
R=St->Relation[i] ;
sprintf( Str," %2d %2d -> %2d %2d",R.s1,R.p1,R.s2,R.p2 );
s_text_yxf( y1+i,x1+1 ,c, Str );
}
/********************************************************************/
char t_ViewTransParam :: hot_key( short SS, short key1, short key2 )
{
return 0 ;
}
/********************************************************************/
// смотрелка для t_Slowo3 словарь структур перевода //
/********************************************************************/
t_Slowo3View :: t_Slowo3View( void )
{ strcpy( Name,"Словарь переводов" );
}
/********************************************************************/
void t_Slowo3View :: set_pos( short _x1, short _y1, short _x2, short _y2 )
{
t_Win::set_pos( _x1,_y1,_x2,_y2 );
n_stack = 0 ;
i_Select= 0 ;
Begin_Y = 0 ;
}
/********************************************************************/
void t_Slowo3View :: restart( void )
{
stack[0]=0 ;
n_stack=1 ;
}
/********************************************************************/
void t_Slowo3View :: paint( void )
{ short xx ;
t_Win::paint();
xx=x1+(x2-x1)/2 ;
// ----------------- нарисовать рамки ------------------------
s_rame2_F( y1, x1 , y2, xx, 0x07 );
s_rame2_F( y1, xx+1, y2, x2, 0x07 );
s_text_yxf( y1, x1+3, 0x0a, "Стек" );
s_text_yxf( y1, xx+3, 0x0a, "Дальше" );
// ---------------- нарисовать стек --------------------------
{ long i,b=0,z ;
char Str[100] ;
t_sTree *T ;
if( (size_y-4)<b+n_stack ) b=n_stack-(size_y-4) ;
for( i=0 ; i<size_y ; i++ )
{ if( n_stack<=b+i ) break ;
z=stack[b+i] ;
T=Perevod.tree(z) ;
if( T->rang<0 || T->empty==2 )
sprintf( Str,"%5ld %5ld %2d",z,T->up,T->rang );
else sprintf( Str,"%5ld %5ld %2d %s",z,T->up,T->rang,Perevod.word_src(z) );
Str[xx-x1-3]=0 ;
s_text_yxf( y1+i+1, x1+2, 0x07, Str );
}
}
// ---------------- нарисовать составляющие ------------------
{ long i,z ;
char c,Str[100],*Str1,*Str2 ;
t_sTree *T,*T1 ;
t_sStruct *S ;
t_sWord *W ;
t_Format1 *Format = Perevod.format() ;
T=Perevod.tree(stack[n_stack-1]) ;
if( 0<T->n_down)
{ for( i=0 ; i<size_y-3 ; i++ )
{ if( T->n_down<=Begin_Y+i ) break ;
if( Begin_Y+i==i_Select ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+i+1, xx+2, c, emptystr(xx-x1-1) );
z=T->down+Begin_Y+i ;
T1=Perevod.tree(z) ;
S=Perevod.get_from( T1->first );
if( S==NULL ) continue ; // вообще-то надо разобраться
if( n_stack==1 )
{ Str1=Format->get_tag( 0,S->i_struct );
Str2=Format->get_name( 0,S->i_struct );
sprintf( Str,"%s (%s)",Str1,Str2 );
}
else
{ if( T->empty==2 )
{ W=&S->Word[T1->rang+1] ;
sprintf( Str,"%s",Format->get_tag( 0,W->i_struct ) );
}
else
{ W=&S->Word[T1->rang] ;
Str1=Format->get_tag( 0,W->i_struct );
sprintf( Str,"%s[%s]",Str1,Perevod.word_src(z) );
}
}
// ----------- нарисовать параметры структуры -----------
// ------------------------------------------------------
Str[xx-x1-4]=0 ;
s_text_yxf( y1+i+1, xx+2, c, Str );
}
}
else
{ for( i=0 ; i<size_y-3 ; i++ )
{ z=T->first+Begin_Y+i ;
if( T->last<=z ) break ;
S=Perevod.get_from( z );
Str1=Format->get_tag( 0,S->i_struct );
//sprintf( Str,"%s[%s]",Str1,Perevod.Mass+S->Word[T->rang+1].sy );
sprintf( Str,"%s[%s]",Str1,Perevod.word_src(z) );
Str[xx-x1-4]=0 ;
if( Begin_Y+i==i_Select ) c=0x70 ; else c=0x07 ;
s_text_yxf( y1+i+1, xx+2, c, emptystr(xx-x1-1) );
s_text_yxf( y1+i+1, xx+2, c, Str );
}
}
}
}
/********************************************************************/
e_WinMsg t_Slowo3View :: loop( void )
{
short ZZ,key1,key2 ;
restart();
while( 1 )
{
paint( );
s_getch( &key1,&key2 ) ;
ZZ=s_shiftstatus();
switch( key1 )
{ case S_key_Esc : return WM_ESC ;
case S_key_Back :
{ if( 1<n_stack ) n_stack-- ;
i_Select=stack[n_stack]-Perevod.tree(stack[n_stack-1])->down ;
Begin_Y=i_Select ; // поправить на прежний индекс
} break ;
case S_key_Enter :
{ t_sTree *T=Perevod.tree(stack[n_stack-1]) ;
if( T->n_down<=0 ) break ;
stack[n_stack++]=T->down+i_Select ;
i_Select=Begin_Y=0 ;
} break ;
case 0:
{ switch( key2 )
{
case S_key_Up :
if( i_Select>0 ) i_Select-- ;
if( i_Select<Begin_Y ) Begin_Y=i_Select ;
break ;
case S_key_PgUp :
if( i_Select>size_y-3 ) i_Select-=size_y-3 ;
if( i_Select<Begin_Y ) Begin_Y=i_Select ;
break ;
case S_key_Down :
if( i_Select<Perevod.tree(stack[n_stack-1])->n_down-1 ) i_Select++ ;
if( size_y-3<=i_Select-Begin_Y ) Begin_Y=i_Select-(size_y-4) ;
break ;
case S_key_PgDn :
if( i_Select<Perevod.tree(stack[n_stack-1])->n_down-(size_y-3) )
i_Select+=(size_y-3) ;
if( size_y-3<=i_Select-Begin_Y ) Begin_Y=i_Select-(size_y-4) ;
break ;
case S_key_F10 : return WM_ESC ;
case S_key_F1 : Window_help( (void *)"base_enru.html") ; continue ;
}
}
}
}
}