/****************************************************************/
/*								*/
/* Sub.c - dieses Modul enthält Unterroutinen für den GALer	*/
/*								*/
/* compilieren: cc sub.c					*/
/*								*/
/****************************************************************/



#include "exec/types.h"
#include "libraries/dos.h"
#include "libraries/dosextens.h"
#include "exec/memory.h"
#include "intuition/intuition.h"
#include "functions.h"

#include "GALer.h"

#define	YES_GADID	1
#define	NO_GADID	2
#define STR_GADID	3


extern	struct	Window	 *window;
extern	struct	RastPort *rp;

int	ytxt = 160;				/*Startpos. für PrintText*/

UBYTE	ErrorLineStr[] = {"Fehler in Zeile ....:"};


SHORT BorderVectorsR[] = {0,0,82,0,82,14,0,14,0,0};
SHORT BorderVectorsS[] = {0,0,257,0,257,9,0,9,0,0};
struct Border BorderR  = {-1,-1,1,0,JAM1,5,BorderVectorsR,NULL};
struct Border BorderS  = {-1,-1,1,0,JAM1,5,BorderVectorsS,NULL};

struct IntuiText ITextN = {2,0,JAM1,14,3,NULL,(UBYTE *)"Abbruch",NULL};
struct IntuiText ITextY = {2,0,JAM1,16,3,NULL,NULL,NULL};

struct Gadget GadgetN = {NULL,206,53,81,13,NULL,RELVERIFY,
			 BOOLGADGET+REQGADGET,
			 (APTR)&BorderR,NULL,&ITextN,NULL,NULL,NO_GADID,NULL};
struct Gadget GadgetY = {&GadgetN,26,53,81,13,NULL,RELVERIFY,
			 BOOLGADGET+REQGADGET,
			 (APTR)&BorderR,NULL,&ITextY,NULL,NULL,YES_GADID,NULL};

UBYTE GadgetSBuff[60];
struct StringInfo StrSInfo = {GadgetSBuff,NULL,0,60,
			      0,0,0,0,0,0,0,0,NULL };
struct Gadget GadgetS = {&GadgetY,28,34,260,8,NULL,
			 RELVERIFY+STRINGCENTER,STRGADGET+REQGADGET,
			 (APTR)&BorderS,NULL,NULL,NULL,
		  	 (APTR)&StrSInfo,3,NULL };


struct IntuiText ITextW = {2,0,JAM1,19,15,NULL,NULL,NULL};

struct Requester req   = {NULL,170,40,310,76,0,0,
			 &GadgetS,NULL,&ITextW,
			 NULL,3,NULL,NULL,NULL };


/* MyRequest:
   öffnet einen Requester und wartet auf die Antwort
   Aufruf: antwort=MyRequest(mode,text);
	   mode: ASK_REQ : Requester mit Weiter/Abbruch-Gadgets
		 SAVE_REQ: Requester mit SAVE/Abbruch-Gadgets	 
		 LOAD_REQ: Requester mit LOAD/Abbruch-Gadgets	 
		 INFO_REQ: Requester ohne Gadgets (wird automatisch geschlossen)
	   text: Zeiger auf Requester-Text
	   antwort: 0=Abbruch oder Fehler, 1=Bestätigung
*/
MyRequest(mode,text)
int	mode;
UBYTE	*text;
{
struct	IntuiMessage	*imsg;
int	looping;
ULONG	class;
USHORT	gadID;


 ITextW.LeftEdge=(SHORT)(155-strlen(text)*8/2);
 ITextW.IText=text;

 switch (mode) {
   case	ERR_REQ: {
     req.ReqGadget=&GadgetY;
     ITextY.IText=(UBYTE *)"Abbruch";
     break;
    }   
   case ASK_REQ: {
     req.ReqGadget=&GadgetY;
     ITextY.IText=(UBYTE *)"Weiter";
     break;
    }   
   case LOAD_REQ: {
     req.ReqGadget=&GadgetS;
     ITextY.IText=(UBYTE *)" LOAD";
     break;
    }   
   case SAVE_REQ: {
     req.ReqGadget=&GadgetS;
     ITextY.IText=(UBYTE *)" SAVE";
     break;
    }   
   case INFO_REQ: {
     req.ReqGadget=NULL;
     break;
    }
  }
 if (Request(&req,window)) {
   if (mode==INFO_REQ) {
     WaitForTimer(1L,500000L);			/*1.5 Sekunden warten*/
     EndRequest(&req,window);
     return(1);
    }
   else {
     looping=TRUE;
     while (looping) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class=imsg->Class;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class==GADGETUP) {
	   if ((gadID==YES_GADID)||(gadID==STR_GADID)) {
	     EndRequest(&req,window);
	     return(1);
	    }
	   if (gadID==NO_GADID) {
	     EndRequest(&req,window);
	     return(0);
	    }
	  }
        }
      }
   }
  }
 else
   return(0);
}




