home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / dev / mystrip-1.0.lha / MYSTRIP / MYSTRIP.C < prev    next >
C/C++ Source or Header  |  1994-03-01  |  6KB  |  308 lines

  1. /************************************************/
  2. /*** Strips Symbol_Hunks from AMIGALoadFiles  ***/
  3. /*** Quick-and-dirty Version 1.0 010394 ST    ***/
  4. /*** This may be copied, distributed, etc.    ***/
  5. /*** You may alter this file anyway you want  ***/
  6. /************************************************/
  7. #include <dos/doshunks.h>
  8. #include <stdio.h>
  9.  
  10.  
  11. #define SL sizeof(long int)
  12.  
  13. int StripAHunk(FILE *fpin,FILE *fpout); /* Strips a Hunk, to be read from fp, returns*/
  14.                   /* #of symbols stripped */
  15.  
  16. int main(argc,argv)
  17. int argc;
  18. char **argv;
  19. {
  20. FILE *fpin,*fpout;
  21. long int s[10];
  22. int n,i,num;
  23.  
  24. if ((argc!=2)&&(argc!=3))
  25.     {
  26.     fprintf(stderr,"Usage: %s filein [fileout]\n",argv[0]);
  27.     exit(1);
  28.     }
  29.  
  30. if ((fpin=fopen(argv[1],"r"))==NULL)
  31.     {
  32.     fprintf(stderr, "Can't open %s\n",argv[1]);
  33.     exit(1);
  34.     }
  35.  
  36. if (argc==2) /* Use stdout as output */
  37.     fpout=stdout;
  38. else
  39.     {
  40.     if ((fpout=fopen(argv[2],"w"))==NULL)
  41.         {
  42.         fclose(fpin);
  43.         fprintf(stderr,"Can't open %s\n",argv[2]);
  44.         exit(1);
  45.         }
  46.     }
  47.  
  48.  
  49. if (fread(s,SL,1,fpin)!=1)
  50.     {
  51. inerr:    fprintf(stderr,"fread() error\n");
  52.     fclose(fpin);
  53.     fclose(fpout);
  54.     exit(1);
  55.     }
  56.  
  57. if (s[0]!=HUNK_HEADER) /* OOps, not AMIGA Exec */
  58.     {
  59.     fprintf(stderr,"%s doesn't seem to be AMIGA executable...\n",argv[1]);
  60.     exit(1);
  61.     }
  62. if (fwrite(s,SL,1,fpout)!=1)
  63.     {
  64. outerr:    fprintf(stderr,"fwrite() failed\n");
  65.     fclose(fpin);
  66.     fclose(fpout);
  67.     exit(1);
  68.     }
  69.  
  70. /* Read over header */
  71. do
  72.     {
  73.     if (fread(s,SL,1,fpin)!=1)
  74.         goto inerr;
  75.     if (fwrite(s,SL,1,fpout)!=1)
  76.         goto outerr;
  77.     }while (s[0]!=0);
  78.  
  79. /* Copy lengths */
  80. if (fread(s,SL,3,fpin)!=3)
  81.     goto inerr;
  82. if (fwrite(s,SL,3,fpout)!=3)
  83.     goto outerr;
  84.  
  85. n=num=s[2]-s[1]+1;
  86.  
  87. /* Copy lengths */
  88. for (i=0;i<n;i++)
  89.     {
  90.     if (fread(s,SL,1,fpin)!=1)
  91.         goto inerr;
  92.     if (fwrite(s,SL,1,fpout)!=1)
  93.         goto outerr;
  94.     }
  95.  
  96. n=0;
  97. for (i=0;i<num;i++)
  98.     n+=StripAHunk(fpin,fpout);
  99.  
  100. if (argc==3)
  101.     fclose(fpout);
  102. fclose(fpin);
  103. if (argc==3)
  104.     printf("Stripped %d symbols\n",n);
  105.  
  106. }/* Of main */
  107.  
  108. int StripAHunk(fin,fout)
  109. FILE *fin;
  110. FILE *fout;
  111. {
  112. int n,i,s[10],num,num2;
  113.  
  114. if (fread(s,SL,1,fin)!=1)
  115.     {
  116. errin: fprintf(stderr,"fread() failed\n");
  117.     exit(1);
  118.     }
  119.  
  120. switch(s[0])
  121.     {
  122.     case HUNK_NAME: /* Skip them */
  123.     if (fread(s,SL,1,fin)!=1)
  124.         goto errin;
  125.     for (n=s[0],i=0;i<n;i++)
  126.         {
  127.         if (fread(s,SL,1,fin)!=1)
  128.             goto errin;
  129.         }
  130.     return(StripAHunk(fin,fout));
  131.     break;
  132.  
  133.     case HUNK_CODE: /* Code HUNKS */
  134.     case HUNK_DATA: /* Data HUNKS */
  135.     if (fwrite(s,SL,1,fout)!=1)
  136.         goto errout;
  137.     if (fread(s,SL,1,fin)!=1)
  138.         goto errin;
  139.     if (fwrite(s,SL,1,fout)!=1)
  140.         {
  141. errout:    fprintf(stderr,"fwrite() failed\n");
  142.         exit(1);
  143.         }
  144.  
  145.     /* Copy that hunk */
  146.     for (n=s[0],i=0;i<n;i++)
  147.         {
  148.         if (fread(s,SL,1,fin)!=1)
  149.             goto errin;
  150.         if (fwrite(s,SL,1,fout)!=1)
  151.             goto errout;
  152.         }
  153.  
  154.     break;
  155.  
  156.     case HUNK_BSS: /* BSS HUNKS */
  157.         if (fwrite(s,SL,1,fout)!=1)
  158.             goto errout;
  159.         if (fread(s,SL,1,fin)!=1)
  160.             goto errin;
  161.         
  162.         if (fwrite(s,SL,1,fout)!=1)
  163.             goto errout;
  164.         break;
  165.     case HUNK_DEBUG: /* Strip */
  166.            if (fread(s,SL,1,fin)!=1)
  167.                goto errin;
  168.             for (n=s[0],i=0;i<n;i++)
  169.                {
  170.                 if (fread(s,SL,1,fin)!=1)
  171.                      goto errin;
  172.                 }
  173.         
  174.         break;
  175.                         
  176.  
  177.     default:
  178.         fprintf(stderr,"Unknown hunk type %d\n",s[0]);
  179.         exit(1);
  180.         break;
  181.     }/* Of switch */
  182.  
  183.  
  184.     /* So, now there may be HUNK_END, HUNK_RELOC*,HUNK_SYMBOL,HUNK_DEBUG*/
  185. num=0; /* # symbols stripped */
  186. if (fread(s,SL,1,fin)!=1)
  187.     goto errin;
  188.  
  189. while (1)
  190.     {
  191.     switch(s[0])
  192.     {
  193.     case HUNK_END: /* Done */
  194.         if (fwrite(s,SL,1,fout)!=1)
  195.               goto errout;
  196.         return num;
  197.         break;
  198.  
  199.     case HUNK_DEBUG: /* Strip */
  200.         if (fread(s,SL,1,fin)!=1)
  201.             goto errin;
  202.         for (n=s[0];i<n;i++)
  203.             {
  204.             if (fread(s,SL,1,fin)!=1)
  205.                   goto errin;
  206.             }
  207.         if (fread(s,SL,1,fin)!=1)
  208.           goto errin;
  209.         continue;
  210.         break;
  211.  
  212.     case HUNK_SYMBOL: /* STRIP */
  213.         while (1) /* read symnames and value */
  214.         {
  215.         if (fread(s,SL,1,fin)!=1)
  216.         goto errin;
  217.         n=s[0]&0xffffff; /* mask top byte */
  218.         if (n==0)
  219.           break;
  220.         num++; /* One symbol stripped */
  221.         for (i=0;i<n;i++)
  222.            if (fread(s,SL,1,fin)!=1)
  223.             goto errin;
  224.         if (fread(s,SL,1,fin)!=1) /* Value */
  225.               goto errin;
  226.         }/* Of while */
  227.         if (fread(s,SL,1,fin)!=1)
  228.               goto errin;
  229.             continue;
  230.         break;
  231.  
  232.     case HUNK_RELOC32: /* rel32, copy it */
  233.         if (fwrite(s,SL,1,fout)!=1)
  234.             goto errout;
  235.         while (1)
  236.         {
  237.         if (fread(s,SL,1,fin)!=1)
  238.          goto errin;
  239.         if (fwrite(s,SL,1,fout)!=1)
  240.             goto errout;
  241.         n=s[0];
  242.         if (n==0) /* End reached */
  243.             {
  244.             break;
  245.             }
  246.  
  247.         if (fread(s,SL,1,fin)!=1) /* Hunk num */
  248.           goto errin;
  249.         if (fwrite(s,SL,1,fout)!=1)
  250.           goto errout;
  251.  
  252.         for (i=0;i<n;i++)
  253.             {
  254.             if (fread(s,SL,1,fin)!=1)
  255.                  goto errin;
  256.                 if (fwrite(s,SL,1,fout)!=1)
  257.               goto errout;            
  258.             }
  259.         }/* of while */
  260.         if (fread(s,SL,1,fin)!=1)
  261.               goto errin;
  262.             continue;
  263.         break;
  264.  
  265.         case HUNK_RELOC32SHORT: /* Short one */
  266.         num2=0; /* Length */
  267.         while (1)
  268.             {
  269.             if (fread(s,SL,1,fin)!=1)
  270.              goto errin;
  271.             if (fwrite(s,SL,1,fout)!=1)
  272.         goto errout;
  273.             n=s[0];
  274.             if (n==0) /* End reached */
  275.                break;
  276.         if (fread(s,SL,1,fin)!=1) /* HUNK NUM*/
  277.                goto errin;
  278.               if (fwrite(s,SL,1,fout)!=1)
  279.             goto errout;
  280.  
  281.         num2+=n;
  282.             for (i=0;i<n;i++)
  283.                {
  284.                 if (fread(s,sizeof(short int),1,fin)!=1)
  285.                     goto errin;
  286.                    if (fwrite(s,sizeof(short int),1,fout)!=1)
  287.                   goto errout;            
  288.                 }
  289.             }/* of while */
  290.         if (num2&1==1) /* odd # of words , adjust */
  291.          {
  292.          if (fread(s,sizeof(short int),1,fin)!=1)
  293.             goto errin;
  294.           if (fwrite(s,sizeof(short int),1,fout)!=1)
  295.            goto errout;
  296.           }
  297.         if (fread(s,SL,1,fin)!=1)
  298.                goto errin;
  299.              continue;
  300.             break;
  301.         
  302.         default:
  303.             fprintf(stderr,"Unknown HUNK Type %d\n",s[0]);
  304.             exit(1);
  305.         }/* Of switch */
  306.     }/* Of while */
  307. }/* Of StripAHunk */
  308.