1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
*** compface/compface.h Thu Feb 21 16:42:54 2002
--- /home/lkoeller/tmp/ports/mail/faces/work/faces/compface/compface.h Thu Sep 5 07:24:42 1991
***************
*** 14,45 ****
* to me, then an attempt will be made to fix them.
*/
#include <string.h>
#include <fcntl.h>
#include <setjmp.h>
! /* Need to know how many bits per hexadecimal digit for io */
#define BITSPERDIG 4
! extern char HexDigits[];
! /* Define the face size - 48x48x1 */
#define WIDTH 48
#define HEIGHT WIDTH
! /* Total number of pixels and digits */
#define PIXELS (WIDTH * HEIGHT)
#define DIGITS (PIXELS / BITSPERDIG)
! extern char F[PIXELS];
! /* Output formatting word lengths and line lengths */
#define DIGSPERWORD 4
#define WORDSPERLINE (WIDTH / DIGSPERWORD / BITSPERDIG)
! /* Compressed output uses the full range of printable characters.
* in ascii these are in a contiguous block so we just need to know
! * the first and last. The total number of printables is needed too.
! */
#define FIRSTPRINT '!'
#define LASTPRINT '~'
#define NUMPRINTS (LASTPRINT - FIRSTPRINT + 1)
--- 13,64 ----
* to me, then an attempt will be made to fix them.
*/
+ #if defined(SYSV32) || defined(hpux)
#include <string.h>
+ #else
+ #include <strings.h>
+ #endif /* SYSV32 || hpux */
#include <fcntl.h>
#include <setjmp.h>
! /* For all function declarations, if ANSI then use a prototype. */
!
! #if defined(__STDC__)
! #define P(args) args
! #else /* ! __STDC__ */
! #define P(args) ()
! #endif /* STDC */
!
! #ifdef MAIN
! #define EXTERN
! #define INIT(x) = x
! #else
! #define EXTERN extern
! #define INIT(x)
! #endif
!
! /* need to know how many bits per hexadecimal digit for io */
#define BITSPERDIG 4
! EXTERN char HexDigits[] INIT("0123456789ABCDEF");
! /* define the face size - 48x48x1 */
#define WIDTH 48
#define HEIGHT WIDTH
! /* total number of pixels and digits */
#define PIXELS (WIDTH * HEIGHT)
#define DIGITS (PIXELS / BITSPERDIG)
! /* internal face representation - 1 char per pixel is faster */
! EXTERN char F[PIXELS];
! /* output formatting word lengths and line lengths */
#define DIGSPERWORD 4
#define WORDSPERLINE (WIDTH / DIGSPERWORD / BITSPERDIG)
! /* compressed output uses the full range of printable characters.
* in ascii these are in a contiguous block so we just need to know
! * the first and last. The total number of printables is needed too */
#define FIRSTPRINT '!'
#define LASTPRINT '~'
#define NUMPRINTS (LASTPRINT - FIRSTPRINT + 1)
***************
*** 49,56 ****
/* Portable, very large unsigned integer arithmetic is needed.
* Implementation uses arrays of WORDs. COMPs must have at least
! * twice as many bits as WORDs to handle intermediate results.
! */
#define WORD unsigned char
#define COMP unsigned long
#define BITSPERWORD 8
--- 68,74 ----
/* Portable, very large unsigned integer arithmetic is needed.
* Implementation uses arrays of WORDs. COMPs must have at least
! * twice as many bits as WORDs to handle intermediate results */
#define WORD unsigned char
#define COMP unsigned long
#define BITSPERWORD 8
***************
*** 64,76 ****
WORD b_word[MAXWORDS];
} BigInt;
! extern BigInt B;
/* This is the guess the next pixel table. Normally there are 12 neighbour
* pixels used to give 1<<12 cases but in the upper left corner lesser
! * numbers of neighbours are available, leading to 6231 different guesses.
! */
! typedef struct guesses {
char g_00[1<<12];
char g_01[1<<7];
char g_02[1<<2];
--- 82,94 ----
WORD b_word[MAXWORDS];
} BigInt;
! EXTERN BigInt B;
/* This is the guess the next pixel table. Normally there are 12 neighbour
* pixels used to give 1<<12 cases but in the upper left corner lesser
! * numbers of neighbours are available, leading to 6231 different guesses */
! typedef struct guesses
! {
char g_00[1<<12];
char g_01[1<<7];
char g_02[1<<2];
***************
*** 88,155 ****
char g_42[1<<2];
} Guesses;
! extern Guesses G;
/* Data of varying probabilities are encoded by a value in the range 0 - 255.
* The probability of the data determines the range of possible encodings.
! * Offset gives the first possible encoding of the range.
! */
! typedef struct prob {
WORD p_range;
WORD p_offset;
} Prob;
! extern Prob *ProbBuf[PIXELS * 2];
! extern int NumProbs;
/* Each face is encoded using 9 octrees of 16x16 each. Each level of the
* trees has varying probabilities of being white, grey or black.
! * The table below is based on sampling many faces.
! */
#define BLACK 0
#define GREY 1
#define WHITE 2
! extern Prob levels[4][3];
! extern Prob freqs[16];
#define ERR_OK 0 /* successful completion */
#define ERR_EXCESS 1 /* completed OK but some input was ignored */
#define ERR_INSUFF -1 /* insufficient input. Bad face format? */
#define ERR_INTERNAL -2 /* Arithmetic overflow or buffer overflow */
! extern int status;
! extern jmp_buf comp_env;
! int AllBlack(char *, int, int);
! int AllWhite(char *, int, int);
! int BigPop(Prob *);
! int compface(char *);
! int main(int, char *[]);
! int ReadBuf();
! int Same(char *, int, int);
! int uncompface(char *);
! int WriteBuf();
!
! void BigAdd(WORD);
! void BigClear();
! void BigDiv(WORD, WORD *);
! void BigMul(WORD);
! void BigPrint();
! void BigPush(Prob *);
! void BigRead(char *);
! void BigSub(WORD);
! void BigWrite(char *);
! void CompAll(char *);
! void Compress(char *, int, int, int);
! void GenFace();
! void PopGreys(char *, int, int);
! void PushGreys(char *, int, int);
! void ReadFace(char *);
! void RevPush(Prob *);
! void UnCompAll(char *);
! void UnCompress(char *, int, int, int);
! void UnGenFace();
! void WriteFace(char *);
--- 106,204 ----
char g_42[1<<2];
} Guesses;
! /* data.h was established by sampling over 1000 faces and icons */
! EXTERN Guesses G
! #ifdef MAIN
! =
! #include "data.h"
! #endif
! ;
/* Data of varying probabilities are encoded by a value in the range 0 - 255.
* The probability of the data determines the range of possible encodings.
! * Offset gives the first possible encoding of the range */
! typedef struct prob
! {
WORD p_range;
WORD p_offset;
} Prob;
! /* A stack of probability values */
! EXTERN Prob *ProbBuf[PIXELS * 2];
! EXTERN int NumProbs INIT(0);
/* Each face is encoded using 9 octrees of 16x16 each. Each level of the
* trees has varying probabilities of being white, grey or black.
! * The table below is based on sampling many faces */
#define BLACK 0
#define GREY 1
#define WHITE 2
! EXTERN Prob levels[4][3]
! #ifdef MAIN
! =
! {
! {{1, 255}, {251, 0}, {4, 251}}, /* Top of tree almost always grey */
! {{1, 255}, {200, 0}, {55, 200}},
! {{33, 223}, {159, 0}, {64, 159}},
! {{131, 0}, {0, 0}, {125, 131}} /* Grey disallowed at bottom */
! }
! #endif
! ;
!
! /* At the bottom of the octree 2x2 elements are considered black if any
! * pixel is black. The probabilities below give the distribution of the
! * 16 possible 2x2 patterns. All white is not really a possibility and
! * has a probability range of zero. Again, experimentally derived data */
! EXTERN Prob freqs[16]
! #ifdef MAIN
! =
! {
! {0, 0}, {38, 0}, {38, 38}, {13, 152},
! {38, 76}, {13, 165}, {13, 178}, {6, 230},
! {38, 114}, {13, 191}, {13, 204}, {6, 236},
! {13, 217}, {6, 242}, {5, 248}, {3, 253}
! }
! #endif
! ;
#define ERR_OK 0 /* successful completion */
#define ERR_EXCESS 1 /* completed OK but some input was ignored */
#define ERR_INSUFF -1 /* insufficient input. Bad face format? */
#define ERR_INTERNAL -2 /* Arithmetic overflow or buffer overflow */
! EXTERN int status;
! EXTERN jmp_buf comp_env;
! int AllBlack P((char *, int, int)) ;
! int AllWhite P((char *, int, int)) ;
! int BigPop P((Prob *)) ;
! int compface P((char *)) ;
! int main P((int, char *[])) ;
! int ReadBuf P(()) ;
! int Same P((char *, int, int)) ;
! int uncompface P((char *)) ;
! int WriteBuf P(()) ;
!
! void BigAdd P((unsigned char)) ;
! void BigClear P(()) ;
! void BigDiv P((unsigned char, unsigned char *)) ;
! void BigMul P((unsigned char)) ;
! void BigPrint P(()) ;
! void BigPush P((Prob *)) ;
! void BigRead P((char *)) ;
! void BigSub P((unsigned int)) ;
! void BigWrite P((char *)) ;
! void CompAll P((char *)) ;
! void Compress P((char *, int, int, int)) ;
! void GenFace P(()) ;
! void PopGreys P((char *, int, int)) ;
! void PushGreys P((char *, int, int)) ;
! void ReadFace P((char *)) ;
! void RevPush P((Prob *)) ;
! void UnCompAll P((char *)) ;
! void UnCompress P((char *, int, int, int)) ;
! void UnGenFace P(()) ;
! void WriteFace P((char *)) ;
|