/****************************************************************/ /* */ /* 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); }