]> git.zerfleddert.de Git - rsbs2/blame - rsb-lz.c
general cleanups
[rsbs2] / rsb-lz.c
CommitLineData
90836933 1#include <stdio.h>
14ff7444
MG
2#include <stdlib.h>
3#include <strings.h>
4#include <string.h>
e433bc03 5#include <unistd.h>
14ff7444 6#include <errno.h>
af1fed3a 7#include "rsb-crc.h"
90836933 8#include "rsb-lz.h"
e8563c43 9#include "filesystem.h"
90836933 10
2363a0d6 11void err_exit(const char *fname)
14ff7444 12{
e4a6d4c3 13 fprintf(stderr,"%s: error extracting...\n", fname);
14ff7444
MG
14 exit(1);
15}
16
7e4dc833 17struct data_in_s {
5e9ad31f
MG
18 unsigned char *start; /* 0 */
19 unsigned char *stop; /* 4 */
7e4dc833 20 unsigned char bit; /* 8 */
14ff7444
MG
21 unsigned char x; /* 9 */
22};
23
7e4dc833
MG
24struct data_out_s {
25 unsigned char *pos;
26 unsigned char *end;
27};
28
29unsigned char fn_597c8(struct data_in_s *r6_data)
af1fed3a 30{
5e9ad31f
MG
31 unsigned char *r0;
32 unsigned char *r1;
33 unsigned char r5;
34
35 r5 = 0;
36
37 r0 = r6_data->start;
38 r1 = r6_data->stop;
39
40 if (r1 < r0)
2363a0d6 41 err_exit(__func__);
5e9ad31f
MG
42
43 r5 = *r0;
44 r0++;
45 r6_data->start = r0;
46
47 return r5;
af1fed3a
MG
48}
49
7e4dc833 50unsigned int fn_59848(struct data_in_s *r6_data)
e4a6d4c3 51{
90c723bb
MG
52 unsigned char r1;
53 unsigned char r2;
e4a6d4c3
MG
54 unsigned int r5;
55
7e4dc833 56 r1 = r6_data->bit;
e4a6d4c3
MG
57 if (r1 == 0x80) {
58 r6_data->x = fn_597c8(r6_data);
59 }
7e4dc833 60 r1 = r6_data->bit;
e4a6d4c3
MG
61 r2 = r6_data->x;
62 r1 = r1 & r2;
63 r5 = r1 & 0xff;
64
7e4dc833 65 r1 = r6_data->bit;
e4a6d4c3 66 r1 = r1 >> 1;
7e4dc833 67 r6_data->bit = r1;
90c723bb 68 if (r1 == 0) {
e4a6d4c3 69 r1 = 0x80;
7e4dc833 70 r6_data->bit = r1;
90c723bb
MG
71 }
72
e4a6d4c3
MG
73 if (r5 == 0)
74 return 0;
75
76 return 1;
77}
78
7e4dc833 79unsigned int fn_598b4(struct data_in_s *r11_data, unsigned int r10_arg2)
3772880c
MG
80{
81 unsigned int r1;
82 unsigned int r2;
83 unsigned int r6;
84 unsigned int r7;
85
3772880c
MG
86 r1 = r10_arg2 - 1;
87 r6 = 1 << r1;
88
89 r7 = 0;
90c723bb 90 while (r6 != 0) {
7e4dc833 91 r1 = r11_data->bit;
3772880c
MG
92 if (r1 == 0x80) {
93 r1 = fn_597c8(r11_data);
90c723bb 94 r11_data->x = r1;
3772880c 95 }
7e4dc833 96 r1 = r11_data->bit;
3772880c
MG
97 r2 = r11_data->x;
98 r1 = r1 & r2;
99 if (r1 != 0)
100 r7 = r7 | r6;
101
102 r6 = r6 >> 1;
103
7e4dc833 104 r2 = r11_data->bit;
3772880c 105 r2 = r2 >> 1;
7e4dc833 106 r11_data->bit = r2;
3772880c 107
7e4dc833 108 r1 = r11_data->bit;
3772880c 109 if(r1 == 0) {
7e4dc833 110 r11_data->bit = 0x80;
3772880c 111 }
90c723bb 112 }
3772880c
MG
113
114 return r7;
115}
116
7e4dc833 117void fn_5980c(unsigned int arg1, struct data_out_s *data_out)
af1fed3a 118{
9897bfc3
MG
119 unsigned char *r1;
120 unsigned char *r2;
121
7e4dc833
MG
122 r1 = data_out->pos;
123 r2 = data_out->end;
9897bfc3 124
e4a6d4c3
MG
125 if (r1 > r2) {
126 printf("r1: 0x%08x, r2: 0x%08x\n", (unsigned int)r1, (unsigned int)r2);
2363a0d6 127 err_exit(__func__);
e4a6d4c3 128 }
9897bfc3
MG
129
130 *r1 = arg1 & 0xff;
131
132 r1++;
7e4dc833 133 data_out->pos = r1;
af1fed3a
MG
134}
135
7e4dc833 136void lz_expand(struct data_in_s *r10_data, struct data_out_s *data_out)
af1fed3a
MG
137{
138 unsigned int r5;
139 unsigned int r2;
90c723bb 140 unsigned char r4;
05c92ac4
MG
141 unsigned int r6;
142 unsigned int r7;
143 unsigned int r11;
90c723bb 144 unsigned char arr_59b64[2048];
af1fed3a
MG
145
146 r5 = 1;
147
90c723bb
MG
148 while (1) {
149 while (1) {
150 r2 = fn_59848(r10_data);
05c92ac4
MG
151 if (r2 == 0)
152 break;
af1fed3a 153
90c723bb 154 r2 = fn_598b4(r10_data, 8) & 0xff;
05c92ac4 155 r4 = r2;
af1fed3a 156
7e4dc833 157 fn_5980c(r4, data_out);
05c92ac4
MG
158 arr_59b64[r5] = r4 & 0xff;
159 r2 = r5 + 1;
160 r2 = r2 << 22;
161 r2 = r2 >> 22;
162 r5 = r2;
90c723bb 163 }
af1fed3a 164
90c723bb 165 r11 = fn_598b4(r10_data, 0x0a);
05c92ac4
MG
166 if(r11 == 0)
167 return;
af1fed3a 168
90c723bb 169 r2 = fn_598b4(r10_data, 0x04);
05c92ac4
MG
170 r7 = r2 + 1;
171 r6 = 0;
90c723bb 172 while (r6 <= r7) {
05c92ac4
MG
173 r2 = r6 + r11;
174 r2 = r2 << 22;
175 r2 = r2 >> 22;
176 r4 = arr_59b64[r2];
7e4dc833 177 fn_5980c(r4, data_out);
90c723bb 178 arr_59b64[r5] = r4;
05c92ac4
MG
179 r2 = r5 + 1;
180 r2 = r2 << 22;
181 r2 = r2 >> 22;
182 r5 = r2;
183 r6++;
90c723bb
MG
184 }
185 }
af1fed3a
MG
186}
187
188unsigned int crc_check_59684(unsigned char *arg1, unsigned int arg2, unsigned int magic)
189{
190 unsigned int r3;
191 unsigned int r4;
192 unsigned int r5;
193
194#if 0
195 if (r0 < 0xc0000000)
196 return 1;
197#endif
198
e433bc03 199 /* ??? */
af1fed3a
MG
200 r4 = *((unsigned int*)arg1 + 0x20);
201 r5 = *((unsigned int*)arg1 + 0x24);
202
e433bc03 203 printf("magic: 0x%08x <-> 0x%08x\n", r5, magic);
af1fed3a
MG
204 if (r5 != magic)
205 return 2;
206
207 if (arg2 >= r4)
208 r5 = 0;
209 else
210 return 3;
211
212 r5 = ~rsb_crc(~0x00, arg1, r4);
213 r3 = *((unsigned int*)(arg1 + r4));
214 printf("Checksums: 0x%02x <-> 0x%02x\n", r5, r3);
215
216 if (r3 == r5)
217 return 0;
218
05c92ac4 219 return 4;
af1fed3a
MG
220}
221
2363a0d6 222void extract_lz_file(unsigned char *inbuf, unsigned char *name)
14ff7444 223{
2363a0d6
MG
224 unsigned int len;
225 unsigned char *outbuf;
7e4dc833
MG
226 struct data_in_s data_in;
227 struct data_out_s data_out;
14ff7444 228
2363a0d6
MG
229 if (*((unsigned int*)inbuf) != LZ_MAGIC)
230 err_exit(__func__);
e4a6d4c3 231
2363a0d6
MG
232 len = *((unsigned int*)(inbuf + 4));
233 printf(", length: %d", len);
14ff7444 234
2363a0d6 235 if ((outbuf = malloc(len)) == NULL) {
e433bc03
MG
236 perror("malloc");
237 exit(1);
238 }
e433bc03 239
2363a0d6
MG
240 bzero(outbuf, len);
241
242 data_in.start = inbuf + 8;
243 data_in.stop = inbuf + len;
7e4dc833
MG
244 data_in.x = 0;
245 data_in.bit = 0x80;
14ff7444 246
2363a0d6
MG
247 data_out.pos = outbuf;
248 data_out.end = outbuf + len;
14ff7444 249
7e4dc833 250 lz_expand(&data_in, &data_out);
14ff7444 251
e433bc03
MG
252#if 0
253 /* This seems to still be completely broken */
af1fed3a
MG
254 r3 = r7 + 0x20;
255 r5 = *((unsigned int*)r3);
256
e433bc03
MG
257 if ((ret = crc_check_59684(r7, r5, 0x46335053)) != 0) {
258 printf("crc_check return: %d\n", ret);
2363a0d6 259 err_exit(__func__);
e433bc03
MG
260 }
261#endif
af1fed3a 262
2363a0d6 263 write_file((char*)name, outbuf, len);
e433bc03 264
2363a0d6 265 free(outbuf);
14ff7444 266}
Impressum, Datenschutz