2019-02-05 02:44:07 +02:00
[ I n t e r : : Frame : : ] F r a m e s .
To m a n a g e f r a m e s , w h i c h a r e w i n d o w s into I n t e r s t o r a g e .
@ h F r a m e s .
=
t y p e def s t r u c t i n t e r _ f r a m e {
s t r u c t i n t e r _ r e p o s i t o r y _ s e g m e n t * r e p o _ s e g m e n t ;
int index ;
i n t e r _ t * d a t a ;
int extent ;
} i n t e r _ f r a m e ;
@ =
i n t e r _ f r a m e I n t e r : : Frame : : a r o u n d ( i n t e r _ r e p o s i t o r y _ s e g m e n t * IS , int index ) {
i n t e r _ f r a m e F ;
F . r e p o _ s e g m e n t = IS ; F . index = index ;
if ( ( IS ) && (index >= 0) && (index < IS->size)) {
F . d a t a = &(IS->bytecode[index + PREFRAME_SIZE]);
F . extent = ( ( int ) I S - > b y t e c o d e [ index ] ) - P R E F R A M E _ S I Z E ;
} else {
F . d a t a = NULL ; F . extent = 0 ;
}
return F ;
}
int I n t e r : : Frame : : v a l i d ( i n t e r _ f r a m e * F ) {
if ( ( F = = NULL ) | | ( F - > r e p o _ s e g m e n t = = NULL ) | | ( F - > index < 0 ) | | ( F - > d a t a = = NULL ) | | ( F - > extent < = 0 ) ) return FALSE ;
return TRUE ;
}
int I n t e r : : Frame : : eq ( i n t e r _ f r a m e * F 1 , i n t e r _ f r a m e * F 2 ) {
if ( ( F 1 = = NULL ) | | ( F 2 = = NULL ) ) {
if ( F 1 = = F 2 ) return TRUE ;
return FALSE ;
}
if ( F 1 - > r e p o _ s e g m e n t ! = F 2 - > r e p o _ s e g m e n t ) return FALSE ;
if ( F 1 - > index ! = F 2 - > index ) return FALSE ;
return TRUE ;
}
@ =
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 0 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 2 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 1 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 3 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 2 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 4 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 3 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 5 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 4 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ t V 4 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 6 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
P . d a t a [ D A T A _ I F L D + 3 ] = V 4 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 5 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ t V 4 , i n t e r _ t V 5 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 7 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
P . d a t a [ D A T A _ I F L D + 3 ] = V 4 ;
P . d a t a [ D A T A _ I F L D + 4 ] = V 5 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 6 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ t V 4 , i n t e r _ t V 5 , i n t e r _ t V 6 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 8 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
P . d a t a [ D A T A _ I F L D + 3 ] = V 4 ;
P . d a t a [ D A T A _ I F L D + 4 ] = V 5 ;
P . d a t a [ D A T A _ I F L D + 5 ] = V 6 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 7 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ t V 4 , i n t e r _ t V 5 , i n t e r _ t V 6 , i n t e r _ t V 7 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 9 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
P . d a t a [ D A T A _ I F L D + 3 ] = V 4 ;
P . d a t a [ D A T A _ I F L D + 4 ] = V 5 ;
P . d a t a [ D A T A _ I F L D + 5 ] = V 6 ;
P . d a t a [ D A T A _ I F L D + 6 ] = V 7 ;
return P ;
}
2019-07-14 12:44:07 +03:00
i n t e r _ f r a m e I n t e r : : Frame : : f i l l _ 8 ( i n t e r _ b o o k m a r k * I B M , int S , i n t e r _ t V 1 , i n t e r _ t V 2 , i n t e r _ t V 3 , i n t e r _ t V 4 , i n t e r _ t V 5 , i n t e r _ t V 6 , i n t e r _ t V 7 , i n t e r _ t V 8 , i n t e r _ e r r o r _ l o c a t i o n * e l o c , i n t e r _ t l e v e l ) {
i n t e r _ f r a m e P = I n t e r : : f i n d _ r o o m ( I B M - > r e a d _ i n t o , 10 , e l o c , I n t e r : : B o o k m a r k s : : p a c k a g e ( I B M ) ) ;
2019-02-05 02:44:07 +02:00
P . d a t a [ I D _ I F L D ] = ( i n t e r _ t ) S ;
P . d a t a [ L E V E L _ I F L D ] = l e v e l ;
P . d a t a [ D A T A _ I F L D ] = V 1 ;
P . d a t a [ D A T A _ I F L D + 1 ] = V 2 ;
P . d a t a [ D A T A _ I F L D + 2 ] = V 3 ;
P . d a t a [ D A T A _ I F L D + 3 ] = V 4 ;
P . d a t a [ D A T A _ I F L D + 4 ] = V 5 ;
P . d a t a [ D A T A _ I F L D + 5 ] = V 6 ;
P . d a t a [ D A T A _ I F L D + 6 ] = V 7 ;
P . d a t a [ D A T A _ I F L D + 7 ] = V 8 ;
return P ;
}
@ =
int I n t e r : : Frame : : e x t e n d ( i n t e r _ f r a m e * F , i n t e r _ t by ) {
if ( by = = 0 ) return TRUE ;
if ( ( F - > index + F - > extent + P R E F R A M E _ S I Z E < F - > r e p o _ s e g m e n t - > size ) | |
( F - > r e p o _ s e g m e n t - > n e x t _ r e p o _ s e g m e n t ) ) return FALSE ;
if ( F - > r e p o _ s e g m e n t - > size + ( int ) by < = F - > r e p o _ s e g m e n t - > c a p a c i t y ) {
F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index ] + = by ;
F - > r e p o _ s e g m e n t - > size + = by ;
F - > extent + = by ;
return TRUE ;
}
int n e x t _ s i z e = I n t e r : : e n l a r g e _ s i z e ( F - > r e p o _ s e g m e n t - > c a p a c i t y , F - > extent + P R E F R A M E _ S I Z E + ( int ) by ) ;
2019-07-11 11:15:57 +03:00
F - > r e p o _ s e g m e n t - > n e x t _ r e p o _ s e g m e n t = I n t e r : : c r e a t e _ s e g m e n t ( n e x t _ s i z e , F - > r e p o _ s e g m e n t - > o w n i n g _ r e p o , F - > r e p o _ s e g m e n t ) ;
2019-02-05 02:44:07 +02:00
i n t e r _ f r a m e X F = I n t e r : : f i n d _ r o o m _ i n _ s e g m e n t ( F - > r e p o _ s e g m e n t - > n e x t _ r e p o _ s e g m e n t , F - > extent + ( int ) by ) ;
F - > r e p o _ s e g m e n t - > size = F - > index ;
F - > r e p o _ s e g m e n t - > c a p a c i t y = F - > index ;
X F . r e p o _ s e g m e n t - > b y t e c o d e [ X F . index + P R E F R A M E _ V E R I F I C A T I O N _ C O U N T ] = F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index + P R E F R A M E _ V E R I F I C A T I O N _ C O U N T ] ;
X F . r e p o _ s e g m e n t - > b y t e c o d e [ X F . index + P R E F R A M E _ O R I G I N ] = F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index + P R E F R A M E _ O R I G I N ] ;
X F . r e p o _ s e g m e n t - > b y t e c o d e [ X F . index + P R E F R A M E _ C O M M E N T ] = F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index + P R E F R A M E _ C O M M E N T ] ;
X F . r e p o _ s e g m e n t - > b y t e c o d e [ X F . index + P R E F R A M E _ P A C K A G E ] = F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index + P R E F R A M E _ P A C K A G E ] ;
F - > index = X F . index ;
F - > r e p o _ s e g m e n t = X F . r e p o _ s e g m e n t ;
for ( int i = 0 ; i < X F . extent ; i + + )
if ( i < F - > extent )
X F . d a t a [ i ] = F - > d a t a [ i ] ;
else
X F . d a t a [ i ] = 0 ;
F - > d a t a = X F . d a t a ;
F - > extent = X F . extent ;
return TRUE ;
}
2019-07-11 11:15:57 +03:00
i n t e r _ t I n t e r : : Frame : : t o _ i n d e x ( i n t e r _ f r a m e * F ) {
if ( ( F - > r e p o _ s e g m e n t = = NULL ) | | ( F - > index < 0 ) ) i n t e r n a l _ e r r o r ( "no index for null frame" ) ;
return ( F - > r e p o _ s e g m e n t - > i n d e x _ o f f s e t ) + ( i n t e r _ t ) ( F - > index ) ;
}
i n t e r _ f r a m e I n t e r : : Frame : : f r o m _ i n d e x ( i n t e r _ r e p o s i t o r y * I , i n t e r _ t index ) {
i n t e r _ r e p o s i t o r y _ s e g m e n t * s e g = I - > f i r s t _ r e p o _ s e g m e n t ;
while ( s e g ) {
if ( s e g - > i n d e x _ o f f s e t + ( i n t e r _ t ) s e g - > c a p a c i t y > index )
return I n t e r : : Frame : : a r o u n d ( s e g , ( int ) ( index - s e g - > i n d e x _ o f f s e t ) ) ;
s e g = s e g - > n e x t _ r e p o _ s e g m e n t ;
}
i n t e r n a l _ e r r o r ( "index not found in repository" ) ;
return I n t e r : : Frame : : a r o u n d ( NULL , - 1 ) ;
}
2019-02-05 02:44:07 +02:00
@
=
int t r a c e _ i n t e r _ i n s e r t i o n = FALSE ;
2019-07-14 12:44:07 +03:00
void I n t e r : : Frame : : insert ( i n t e r _ f r a m e F , i n t e r _ b o o k m a r k * at ) {
2019-02-05 02:44:07 +02:00
i n t e r _ r e p o s i t o r y * I = F . r e p o _ s e g m e n t - > o w n i n g _ r e p o ;
L O G I F ( I N T E R _ F R A M E S , "I%d: Insert frame %F\n" , I - > a l l o c a t i o n _ i d , F ) ;
if ( t r a c e _ i n t e r _ i n s e r t i o n ) I n t e r : : D e f n : : w r i t e _ c o n s t r u c t _ t e x t ( D L , F ) ;
2019-07-11 11:15:57 +03:00
i n t e r _ t F _ l e v e l = F . d a t a [ L E V E L _ I F L D ] ;
if ( F _ l e v e l = = 0 ) {
I n t e r : : a d d _ t o _ f r a m e _ l i s t ( &(I->global_material), F);
2019-07-14 12:44:07 +03:00
if ( ( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = A F T E R _ I C P L A C E M E N T ) | |
( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = I M M E D I A T E L Y _ A F T E R _ I C P L A C E M E N T ) )
I n t e r : : B o o k m a r k s : : s e t _ r e f ( at , F ) ;
2019-07-08 13:21:00 +03:00
} else {
2019-07-14 12:44:07 +03:00
if ( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = N O W H E R E _ I C P L A C E M E N T ) i n t e r n a l _ e r r o r ( "bad wrt" ) ;
if ( ( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = A F T E R _ I C P L A C E M E N T ) | |
( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = I M M E D I A T E L Y _ A F T E R _ I C P L A C E M E N T ) ) {
while ( F _ l e v e l < I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) . d a t a [ L E V E L _ I F L D ] ) {
i n t e r _ t P R _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) ) ;
2019-07-11 11:15:57 +03:00
if ( P R _ i n d e x = = 0 ) i n t e r n a l _ e r r o r ( "bubbled up out of tree" ) ;
2019-07-14 12:44:07 +03:00
I n t e r : : B o o k m a r k s : : s e t _ r e f ( at , I n t e r : : Frame : : f r o m _ i n d e x ( I , P R _ i n d e x ) ) ;
2019-07-11 11:15:57 +03:00
}
2019-07-14 12:44:07 +03:00
if ( F _ l e v e l > I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) . d a t a [ L E V E L _ I F L D ] + 1 ) i n t e r n a l _ e r r o r ( "bubbled down off of tree" ) ;
if ( F _ l e v e l = = I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) . d a t a [ L E V E L _ I F L D ] + 1 ) {
if ( I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) = = I M M E D I A T E L Y _ A F T E R _ I C P L A C E M E N T ) {
I n t e r : : Frame : : p l a c e ( F , A S _ F I R S T _ C H I L D _ O F _ I C P L A C E M E N T , I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) ) ;
I n t e r : : B o o k m a r k s : : s e t _ p l a c e m e n t ( at , A F T E R _ I C P L A C E M E N T ) ;
2019-07-12 00:18:10 +03:00
} else {
2019-07-14 12:44:07 +03:00
I n t e r : : Frame : : p l a c e ( F , A S _ L A S T _ C H I L D _ O F _ I C P L A C E M E N T , I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) ) ;
2019-07-12 00:18:10 +03:00
}
2019-07-11 11:15:57 +03:00
} else {
2019-07-14 12:44:07 +03:00
I n t e r : : Frame : : p l a c e ( F , A F T E R _ I C P L A C E M E N T , I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) ) ;
2019-07-11 11:15:57 +03:00
}
2019-07-14 12:44:07 +03:00
I n t e r : : B o o k m a r k s : : s e t _ r e f ( at , F ) ;
2019-07-11 11:15:57 +03:00
return ;
2019-07-08 13:21:00 +03:00
}
2019-07-14 12:44:07 +03:00
I n t e r : : Frame : : p l a c e ( F , I n t e r : : B o o k m a r k s : : g e t _ p l a c e m e n t ( at ) , I n t e r : : B o o k m a r k s : : g e t _ r e f ( at ) ) ;
2019-07-08 13:21:00 +03:00
}
2019-02-05 02:44:07 +02:00
}
i n t e r _ s y m b o l s _ t a b l e * I n t e r : : Frame : : g l o b a l _ s y m b o l s ( i n t e r _ f r a m e F ) {
if ( I n t e r : : Frame : : v a l i d ( &F))
return I n t e r : : g e t _ g l o b a l _ s y m b o l s ( F . r e p o _ s e g m e n t - > o w n i n g _ r e p o ) ;
return NULL ;
}
i n t e r _ e r r o r _ l o c a t i o n * I n t e r : : Frame : : r e t r i e v e _ o r i g i n ( i n t e r _ f r a m e * F ) {
if ( I n t e r : : Frame : : v a l i d ( F ) = = FALSE ) return NULL ;
return I n t e r : : r e t r i e v e _ o r i g i n ( F - > r e p o _ s e g m e n t - > o w n i n g _ r e p o , F - > r e p o _ s e g m e n t - > b y t e c o d e [ F - > index + P R E F R A M E _ O R I G I N ] ) ;
}
i n t e r _ e r r o r _ m e s s a g e * I n t e r : : Frame : : error ( i n t e r _ f r a m e * F , t e x t _ s t r e a m * e r r , t e x t _ s t r e a m * q u o t e ) {
i n t e r _ e r r o r _ m e s s a g e * i e m = CREATE ( i n t e r _ e r r o r _ m e s s a g e ) ;
i n t e r _ e r r o r _ l o c a t i o n * e l o c = I n t e r : : Frame : : r e t r i e v e _ o r i g i n ( F ) ;
if ( e l o c )
i e m - > e r r o r _ a t = * e l o c ;
else
i e m - > e r r o r _ a t = I n t e r : : E r r o r s : : f i l e _ l o c a t i o n ( NULL , NULL ) ;
i e m - > e r r o r _ b o d y = e r r ;
i e m - > e r r o r _ q u o t e = q u o t e ;
return i e m ;
}
i n t e r _ t I n t e r : : Frame : : g e t _ c o m m e n t ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ C O M M E N T ] ;
}
return 0 ;
}
void I n t e r : : Frame : : a t t a c h _ c o m m e n t ( i n t e r _ f r a m e F , i n t e r _ t I D ) {
if ( ( I D ) && (F.repo_segment)) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ C O M M E N T ] = I D ;
}
}
i n t e r _ t I n t e r : : Frame : : g e t _ p a c k a g e ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P A C K A G E ] ;
}
return 0 ;
}
2019-07-11 22:38:01 +03:00
i n t e r _ t I n t e r : : Frame : : g e t _ p a c k a g e _ a l t ( i n t e r _ f r a m e F ) {
while ( TRUE ) {
i n t e r _ t P _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( F ) ;
if ( P _ i n d e x = = 0 ) break ;
F = I n t e r : : Frame : : f r o m _ i n d e x ( F . r e p o _ s e g m e n t - > o w n i n g _ r e p o , P _ i n d e x ) ;
if ( F . d a t a [ I D _ I F L D ] = = P A C K A G E _ I S T ) {
return F . d a t a [ P I D _ P A C K A G E _ I F L D ] ;
}
2019-06-10 10:30:20 +03:00
}
return 0 ;
}
2019-07-13 13:03:54 +03:00
void I n t e r : : Frame : : b a c k t r a c e ( O U T P U T _ S T R E A M , i n t e r _ f r a m e F ) {
i n t e r _ f r a m e X = F ;
int n = 0 ;
while ( TRUE ) {
i n t e r _ t X _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( X ) ;
if ( X _ i n d e x = = 0 ) break ;
X = I n t e r : : Frame : : f r o m _ i n d e x ( X . r e p o _ s e g m e n t - > o w n i n g _ r e p o , X _ i n d e x ) ;
n + + ;
}
for ( int i = n ; i > = 0 ; i - - ) {
i n t e r _ f r a m e X = F ;
int m = 0 ;
while ( TRUE ) {
i n t e r _ t X _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( X ) ;
if ( X _ i n d e x = = 0 ) break ;
if ( m = = i ) {
WRITE ( "%2d. " , ( n - i ) ) ;
if ( i = = 0 ) WRITE ( "** " ) ; else WRITE ( " " ) ;
I n t e r : : D e f n : : w r i t e _ c o n s t r u c t _ t e x t _ a l l o w i n g _ n o p ( O U T , X ) ;
break ;
}
X = I n t e r : : Frame : : f r o m _ i n d e x ( X . r e p o _ s e g m e n t - > o w n i n g _ r e p o , X _ i n d e x ) ;
m + + ;
}
}
L O O P _ T H R O U G H _ I N T E R _ C H I L D R E N ( C , F ) {
WRITE ( "%2d. " , ( n + 1 ) ) ;
I n t e r : : D e f n : : w r i t e _ c o n s t r u c t _ t e x t _ a l l o w i n g _ n o p ( O U T , C ) ;
}
}
2019-02-05 02:44:07 +02:00
void I n t e r : : Frame : : a t t a c h _ p a c k a g e ( i n t e r _ f r a m e F , i n t e r _ t I D ) {
if ( ( I D ) && (F.repo_segment)) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P A C K A G E ] = I D ;
}
}
2019-07-09 12:32:05 +03:00
2019-07-11 11:15:57 +03:00
i n t e r _ t I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ F I R S T _ C H I L D ] ;
}
return 0 ;
}
void I n t e r : : Frame : : s e t _ f i r s t _ c h i l d _ i n d e x ( i n t e r _ f r a m e F , i n t e r _ t V ) {
if ( F . r e p o _ s e g m e n t ) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ F I R S T _ C H I L D ] = V ;
}
}
i n t e r _ t I n t e r : : Frame : : g e t _ l a s t _ c h i l d _ i n d e x ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ L A S T _ C H I L D ] ;
}
return 0 ;
}
void I n t e r : : Frame : : s e t _ l a s t _ c h i l d _ i n d e x ( i n t e r _ f r a m e F , i n t e r _ t V ) {
if ( F . r e p o _ s e g m e n t ) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ L A S T _ C H I L D ] = V ;
}
}
i n t e r _ t I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P A R E N T ] ;
}
return 0 ;
}
void I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( i n t e r _ f r a m e F , i n t e r _ t V ) {
if ( F . r e p o _ s e g m e n t ) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P A R E N T ] = V ;
}
}
i n t e r _ t I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ N E X T ] ;
}
return 0 ;
}
void I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( i n t e r _ f r a m e F , i n t e r _ t V ) {
if ( F . r e p o _ s e g m e n t ) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ N E X T ] = V ;
}
}
i n t e r _ t I n t e r : : Frame : : g e t _ p r e v i o u s _ i n d e x ( i n t e r _ f r a m e F ) {
if ( F . r e p o _ s e g m e n t ) {
return F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P R E V I O U S ] ;
}
return 0 ;
}
void I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( i n t e r _ f r a m e F , i n t e r _ t V ) {
if ( F . r e p o _ s e g m e n t ) {
F . r e p o _ s e g m e n t - > b y t e c o d e [ F . index + P R E F R A M E _ P R E V I O U S ] = V ;
}
}
@ d L O O P _ T H R O U G H _ I N T E R _ C H I L D R E N ( F , P )
for ( i n t e r _ t F # # _ i n d e x = I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( P ) ;
F # # _ i n d e x ! = 0 ;
F # # _ i n d e x = I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( I n t e r : : Frame : : f r o m _ i n d e x ( P . r e p o _ s e g m e n t - > o w n i n g _ r e p o , F # # _ i n d e x ) ) )
for ( i n t e r _ f r a m e F = I n t e r : : Frame : : f r o m _ i n d e x ( P . r e p o _ s e g m e n t - > o w n i n g _ r e p o , F # # _ i n d e x ) ; F . r e p o _ s e g m e n t ; F . r e p o _ s e g m e n t = NULL )
2019-07-13 19:15:26 +03:00
@ d P R O T E C T E D _ L O O P _ T H R O U G H _ I N T E R _ C H I L D R E N ( F , P )
for ( i n t e r _ t F # # _ i n d e x = I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( P ) , F # # _ n e x t _ i n d e x = ( F # # _ i n d e x ) ? ( I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( I n t e r : : Frame : : f r o m _ i n d e x ( P . r e p o _ s e g m e n t - > o w n i n g _ r e p o , F # # _ i n d e x ) ) ) : 0 ;
F # # _ i n d e x ! = 0 ;
F # # _ i n d e x = F # # _ n e x t _ i n d e x , F # # _ n e x t _ i n d e x = ( F # # _ n e x t _ i n d e x ) ? ( I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( I n t e r : : Frame : : f r o m _ i n d e x ( P . r e p o _ s e g m e n t - > o w n i n g _ r e p o , F # # _ n e x t _ i n d e x ) ) ) : 0 )
for ( i n t e r _ f r a m e F = I n t e r : : Frame : : f r o m _ i n d e x ( P . r e p o _ s e g m e n t - > o w n i n g _ r e p o , F # # _ i n d e x ) ; F . r e p o _ s e g m e n t ; F . r e p o _ s e g m e n t = NULL )
2019-07-11 11:15:57 +03:00
@
@ e B E F O R E _ I C P L A C E M E N T from 0
@ e A F T E R _ I C P L A C E M E N T
2019-07-12 00:18:10 +03:00
@ e I M M E D I A T E L Y _ A F T E R _ I C P L A C E M E N T
@ e A S _ F I R S T _ C H I L D _ O F _ I C P L A C E M E N T
2019-07-11 11:15:57 +03:00
@ e A S _ L A S T _ C H I L D _ O F _ I C P L A C E M E N T
@ e N O W H E R E _ I C P L A C E M E N T
=
2019-07-13 19:15:26 +03:00
void I n t e r : : Frame : : r e m o v e _ f r o m _ t r e e ( i n t e r _ f r a m e P ) {
I n t e r : : Frame : : p l a c e ( P , N O W H E R E _ I C P L A C E M E N T , I n t e r : : Frame : : a r o u n d ( NULL , - 1 ) ) ;
}
2019-07-11 11:15:57 +03:00
void I n t e r : : Frame : : p l a c e ( i n t e r _ f r a m e C , int h o w , i n t e r _ f r a m e R ) {
i n t e r _ t C _ i n d e x = I n t e r : : Frame : : t o _ i n d e x ( &C);
i n t e r _ r e p o s i t o r y * I = C . r e p o _ s e g m e n t - > o w n i n g _ r e p o ;
@ < E x t r i c a t e C from i t s current t r e e position @ > ;
s w i t c h ( h o w ) {
case N O W H E R E _ I C P L A C E M E N T :
return ;
2019-07-12 00:18:10 +03:00
case A S _ F I R S T _ C H I L D _ O F _ I C P L A C E M E N T :
@ < M a k e C t h e first c h i l d of R @ > ;
break ;
2019-07-11 11:15:57 +03:00
case A S _ L A S T _ C H I L D _ O F _ I C P L A C E M E N T :
@ < M a k e C t h e last c h i l d of R @ > ;
break ;
case A F T E R _ I C P L A C E M E N T :
2019-07-12 00:18:10 +03:00
case I M M E D I A T E L Y _ A F T E R _ I C P L A C E M E N T :
2019-07-11 11:15:57 +03:00
@ < Insert C a f t e r R @ > ;
break ;
case B E F O R E _ I C P L A C E M E N T :
@ < Insert C b e f o r e R @ > ;
break ;
default :
i n t e r n a l _ e r r o r ( "unimplemented" ) ;
}
}
@ < E x t r i c a t e C from i t s current t r e e position @ > =
i n t e r _ t O P _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( C ) ;
if ( O P _ i n d e x ! = 0 ) {
i n t e r _ f r a m e O P = I n t e r : : Frame : : f r o m _ i n d e x ( I , O P _ i n d e x ) ;
if ( I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( O P ) = = C _ i n d e x )
I n t e r : : Frame : : s e t _ f i r s t _ c h i l d _ i n d e x ( O P , I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( C ) ) ;
if ( I n t e r : : Frame : : g e t _ l a s t _ c h i l d _ i n d e x ( O P ) = = C _ i n d e x )
I n t e r : : Frame : : s e t _ l a s t _ c h i l d _ i n d e x ( O P , I n t e r : : Frame : : g e t _ p r e v i o u s _ i n d e x ( C ) ) ;
}
i n t e r _ t O B _ i n d e x = I n t e r : : Frame : : g e t _ p r e v i o u s _ i n d e x ( C ) ;
i n t e r _ t O D _ i n d e x = I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( C ) ;
if ( O B _ i n d e x ! = 0 ) {
i n t e r _ f r a m e O B = I n t e r : : Frame : : f r o m _ i n d e x ( I , O B _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( O B , O D _ i n d e x ) ;
}
if ( O D _ i n d e x ! = 0 ) {
i n t e r _ f r a m e O D = I n t e r : : Frame : : f r o m _ i n d e x ( I , O D _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( O D , O B _ i n d e x ) ;
}
I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( C , 0 ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( C , 0 ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( C , 0 ) ;
2019-07-12 00:18:10 +03:00
@ < M a k e C t h e first c h i l d of R @ > =
i n t e r _ t R _ i n d e x = I n t e r : : Frame : : t o _ i n d e x ( &R);
I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( C , R _ i n d e x ) ;
i n t e r _ t D _ i n d e x = I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( R ) ;
if ( D _ i n d e x = = 0 ) {
I n t e r : : Frame : : s e t _ l a s t _ c h i l d _ i n d e x ( R , C _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( C , 0 ) ;
} else {
i n t e r _ f r a m e D = I n t e r : : Frame : : f r o m _ i n d e x ( I , D _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( D , C _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( C , D _ i n d e x ) ;
}
I n t e r : : Frame : : s e t _ f i r s t _ c h i l d _ i n d e x ( R , C _ i n d e x ) ;
2019-07-11 11:15:57 +03:00
@ < M a k e C t h e last c h i l d of R @ > =
i n t e r _ t R _ i n d e x = I n t e r : : Frame : : t o _ i n d e x ( &R);
I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( C , R _ i n d e x ) ;
i n t e r _ t B _ i n d e x = I n t e r : : Frame : : g e t _ l a s t _ c h i l d _ i n d e x ( R ) ;
if ( B _ i n d e x = = 0 ) {
I n t e r : : Frame : : s e t _ f i r s t _ c h i l d _ i n d e x ( R , C _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( C , 0 ) ;
} else {
i n t e r _ f r a m e B = I n t e r : : Frame : : f r o m _ i n d e x ( I , B _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( B , C _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( C , B _ i n d e x ) ;
}
I n t e r : : Frame : : s e t _ l a s t _ c h i l d _ i n d e x ( R , C _ i n d e x ) ;
@ < Insert C a f t e r R @ > =
i n t e r _ t P _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( R ) ;
i n t e r _ t R _ i n d e x = I n t e r : : Frame : : t o _ i n d e x ( &R);
if ( P _ i n d e x = = 0 ) i n t e r n a l _ e r r o r ( "can't move C after R when R is nowhere" ) ;
I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( C , P _ i n d e x ) ;
i n t e r _ f r a m e P = I n t e r : : Frame : : f r o m _ i n d e x ( I , P _ i n d e x ) ;
if ( I n t e r : : Frame : : g e t _ l a s t _ c h i l d _ i n d e x ( P ) = = R _ i n d e x )
I n t e r : : Frame : : s e t _ l a s t _ c h i l d _ i n d e x ( P , C _ i n d e x ) ;
else {
i n t e r _ t D _ i n d e x = I n t e r : : Frame : : g e t _ n e x t _ i n d e x ( R ) ;
if ( D _ i n d e x = = 0 ) i n t e r n a l _ e r r o r ( "inter tree broken" ) ;
i n t e r _ f r a m e D = I n t e r : : Frame : : f r o m _ i n d e x ( I , D _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( C , D _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( D , C _ i n d e x ) ;
}
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( R , C _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( C , R _ i n d e x ) ;
@ < Insert C b e f o r e R @ > =
i n t e r _ t P _ i n d e x = I n t e r : : Frame : : g e t _ p a r e n t _ i n d e x ( R ) ;
i n t e r _ t R _ i n d e x = I n t e r : : Frame : : t o _ i n d e x ( &R);
if ( P _ i n d e x = = 0 ) i n t e r n a l _ e r r o r ( "can't move C before R when R is nowhere" ) ;
I n t e r : : Frame : : s e t _ p a r e n t _ i n d e x ( C , P _ i n d e x ) ;
i n t e r _ f r a m e P = I n t e r : : Frame : : f r o m _ i n d e x ( I , P _ i n d e x ) ;
if ( I n t e r : : Frame : : g e t _ f i r s t _ c h i l d _ i n d e x ( P ) = = R _ i n d e x )
I n t e r : : Frame : : s e t _ f i r s t _ c h i l d _ i n d e x ( P , C _ i n d e x ) ;
else {
i n t e r _ t B _ i n d e x = I n t e r : : Frame : : g e t _ p r e v i o u s _ i n d e x ( R ) ;
if ( B _ i n d e x = = 0 ) i n t e r n a l _ e r r o r ( "inter tree broken" ) ;
i n t e r _ f r a m e B = I n t e r : : Frame : : f r o m _ i n d e x ( I , B _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( C , B _ i n d e x ) ;
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( B , C _ i n d e x ) ;
}
I n t e r : : Frame : : s e t _ n e x t _ i n d e x ( C , R _ i n d e x ) ;
I n t e r : : Frame : : s e t _ p r e v i o u s _ i n d e x ( R , C _ i n d e x ) ;