Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include "zlib.h"
- /* usage: scb2swf infile.scb outfile.swf */
- #pragma pack(1)
- void *emalloc(int size, int ret) {
- void *p = malloc(size);
- if(p) return p;
- fprintf(stderr,"fatal: memory allocation error (%u bytes)\n", size);
- exit(ret);
- }
- void *erealloc(void *p, int size, int ret) {
- void *q = realloc(p, size);
- if(q) return q;
- fprintf(stderr,"fatal: memory reallocation error (%08x -> %u bytes)\n", p, size);
- exit(ret);
- }
- int mem_inflate(void *inbuf, unsigned int insize, void *outbuf, unsigned int outsize, int ret) {
- z_stream zs;
- zs.next_in = inbuf;
- zs.avail_in = insize;
- zs.total_in = 0;
- zs.zalloc = 0;
- zs.zfree = 0;
- zs.opaque = 0;
- zs.next_out = outbuf;
- zs.avail_out = outsize;
- zs.total_out = 0;
- if(inflateInit(&zs)) {
- fprintf(stderr,"error initialising zlib for decompression\n");
- return ret;
- }
- if(inflate(&zs, Z_FINISH)!=Z_STREAM_END) {
- fprintf(stderr,"error decompressing\n");
- return ret+1;
- }
- inflateEnd(&zs);
- return 0;
- }
- int main(int argc, char **argv) {
- FILE *fin, *fout;
- struct SCHh {
- char sig[3];
- unsigned int schUsizep15;
- int docId;
- char docType;
- short numPages;
- short sizeX;
- short sizeY;
- short pageOffs;
- char unk1;
- char comp;
- unsigned int schCsize;
- } sch;
- struct SCPh {
- char sig[3]; /* "SCP" */
- short pageNum;
- unsigned int scpUsizep18;
- char unk2;
- short unk3;
- char unk4;
- char comp;
- unsigned int scpCsize;
- } scp;
- z_stream zs;
- unsigned char *schbuf;
- unsigned int schlen;
- int page;
- int flen;
- char sig[3];
- if(argc < 3) {
- fprintf(stderr,"usage: scb2swf infile.scb outfile.swf\n");
- return 1;
- }
- if(!(fin=fopen(argv[1],"rb"))) {
- fprintf(stderr,"error opening %s\n", argv[1]);
- return 2;
- }
- if(fread(&sig, 1, 3, fin) != 3) {
- fprintf(stderr,"infile insufficient length\n");
- return 3;
- }
- if(memcmp(sig, "SCB", 3)) {
- fprintf(stderr,"incorrect SCB signature\n");
- return 4;
- }
- if(fgetc(fin) != 1)
- fprintf(stderr,"warning: version is not 1\n");
- fseek(fin, 4, SEEK_CUR); /* ignored bytes */
- /* process SCH header */
- if(fread(&sch, 1, sizeof(sch), fin) != sizeof(sch)
- || memcmp(sch.sig, "SCH", 3)) {
- fprintf(stderr,"invalid SCH header\n");
- return 5;
- }
- schbuf = emalloc(sch.schCsize, 6);
- if(fread(schbuf, 1, sch.schCsize, fin) != sch.schCsize) {
- fprintf(stderr,"truncated SCH body\n");
- return 7;
- }
- if(sch.schUsizep15 < 15) {
- fprintf(stderr,"fatal: schUsizep15 < 15!\n");
- return 8;
- }
- if(sch.comp) {
- unsigned int schUsize = sch.schUsizep15 - 15;
- unsigned char *schubuf = emalloc(schUsize, 9);
- int ret = mem_inflate(schbuf, sch.schCsize, schubuf, schUsize, 10);
- if(ret)
- return ret;
- free(schbuf);
- schbuf = schubuf;
- schlen = schUsize;
- } else
- schlen = sch.schCsize;
- if(!(fout=fopen(argv[2],"wb"))) {
- fprintf(stderr,"error opening %s for writing\n");
- return 12;
- }
- fwrite(schbuf, 1, schlen, fout);
- for(page=0;page<sch.numPages;page++) {
- int rlen = fread(&scp, 1, sizeof(scp), fin);
- if(rlen) {
- if(rlen != sizeof(scp) || memcmp(scp.sig, "SCP", 3)) {
- fprintf(stderr,"invalid SCP header\n");
- return 13;
- }
- if(scp.scpCsize > schlen) {
- schbuf = erealloc(schbuf, scp.scpCsize, 14);
- schlen = scp.scpCsize;
- }
- if(fread(schbuf, 1, scp.scpCsize, fin) != scp.scpCsize) {
- fprintf(stderr,"error reading page %d\n", scp.pageNum);
- return 15;
- }
- if(scp.scpUsizep18 < 18) {
- fprintf(stderr,"fatal: scpUsizep18 < 18!\n");
- return 16;
- }
- if(scp.comp) {
- unsigned int scpUsize = scp.scpUsizep18 - 18;
- char *scpubuf = emalloc(scpUsize, 17);
- int ret = mem_inflate(schbuf, scp.scpCsize, scpubuf, scpUsize, 18);
- if(ret)
- return ret;
- free(schbuf);
- schbuf = scpubuf;
- schlen = scpUsize;
- } else
- schlen = scp.scpCsize;
- printf("%d [%d bytes] ", scp.pageNum, schlen);
- fwrite(schbuf, 1, schlen, fout);
- fwrite("\x00\x40\x00\x02\x07", 1, 5, fout);
- page++;
- fwrite(&page, 1, 2, fout);
- page--;
- } else {
- fprintf(stderr,"warning: premature EOF, pages may be missing\n");
- break;
- }
- }
- fwrite("\x00", 1, 2, fout); /* End */
- flen = ftell(fout);
- fseek(fout, 4, SEEK_SET);
- fwrite(&flen, 1, 4, fout);
- fseek(fout, 19, SEEK_SET);
- fwrite(&page, 1, 2, fout);
- fclose(fout);
- fclose(fin);
- printf("\nDone\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement