

/***********************************************************
* Hilfsprogramm zum leichteren Programmieren unter Aztec-C *
*           1986-1987  by  Stefan Diestelmann              *
***********************************************************/


#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>

struct Library *IntuitionBase;
struct Library *GfxBase;

FILE *fp, *fopen();

static RAMDISK=1;                /* Zeiger ob auf RamDisk gearbeitet wird,
                                    Grundeinstellung: Ja. */

/* Aktueller Zeichensatz fuer Command ist Topaz 80 */

 struct TextAttr MyFont={
  (UBYTE *)"topaz.font",
  TOPAZ_EIGHTY,
  FS_NORMAL,
  FPF_ROMFONT
 };

#include "CommandGadgets.h"

/* CommandWindow Definitionen */

 struct NewWindow NewWindow = {
  0, 0, 409, 100, 0, 1,
  CLOSEWINDOW | GADGETUP,
  WINDOWCLOSE | SIMPLE_REFRESH | ACTIVATE | WINDOWDRAG | WINDOWDEPTH | NOCAREREFRESH,
  &LinkOptGadget,
  0,
  (UBYTE *)"Aztec-C  1986/1987 Stefan Diestelmann", 0, 0,
  0,0,0,0,
  WBENCHSCREEN
 };


main()
{
 struct Window *Window;
 struct IntuiMessage *Message;
 ULONG class;
 APTR address;

   if ((IntuitionBase=OpenLibrary("intuition.library", 33L)) == NULL) goto EXITING;
   if ((GfxBase=OpenLibrary("graphics.library", 33L)) == NULL) goto EXITING;
   if ((Window=OpenWindow(&NewWindow)) == NULL) goto EXITING;

   AlleGadgets(OffGadget, Window);

   ActivateGadget(&MainfileGadget, Window, NULL);
   FOREVER {
      Wait(1L<<Window->UserPort->mp_SigBit);
      while (Message=(struct IntuiMessage *)GetMsg(Window->UserPort)) {
         class=Message->Class;
         address=Message->IAddress;
         ReplyMsg(Message);
         switch(class) {
            case GADGETUP:
               GadgetMessage(address,Window);
               break;
            case CLOSEWINDOW:
               while (Message=(struct IntuiMessage *)GetMsg(Window->UserPort)) ReplyMsg(Message);
               goto EXITING;
         } /* switch */
      } /* while */
   } /* FOREVER */

EXITING:
   if (Window) CloseWindow(Window);
   if (GfxBase) CloseLibrary(GfxBase);
   if (IntuitionBase) CloseLibrary(IntuitionBase);
} /* main */


