/**********************************************************************
 *                 Fasm.c   von Sven Ober November 88                 *
 *                 Ein Utility für den Aztec C Compiler               *
 **********************************************************************/


#include <exec/types.h>
#include <exec/memory.h>
#include <functions.h>
#include <libraries/dos.h>

long filegroesse;
char *namzei;
char *dread();
long checksize(); 
void checkfile();
char mathb[]={"move.l  _MathBase,a6"};
char js[]={"        jsr     "};
char mul[]={"-78(a6)"};   /* offsets der FFP Routinen */
char add[]={"-66(a6)"};
char ab[]={"-54(a6)"};
char cmp[]={"-42(a6)"}
;
char div[]={"-84(a6)"};
char fix[]={"-30(a6)"};
char flt[]={"-36(a6)"};
char neg[]={"-60(a6)"};
char sub[]={"-72(a6)"};
char tst[]={"-48(a6)"};


main(argc,argv)
int argc;
char *argv[];
 {
  if(argc!=2)             /* Filenamen angegeben ?         */
   {
    Write(Output(),"Usage Fasm <file>\n",18L);  /*Ausgabe auf das CLI- */
    cleanup();					/*Fenster ohne printf()*/
   }
  namzei=dread(argv[1]);  /* File öffnen und in den Speicher laden*/
  checkfile(argv[1]);
 }

char *dread(file)
  char *file;
   {
     struct FileHandle *fh;
     char *bp;
     long len;
     
     bp = (char *)AllocMem((LONG)(filegroesse=checksize(file)),MEMF_CLEAR);
     if((fh=(struct FileHandle *)Open(file,MODE_OLDFILE))==0L)
      {
        Write(Output(),"File nicht gefunden\n",21L);
        cleanup();
      }
     len = Read(fh,bp,filegroesse);
     Close(fh);
     return(bp);
   }

void checkfile(file)
 char *file;
 {
  register char *unters;  /* unters ist der zeiger auf das */
  register char *rep;     /* zu untersuchende File  */
  register long b=0;
  register long f,err;

  struct FileHandle *fh;

  char ret=10;            /* 10 ist der code für return */

   unters=namzei;
   f=0;
   if(!(fh=Open(file,MODE_NEWFILE) ))
    cleanup();

/* Die folgende Schleife durchsucht das File nach z.B. Fmul# es wird dabei
   aber zunächst nur auf F und # geprüft */
   do
    { 
     if((*unters == 'F') && (unters[4]== '#'))
      {
 unters++;
 switch(unters[0])
  {
   case 'm':                    /* Fmul */
    {rep=mul;break;}
   case 'd':                    /* Fdiv */
    {rep=div;break;}
   case 's':                    /* Fsub */
    {rep=sub;break;}
   case 'c':                    /* Fcmp */
    {rep=cmp;break;}
   case 't':                    /* Ftst */
    {rep=tst;break;}
   case 'n':                    /* Fneg */
    {rep=neg;break;}
   case 'a':                    /* Fadd oder Fabs */
    {
     switch(unters[1])
      {
       case 'd':                /* Fadd */
        {rep=add;break;}
       case 'b':                /* Fabs */
        {rep=ab;break;}
             }
     break;
    }
   case 'f':
    {
     switch(*(unters+1))
      {
       case 'i':                /* Ffix */
        {rep=fix;break;}
       case 'l':                /* Fflt */
        {rep=flt;break;}
      }
     break;
    }
  }
 err=Write(fh,&namzei[b],(long)(f-b-5L));
 err=Write(fh,mathb,20L);
 err=Write(fh,&ret,1L);
 err=Write(fh,js,16L);
 err=Write(fh,rep,7L);
 f++;
 b=f+4;
      }
     else
      {
 unters++;f++;
      }
    }while(*unters);
  err=Write(fh,&namzei[b],(long)(filegroesse-b));
  Close(fh);
 }

cleanup()
 {
  if(namzei) FreeMem(namzei,filegroesse);
  Exit();
 }

LONG checksize(name)   /* Bestimmt die grösse eines Files   */
 char *name;           /* die Grösse wird in err zurückgegeben */
{
 register long err;

 struct FileHandle *fh;
 if((fh=(struct FileHandle *)Open(name,MODE_OLDFILE))==0L)
      {
        Write(Output(),"File nicht gefunden\n",21L);
        cleanup();
      }
 err=Seek(fh,0L,OFFSET_END);
 err=Seek(fh,0L,OFFSET_END);
 Close(fh);
 return(err);
}
