Pascal News
Pascal News
Pascal News
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
61<br />
trsl ~~RAY [t •• maxlengthl OF treept<br />
119 VAR 179<br />
120 temp: treept: 180<br />
121<br />
62<br />
END;<br />
122<br />
63 newcharsetl ARRAY [alphabet1 OF newchar:<br />
123<br />
64 stactc: newchar;<br />
124<br />
65<br />
66<br />
61 PROCEDURE get_char:<br />
125<br />
126<br />
127<br />
68<br />
128<br />
69 BEGIN<br />
129<br />
70<br />
REPEAT num_in_cnars:= num_ln-ehars + t;<br />
no<br />
71 UNTIL eof(ln_flle) OR (ord(1n-flh-.) 0)<br />
III<br />
72 ENDtGET_CHAR);<br />
1J2<br />
73<br />
III<br />
74<br />
134<br />
75 PROCEDURE fIll_tally:<br />
135<br />
H. (Scan the file the first tIme and get a character count on<br />
U6<br />
77 WhIch to maKe the new Huffman character set.)<br />
78<br />
117<br />
U8<br />
79 VAR 139<br />
80 count: integer:<br />
140<br />
81<br />
141<br />
82 BEGIN<br />
142<br />
83 reset(1n_file 1I<br />
143<br />
84<br />
FOR count := 'ftlnchar.J'O 127 DC?,<br />
144<br />
85<br />
WIrH tallylcountl'DO .<br />
145<br />
86<br />
BEGIN marKed: e falsel<br />
1= 0<br />
146<br />
87 IF NOr eol(1n_file)<br />
147<br />
88<br />
THEN<br />
148<br />
89<br />
BEGIN<br />
149<br />
90<br />
IJet_char:<br />
150<br />
91<br />
WHILE NOT eofCin_file) DO<br />
1!>1<br />
92<br />
8EGIN<br />
152<br />
93<br />
If' ord(1n_flle-) < minchar THEN<br />
153<br />
94<br />
BEGU<br />
154<br />
95<br />
writelnCtty, 'Bad character in input!·~·, ordC<br />
l!>5<br />
96<br />
in_file-» :<br />
156<br />
97<br />
GOTO 13<br />
157<br />
98<br />
END:<br />
158<br />
99<br />
tallylord(1n_Hle-)]. num_of 1= tally[ordCin_flle-.><br />
159<br />
100<br />
]. nu .._of + 1;<br />
1&0<br />
101<br />
get_Char I<br />
lot<br />
102<br />
END<br />
102<br />
103<br />
END<br />
163<br />
104 END (FILL_T~LLr):<br />
Ib4<br />
105<br />
Ib5<br />
106<br />
166<br />
101 PROCEDURE exchangeCVAR x, Y: integer):<br />
167<br />
108<br />
t&8<br />
109 VAR 11>9<br />
110 temp: integer:<br />
110<br />
111<br />
111<br />
112 BEGTN temp := x, x := VI V := temp E~D (EXCHANGE):<br />
112<br />
113<br />
173<br />
114<br />
114<br />
115 PROCEDURE .. aKe_new_chars:<br />
115<br />
116 (~aKe the Huffman Characters based on the character frequencies<br />
176<br />
117 of the file.)<br />
117<br />
118<br />
178<br />
poSl, pos2, cOQnt: inteqer:<br />
done, trl, tr2: boolean:<br />
PROCE~URE 1roundCt: treept: val: Integer):<br />
(Ground the character tree With NIL's)<br />
BEGIN<br />
WITH t-, DO<br />
B£GIN left:= NIL:<br />
ENO (GROUND):<br />
sum := val END<br />
PROCEDURE 1et_2_minsCVAR posl, pos2: inte1er: VAR trl, tr2:<br />
boolean):<br />
(Find the two Characters or character trees with the smallest<br />
frequpncles.)<br />
VAR<br />
count. mini, mln2: integer:<br />
BEGIN tGET_2_MINS}<br />
mint := ~axlnt; mln2:= maxlnt;<br />
faR count := MinChar TO 127 00<br />
WITH tallvlcountJ DO<br />
If' Nor marlced<br />
THEN<br />
If' num_of < min2<br />
THEN<br />
IF num_of < minl<br />
THEN<br />
BEGIN<br />
min2 := mint:<br />
pos2 := posl:<br />
trl := falSe;<br />
END<br />
ELSE<br />
BEGIN<br />
pos2 := count:<br />
11I1n2 := num_of<br />
END:<br />
TO trees. t_num on<br />
trs [count] ., DO<br />
dn2<br />
FOR count : = 1<br />
WITH trees.<br />
If' sum <<br />
rH I!: Pi<br />
If' NOT trl<br />
IF NOT tr2<br />
IF su'" < mini<br />
THEN<br />
BEGlPi<br />
mi02 := m1nl:<br />
post := count,<br />
I!: NO<br />
I!:LSE<br />
BEGIN<br />
END tGEr_2_~INSJ:<br />
tr2 :<br />
DOSl<br />
mini<br />
trl:<br />
= c01Jnt:<br />
= num_of<br />
tr2 := false:<br />
tr2 := trl:<br />
trl := true,<br />
pos2 := posl:<br />
mini := sum<br />
mln2 := sum: 00s2 : =<br />
e:r~D;<br />
THEN<br />
THEN<br />
tally[posl]. marKed := truel<br />
tally[pos2]. marked := true<br />
count<br />
en<br />
rn<br />
"'tl<br />
.....<br />
rn<br />
3<br />
t:C<br />
rn<br />
::0<br />
.....<br />