home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / strip3sr / mwc
Encoding:
Text File  |  1990-03-22  |  3.4 KB  |  154 lines

  1. >From um-math!mailrus!csd4.milw.wisc.edu!nic.MR.NET!umn-d-ub!rutgers!att!lzaz!hcj Sun Mar  5 03:08:15 EST 1989
  2. Article 4854 of comp.sys.atari.st:
  3. Path: um-math!mailrus!csd4.milw.wisc.edu!nic.MR.NET!umn-d-ub!rutgers!att!lzaz!hcj
  4. >From: hcj@lzaz.ATT.COM (HC Johnson)
  5. Newsgroups: comp.sys.atari.st
  6. Subject: strip3.c, for converting mwc 3 to mwc 2 format
  7. Keywords: distomwc tool
  8. Message-ID: <436@lzaz.ATT.COM>
  9. Date: 27 Feb 89 15:38:23 GMT
  10. Organization: AT&T ISL Lincroft NJ USA
  11. Lines: 138
  12.  
  13.  
  14. This tool makes a mwc 3 executable look like a DRI or mwc 2 version.
  15. Distomwc cannot disassembel a mwc 3 format.
  16. --This compiles on mwc.
  17.  
  18. Howard C. Johnson
  19. ATT Bell Labs
  20. att!lzaz!hcj
  21. hcj@lzaz.att.com
  22.  
  23. ==============================cut here========================
  24. /*
  25.  * use to strip mwc 3.0 exec files to allow disassembly
  26.  */
  27. #include <stdio.h>
  28. #include <gemout.h>
  29. #include <stat.h>
  30.  
  31. main(argc,argv)
  32. char **argv;
  33. {
  34.     long lseek();
  35.     struct stat xstat;
  36.     struct gemohdr header;
  37.     char *name_in,*name_out;
  38.     long filelen;
  39.     long address;
  40.     FILE *fin,*fout;
  41.     int ret;
  42.     long tmp;
  43.     long offset;
  44.  
  45.     if(argc != 3) {
  46.         fprintf(stderr,"Usage: %s  file_in file_out\nStrip symbol and debugging info from mwc 3.0\n",argv[0]);
  47.         exit(1);
  48.     }
  49.     name_in = argv[1];
  50.     name_out = argv[2];
  51.     if(stat(name_in,&xstat) < 0) {
  52.         perror("");
  53.         fprintf(stderr,"Cannot open %s\n",name_in);
  54.         exit(1);
  55.     }
  56.     filelen = xstat.st_size;
  57.     if((fin = fopen(name_in,"rb")) == 0) {
  58.         perror("");
  59.         fprintf(stderr,"Cannot open %s\n",name_in);
  60.         exit(1);
  61.     }
  62.     ret = fread(&header,sizeof(header),1,fin);
  63.     if(ret == 0) {
  64.         printf("Error reading header\n");
  65.         goto error;
  66.     }
  67.     if((fout = fopen(name_out,"wb")) == 0) {
  68.         perror("");
  69.         fprintf(stderr,"Cannot open %s\n",name_out);
  70.         exit(1);
  71.     }
  72.     offset =header.g_ssize[GO_TEXT] +
  73.         header.g_ssize[GO_DATA] +
  74.         header.g_ssize[GO_SYM] + sizeof(header);
  75.     tmp =      header.g_ssize[GO_SYM] > 0x30L? 0x30L:header.g_ssize[GO_SYM];
  76.  
  77.     tmp =      header.g_ssize[GO_SYM] ;
  78.     
  79.     fprintf(stderr,"File Sizes: Text = %X, Data = %X Sym = %X New Sym = %X\n",
  80.          header.g_ssize[GO_TEXT],
  81.          header.g_ssize[GO_DATA],
  82.          header.g_ssize[GO_SYM],
  83.         header.g_ssize[GO_SYM]-tmp);
  84.     if(filelen - offset < 0) {
  85.         fprintf(stderr,"size error: filelen = %D, size = %D\n",filelen,offset);
  86.         exit(1);
  87.     }
  88.     header.g_ssize[GO_SYM] -= tmp;
  89. /*
  90.     if(header.g_ssize[GO_SYM]) {
  91.         header.g_relflag = 1;
  92.     }
  93. */
  94.     ret = fwrite(&header,sizeof(header),1,fout);
  95.     if(ret == 0) {
  96.         printf("Error writing header\n");
  97.         goto error;
  98.     }
  99.     copy(fin,fout,header.g_ssize[GO_TEXT]);
  100.     copy(fin,fout,header.g_ssize[GO_DATA]);
  101.     if(tmp)
  102.         fseek(fin,(long)tmp,1); /* skip over 0x30 bytes */
  103.     copy(fin,fout,header.g_ssize[GO_SYM]); /* copy balance of symbols */
  104.     address = filelen - offset;  /* net relo size */
  105.     copy(fin,fout,address);
  106.     fclose(fin);
  107.     fclose(fout);
  108.     exit(0);
  109.  
  110.  
  111. error:
  112.     perror("");
  113.     printf("Error in File %s\n",name_in);
  114.     fprintf(stderr,"Error in File %s\n",name_in);
  115.         exit(1);
  116. }
  117. copy(fin,fout,lsize)
  118. FILE *fin,*fout;
  119. long lsize;
  120. {
  121.     char *space;
  122.     short size;
  123.     int ret;
  124.  
  125. fprintf(stderr,"Copy %D\n",lsize);
  126.     if(!lsize)
  127.         return;
  128.     space = malloc(lsize>0xfffeL?0xfffe:(short)lsize);
  129.     if(!space) {
  130.         printf("Cannot allocate %D bytes\n",size);
  131.         exit(1);
  132.     }
  133.     while(lsize) {
  134.         size = lsize>0xfffeL?0xfffe:(short)lsize;
  135.         lsize -= size;
  136.         ret = fread(space,size,1,fin);
  137.         if(ret == 0) {
  138.             perror("");
  139.             printf("Error reading input file\n");
  140.             exit(1);
  141.         }
  142.         ret = fwrite(space,size,1,fout);
  143.         if(ret == 0) {
  144.             perror("");
  145.             printf("Error writing output file\n");
  146.             exit(1);
  147.         }
  148.     }
  149.     free(space);
  150. }
  151.  
  152.  
  153.  
  154.