$ od -c -N 50000 [Indigo]<Spruce>13>SpruceBand.bcpl!2 0000000 / / S p r u c e B a n d . S 0000020 r - l a s t m o d i f i e 0000040 d : N o v e m b e r 2 0 , 0000060 1 9 7 8 7 : 0 6 A M \r \r 0000100 / / B A N D - - B a 0000120 n d m a n a g e m e n t f o 0000140 r s c a n \r / / e r r o 0000160 r s 9 0 0 \r g e t " S p r u 0000200 c e . d " \r g e t " S p r u c 0000220 e F i l e s . d " \r g e t " A 0000240 l l o c . D e c l " \r / / o u 0000260 t g o i n g p r o c e d u r e 0000300 s \r e x t e r n a l / / d e 0000320 f i n e d h e r e \r \t [ \r \t B 0000340 a n d I n i t \r \t B a n d C l o 0000360 s e \r \t B a n d B e g i n P a g 0000400 e \r \t B a n d E n d P a g e \r \t 0000420 B a n d F l u s h \r \t F l u s h 0000440 B u f f e r s \r \t P a g e D a t 0000460 a \t \t / / R e a d / W r i t e 0000500 s c a n p a s s s u m m a 0000520 r y ( ~ ~ s / b i n C h 0000540 e c k f o r m a t ! ) \r \t w i 0000560 n V e c \r \t ] \r / / i n c o m 0000600 i n g p r o c e d u r e s \r e 0000620 x t e r n a l / / e x t e r 0000640 n a l \r \t [ \r / / W I N D O W \r 0000660 \t C u r P o s i t i o n \r \t P a 0000700 g e T o P o s \r \t W i n d o w C 0000720 r e a t e S t r e a m \r \t W i n 0000740 d o w C o p y \r \t W i n d o w F 0000760 l u s h \r \t W i n d o w G e t B 0001000 o u n d s \r \t W i n d o w G e t 0001020 P o s i t i o n \r \t W i n d o w 0001040 N e x t P a g e \r \t W i n d o w 0001060 P o s i t i o n P t r \r \t W i n 0001100 d o w R e a d \r \t W i n d o w R 0001120 e a d B l o c k \r \t W i n d o w 0001140 S e t B o u n d s \r \t W i n d o 0001160 w S e t P a g e \r \t W i n d o w 0001200 S e t P o s i t i o n \r \t W i n 0001220 d o w W r i t e \r \t W i n d o w 0001240 W r i t e B l o c k \r \t P u t E 0001260 o f E r r o r \r \r / / S P R U C 0001300 E U t i l i t i e s \r \t E m e 0001320 r g e n c y O v e r \r \t S p r u 0001340 c e C o n d i t i o n \r \t S p r 0001360 u c e E r r o r \r \t F S G e t R 0001400 e l e a s e \r \t F S G e t X \r \t 0001420 F S G e t \r \t F S P u t \r \t M i 0001440 n \r \t U s c \r \r / / S P R U C E 0001460 M L \r \t U g t \r \t D o u b l e A 0001500 d d \r \t D o u b l e C o p \r \r / 0001520 / S p r u c e B a n d M l \r \t 0001540 F l u s h C h a r s \r / / O S \r 0001560 \t M o v e B l o c k \r \t Z e r o 0001600 \r \t C a l l S w a t \r \t C l o s 0001620 e s \r \r / / M E T E R \r \t M e t 0001640 e r B l o c k \r \r / / C U R S O 0001660 R \r \t C u r s o r T o g g l e \r 0001700 / / I S F \r \t I n d e x e d P 0001720 a g e I O \r \t ] \r / / i n c o 0001740 m i n g s t a t i c s \r e x t 0001760 e r n a l \t [ \r \t D P z e r o \t 0002000 \t \t / / D o u b l e p r e c i 0002020 s i o n z e r o . \r \t B a n d 0002040 F i l e \r \t B a n d W i n d o w 0002060 \r \t e m e r g e n c y S t o r a 0002100 g e \r \t n V i s i b l e B a n d 0002120 s \t \t / / N u m b e r o f b 0002140 a n d s r e q u i r e d f o 0002160 r t h i s d e v i c e \r \t n 0002200 L e a d i n g B a n d s \r \t n T 0002220 r a i l i n g B a n d s \r \t R e 0002240 p o r t \r \t D o E t h e r R e p 0002260 o r t \r \t D o M e t e r \r \t D e 0002300 b u g S y s t e m \r \t o n l y O 0002320 n C o p y \r \t O v e r l a y T o 0002340 p \r \t P e r m a n e n t B o t t 0002360 o m \r \t S p r u c e Z o n e \r \t 0002400 B a n d T a b l e \r \t B a n d F 0002420 r e e \r \t B a n d A v a i l \r \t 0002440 C o p y T a b l e \r \t p a r t N 0002460 u m b e r \r \t ] \r / / i n t e 0002500 r n a l s t a t i c s \r s t a 0002520 t i c \t \t [ \r \t B a n d B u f L 0002540 i s t \r \t B a n d B u f \r \t B a 0002560 n d B u f S i z e T o t a l \r \t 0002600 B a n d S e g m e n t s \t \t / / 0002620 N u m b e r o f " d u m p s 0002640 " o n d i s k \r \t b a n d O 0002660 u t P o s \t \t / / S a v e p o 0002700 s i t i o n o f " m a i n " 0002720 b a n d o u t p u t \r \t f i 0002740 r s t M e r g e P a g e \t \t / / 0002760 f i r s t p a g e u s e d 0003000 f o r i n t e r m e d i a t e 0003020 m e r g e o u t p u t \r \t w 0003040 i n V e c \r \t ] \r / / b u f f 0003060 e r m a n a g e m e n t v a 0003100 l u e s \r m a n i f e s t \t [ \r 0003120 \t n a h M e r g e O u t = 4 0003140 \t / / o u t p u t f i l e 0003160 a h e a d c o u n t \r \t n a h 0003200 M e r g e I n = 5 \t \t / / 0003220 i n p u t f i l e d i t t o 0003240 \r / / P e r f o r m a n c e - 0003260 r e l a t e d s i z e s : \r \t 0003300 n M a x M e r g e I n p u t s = 0003320 4 \t \t \t / / M a x n u m b e r 0003340 o f b a n d s e g m e n t 0003360 s t o m e r g e a t o n 0003400 c e \r \t l n M a x M e r g e I n 0003420 p u t s = 2 \r \t B a n d B u f S 0003440 i z e = 1 0 2 4 + m i n L e 0003460 n S P r u c e P a g e / / M 0003500 a x S P r u c e P a g e s i 0003520 z e \r \t M U D o n e = 0 \r \t 0003540 M U C a n t = 1 \r \t ] \r / / 0003560 B a n d I n i t ( ) , 0003600 B a n d C l o s e ( ) , 0003620 B a n d B e g i n P 0003640 a g e ( ) \r l e t B a n d I n 0003660 i t ( ) b e \r [ \r \t c o m p i 0003700 l e i f B E M a x S i z e g 0003720 e B a n d B u f S i z e t h 0003740 e n [ f o o = 0 ] \r \r \t B 0003760 a n d T a b l e = F S G e t X ( 0004000 n V i s i b l e B a n d s ) \r \t 0004020 C o p y T a b l e = F S G e t X 0004040 ( n V i s i b l e B a n d s ) \r 0004060 \t B a n d B u f L i s t = 0 0004100 ; R e l e a s e B a n d B u f 0004120 s ( t r u e ) \r ] \r \r a n d B 0004140 a n d C l o s e ( ) b e \r [ \r 0004160 \t B a n d T a b l e = F S P 0004200 u t ( B a n d T a b l e ) \r \t C 0004220 o p y T a b l e = F S P u t 0004240 ( C o p y T a b l e ) \r \t R e l 0004260 e a s e B a n d B u f s ( f a l 0004300 s e ) \r ] \r \r a n d B a n d B 0004320 e g i n P a g e ( ) b e / / 0004340 ~ ~ c o u l d e a s i l y 0004360 e l i m i n a t e \r [ \r \t B a 0004400 n d S e g m e n t s = 0 \t \t \t / 0004420 / N o n e o n t h e d i s 0004440 k . \r ] \r / / B a n d E n d P 0004460 a g e ( p a g e ) \t \t S e g m e 0004500 n t M e r g i n g \r / / \t U n 0004520 l e s s t h e e n t i r e 0004540 p a g e ' s b a n d e n t r 0004560 i e s a r e i n m e m o r 0004600 y , w e m u s t n o w m 0004620 e r g e a l l t h e s e g 0004640 m e n t s . T h e r e \r / / 0004660 a r e B a n d S e g m e n t s 0004700 s e g m e n t s t o m e r 0004720 g e ; t h e f i r s t b e 0004740 g i n s i n p a g e 1 o 0004760 f M e r g e F i l e , t h e 0005000 2 d i n p a g e 2 , e 0005020 t c . \r / / E a c h t h e n 0005040 c o n t i n u e s a t n M 0005060 a x M e r g I n p u t s - p a g 0005100 e i n t e r v a l s u n t i 0005120 l i t s e n t r i e s a r 0005140 e e x h a u s t e d . A l l 0005160 s e g m e n t s \r / / h a v 0005200 e b a n d s r u n n i n g 0005220 f r o m 0 t o n V i s i b 0005240 l e B a n d s - 1 . T h e y 0005260 m u s t b e m e r g e d i 0005300 n t o t h e m a i n b a n 0005320 d f i l e . T h e n \r / / 0005340 t h e M e r g e F i l e m u 0005360 s t b e d i s c a r d e d . 0005400 F o u r s e g m e n t s s 0005420 h o u l d b e s u f f i c i 0005440 e n t f o r a n y e n v i 0005460 s i o n e d u s e . \r \r a n d 0005500 B a n d E n d P a g e ( p a g 0005520 e ) b e \r [ \r 0005540 u n l e s s B a n d S e g m e 0005560 n t s d o [ B a n d F l u 0005600 s h ( p a g e ) ; r e t u r n 0005620 ] / / w r i t e e n t i 0005640 r e p a g e , r e t u r n \r 0005660 \r B a n d F l u s h ( 0 0005700 ) \t \t \t / / G o h a n d l e 0005720 c u r r e n t b u f f e r . \r 0005740 C u r s o r T o g g l e 0005760 ( 0 ) \r l e t p 0 , 0006000 p n = t a b l e [ 0 ; 0006020 0 ] , v e c 2 \r P 0006040 a g e T o P o s ( p n , f i r 0006060 s t M e r g e P a g e , 0 , 0006100 w o r d I t e m , B a n d F i 0006120 l e ) \r W i n d o w S e 0006140 t B o u n d s ( B a n d W i n d 0006160 o w , p 0 , p n ) \r 0006200 B a n d W i n d o w > > S S . s 0006220 t e p S i z e = 1 \t / / b 0006240 a c k t o n o r m a l p a 0006260 g e - s e q u e n c i n g \r 0006300 W i n d o w S e t P o s i t 0006320 i o n ( B a n d W i n d o w , 0006340 b a n d O u t P o s ) \r 0006360 B a n d F i n a l ( p a g e , 0006400 0 ) \r B a n d S e g m e 0006420 n t s = B a n d S e g m e n 0006440 t s - 1 \r l e t v = 0006460 v e c n M a x M e r g e I n 0006500 p u t s ; w i n V e c = v 0006520 \r f o r s = 0 t 0006540 o B a n d S e g m e n t s d 0006560 o \r \t [ \r \t l e t p o s = 0006600 v e c 2 \r \t P a g e T o P o s 0006620 ( p o s , f i r s t M e r g e 0006640 P a g e + s , 0 , w o r d I 0006660 t e m , B a n d F i l e ) \r \t 0006700 w i n V e c ! s = \r \t 0006720 W i n d o w C r e a t e S t r e 0006740 a m ( B a n d F i l e , k s T 0006760 y p e R e a d O n l y , 0 , 0007000 n a h M e r g e I n , p o s , 0007020 0 , n M a x M e r g e I n p 0007040 u t s ) \r \t ] \r / / B 0007060 a n d B u f f e r a s s e r 0007100 t e d p o i s e d f o r n 0007120 e x t p a g e , s o o n e 0007140 b u f f e r i s e m p t y 0007160 a n d i n i t i a l i z e d 0007200 \r f o r b = 0 t 0007220 o n V i s i b l e B a n d s - 0007240 1 d o \r \t [ \r \t / / B a n d 0007260 s f r o m d i f f e r e n t 0007300 s e g m e n t s m u s t b 0007320 e m e r g e d i n r e v e 0007340 r s e o r d e r \r \t f o r s 0007360 = B a n d S e g m e n t s b y 0007400 - 1 t o 0 d o \r \t 0007420 [ / / e L e n i s l e 0007440 n g t h o f ( e n d o f 0007460 b a n d ) e n t r y - - n 0007500 o n - z e r o o n l y d u r 0007520 i n g l a s t i t e r a t i 0007540 o n \r \t l e t s t r , 0007560 e L e n , l e n = w i n 0007600 V e c ! s , ( s e q 0 ? 0007620 2 , 0 ) , W i n d o w R e a 0007640 d ( s t r ) + e L e n \r \t 0007660 i f B a n d A v a i l + l e 0007700 n g e 0 % e m e r g e n 0007720 c y S t o r a g e e q 0 t 0007740 h e n F l u s h M e r g e B u 0007760 f f e r s ( t r u e ) \r \t 0010000 B a n d A v a i l = B a n 0010020 d A v a i l + l e n ; i f B 0010040 a n d A v a i l g e 0 t h 0010060 e n \r \t \t S p r u c e C o n d i 0010100 t i o n ( 9 0 6 , E C F i l e 0010120 T e r m i n a t e , p a r t N 0010140 u m b e r ) \r \t i f l 0010160 e n t h e n W i n d o w R e 0010200 a d B l o c k ( s t r , B a n 0010220 d F r e e , l e n - e L e n ) 0010240 \r \t B a n d F r e e = 0010260 B a n d F r e e + l e n \r \t 0010300 i f e L e n t h e n 0010320 B a n d F r e e ! - 2 , B a n 0010340 d F r e e ! - 1 = B E E n d 0010360 H , B E E n d H / / B a n 0010400 d E n d s i m u l a t i o n \r 0010420 \t ] \r \t ] \r F l 0010440 u s h M e r g e B u f f e r s ( 0010460 f a l s e ) / / f i n a l 0010500 w r i t i n g \r f o r 0010520 s = 0 t o B a n d S e g m e 0010540 n t s d o C l o s e s ( w i 0010560 n V e c ! s ) ; w i n V e c 0010600 = 0 \r W i n d o w G e 0010620 t P o s i t i o n ( B a n d W i 0010640 n d o w , b a n d O u t P o s 0010660 ) \r W i n d o w S e t B 0010700 o u n d s ( B a n d W i n d o w 0010720 ) \r W i n d o w S e t P 0010740 o s i t i o n ( B a n d W i n d 0010760 o w , b a n d O u t P o s ) \r 0011000 B a n d F i n a l ( p a 0011020 g e , 1 ) \r A d d B a 0011040 n d B u f ( ) / / l e a v e 0011060 s e t u p f o r n e x t 0011100 p a g e \r ] \r \r a n d 0011120 F l u s h M e r g e B u f f e 0011140 r s ( g e t A n o t h e r ) b 0011160 e \r \t [ \r \t / / r e l e a s e 0011200 a l l b u f f e r e d p a 0011220 g e s f o r i n p u t s t 0011240 r e a m s t o m a k e r o 0011260 o m f o r o u t p u t \r \t l 0011300 e t p o s n s = v e c n 0011320 M a x M e r g e I n p u t s * 2 0011340 \r \t f o r s = 0 t o B 0011360 a n d S e g m e n t s d o \r \t 0011400 \t [ \r \t \t l e t s t r = w 0011420 i n V e c ! s \r \t \t l e t p o 0011440 s = p o s n s + s l s h i 0011460 f t 1 \r \t \t / / ~ ~ i f 0011500 s t r e a m a t e n d o f 0011520 p a g e , t h e G e t P o 0011540 s i t i o n / S e t P o s i t i 0011560 o n p a i r c o u l d a d 0011600 v a n c e t o \r \t \t / / ~ ~ 0011620 t h e n e x t p a g e - 0011640 - s i n c e t h e s e s t 0011660 r e a m s a r e n o t p r 0011700 o c e d i n g t h r o u g h 0011720 s e q u e n t i a l \r \t \t / / 0011740 ~ ~ p a g e s , t h i s l 0011760 e a d s t o a n e r r o r 0012000 . T h i s s o l u t i o n 0012020 i s u g l y . \r \t \t / / W i 0012040 n d o w G e t P o s i t i o n ( 0012060 s t r , p o s ) / / ~ ~ 0012100 ( t h e e r r o r d i d o 0012120 c c u r ) \r \t \t p o s ! 0 = 0012140 s t r > > S S . s p r u c e P a 0012160 g e > > S P r u c e P a g e . p 0012200 a g e N u m b e r / / ~ ~ 0012220 n e e d s a b s t r a c t i o 0012240 n \r \t \t p o s ! 1 = C u r P 0012260 o s i t i o n ( s t r ) \r \t \t W 0012300 i n d o w F l u s h ( s t r , 0012320 t r u e ) / / r e l e a s e 0012340 t h e c u r r e n t p a g 0012360 e \r \t \t ] \r \t F l u s h B u f f 0012400 e r s ( g e t A n o t h e r ) 0012420 / / w r i t e c u r r e n t 0012440 b u f f e r s e t \r \t u n l 0012460 e s s g e t A n o t h e r r 0012500 e t u r n \r \t f o r s = 0 0012520 t o B a n d S e g m e n t s 0012540 d o \r \t \t [ \r \t \t / / W i n 0012560 d o w S e t P o s i t i o n ( w 0012600 i n V e c ! s , p o s n s + s 0012620 l s h i f t 1 ) / / ~ ~ 0012640 o t h e r h a l f o f e 0012660 r r o r \r \t \t l e t s t r , 0012700 p o s = w i n V e c ! s , 0012720 p o s n s + s l s h i f t 1 0012740 \r \t \t W i n d o w S e t P a g e 0012760 ( s t r , p o s ! 0 ) \r \t \t W 0013000 i n d o w P o s i t i o n P t r 0013020 ( s t r , p o s ! 1 ) \r \t \t ] 0013040 \r \t ] \r / / B a n d F l u s h 0013060 ( [ p a g e ] ) \r / / B a 0013100 n d F l u s h i s c a l l e 0013120 d f o r t h r e e r e a s 0013140 o n s : \r / / B a n d F l 0013160 u s h ( ) c a l l e d w h e 0013200 n b a n d s o v e r f l o w 0013220 d u r i n g o u t p u t . \r 0013240 / / B a n d F l u s h ( 0 0013260 ) c a l l e d t o f l u s 0013300 h f i n a l p a r t i a l 0013320 o u t p u t b e f o r e m e 0013340 r g e r \r / / B a n d F l 0013360 u s h ( p a g e ) c a l l e d 0013400 i f w e g e t t o e n 0013420 d o f p a g e b e f o r e 0013440 b a n d o v e r f l o w \r \r 0013460 / / T w o d i f f e r e n t 0013500 l o o p s . I f t h i s 0013520 i s t h e f i n a l p a 0013540 s s , w e c a n s i m p 0013560 l y w r i t e t h e b a n 0013600 d l i s t s o u t . I f 0013620 t h i s i s n o t \r / / 0013640 t h e f i n a l p a s s , 0013660 w e f i r s t c o u n t t 0013700 h e n u m b e r o f w o r 0013720 d s i n t h e b a n d e 0013740 n t r y ( n o t c o u n t i 0013760 n g t h e E n d H ) \r \r a n 0014000 d B a n d F l u s h ( p a g e 0014020 ; n u m a r g s n ) b e \r 0014040 [ \r i f n e 0014060 q 0 t h e n p a g e = 0 \r 0014100 l e t f i n a l = n 0014120 e q 1 / / d o n ' t a 0014140 l l o c a t e m o r e b a n 0014160 d s i f B a n d F l u s h ( 0014200 0 ) \r u n l e s s f i 0014220 n a l % n o t A d d B a n d B 0014240 u f ( Y e s ) r e t u r n \r 0014260 f i n a l = p a g e 0014300 n e 0 / / n o w f i n a 0014320 l o n l y i f p a g e a 0014340 r g u m e n t s u p p l i e d 0014360 \r C u r s o r T o g g l 0014400 e ( B a n d S e g m e n t s ) \r 0014420 t e s t f i n a l t 0014440 h e n B a n d F i n a l ( p a 0014460 g e , 0 ) o r S e t u p M 0014500 e r g e F i l e ( ) \r f 0014520 o r b = 0 t o n V i s i b 0014540 l e B a n d s - 1 d o \r \t [ \r 0014560 \t / / c o m p u t e b a n d 0014600 s i z e l o o p \r \t / / * 0014620 * * p , n e x t P , a n d 0014640 l e f t m u s t r e m a i 0014660 n c o n t i g u o u s - - 0014700 u s e d i n m i c r o c o d 0014720 e * * * \r \t l e t p , n e 0014740 x t P , l e f t = B a n d 0014760 T a b l e ! b , n i l , n i 0015000 l \r \t u n l e s s f i n a l 0015020 d o \r \t [ \r \t 0015040 l e t l e n = 0 \r \t w 0015060 h i l e p d o \r \t \t [ \r \t \t 0015100 / / ~ ~ s t r e s s e s s 0015120 p e e d ; m u s t a d j u s 0015140 t w h e n n e w t y p e s 0015160 a d d e d - - k n o w s 0015200 a b s . s i z e s a n d s 0015220 h a p e s \r \t \t l e t t y p e 0015240 W d = @ p \r \t \t l e n = l e 0015260 n + ( t y p e W d < 0 ? 2 , 0015300 t y p e W d e q B E R e c t 0015320 a n g l e H ? 4 , 2 ) \r \t \t 0015340 p = p ! - 1 \r \t \t ] \r \t 0015360 u n l e s s f i n a l t h e 0015400 n W i n d o w W r i t e ( B a 0015420 n d W i n d o w , l e n ) \r \t 0015440 p = B a n d T a b l 0015460 e ! b \r \t ] \r \r \t / / 0015500 W r i t e b a n d e n t r i 0015520 e s l o o p ( m i c r o c o 0015540 d e l i n k a g e ) \r \t 0015560 [ \r \t u n l e s s p 0015600 b r e a k \r \t / / M 0015620 L l i n k a g e r e s p o n 0015640 s i b l e f o r k e e p i n 0015660 g s t r e a m d a t a c o 0015700 r r e c t \r \t / / F l 0015720 u s h C h a r s u p d a t e s 0015740 p , n e x t P , a n d l 0015760 e f t ( n e x t P n o t a 0016000 l w a y s d e r i v a b l e 0016020 a n y l o n g e r ) \r \t 0016040 / / l e f t i s # w o 0016060 r d s l e f t t o w r i t 0016100 e i n e n t r y i n d i c 0016120 a t e d b y p \r \t s 0016140 w i t c h o n F l u s h C h a 0016160 r s ( l v p , l v B a n d 0016200 W i n d o w > > F S . f s p ) 0016220 i n t o \r \t \t [ \r \t \t c a s e 0016240 M U C a n t : / / w r i t e 0016260 c u r r e n t e n t r y , 0016300 m a y b e o v e r l a p p e d 0016320 , g o o n t o ( n o w 0016340 n o n - e m p t y ) n e x t 0016360 p p . \r \t \t \t W i n d o w W r i 0016400 t e B l o c k ( B a n d W i n d 0016420 o w , p , l e f t + 1 ) ; 0016440 e n d c a s e \r \t \t c a s e M 0016460 U D o n e : b r e a k \r \t \t d 0016500 e f a u l t : S p r u c e E r 0016520 r o r ( 1 0 2 ) \r \t \t ] \r \t 0016540 p = n e x t P \r \t 0016560 ] r e p e a t \r \t / / N o w 0016600 w r i t e e n d c o d e 0016620 ( o n l y i f f i n a l f 0016640 i l e ) \r \t i f f i n a l t 0016660 h e n B a n d E n d ( ) \r \t ] 0016700 \r \r i f f i n a l t 0016720 h e n B a n d F i n a l ( p a 0016740 g e , 1 ) \r \r / / N 0016760 o w r e s e t b a n d b u 0017000 f f e r s t u f f \r R 0017020 e l e a s e B a n d B u f s ( t 0017040 r u e ) \r ] \r / / S e 0017060 t u p M e r g e F i l e ( ) 0017100 B a n d F i n a l ( p a g e , 0017120 l a s t ) B a n d E n d ( ) 0017140 A d d B a n d B u f ( ) \r a 0017160 n d S e t u p M e r g e F i l 0017200 e ( ) b e / / c l o s e 0017220 m a i n B a n d W i n d o w , 0017240 s e t i t u p o n M e 0017260 r g e S u b f i l e , p o s i 0017300 t i o n a p p r o p r i a t e 0017320 l y \r [ \r l e t 0017340 t 1 = B a n d F i l e > > 0017360 S P r u c e F i l e . l n P a g 0017400 e S i z e \r i f B a n 0017420 d S e g m e n t s e q 0 t 0017440 h e n \r \t [ \r \t b a n d O u t P 0017460 o s = t a b l e [ 0 ; 0017500 0 ] \r \t W i n d o w G e t P o 0017520 s i t i o n ( B a n d W i n d o 0017540 w , b a n d O u t P o s ) \r \t 0017560 l e t t 2 = B a n d B u f 0017600 S i z e T o t a l + n V i s i b 0017620 l e B a n d s + 2 5 0 0 \r \t t 1 0017640 = ( t 2 r s h i f t ( t 0017660 1 - l n M a x M e r g e I n p u 0017700 t s ) ) + n M a x M e r g e I n 0017720 p u t s - 1 \r \t l e t n u m P 0017740 a g e s = B a n d F i l e > 0017760 > S P r u c e F i l e . n u m P 0020000 a g e s \r \t l e t r e m P a g 0020020 e s = n u m P a g e s - B a 0020040 n d W i n d o w > > S S . s p r 0020060 u c e P a g e > > S P r u c e P 0020100 a g e . p a g e N u m b e r - 1 0020120 \r \t t 1 = M i n ( t 1 , r 0020140 e m P a g e s ) \r \t f i r s t M 0020160 e r g e P a g e = n u m P a 0020200 g e s - t 1 \r \t B a n d W i n d 0020220 o w > > S S . s t e p S i z e 0020240 = n M a x M e r g e I n p u t 0020260 s / / i n t e r l a c e a 0020300 l l i n t p u t s t o m e 0020320 r g e \r \t ] \r W i n d o 0020340 w S e t P a g e ( B a n d W i n 0020360 d o w , f i r s t M e r g e P 0020400 a g e + B a n d S e g m e n t s 0020420 ) \r B a n d S e g m e n 0020440 t s = B a n d S e g m e n t 0020460 s + 1 \r i f B a n d S 0020500 e g m e n t s > n M a x M e r g 0020520 e I n p u t s t h e n S p r 0020540 u c e C o n d i t i o n ( 9 0 0 0020560 , E C F i l e T e r m i n a t 0020600 e , p a r t N u m b e r ) \r 0020620 ] \r \r a n d B a n d 0020640 F i n a l ( p a g e , l a s t 0020660 ) b e \r [ \r \t i f l a s t 0020700 t h e n f o r i = 1 t o 0020720 n T r a i l i n g B a n d s d 0020740 o B a n d E n d ( ) \r \t l e t 0020760 r e c = W i n d o w N e x t P 0021000 a g e ( B a n d W i n d o w ) \r 0021020 \t t e s t l a s t e q 0 0021040 t h e n p a g e > > P a g e G 0021060 . b a n d P o s = r e c \r \t 0021100 o r p a g e > > P a g e G . 0021120 n R e c o r d s = r e c - p a g 0021140 e > > P a g e G . b a n d P o s 0021160 \r \t u n l e s s l a s t t h 0021200 e n f o r i = 1 t o n L 0021220 e a d i n g B a n d s d o B 0021240 a n d E n d ( ) \r ] \r \r a n d 0021260 B a n d E n d ( ) b e \r \t f o 0021300 r i = 0 t o 1 d o W i 0021320 n d o w W r i t e ( B a n d W i 0021340 n d o w , B E E n d H ) \r \r a 0021360 n d A d d B a n d B u f ( u s 0021400 e F o n t W i d t h S t o r a g 0021420 e ; n u m a r g s n a ) = 0021440 v a l o f \r \t [ \r \t i f n a 0021460 < 1 t h e n u s e F o n t W 0021500 i d t h S t o r a g e = N o 0021520 \r \t u n l e s s e m e r g e n 0021540 c y S t o r a g e r e s u l t 0021560 i s f a l s e \r \t l e t b b 0021600 = F S G e t ( B a n d B u f 0021620 S i z e ) \r \t i f n o t b b 0021640 & u s e F o n t W i d t h S t o 0021660 r a g e t h e n [ F S G e 0021700 t R e l e a s e ( 0 ) ; b b 0021720 = F S G e t ( B a n d B u f S 0021740 i z e ) ] \r \t u n l e s s b 0021760 b r e s u l t i s f a l s e 0022000 \r \t B a n d B u f S i z e T o t 0022020 a l = B a n d B u f S i z e 0022040 T o t a l + B a n d B u f S i z 0022060 e \r \t b b ! 0 = 0 \r \t t e s 0022100 t B a n d B u f t h e n B 0022120 a n d B u f ! 0 = b b o r 0022140 B a n d B u f L i s t = b 0022160 b \r \t B a n d B u f = b b \r 0022200 \t B a n d F r e e , B a n d A 0022220 v a i l = B a n d B u f + 2 0022240 , - B a n d B u f S i z e + B 0022260 E M a x S i z e + 1 \r \t r e s u 0022300 l t i s t r u e \r \t ] \r \r a n 0022320 d R e l e a s e B a n d B u f 0022340 s ( r e I n i t i a l i z e ) 0022360 b e \r [ \r i f 0022400 B a n d T a b l e t h e n Z 0022420 e r o ( B a n d T a b l e , n 0022440 V i s i b l e B a n d s ) \r 0022460 l e t n e x t B u f = 0022500 B a n d B u f L i s t \r 0022520 w h i l e n e x t B u f d o 0022540 \r \t [ l e t b u f = n e 0022560 x t B u f ; n e x t B u f = 0022600 @ n e x t B u f ; F S P u t 0022620 ( b u f ) ] \r B a n d 0022640 B u f L i s t , B a n d B u f 0022660 S i z e T o t a l , B a n d B 0022700 u f = 0 , 0 , 0 \r 0022720 E m e r g e n c y O v e r ( ) 0022740 \r i f r e I n i t i a 0022760 l i z e t h e n A d d B a n 0023000 d B u f ( ) \r ] \r / / 0023020 U s e d t o o b t a i n t 0023040 h e s e b u f f e r s f o r 0023060 a l t e r n a t e u s e s 0023100 d u r i n g m e r g i n g a 0023120 n d f o n t c o p y i n g \r 0023140 \r a n d F l u s h B u f f e r 0023160 s ( g e t A n o t h e r ) b e 0023200 \r \t [ \r \t i f B a n d B u f 0023220 t h e n B a n d B u f ! 1 = 0023240 B a n d F r e e - B a n d B u 0023260 f - 2 \r \t i f g e t A n o t h 0023300 e r & A d d B a n d B u f ( ) 0023320 r e t u r n \r \t l e t n e x t 0023340 B u f , b u f = B a n d B 0023360 u f L i s t , n i l \r \t w h i 0023400 l e n e x t B u f d o \r \t \t 0023420 [ \r \t \t b u f , n e x t B u f 0023440 = n e x t B u f , @ n e x 0023460 t B u f \r \t \t l e t l e n = 0023500 b u f ! 1 \r \t \t i f l e n 0023520 t h e n u n l e s s W i n d 0023540 o w W r i t e B l o c k ( B a n 0023560 d W i n d o w , b u f + 2 , 0023600 l e n ) e q l e n d o \r \t 0023620 \t \t P u t E o f E r r o r ( B a 0023640 n d W i n d o w ) \r \t \t ] \r \t R 0023660 e l e a s e B a n d B u f s ( g 0023700 e t A n o t h e r ) \r \t ] \r \r / 0023720 / - - - - - - - - - - - - - - 0023740 - - - - - - - - - - - - - - - - * 0024000 - - - - - - - - \r a n d P a g 0024020 e D a t a ( p D o c ) = v a 0024040 l o f t e s t p D o c t h 0024060 e n / / ~ ~ T h i s i s 0024100 a l l w r o n g , g i v e 0024120 n c p e x i s t \r / / - - 0024140 - - - - - - - - - - - - - - - - * 0024220 - - - - \r [ \r \t W i n d o w S e 0024240 t P o s i t i o n ( B a n d W i 0024260 n d o w , D P z e r o ) \r \t W 0024300 i n d o w W r i t e B l o c k ( 0024320 B a n d W i n d o w , p D o c 0024340 , s i z e D o c G / 1 6 ) \r 0024360 \t W i n d o w W r i t e B l o c 0024400 k ( B a n d W i n d o w , p D 0024420 o c > > D o c G . P a g e s , 0024440 p D o c > > D o c G . n P a g e 0024460 s * ( s i z e P a g e G / 1 6 0024500 ) ) \r \t W i n d o w W r i t e B 0024520 l o c k ( B a n d W i n d o w , 0024540 p D o c > > D o c G . F o n t 0024560 s , p D o c > > D o c G . n F 0024600 o n t L o a d s * ( s i z e F 0024620 o n t G / 1 6 ) ) \r \t r e s u l 0024640 t i s n i l \r ] \r o r \r [ \r 0024660 \t l e t p = O v e r l a y T o 0024700 p \r \t / / ~ ~ B a n d F i l 0024720 e c / b t r u n c a t e d , 0024740 o r r e p l a c e d b y 0024760 m a p h e r e \r \t I n d e x e 0025000 d P a g e I O ( B a n d F i l e 0025020 > > S P r u c e F i l e . m a p 0025040 , 1 , p , 4 , i s f R e 0025060 a d ) \r \t l e t p a g e l e n 0025100 = p > > D o c G . n P a g e s * 0025120 ( s i z e P a g e G / 1 6 ) \r 0025140 \t l e t f o n t l e n = p > > 0025160 D o c G . n F o n t L o a d s * 0025200 ( s i z e F o n t G / 1 6 ) \r 0025220 \t l e t t o t l e n = p a g e 0025240 l e n + f o n t l e n + ( s i z 0025260 e D o c G / 1 6 ) \r \t p > > D 0025300 o c G . F o n t s = P e r m a n 0025320 e n t B o t t o m - f o n t l e 0025340 n \r \t p > > D o c G . P a g e s 0025360 = P e r m a n e n t B o t t o m 0025400 - f o n t l e n - p a g e l e n 0025420 \r \t i f U g t ( t o t l e n , 0025440 4 * 2 5 6 ) t h e n S p r 0025460 u c e E r r o r ( 1 0 0 ) \r \t P 0025500 e r m a n e n t B o t t o m = P 0025520 e r m a n e n t B o t t o m - t 0025540 o t l e n \r \t M o v e B l o c k 0025560 ( P e r m a n e n t B o t t o m 0025600 , p , t o t l e n ) \r \t r e 0025620 s u l t i s P e r m a n e n t 0025640 B o t t o m \r ] \r / / - - - - 0025660 - - - H i s t o r y . . 0025700 . \r \r / / D C S , J u l y 0025720 2 7 , 1 9 7 7 1 1 : 1 1 0025740 P M , m i n o r ( W i n d o 0025760 w s t r e a m ) r e v i s i 0026000 o n s \r / / A u g u s t 4 , 0026020 1 9 7 7 1 0 : 1 8 P M , 0026040 r e m o v e u n u s e d 5 0026060 0 0 w o r d v e c t o r \r / 0026100 / S e p t e m b e r 2 6 , 0026120 1 9 7 7 8 : 5 9 A M , h 0026140 a n d l e " o n l y o n c 0026160 o p y " \r / / S e p t e m b e 0026200 r 2 7 , 1 9 7 7 1 0 : 3 0026220 8 A M , " o n l y o n c 0026240 o p y " w h e n m e r g e s 0026260 r e q u i r e d \r / / S e p 0026300 t e m b e r 2 8 , 1 9 7 7 0026320 1 0 : 1 4 A M , s p e e d 0026340 u p b a n d f l u s h \r / 0026360 / O c t o b e r 9 , 1 9 7 0026400 7 3 : 4 7 P M , r e p a 0026420 i r m a n y B r a n c h r 0026440 e l o c . p r o b l e m s \r / 0026460 / J a n u a r y 2 3 , 1 9 0026500 7 8 9 : 5 3 A M , m o v 0026520 e P a g e D a t a h e r e , 0026540 a t l e a s t f o r t h 0026560 e p r e s e n t \r / / M a r 0026600 c h 1 1 , 1 9 7 8 1 : 5 0026620 1 P M , d i m i n i s h l 0026640 i k e l i h o o d o f s t o 0026660 r a g e b o m b i n g \r / / 0026700 O c t o b e r 5 , 1 9 7 8 0026720 9 : 2 7 P M , m a k e w 0026740 i n V e c s t a t i c f o r 0026760 e x t e r n a l m o n i t o 0027000 r i n g \r / / O c t o b e r 0027020 1 5 , 1 9 7 8 3 : 3 0 P 0027040 M , m o d i f y b u f f e r 0027060 i n g f o r f a s t f i l 0027100 e s \r / / O c t o b e r 2 3 0027120 , 1 9 7 8 1 2 : 0 4 P M 0027140 , u s e m i c r o c o d e 0027160 ( v i a a s m c o d e i n 0027200 S p r u c e B a n d M l ) f 0027220 o r b u f f e r f l u s h i 0027240 n g \r / / O c t o b e r 2 4 0027260 , 1 9 7 8 8 : 0 4 A M , 0027300 r e m o v e l i n k a g e 0027320 m e t h o d f o r o n l y - 0027340 o n - c o p y b r a n c h i n 0027360 g - - u s e C o p y T a b 0027400 l e \r / / O c t o b e r 2 5 0027420 , 1 9 7 8 7 : 3 3 A M , 0027440 v a s t l y s i m p l i f y 0027460 a n d e n h a n c e m e r 0027500 g e l o o p - - i n t e r 0027520 l a c e d s t r e a m s \r / / 0027540 O c t o b e r 2 6 , 1 9 7 0027560 8 1 0 : 4 2 P M , c a c 0027600 h e m e r g e i n p u t i 0027620 n l a r g e b u f f e r s , 0027640 c o d e s h a r e d w i t 0027660 h F o n t M a k e \r / / N o 0027700 v e m b e r 3 , 1 9 7 8 0027720 1 0 : 3 2 A M , i s s u e 0027740 e n d - o f - b a n d e n t r 0027760 y o n l y a f t e r a l l 0030000 s e g m e n t s m e r g e d 0030020 \r / / N o v e m b e r 4 , 0030040 1 9 7 8 1 2 : 2 8 A M , 0030060 t o s s o u t f o n t s w 0030100 h e n e n t e r i n g m e r 0030120 g e m o d e , t o m i n i 0030140 m i z e m e r g e s \r / / N 0030160 o v e m b e r 2 0 , 1 9 7 8 0030200 7 : 0 6 A M , F l u s h 0030220 M e r g e B u f f e r s m u s 0030240 t a v o i d d e s t r o y i 0030260 n g o d d p a g e s u c c 0030300 e s s i o n f o r \r / / \t m e 0030320 r g e s t r e a m s \r / / \0 \0 0030340 032 ( 6 3 5 ) \ 5 2 9 2 v 1 1 V \r 0030360