static UBYTE executestr[MAXSTRSIZE];

 GadgetMessage(address,w)
  APTR address;
  struct Window *w;

 {
  /* Wenn auf der RamDisk Compiliert werden soll kann man das mit dem
     RamDiskGadget einstellen. Die Variable RAMDISK dient dabei
     als Toggle und wird in Assemble, Compile und Link verwendet */

    if (address == (APTR)&RamDiskGadget) RAMDISK ? (RAMDISK=0) : (RAMDISK=1);

  /* Wenn der Workfilename eingetipppt wird und der Mainfilename noch nicht
     definiert ist, erhaelt dieser den Wert von Workfilename, genauso ist es
     umgekehrt. */

    if ((address == (APTR)&MainfileGadget) && (MainfileBuffer[0])) {
       strcpy(&WorkfileBuffer,&MainfileBuffer);
       strcat(WorkfileBuffer,".c");
       RefreshGadgets(&WorkfileGadget,w,NULL);
       AlleGadgets(OnGadget, w);
    }

  /* Save: speichert die Options auf Diskette nach s:Command.opt ab */

    if (address == (APTR)&SaveGadget) {
       fp=fopen("s:Command.opt","w");
       if (fp != NULL) {
          fwrite(CompOptBuffer,MAXSTRSIZE,1,fp);
          fwrite(LinkOptBuffer,MAXSTRSIZE,1,fp);
          fwrite(AssOptBuffer,MAXSTRSIZE,1,fp);
          fclose(fp);
       }
    }

  /* Load: Laedt die Options von Diskette */

    if (address == (APTR)&LoadGadget) {
       fp=fopen("s:Command.opt","r");
       if (fp != NULL) {
          fread(CompOptBuffer,MAXSTRSIZE,1,fp);
          fread(LinkOptBuffer,MAXSTRSIZE,1,fp);
          fread(AssOptBuffer,MAXSTRSIZE,1,fp);
          fclose(fp);
          RefreshGadgets(&LinkOptGadget,w,NULL);
          RefreshGadgets(&AssOptGadget,w,NULL);
          RefreshGadgets(&CompOptGadget,w,NULL);
       }
    }
   
  /* Edit: Workfilename und dann ein .c Kuerzel. */

    if (address == (APTR)&EditGadget) {
       AlleGadgets(OffGadget, w);
       executestr[0]='\0';
       strcat(executestr,"Ed ");           /* Ed ist der Name des verwendeten TextEditors */
       strcat(executestr,WorkfileBuffer);
       Execute(executestr,0L,0L);
       AlleGadgets(OnGadget, w);
    }

  /* Execute: Laesst das Programm <MainfileName> zum Ausprobieren laufen. */

    if (address == (APTR)&ExecuteGadget) {
       AlleGadgets(OffGadget, w);
       Execute(MainfileBuffer,0L,0L);
       AlleGadgets(OnGadget, w);
    }

  /* Running: Macht alle Schritte um ein lauffaehiges Programm zu erhalten */

    if (address == (APTR)&RunningGadget) {
       AlleGadgets(OffGadget, w);
       Compile();
       Assemble();
       Link();
       AlleGadgets(OnGadget, w);
    }

  /* Compile: Compiliert das Programm. <MainfileName> */

    if (address == (APTR)&CompileGadget) {
       AlleGadgets(OffGadget, w);
       Compile();
       AlleGadgets(OnGadget, w);
    }

  /* Assemble: Assembliert das Programm. <MainfileName> */

    if (address == (APTR)&AssembleGadget) {
       AlleGadgets(OffGadget, w);
       Assemble();
       AlleGadgets(OnGadget, w);
    }

  /* Link: Linked das Programm. <MainfileName> */

    if (address == (APTR)&LinkGadget) {
       AlleGadgets(OffGadget, w);
       Link();
       AlleGadgets(OnGadget, w);
    }
 }

 Compile()
  {
   if (RAMDISK) CompBefehl("cc "," -O RAM:cprtemp.asm ",CompOptBuffer);
           else CompBefehl("cc "," ",CompOptBuffer); 
  }

 Assemble()
  {
   if (RAMDISK) {
      Execute("as RAM:cprtemp.asm",0L,0L);
      Execute("delete RAM:cprtemp.asm",0L,0L);
   }
   else CompBefehl("as "," ",AssOptBuffer);
  }

 Link()
  {
   if (RAMDISK) {
      CompBefehl("ln -O "," RAM:cprtemp.o ",LinkOptBuffer);
      Execute("delete RAM:cprtemp.o",0L,0L);
   }
   else CompBefehl("ln ",".o ",LinkOptBuffer);
  }

   
 CompBefehl(str1, str2, str3)
  UBYTE *str1[], *str2[], *str3[];
  {
     executestr[0]='\0';
     strcat(executestr,str1);
     strcat(executestr,MainfileBuffer);
     strcat(executestr,str2);
     strcat(executestr,str3);
     Execute(executestr,0L,0L);
  }

 /* Alle Gadgets an oder ausschalten */

 AlleGadgets(funcp, w)
  void (*funcp)();
  struct Window *w;
 
 {
    (*funcp)(&RunningGadget, w, NULL);
    (*funcp)(&CompileGadget, w, NULL);
    (*funcp)(&AssembleGadget, w, NULL);
    (*funcp)(&LinkGadget, w, NULL);
    (*funcp)(&EditGadget, w, NULL);
    (*funcp)(&ExecuteGadget, w, NULL);
 }

