|
Lines 95-100
Link Here
|
| 95 |
int is_pcx(file_data_t *fd); |
95 |
int is_pcx(file_data_t *fd); |
| 96 |
void fix_pal(unsigned char *pal, unsigned shade1, unsigned shade2, unsigned char *rgb); |
96 |
void fix_pal(unsigned char *pal, unsigned shade1, unsigned shade2, unsigned char *rgb); |
| 97 |
void write_data(char *name); |
97 |
void write_data(char *name); |
|
|
98 |
void add_number_le(file_data_t *d, uint32_t u, unsigned usize); |
| 98 |
void add_data(file_data_t *d, void *buffer, unsigned size); |
99 |
void add_data(file_data_t *d, void *buffer, unsigned size); |
| 99 |
code_t *new_code(void); |
100 |
code_t *new_code(void); |
| 100 |
dict_t *new_dict(void); |
101 |
dict_t *new_dict(void); |
|
Lines 357-363
Link Here
|
| 357 |
|
358 |
|
| 358 |
// then, put everything together |
359 |
// then, put everything together |
| 359 |
|
360 |
|
| 360 |
add_data(&fd, &header, sizeof header); |
361 |
add_number_le(&fd, header.magic_id, 4); |
|
|
362 |
add_data(&fd, &header.version, 1); |
| 363 |
add_data(&fd, &header.res_1, 1); |
| 364 |
add_data(&fd, &header.res_2, 1); |
| 365 |
add_data(&fd, &header.res_3, 1); |
| 366 |
add_number_le(&fd, header.bincode, 4); |
| 367 |
add_number_le(&fd, header.bincode_size, 4); |
| 368 |
add_number_le(&fd, header.bincode_crc, 4); |
| 369 |
add_number_le(&fd, header.dict, 4); |
| 370 |
add_number_le(&fd, header.code, 4); |
| 371 |
add_number_le(&fd, header.code_size, 4); |
| 361 |
|
372 |
|
| 362 |
add_data(&fd, bincode_data, sizeof bincode_data); |
373 |
add_data(&fd, bincode_data, sizeof bincode_data); |
| 363 |
|
374 |
|
|
Lines 375-380
Link Here
|
| 375 |
} |
386 |
} |
| 376 |
|
387 |
|
| 377 |
|
388 |
|
|
|
389 |
/* Copy the least-significant usize bytes of u into enc, least-significant |
| 390 |
* byte first. |
| 391 |
*/ |
| 392 |
void copy_number_le(unsigned char *enc, unsigned u, unsigned usize) |
| 393 |
{ |
| 394 |
int i; |
| 395 |
for (i = 0; i < usize; ++i) |
| 396 |
enc[i] = (u >> (i * 8)) & 255; |
| 397 |
} |
| 398 |
|
| 399 |
|
| 400 |
void add_number_le(file_data_t *d, uint32_t u, unsigned usize) |
| 401 |
{ |
| 402 |
unsigned char buf[4]; |
| 403 |
copy_number_le(buf, u, usize); |
| 404 |
add_data(d, buf, sizeof buf); |
| 405 |
} |
| 406 |
|
| 407 |
|
| 378 |
void add_data(file_data_t *d, void *buffer, unsigned size) |
408 |
void add_data(file_data_t *d, void *buffer, unsigned size) |
| 379 |
{ |
409 |
{ |
| 380 |
ssize_t ofs = 0; |
410 |
ssize_t ofs = 0; |
|
Lines 443-448
Link Here
|
| 443 |
} |
473 |
} |
| 444 |
|
474 |
|
| 445 |
|
475 |
|
|
|
476 |
uint32_t read_uint32_le(file_data_t *fd, unsigned ofs) |
| 477 |
{ |
| 478 |
uint32_t word = 0; |
| 479 |
int i; |
| 480 |
for (i = 0; i < 4; ++i) |
| 481 |
word += fd->data[ofs + i] << (i * 8); |
| 482 |
return word; |
| 483 |
} |
| 484 |
|
| 485 |
|
| 446 |
void hexdump(file_data_t *fd, unsigned ofs, int len) |
486 |
void hexdump(file_data_t *fd, unsigned ofs, int len) |
| 447 |
{ |
487 |
{ |
| 448 |
unsigned u, p; |
488 |
unsigned u, p; |
|
Lines 500-506
Link Here
|
| 500 |
fd = read_file(name); |
540 |
fd = read_file(name); |
| 501 |
|
541 |
|
| 502 |
if(fd.size >= sizeof header) { |
542 |
if(fd.size >= sizeof header) { |
| 503 |
memcpy(&header, fd.data, sizeof header); |
543 |
header.magic_id = read_uint32_le(&fd, 0); |
|
|
544 |
header.version = fd.data[4]; |
| 545 |
header.res_1 = fd.data[5]; |
| 546 |
header.res_2 = fd.data[6]; |
| 547 |
header.res_3 = fd.data[7]; |
| 548 |
header.bincode = read_uint32_le(&fd, 8); |
| 549 |
header.bincode_size = read_uint32_le(&fd, 12); |
| 550 |
header.bincode_crc = read_uint32_le(&fd, 16); |
| 551 |
header.dict = read_uint32_le(&fd, 20); |
| 552 |
header.code = read_uint32_le(&fd, 24); |
| 553 |
header.code_size = read_uint32_le(&fd, 28); |
| 504 |
ofs += sizeof header; |
554 |
ofs += sizeof header; |
| 505 |
} |
555 |
} |
| 506 |
|
556 |
|
|
Lines 608-614
Link Here
|
| 608 |
|
658 |
|
| 609 |
*word = 0; |
659 |
*word = 0; |
| 610 |
|
660 |
|
| 611 |
while(isspace(*s)) if(*s++ == '\n') line++; |
661 |
while(isspace((unsigned char) *s)) if(*s++ == '\n') line++; |
| 612 |
|
662 |
|
| 613 |
if(!*s) { |
663 |
if(!*s) { |
| 614 |
*ptr = s; |
664 |
*ptr = s; |
|
Lines 707-713
Link Here
|
| 707 |
word[n] = 0; |
757 |
word[n] = 0; |
| 708 |
} |
758 |
} |
| 709 |
else { |
759 |
else { |
| 710 |
while(!isspace(*s)) s++; |
760 |
while(!isspace((unsigned char) *s)) s++; |
| 711 |
} |
761 |
} |
| 712 |
|
762 |
|
| 713 |
if(!is_str) { |
763 |
if(!is_str) { |
|
Lines 808-814
Link Here
|
| 808 |
c->size = u2 + 1; |
858 |
c->size = u2 + 1; |
| 809 |
c->enc = malloc(c->size); |
859 |
c->enc = malloc(c->size); |
| 810 |
c->enc[0] = c->type + (u2 << 4); |
860 |
c->enc[0] = c->type + (u2 << 4); |
| 811 |
if(u2) memcpy(c->enc + 1, &c->value.u, u2); |
861 |
if(u2) copy_number_le(c->enc + 1, c->value.u, u2); |
| 812 |
break; |
862 |
break; |
| 813 |
|
863 |
|
| 814 |
case t_string: |
864 |
case t_string: |
|
Lines 817-823
Link Here
|
| 817 |
c->size = u1 + u0 + 1; |
867 |
c->size = u1 + u0 + 1; |
| 818 |
c->enc = malloc(c->size); |
868 |
c->enc = malloc(c->size); |
| 819 |
c->enc[0] = c->type + (u0 << 4) + 0x80; |
869 |
c->enc[0] = c->type + (u0 << 4) + 0x80; |
| 820 |
memcpy(c->enc + 1, &u1, u0); |
870 |
copy_number_le(c->enc + 1, u1, u0); |
| 821 |
memcpy(c->enc + 1 + u0, c->value.p, u1); |
871 |
memcpy(c->enc + 1 + u0, c->value.p, u1); |
| 822 |
break; |
872 |
break; |
| 823 |
|
873 |
|
|
Lines 841-847
Link Here
|
| 841 |
c->size = u0 + 1; |
891 |
c->size = u0 + 1; |
| 842 |
c->enc = malloc(c->size); |
892 |
c->enc = malloc(c->size); |
| 843 |
c->enc[0] = c->type + (u0 << 4); |
893 |
c->enc[0] = c->type + (u0 << 4); |
| 844 |
if(u0) memcpy(c->enc + 1, &c->value.u, u0); |
894 |
if(u0) copy_number_le(c->enc + 1, c->value.u, u0); |
| 845 |
break; |
895 |
break; |
| 846 |
|
896 |
|
| 847 |
default: |
897 |
default: |
|
Lines 871-877
Link Here
|
| 871 |
if(c->enc) free(c->enc); |
921 |
if(c->enc) free(c->enc); |
| 872 |
c->enc = malloc(c->size); |
922 |
c->enc = malloc(c->size); |
| 873 |
c->enc[0] = c->type + (u1 << 4); |
923 |
c->enc[0] = c->type + (u1 << 4); |
| 874 |
if(u1) memcpy(c->enc + 1, &code[u0].ofs, u1); |
924 |
if(u1) copy_number_le(c->enc + 1, code[u0].ofs, u1); |
| 875 |
} |
925 |
} |
| 876 |
|
926 |
|
| 877 |
ofs += c->size; |
927 |
ofs += c->size; |
|
Lines 892-906
Link Here
|
| 892 |
exit(6); |
942 |
exit(6); |
| 893 |
} |
943 |
} |
| 894 |
|
944 |
|
| 895 |
add_data(&dict_file, &dict_size, 4); |
945 |
add_number_le(&dict_file, dict_size, 4); |
| 896 |
|
946 |
|
| 897 |
u = 0; |
947 |
u = 0; |
| 898 |
|
948 |
|
| 899 |
for(i = 0; i < dict_size; i++) { |
949 |
for(i = 0; i < dict_size; i++) { |
| 900 |
if(dict[i].type == t_none || dict[i].type == t_prim) continue; |
950 |
if(dict[i].type == t_none || dict[i].type == t_prim) continue; |
| 901 |
add_data(&dict_file, &i, 2); |
951 |
add_number_le(&dict_file, i, 2); |
| 902 |
add_data(&dict_file, &dict[i].type, 1); |
952 |
add_data(&dict_file, &dict[i].type, 1); |
| 903 |
add_data(&dict_file, &dict[i].value.u, 4); |
953 |
add_number_le(&dict_file, dict[i].value.u, 4); |
| 904 |
u++; |
954 |
u++; |
| 905 |
} |
955 |
} |
| 906 |
|
956 |
|