/* * PatchGE.c version 1.0 - © 1991 Jaba Development * * written in Aztec C version 5.0a by Jan van den Baard * * Since I have been so stupid as not to leave any room for improvement * in the binary file structure of "GE" files made with GadgetED version 2.0 * I had to write a patch program that will upgrade these files to GadgetED * version 2.1 and up..... sorry ! */ #include #include "PatchGE.h" #include struct OldBin { ULONG FileType; ULONG NumGads; ULONG ScrDepth; BOOL ReqGads; BOOL WBScreen; ULONG NumTexts; USHORT Colors[32]; BOOL skip_zero_planes; BOOL auto_size; BOOL image_copy; struct NewWindow new_window; char window_title[80]; char window_label[32]; }; struct NewBin { ULONG FileType; USHORT Version; USHORT Revision; USHORT NumGads; USHORT ScrDepth; BOOL ReqGads; BOOL WBScreen; USHORT NumTexts; USHORT Colors[32]; USHORT FPen; USHORT BPen; USHORT BackFill; USHORT WDBackFill; USHORT LightSide; USHORT DarkSide; USHORT Res[2]; BOOL skip_zero_planes; BOOL auto_size; BOOL image_copy; BOOL text_copy; BOOL static_structures; BOOL no_flags; BOOL Res1[2]; struct NewWindow new_window; char window_title[80]; char window_label[32]; }; struct ToolBase *ToolBase; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Window *window = NULL; struct IntuiMessage *msg; struct Gadget *gadget; struct RastPort *rport; struct FileRequester *freq = NULL; struct OldBin *oldbin = NULL; struct NewBin newbin; ULONG class, filesize; USHORT code, id; void bail() { if(oldbin) FreeMem(oldbin,filesize); if(freq) FreeFreq(freq); if(window) CloseWindow(window); if(ToolBase) CloseLibrary(ToolBase); exit(0L); } void setup() { if(NOT(ToolBase = (struct ToolBase *) OpenLibrary("tool.library",TOOL_VERSION))) bail(); IntuitionBase = ToolBase->IntuitionBase; GfxBase = ToolBase->GfxBase; if(NOT(freq = AllocFreq())) bail(); if(NOT(window = (struct Window *)OpenWindow(NEWWINDOW))) bail(); rport = window->RPort; } void do_patch() { USHORT i; SetAPen(rport,0); SetDrMd(rport,JAM1); RectFill(rport,212,18,373,63); SetAPen(rport,3); Move(rport,212,25); Text(rport,freq->fr_FileName,strlen(freq->fr_FileName)); Move(rport,212,34); FormatText(rport,"%ld",oldbin->NumGads); Move(rport,212,43); if(oldbin->ReqGads) Text(rport,"Requester",9L); else Text(rport,"Window",6L); Move(rport,212,52); FormatText(rport,"%ld",oldbin->NumTexts); Move(rport,212,61); if(oldbin->WBScreen) Text(rport,"Workbench 4 colors",18L); else FormatText(rport,"Custom %ld colors",(1 << oldbin->ScrDepth)); newbin.FileType = 'EG2+'; newbin.Version = 2; newbin.Revision = 1; newbin.NumGads = oldbin->NumGads; newbin.ScrDepth = oldbin->ScrDepth; newbin.ReqGads = oldbin->ReqGads; newbin.WBScreen = oldbin->WBScreen; newbin.NumTexts = oldbin->NumTexts; CopyMem((char *)&oldbin->Colors[0],(char *)&newbin.Colors[0],64L); newbin.FPen = 1; newbin.BPen = 0; newbin.BackFill = 1; newbin.WDBackFill = 0; newbin.LightSide = 2; newbin.DarkSide = 1; for(i=0;i<2;i++) newbin.Res[i] = 0; newbin.skip_zero_planes = oldbin->skip_zero_planes; newbin.auto_size = oldbin->auto_size; newbin.image_copy = oldbin->image_copy; newbin.text_copy = FALSE; newbin.static_structures = FALSE; newbin.no_flags = FALSE; for(i=0;i<2;i++) newbin.Res1[i] = 0; CopyMem((char *)&oldbin->new_window,(char *)&newbin.new_window,sizeof(struct NewWindow)); strcpy((char *)&newbin.window_title,(char *)&oldbin->window_title); strcpy((char *)&newbin.window_label,(char *)&oldbin->window_label); } void inform(char *text) { SetAPen(rport,0); SetDrMd(rport,JAM1); RectFill(rport,212,18,373,63); SetAPen(rport,2); Move(rport,294-(strlen(text) << 2),43); Text(rport,text,strlen(text)); } void load_file() { strcpy(freq->fr_HeadLine,"Load a 'GE' file"); freq->fr_Flags = FR_NoInfo|FR_ReturnOld; if(oldbin) { FreeMem(oldbin,filesize); oldbin = NULL; } switch(FileRequest(freq)) { case FREQ_OK: inform("LOADING"); Seek(freq->fr_Handle,0,OFFSET_END); filesize = Seek(freq->fr_Handle,0,OFFSET_BEGINNING); if(oldbin = (struct OldBin *)AllocMem(filesize,MEMF_PUBLIC)) { if(Read(freq->fr_Handle,(char *)oldbin,filesize) <= 0) { Close(freq->fr_Handle); inform("READ ERROR"); break; } if(oldbin->FileType == 'EG2+') { FreeMem(oldbin,filesize); oldbin = NULL; Close(freq->fr_Handle); inform("FILE ALREADY PATCHED"); break; } if(oldbin->FileType != 'EGAD') { FreeMem(oldbin,filesize); oldbin = NULL; Close(freq->fr_Handle); inform("UNKNOWN FILE"); break; } do_patch(); Close(freq->fr_Handle); } break; case FREQ_CANT_OPEN: inform("FILEREQUESTER ERROR"); break; case FREQ_FILE_ERROR: inform("CANT OPEN THE FILE"); break; case FREQ_CANCELED: break; } } void save_file() { if(NOT oldbin) return; strcpy(freq->fr_HeadLine,"Save 'GE' patch"); freq->fr_Flags = FR_NoInfo|FR_ReturnNew; switch(FileRequest(freq)) { case FREQ_OK: inform("SAVING"); if(Write(freq->fr_Handle,(char *)&newbin,sizeof(struct NewBin)) < 0) { Close(freq->fr_Handle); inform("WRITE ERROR"); break; } if(Write(freq->fr_Handle,(char *)((ULONG)oldbin+(ULONG)sizeof(struct OldBin)),filesize-sizeof(struct OldBin)) < 0) { Close(freq->fr_Handle); inform("WRITE ERROR"); break; } Close(freq->fr_Handle); do_patch(); break; case FREQ_CANT_OPEN: inform("FILEREQUESTER ERROR"); break; case FREQ_FILE_ERROR: inform("CANT OPEN THE FILE"); break; case FREQ_CANCELED: break; } } void main() { setup(); do { WaitPort(window->UserPort); while(msg = (struct IntuiMessage *)GetMsg(window->UserPort)) { class = msg->Class; code = msg->Code; gadget = (struct Gadget *)msg->IAddress; id = gadget->GadgetID; ReplyMsg((struct Message *)msg); switch(id) { case LOAD_ID: load_file(); break; case SAVE_ID: save_file(); break; } } } while(id != QUIT_ID); bail(); }