#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/rdargs.h>
#include <dos/var.h>

#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>

#define ARG_DESCRIPTOR  0
#define ARG_CFILE       1
#define ARG_PREFIX      2

LONG argarray[3];
UBYTE *argstr="DESCRIPTOR/A,CFILE/A,PREFIX/M";

BOOL myFGets(BPTR fh,UBYTE *buf,ULONG len)
{
   BOOL res;

   res=(BOOL)FGets(fh, buf, len);

   while(res && buf[0]==';')
      res=(BOOL)FGets(fh, buf, len);

   return(res);
}

UBYTE readbuf[2000];
UBYTE readbuf2[2000];

main()
{
   struct RDArgs *rdargs;
   BPTR *fhin,*fhout;
   ULONG stringnum,c,num,len;
   int n1,n2,n3,n4;
   BOOL match;
   UBYTE **patarray;
   
   if(!(rdargs=(struct RDArgs *)ReadArgs(argstr,argarray,NULL)))
   {
      PrintFault(IoErr(),NULL);
      exit(10);
   }

   patarray=NULL;
   if(argarray[ARG_PREFIX]) patarray=(UBYTE **)argarray[ARG_PREFIX];

   if(!(fhin=Open((UBYTE *)argarray[ARG_DESCRIPTOR],MODE_OLDFILE)))
   {
      PrintFault(IoErr(),argarray[ARG_DESCRIPTOR]);
      FreeArgs(rdargs);
      exit(0);
   }

   if(!(fhout=Open((UBYTE *)argarray[ARG_CFILE],MODE_NEWFILE)))
   {
      PrintFault(IoErr(),argarray[ARG_CFILE]);
      FreeArgs(rdargs);
      Close(fhin);
      exit(0);
   }

   /* Make the jbCatCompBlock */

   stringnum=0;

   FPrintf(fhout,"static const char jbCatCompBlock[] = \n{\n");

   while(myFGets(fhin,readbuf,2000))
   {
      /* Strip EOL */
      readbuf[strlen(readbuf)-1]=0;

      for(c=strlen(readbuf);c!=0;c--)
         if(readbuf[c]=='(') break;

      if(readbuf[c]=='(')
      {
         c--;

         while(readbuf[c]==' ')
            c--;

         readbuf[c+1]=0;
      }

      myFGets(fhin,readbuf2,2000);
      readbuf2[strlen(readbuf2)-1]=0;

      match=FALSE;

      if(!patarray)
      {
         match=TRUE;
      }
      else
      {
         for(c=0;patarray[c];c++)
            if(strnicmp(readbuf,patarray[c],strlen(patarray[c]))==0) match=TRUE;
      }

      if(match)
      {
         num=stringnum;

         n1=num%256;
         num/=256;
         n2=num%256;
         num/=256;
         n3=num%256;
         num/=256;
         n4=num;

         FPrintf(fhout,"\"\\x%02lx\\x%02lx\\x%02lx\\x%02lx\" ",
            n4,n3,n2,n1);

         num=strlen(readbuf2)+1;

         for(c=0;readbuf2[c];c++)
         {
            if(readbuf2[c]=='\\' && readbuf2[c+1]=='"') num--;
            if(readbuf2[c]=='\\' && readbuf2[c+1]=='n') num--;
            if(readbuf2[c]=='\\' && readbuf2[c+1]=='0') num--;
         }

         len=num;
         if(num%2) num++;

         n1=num%256;
         num/=256;
         n2=num;

         FPrintf(fhout,"\"\\x%02lx\\x%02lx\"\n",n2,n1);
         FPrintf(fhout,"%s_STR ",readbuf);

         if(len%2)
            FPrintf(fhout,"\"\\x00\\x00\"\n");

         else
            FPrintf(fhout,"\"\\x00\"\n");
      }

      stringnum++;
   }

   FPrintf(fhout,"\"\\xff\\xff\\xff\\xff\" \"\\x02\"\n\"\\x00\\x00\"\n};\n");

   FreeArgs(rdargs);
   Close(fhin);
   Close(fhout);

   exit(0);
}