/* FileSize:
   gibt die Länge einer Datei zurück
   Aufruf: size=FileSize(filename);
           filename: Zeiger auf Filenamen
   Ergebnis: -1 : File existiert nicht
	     -2 : kein Speicher für FileInfoBlock
	    size: Filelänge
*/
FileSize(filename)
UBYTE	*filename;
{
struct	FileInfoBlock	*fib;
struct	FileLock	*lock;
LONG	filesize;

 if((lock=(struct FileLock *) Lock(filename,ACCESS_READ))) {
   fib=(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP);
   if (fib!=NULL) {
     if (Examine(lock,fib))
       filesize=fib->fib_Size;
     else filesize=-1L;
     UnLock(lock);
     FreeMem(fib,(long)sizeof(struct FileInfoBlock));
     return(filesize);
    }
   else
     return(-2L);				/*Mem-Error*/
  }
 else
   return(-1L);					/*File existiert nicht*/
}


/* ReadFile
   File einlesen
   Aufruf: error=ReadFile(filename,filesize,filebuff)
           filename: Zeiger auf Filenamen
	   filesize: Größe der Datei in Bytes
	   filebuff: Adresse, an die die Datei gelesen werden soll
   Ergebnis: error: 1=kein Fehler, 0=Fehler
*/
ReadFile(filename,filesize,filebuff)
UBYTE	*filename,*filebuff;
LONG	filesize;
{
int 	actlength;
struct	FileHandle	*fh;

 if ((fh=Open(filename,MODE_OLDFILE))) {
   actlength=Read(fh,filebuff,filesize);
   Close(fh);
   if (actlength==-1L) return(0L);
   else return(1L);
  }
 else
  return(0L);
}




/*ErrorReq
  gibt zu einer Fehlernummer den entsprechenden Requester aus
  Aufruf: ErrorReq(errornum);
	  errornum: Fehlernummer
*/
ErrorReq(errornum)
int errornum;
{
 switch (errornum) {
   case 1: { MyRequest(ERR_REQ,(UBYTE*)"kann Datei leider nicht finden!");
	     break; }
   case 2: { MyRequest(ERR_REQ,(UBYTE*)"nicht genug freier Speicher vorhanden!");
	     break; }
   case 3: { MyRequest(ERR_REQ,(UBYTE*)"kann Datei leider nicht laden!");
	     break; }
   case 4: { MyRequest(ERR_REQ,(UBYTE*)"Datei ist leer!");
	     break; }
   case 5: { MyRequest(ERR_REQ,(UBYTE*)"Fehler in Jedec-Datei!");
	     break; }
   case 6: { MyRequest(ERR_REQ,(UBYTE*)"GAL ist NICHT leer!");
	     break; }
   case 7: { MyRequest(ERR_REQ,(UBYTE*)"keine gültigen Pinnamen vorhanden");
	     break; }
   case 8: { MyRequest(ERR_REQ,(UBYTE*)"Datei läßt sich nicht schließen!");
	     break; }
   case 9: { MyRequest(ERR_REQ,(UBYTE*)"falsches GAL eingestellt!");
	     break; }
  }
}




/* PrintText
   gibt Text im Text-Feld aus
   Aufruf: PrintText(text);
	   text: Zeiger auf Text
*/
PrintText(text)
UBYTE	*text;
{
 if (ytxt<190) ytxt+=10;
 else ScrollRaster(rp,0L,10L,31L,162L,609L,194L);
 Move(rp,40L,(long)ytxt);
 Text(rp,text,(long)strlen(text));

}

/*gibt "Fehler in Zeile xyz" aus
  Aufruf: PrintErrorLine(line);
	  line: Zeilennummer
*/
PrintErrorLine(line)
int line;
{
 sprintf(&ErrorLineStr[16],"%4d:",line);
 PrintText(&ErrorLineStr);
}


