/***********************************************************
 *
 *  main.c
 *
 *  main()-Routine zum "Calc"
 *
 *  Peter Gober, 06-Nov-88
 *
 ***********************************************************/


#include <exec/types.h>
#include <intuition/intuition.h>
#include <functions.h>
#include "calc.h"


char infostr[] = "Calc V1.0 (C) 1988 Peter Gober";
                                        /* wird nicht verwendet */


struct Window *wind = 0L;
struct Remember *remkey = 0L;           /* RememberKey für Speicherverwaltung
                                           durch Intuition */

struct IntuitionBase *IntuitionBase = 0L;

main()
{
   int key;                             /* Code für gedrückte "Taste" */

   /*
    *  Alles mögliche öffnen ...
    */

   if (!(IntuitionBase = (struct IntuitionBase *)
      OpenLibrary("intuition.library", 0L)))
      cleanup();

   makegads();                          /* Gadgets herstellen */
   newwind.FirstGadget = lastgad;

   if (!(wind = OpenWindow(&newwind)))
      cleanup();

   DrawBorder(wind->RPort, &dispbord, (long) (SPCHOR-1), (long) DISPTOP);
                                        /* Umrandung für den Display */
   SetMenuStrip(wind, &menuanz);

   dispnum();                           /* Zahl 0 zeigen */

   for(;;)
   {
      key = waitforinp();
      process(key);
   }
}


/*
 *  cleanup()
 *  räumt auf und beendet den Spaß
 */

cleanup()
{
   if (wind && wind->MenuStrip)
      ClearMenuStrip(wind);
   if (wind) CloseWindow(wind);
   if (IntuitionBase) CloseLibrary(IntuitionBase);
   if (remkey) FreeRemember(remkey, TRUE);

   exit(0);
}


_abort()
{
   cleanup();
}


/*
 *  waitforinp()
 *  wartet auf Eingaben des Benutzers und gibt den "Keycode" zurück oder
 *  ruft cleanup() auf, falls das Fenster geschlossen wurde. Beobachtet die
 *  Menüeinstellungen.
 */

waitforinp()
{
   struct IntuiMessage *mes;           /* Zeiger auf Message von Intuition */

   ULONG mesclass;                     /* für Kopien einiger interessanter */
   USHORT mescode;                     /* Teile der Message */
   APTR mesaddr;

   register int flag = 0;              /* TRUE, wenn eine zu verarbeitende
                                          Taste gedrückt wurde */
   register int rc;

   do
   {
      WaitPort(wind->UserPort);
    
      /*
       *  Eine Intuition-Messages ist da, diese verarbeiten
       */

      mes = (struct IntuiMessage *) GetMsg(wind->UserPort);

      /*
       *  interessante Informationen der Message kopieren und sofort zurück-
       *  schicken
       */

      mesclass = mes->Class;
      mescode = mes->Code;
      mesaddr = mes->IAddress;
      ReplyMsg(mes);

      switch(mesclass)
      {
         case GADGETUP:
            /*
             *  Eine "Taste" ist gedrückt worden, ihren Code zurückgeben
             */
            rc = (int) ((struct Gadget *) mesaddr)->GadgetID;
            flag = 1;
            break;

         case CLOSEWINDOW:
            /*
             *  Der Benutzer liebt uns nicht mehr ...
             */
            cleanup();

         case MENUPICK:
            /*
             *  Der Benutzer hat mit den Menüs herumgespielt, Optionsvari-
             *  ablen ändern
             */
            while (mescode != MENUNULL)
            {
               switch(MENUNUM(mescode))
               {
                  case 0:
                     anz = ITEMNUM(mescode);
                     dispnum();         /* Anzeige auf neue Gegebenheiten
                                           einstellen */
                     break;

                  case 1:
                     stell = ITEMNUM(mescode) - 1;
                     dispnum();
                     break;

                  case 2:
                     zahlsys = ITEMNUM(mescode);
                     changekeys();      /* Tastenbelegungen ändern */
                     dispnum();
                     break;

                  case 3:
                     wink = ITEMNUM(mescode);
                     break;
               }
               mescode = ItemAddress(&menuanz, (long) mescode)->NextSelect;
                                        /* Mehrfachaktivierungen sind
                                           möglich */
            }
            break;

         case VANILLAKEY:
            /*
             *  Der Benutzer hat eine Taste der Tastatur gedrückt, diese
             *  umwandeln in ein Gadget-Keycode-Äquivalent
             */
            switch(mescode)
            {
               case  '(': rc = 22; flag = 1; break;
               case  ')': rc = 23; flag = 1; break;
               case '\b': rc = 24; flag = 1; break;
               case  'e':
               case  'E': if (zahlsys == SYSDEZ) { rc = 30; flag = 1; } break;
               case  'c':
               case  'C': rc = 60; flag = 1; break;
               case  '/': rc = 34; flag = 1; break;
               case  '*': rc = 44; flag = 1; break;
               case  '-': rc = 54; flag = 1; break;
               case  '+': rc = 64; flag = 1; break;
               case   13:
               case  '=': rc = 63; flag = 1; break;
               case  '0': rc = 61; flag = 1; break;
               case  '.': if (zahlsys == SYSDEZ) { rc = 62; flag = 1; } break;
               case  '1': rc = 51; flag = 1; break;
               case  '2': if (zahlsys < SYSHEX)
                             { rc = 52; flag = 1; }  break;
               case  '3': if (zahlsys < SYSHEX)
                             { rc = 53; flag = 1; }  break;
               case  '4': if (zahlsys < SYSHEX)
                             { rc = 41; flag = 1; }  break;
               case  '5': if (zahlsys < SYSHEX)
                             { rc = 42; flag = 1; }  break;
               case  '6': if (zahlsys < SYSHEX)
                             { rc = 43; flag = 1; }  break;
               case  '7': if (zahlsys < SYSHEX)
                             { rc = 31; flag = 1; }  break;
               case  '8': if (zahlsys < SYSOKT)
                             { rc = 32; flag = 1; }  break;
               case  '9': if (zahlsys < SYSOKT)
                             { rc = 33; flag = 1; }  break;
            }
            break;
      }
   }
   while (!flag);

   return(rc);
}
