SmartPDF - lightweight pdf viewer app for rosapps
[reactos.git] / rosapps / smartpdf / fitz / stream / filt_a85e.c
1 #include "fitz-base.h"
2 #include "fitz-stream.h"
3
4 typedef struct fz_a85e_s fz_a85e;
5
6 struct fz_a85e_s
7 {
8 fz_filter super;
9 int c;
10 };
11
12 fz_error *
13 fz_newa85e(fz_filter **fp, fz_obj *params)
14 {
15 FZ_NEWFILTER(fz_a85e, f, a85e);
16 f->c = 0;
17 return nil;
18 }
19
20 void
21 fz_dropa85e(fz_filter *f)
22 {
23 }
24
25 fz_error *
26 fz_processa85e(fz_filter *filter, fz_buffer *in, fz_buffer *out)
27 {
28 fz_a85e *f = (fz_a85e*)filter;
29 unsigned long word;
30 int count;
31 int n;
32
33 n = 0;
34
35 while (1)
36 {
37 if (f->c >= 70) {
38 if (out->wp + 1 > out->ep)
39 return fz_ioneedout;
40 *out->wp++ = '\n';
41 f->c = 0;
42 n ++;
43 }
44
45 if (in->rp + 4 <= in->wp)
46 {
47 word = (in->rp[0] << 24) |
48 (in->rp[1] << 16) |
49 (in->rp[2] << 8) |
50 (in->rp[3]);
51 if (word == 0) {
52 if (out->wp + 1 > out->ep)
53 return fz_ioneedout;
54 *out->wp++ = 'z';
55 f->c ++;
56 n ++;
57 }
58 else {
59 unsigned long v1, v2, v3, v4;
60
61 if (out->wp + 5 > out->ep)
62 return fz_ioneedout;
63
64 v4 = word / 85;
65 v3 = v4 / 85;
66 v2 = v3 / 85;
67 v1 = v2 / 85;
68
69 *out->wp++ = (v1 % 85) + '!';
70 *out->wp++ = (v2 % 85) + '!';
71 *out->wp++ = (v3 % 85) + '!';
72 *out->wp++ = (v4 % 85) + '!';
73 *out->wp++ = (word % 85) + '!';
74 f->c += 5;
75 n += 5;
76 }
77 in->rp += 4;
78 }
79
80 else if (in->eof)
81 {
82 unsigned long divisor;
83
84 if (in->rp == in->wp)
85 goto needinput; /* handle clean eof here */
86
87 count = in->wp - in->rp;
88
89 if (out->wp + count + 3 > out->ep)
90 return fz_ioneedout;
91
92 word = 0;
93 switch (count) {
94 case 3: word |= in->rp[2] << 8;
95 case 2: word |= in->rp[1] << 16;
96 case 1: word |= in->rp[0] << 24;
97 }
98 in->rp += count;
99
100 divisor = 85L * 85 * 85 * 85;
101 while (count-- >= 0) {
102 *out->wp++ = ((word / divisor) % 85) + '!';
103 divisor /= 85;
104 }
105
106 *out->wp++ = '~';
107 *out->wp++ = '>';
108 out->eof = 1;
109 return fz_iodone;
110 }
111
112 else {
113 goto needinput;
114 }
115 }
116
117 needinput:
118 if (in->eof) {
119 if (out->wp + 2 > out->ep)
120 return fz_ioneedout;
121 *out->wp++ = '~';
122 *out->wp++ = '>';
123 out->eof = 1;
124 return fz_iodone;
125 }
126 return fz_ioneedin;
127 }
128