Advertisement
Guest User

scb2swf

a guest
Sep 23rd, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include "zlib.h"
  3.  
  4. /* usage: scb2swf infile.scb outfile.swf */
  5.  
  6. #pragma pack(1)
  7.  
  8. void *emalloc(int size, int ret) {
  9. void *p = malloc(size);
  10. if(p) return p;
  11. fprintf(stderr,"fatal: memory allocation error (%u bytes)\n", size);
  12. exit(ret);
  13. }
  14.  
  15. void *erealloc(void *p, int size, int ret) {
  16. void *q = realloc(p, size);
  17. if(q) return q;
  18. fprintf(stderr,"fatal: memory reallocation error (%08x -> %u bytes)\n", p, size);
  19. exit(ret);
  20. }
  21.  
  22. int mem_inflate(void *inbuf, unsigned int insize, void *outbuf, unsigned int outsize, int ret) {
  23. z_stream zs;
  24. zs.next_in = inbuf;
  25. zs.avail_in = insize;
  26. zs.total_in = 0;
  27. zs.zalloc = 0;
  28. zs.zfree = 0;
  29. zs.opaque = 0;
  30. zs.next_out = outbuf;
  31. zs.avail_out = outsize;
  32. zs.total_out = 0;
  33. if(inflateInit(&zs)) {
  34. fprintf(stderr,"error initialising zlib for decompression\n");
  35. return ret;
  36. }
  37. if(inflate(&zs, Z_FINISH)!=Z_STREAM_END) {
  38. fprintf(stderr,"error decompressing\n");
  39. return ret+1;
  40. }
  41. inflateEnd(&zs);
  42. return 0;
  43. }
  44.  
  45.  
  46. int main(int argc, char **argv) {
  47. FILE *fin, *fout;
  48. struct SCHh {
  49. char sig[3];
  50. unsigned int schUsizep15;
  51. int docId;
  52. char docType;
  53. short numPages;
  54. short sizeX;
  55. short sizeY;
  56. short pageOffs;
  57. char unk1;
  58. char comp;
  59. unsigned int schCsize;
  60. } sch;
  61. struct SCPh {
  62. char sig[3]; /* "SCP" */
  63. short pageNum;
  64. unsigned int scpUsizep18;
  65. char unk2;
  66. short unk3;
  67. char unk4;
  68. char comp;
  69. unsigned int scpCsize;
  70. } scp;
  71. z_stream zs;
  72. unsigned char *schbuf;
  73. unsigned int schlen;
  74. int page;
  75. int flen;
  76. char sig[3];
  77. if(argc < 3) {
  78. fprintf(stderr,"usage: scb2swf infile.scb outfile.swf\n");
  79. return 1;
  80. }
  81. if(!(fin=fopen(argv[1],"rb"))) {
  82. fprintf(stderr,"error opening %s\n", argv[1]);
  83. return 2;
  84. }
  85. if(fread(&sig, 1, 3, fin) != 3) {
  86. fprintf(stderr,"infile insufficient length\n");
  87. return 3;
  88. }
  89. if(memcmp(sig, "SCB", 3)) {
  90. fprintf(stderr,"incorrect SCB signature\n");
  91. return 4;
  92. }
  93. if(fgetc(fin) != 1)
  94. fprintf(stderr,"warning: version is not 1\n");
  95. fseek(fin, 4, SEEK_CUR); /* ignored bytes */
  96. /* process SCH header */
  97. if(fread(&sch, 1, sizeof(sch), fin) != sizeof(sch)
  98. || memcmp(sch.sig, "SCH", 3)) {
  99. fprintf(stderr,"invalid SCH header\n");
  100. return 5;
  101. }
  102. schbuf = emalloc(sch.schCsize, 6);
  103. if(fread(schbuf, 1, sch.schCsize, fin) != sch.schCsize) {
  104. fprintf(stderr,"truncated SCH body\n");
  105. return 7;
  106. }
  107. if(sch.schUsizep15 < 15) {
  108. fprintf(stderr,"fatal: schUsizep15 < 15!\n");
  109. return 8;
  110. }
  111. if(sch.comp) {
  112. unsigned int schUsize = sch.schUsizep15 - 15;
  113. unsigned char *schubuf = emalloc(schUsize, 9);
  114. int ret = mem_inflate(schbuf, sch.schCsize, schubuf, schUsize, 10);
  115. if(ret)
  116. return ret;
  117. free(schbuf);
  118. schbuf = schubuf;
  119. schlen = schUsize;
  120. } else
  121. schlen = sch.schCsize;
  122. if(!(fout=fopen(argv[2],"wb"))) {
  123. fprintf(stderr,"error opening %s for writing\n");
  124. return 12;
  125. }
  126. fwrite(schbuf, 1, schlen, fout);
  127. for(page=0;page<sch.numPages;page++) {
  128. int rlen = fread(&scp, 1, sizeof(scp), fin);
  129. if(rlen) {
  130. if(rlen != sizeof(scp) || memcmp(scp.sig, "SCP", 3)) {
  131. fprintf(stderr,"invalid SCP header\n");
  132. return 13;
  133. }
  134. if(scp.scpCsize > schlen) {
  135. schbuf = erealloc(schbuf, scp.scpCsize, 14);
  136. schlen = scp.scpCsize;
  137. }
  138. if(fread(schbuf, 1, scp.scpCsize, fin) != scp.scpCsize) {
  139. fprintf(stderr,"error reading page %d\n", scp.pageNum);
  140. return 15;
  141. }
  142. if(scp.scpUsizep18 < 18) {
  143. fprintf(stderr,"fatal: scpUsizep18 < 18!\n");
  144. return 16;
  145. }
  146. if(scp.comp) {
  147. unsigned int scpUsize = scp.scpUsizep18 - 18;
  148. char *scpubuf = emalloc(scpUsize, 17);
  149. int ret = mem_inflate(schbuf, scp.scpCsize, scpubuf, scpUsize, 18);
  150. if(ret)
  151. return ret;
  152. free(schbuf);
  153. schbuf = scpubuf;
  154. schlen = scpUsize;
  155. } else
  156. schlen = scp.scpCsize;
  157. printf("%d [%d bytes] ", scp.pageNum, schlen);
  158. fwrite(schbuf, 1, schlen, fout);
  159. fwrite("\x00\x40\x00\x02\x07", 1, 5, fout);
  160. page++;
  161. fwrite(&page, 1, 2, fout);
  162. page--;
  163. } else {
  164. fprintf(stderr,"warning: premature EOF, pages may be missing\n");
  165. break;
  166. }
  167. }
  168. fwrite("\x00", 1, 2, fout); /* End */
  169. flen = ftell(fout);
  170. fseek(fout, 4, SEEK_SET);
  171. fwrite(&flen, 1, 4, fout);
  172. fseek(fout, 19, SEEK_SET);
  173. fwrite(&page, 1, 2, fout);
  174. fclose(fout);
  175. fclose(fin);
  176. printf("\nDone\n");
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement