/*-- AutoRev header do NOT edit! * * Program : main.c * Copyright : © 1991 Jaba Development * Author : Jan van den Baard * Creation Date : 21-Apr-91 * Current version : 1.5 * Translator : DICE v2.6 * * REVISION HISTORY * * Date Version Comment * --------- ------- ------------------------------------------ * 17-Sep-91 1.5 Changed input-handler to commodity broker. * 16-Sep-91 1.4 Added mini line editor. * 16-Sep-91 1.4 Added text save option. * 16-Sep-91 1.4 Added pattern gadget in FileRequesters. * 23-Aug-91 1.3 View now support ECS screen modes. * 12-Aug-91 1.2 Added Save text block option. * 12-Aug-91 1.2 Search now from top-line. * 03-Jul-91 1.1 Removed Enforcer hits! * 03-Jul-91 1.1 Fixed bug in decrunch routine! * 21-Apr-91 1.0 View main program. OS 2 ONLY! * *-- REV_END --*/ #include "view.h" /* * Function proto-types. */ long OpenConsole( void ); void CloseConsole( void ); void Quit( long ); void Inform( char * ); void Display( struct Line * ); void CheckDir( UBYTE * ); void LoadFile( long ); void DisplayText( void ); void MoveTo( UBYTE, UBYTE ); void LineDown( void ); void LineUp( void ); void Top( void ); void Bottom( void ); void PageUp( void ); void PageDown( void ); void Percentage( void ); void BytesShown( void ); void InfoLine( void ); void ErrorLine( UBYTE * ); void WaitKey( void ); void Help( void ); long CountEsc( struct Line *, long ); void DoFound( void ); void PrintFound( UWORD ); void GetSomething( ULONG ); void FindN( void ); void FindP( void ); void EditFile( void ); void PrintFile( void ); __geta4 void PrintProc( void ); long IsItADir( void ); long CheckPP( void ); long CheckBlock( UWORD ); long ParseName( char * ); void SetMark( UWORD ); void UnSetMark( UWORD ); void JumpMark( UWORD ); void SaveBlock( WORD ); void EditLine( void ); void SetupComm( void ); void QuitComm( void ); void OpenLibs( void ); void OpenDisplay( void ); void CloseDisplay( void ); void GetRequest( void ); void MainLoop( void ); void myMain( BOOL ); /* * External function proto-types. */ extern void _waitwbmsg( void ); extern void _exit( int ); extern void ConvertKeyTab( void ); extern void HandleKeyboard( UWORD, UWORD ); extern long HandleMsg( struct MsgPort * ); extern void ClearMsg( struct MsgPort * ); /* * Macros. */ #define MAXCOL(w,f) (w->Width / f->tf_XSize) #define CLRLIN() SetAPen(VW_rport,2); RectFill(VW_rport,0,0,VW_wnd->Width,VW_font->tf_YSize-1); #define CLRBLK() setmem(&VW_blk[0],(10*sizeof(struct TextBlock)),0); #define CxOn(b) ActivateCxObj(b,TRUE); #define CxOff(b) ActivateCxObj(b,FALSE); #define BitMask(b) ( 1L << ((ULONG)b) ) /* * Workbench message. */ extern struct WBStartup *_WBMsg; /* * Commodity data. */ UBYTE *CX_PRIORITY = "PRIORITY"; UBYTE *CX_POPWINDOW = "POPWINDOW"; UBYTE *CX_VIEW = "VIEW"; UBYTE *CX_FLUSH = "FLUSH"; UBYTE *CX_QUIT = "QUIT"; UWORD CX_DEF_PRIORITY = 0; UBYTE *CX_DEF_POPWINDOW = "YES"; UBYTE *CX_DEF_VIEW = "lalt lcommand v"; UBYTE *CX_DEF_FLUSH = "lalt lcommand f"; UBYTE *CX_DEF_QUIT = "lalt lcommand q"; #define CX_VERSION "1.5" #define CX_NAME "View" #define CX_DESCRIPTION "Ascii text file viewer." #define CX_COPYRIGHT "© 1991 Jaba Development" #define CX_TITLE CX_NAME " " CX_VERSION ", " CX_COPYRIGHT #define CXC_VIEW 1L #define CXC_FLUSH 2L #define CXC_QUIT 3L UBYTE *VW_vers = "\0$VER: View © 1991 Jaba Development -- v1.5"; struct MsgPort *VW_cxport = NULL; struct MsgPort *VW_idport = NULL; ULONG VW_cxmask = NULL; ULONG VW_idmask = NULL; UWORD VW_dopen = FALSE; UWORD VW_isopen = FALSE; UWORD VW_fsu = TRUE; CxObj *VW_broker = NULL; CxObj *VW_view, *VW_flush, *VW_quit; UBYTE *VW_quitstr, *VW_flushstr, *VW_viewstr, *VW_namestr; struct NewBroker VW_newbroker = { NB_VERSION, CX_NAME, CX_TITLE, CX_DESCRIPTION, NBU_NOTIFY | NBU_UNIQUE, COF_SHOW_HIDE, NULL, 0 }; /* * Main program data. */ struct MsgPort *VW_cport = NULL; struct IOStdReq *VW_creq = NULL; struct Window *VW_wnd = NULL; struct Screen *VW_scr = NULL; struct AsciiText *VW_text = NULL; struct FileRequester *VW_freq = NULL, *VW_save = NULL; struct RastPort *VW_rport; struct TextFont *VW_font; struct Line *VW_first; struct Line *VW_last; APTR VW_wdptr; struct Process *VW_proc; struct RDArgs VW_iargs = { { 0,0,0 },0,0,0,0,RDAF_NOPROMPT }; struct RDArgs *VW_fargs = 0L; struct StringScan VW_search; struct TextBlock VW_blk[10]; ULONG VW_args[7] = { 0,0,0,0,0,0,0 }; BOOL VW_found = FALSE, VW_printing = FALSE; BOOL VW_err = TRUE; ULONG VW_class, VW_signal, VW_shown; UWORD VW_code, VW_id, VW_qual, VW_ymax; UWORD VW_mode, VW_pmode, VW_maxlin, VW_pmark; UWORD DriPens = ~0; LONG VW_num; UBYTE VW_name[256]; UBYTE VW_fbuf[256]; UBYTE VW_patt[32] = "#?"; UBYTE NullStr = 0; /* no Enforcer complaints */ UBYTE *Template = "Name,PRIORITY/n,POPWINDOW/k,VIEW/k,FLUSH/k,QUIT/k"; UBYTE *GetString = "Type string :"; UBYTE *GetLong = "Type percentage:"; UBYTE *Lines[] = { "ViewSleepy", "Out of memory !", "Searching...", "ViewPrinting", "Block %-2.2ld not marked !" }; UBYTE *Dir = 0L, *SDir = 0L; UBYTE *File = 0L, *SFile = 0L; Tag StringTags[] = { GTST_String, VW_fbuf, GTST_MaxChars, 256, TAG_DONE }; Tag StringTags1[] = { GTST_String, 0L, GTST_MaxChars, 0L, TAG_DONE }; struct StringExtend se = { NULL,1,2,1,3,NULL,NULL,NULL,0,0,0,0 }; Tag IntegerTags[] = { GTIN_Number, 0, GTIN_MaxChars,3, TAG_DONE }; Tag NewScreenTags[] = { SA_Pens, &DriPens, SA_DisplayID, NULL, SA_Overscan, OSCAN_TEXT, TAG_DONE }; Tag NewWindowTags[] = { WA_InnerWidth, 200, WA_InnerHeight, 12, TAG_DONE }; Tag NewWindowTags1[] = { WA_InnerWidth, 320, WA_InnerHeight, 12, TAG_DONE }; Tag NewWindowTags2[] = { WA_RptQueue, 1, TAG_DONE }; Tag RequestTags[] = { ASL_LeftEdge, 20, ASL_TopEdge, 15, ASL_Width, 300, ASL_Height, 175, ASL_OKText, "Load", ASL_FuncFlags, FILF_PATGAD, TAG_DONE }; Tag RequestTags1[] = { ASL_LeftEdge, 20, ASL_TopEdge, 15, ASL_Width, 300, ASL_Height, 175, ASL_OKText, "Save", ASL_FuncFlags, FILF_PATGAD | FILF_SAVE, TAG_DONE }; Tag RequestTags2[] = { ASL_Window, NULL, ASL_Dir, 0L, ASL_File, 0L, ASL_Pattern, &VW_patt[0], ASL_Hail, 0L, TAG_DONE }; Tag ProcessTags[] = { NP_Entry, NULL, NP_StackSize, 4096L, NP_Name, "ViewPrinting", TAG_DONE }; struct NewScreen ns = { 0,0,640,200,2,-1,-1,HIRES,CUSTOMSCREEN,NULL,NULL,NULL,NULL }; struct NewWindow nw = { 0,0,640,200,-1,-1,IDCMP_RAWKEY, WFLG_ACTIVATE+WFLG_RMBTRAP+WFLG_SMART_REFRESH+WFLG_BORDERLESS+WFLG_BACKDROP, NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow nws = { 0,0,200,12,-1,-1,IDCMP_GADGETUP, WFLG_RMBTRAP+WFLG_ACTIVATE+WFLG_SMART_REFRESH+WFLG_DRAGBAR, NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow nwe = { 0,0,320,12,-1,-1,IDCMP_GADGETUP+IDCMP_CLOSEWINDOW, WFLG_RMBTRAP+WFLG_CLOSEGADGET+WFLG_ACTIVATE+WFLG_SMART_REFRESH+WFLG_DRAGBAR, NULL,NULL,(UBYTE *)"Edit Line",NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct NewWindow nwp = { 0,0,138,11,-1,-1,IDCMP_CLOSEWINDOW, WFLG_SMART_REFRESH+WFLG_RMBTRAP+WFLG_DRAGBAR+WFLG_CLOSEGADGET, NULL,NULL,(UBYTE *)"Printing...",NULL,NULL,0,0,0,0,CUSTOMSCREEN }; struct TextAttr TOPAZ_80 = { (STRPTR)"topaz.font",TOPAZ_EIGHTY,FS_NORMAL,FPF_ROMFONT }; UBYTE *Header = " \033[0;1mView version " CX_VERSION " © 1991 Jaba Development\n"\ " \033[0;33mWritten with DICE C by Jan van den Baard\033[0m\n\n"; UBYTE *HelpText = " \033[32mSpace\033[0m,\033[32mPg Dn \033[33m \033[0m : Page down (MORE).\n"\ " \033[32mBackspace\033[0m,\033[32mPg Up\033[0m : Page up (LESS).\n"\ " \033[32mReturn\033[0m,\033[32mDn\033[0m,\033[32mNk Dn\033[0m : Next line.\n"\ " \033[32mEnter\033[0m,\033[32mUp\033[0m,\033[32mNk Up\033[0m : Previous line.\n"\ " \033[32m<\033[0m,\033[32mNk Left\033[0m/\033[32m>\033[0m,\033[32mNk Right\033[0m : First/Last page (TOP/BOTTOM).\n"\ " \033[32m/\033[0m,\033[32mF\033[0m : Find first (case sensitive).\n"\ " \033[32mN\033[0m/\033[32mP\033[0m : Find next/previous (case sensitive).\n"\ " \033[32m.\033[0m,\033[32mS\033[0m : Find first (case insensitive).\n"\ " \033[32mCTRL+N\033[0m/\033[32mCTRL+P\033[0m : Find next/previous (case insensitive).\n"\ " \033[32mCTRL+L\033[0m,\033[32mR\033[0m : Refresh display.\n"\ " \033[32m%\033[0m : Goto N%.\n"\ " \033[32mE\033[0m : Edit with ENV:EDITOR.\n"\ " \033[32mL\033[0m : Load a new file.\n"\ " \033[32mJ\033[0m : Jump to last found string.\n"\ " \033[32mB\033[0m : Goto sleep (loose text).\n"\ " \033[32mCTRL+B\033[0m : Goto sleep (remember text).\n"\ " \033[32mLSHIFT+CTRL+D\033[0m/\033[32m+P\033[0m : Dump page/file to printer.\n"\ " \033[32mH\033[0m,\033[32mHELP\033[0m : Help page.\n"\ " \033[32mQ\033[0m,\033[32mCTRL+C\033[0m,\033[32mESC\033[0m : Quit view\n\n"\ " \033[31;1mPRESS A KEY FOR MORE"; UBYTE *HelpText1 = " \033[0;32mFn\033[0m : Mark text block #\033[32mn\033[0m.\n"\ " \033[32mSHIFT+Fn\033[0m : Unmark text block #\033[32mn\033[0m.\n"\ " \033[32mCTRL+Fn\033[0m : Jump to text block #\033[32mn\033[0m.\n"\ " \033[32mLSHIFT+CTRL+Fn\033[0m : Print text block #\033[32mn\033[0m.\n"\ " \033[32mLALT+Fn\033[0m : Save text block #\033[32mn\033[0m.\n"\ " \033[32mCTRL+S\033[0m : Save whole text.\n"\ " \033[32mSHIFT+E\033[0m : Edit a line of text.\n\n"\ " \033[31;1mPRESS A KEY TO CONTINUE"; APTR ConsoleDevice = 0L; extern struct IntuitionBase *IntuitionBase; /* AUTO INIT */ extern struct GfxBase *GfxBase; /* AUTO INIT */ extern struct AslBase *AslBase; /* AUTO INIT */ extern struct GadToolsBase *GadToolsBase; /* AUTO INIT */ extern struct UtilityBase *UtilityBase; /* AUTO INIT */ struct CxBase *CxBase = 0L; struct IconBase *IconBase = 0L; struct NoFragBase *NoFragBase = 0L; struct PPBase *PPBase = 0L; #define ESC 0x1b #define CSI 0x9b #define FF 0x0c char MoveStr[] = { CSI,0x00,0x00,0x3b,0x00,0x00,0x48,0x00 }; char ClearStr[] = { 0x0c,0x00 }; char ScrUpStr[] = { CSI,0x53,0x00 }; char ScrDnStr[] = { CSI,0x54,0x00 }; char StdStr[] = { ESC,0x63,CSI,0x30,0x20,0x70,CSI,0x00,0x38,0x79,0x00 }; char *ResStr = "\033[0m"; char *FFStr = "\033[7mF\033[0m"; long OpenConsole( void ) { if(!(VW_cport = CreateMsgPort())) return FALSE; if(!(VW_creq = (struct IOStdReq *)CreateIORequest(VW_cport, (long)sizeof(struct IOStdReq)))) return FALSE; VW_creq->io_Data = (APTR)VW_wnd; VW_creq->io_Length = sizeof(struct Window); if(!OpenDevice("console.device",0,(struct IORequest *)VW_creq,0)) ConsoleDevice = VW_creq->io_Device; else return FALSE; ConvertKeyTab(); Inform(StdStr); return TRUE; } void CloseConsole( void ) { if(ConsoleDevice) { CloseDevice((struct IORequest *)VW_creq); ConsoleDevice = 0L; } if(VW_creq) { DeleteIORequest((struct IORequest *)VW_creq); VW_creq = 0L; } if(VW_cport) { DeleteMsgPort(VW_cport); VW_cport = 0L; } } void OpenLibs( void ) { if(NOT(NoFragBase = (struct NoFragBase *)OpenLibrary("nofrag.library",NOFRAG_VERSION))) Quit( RETURN_FAIL ); if(NOT(CxBase = (struct CxBase *)OpenLibrary("commodities.library",36L))) Quit( RETURN_FAIL ); if(NOT(IconBase = (struct IconBase *)OpenLibrary("icon.library",36L))) Quit( RETURN_FAIL ); PPBase = (struct PPBase *)OpenLibrary("powerpacker.library",33L); } void OpenDisplay( void ) { struct Screen *plock; if(!(plock = LockPubScreen("Workbench"))) Quit( RETURN_FAIL ); ns.Width = nw.Width = plock->Width; ns.Height = nw.Height = plock->Height; ns.ViewModes = plock->ViewPort.Modes; NewScreenTags[3] = GetVPModeID(&plock->ViewPort); UnlockPubScreen(NULL,plock); if(!(VW_scr = OpenScreenTagList(&ns,(struct TagItem *)&NewScreenTags[0]))) Quit( RETURN_FAIL ); nw.Screen = VW_scr; if(!(VW_wnd = OpenWindowTagList(&nw,(struct TagList *)&NewWindowTags2[0]))) Quit( RETURN_FAIL ); ShowTitle(VW_scr,FALSE); VW_idport = VW_wnd->UserPort; VW_idmask = BitMask( VW_idport->mp_SigBit ); VW_proc = FindTask(0L); VW_wdptr = VW_proc->pr_WindowPtr; VW_proc->pr_WindowPtr = (APTR)VW_wnd; VW_rport = VW_wnd->RPort; VW_font = VW_rport->Font; VW_maxlin = (VW_wnd->Height / VW_font->tf_YSize) - 1; sprintf((char *)&StdStr[7],"%02.2ldy",VW_font->tf_YSize); if(!OpenConsole()) Quit( RETURN_FAIL ); VW_isopen = TRUE; if(NOT VW_text) { if(VW_fsu) { if(VW_namestr) { if(!ParseName(VW_namestr)) LoadFile(TRUE); else LoadFile(FALSE); } else { VW_name[0] = 0; Dir = (char *)&NullStr; File = (char *)&NullStr; LoadFile(TRUE); } } else LoadFile(TRUE); } if(VW_text) { DisplayText(); BytesShown(); InfoLine(); } VW_fsu = FALSE; } void CloseDisplay( void ) { CloseConsole(); if(VW_wnd) { VW_proc->pr_WindowPtr = VW_wdptr; CloseWindow(VW_wnd); VW_wnd = NULL; VW_idport = NULL; VW_idmask = NULL; } if(VW_scr) { CloseScreen(VW_scr); VW_scr = NULL; } VW_isopen = FALSE; } void GetRequest( void ) { if(!(VW_freq = AllocAslRequest(ASL_FileRequest,(struct TagItem *)&RequestTags[0]))) Quit( RETURN_FAIL ); if(!(VW_save = AllocAslRequest(ASL_FileRequest,(struct TagItem *)&RequestTags1[0]))) Quit( RETURN_FAIL ); CLRBLK(); } void Quit( long code ) { CloseDisplay(); QuitComm(); if(VW_text) FreeAscii(VW_text); if(VW_freq) FreeAslRequest(VW_freq); if(VW_save) FreeAslRequest(VW_save); if(IconBase) CloseLibrary(IconBase); if(CxBase) CloseLibrary(CxBase); if(NoFragBase) CloseLibrary(NoFragBase); if(VW_fargs) FreeArgs(VW_fargs); _exit(code); } void Inform( char *text ) { VW_creq->io_Command = CMD_WRITE; VW_creq->io_Data = (APTR)text; VW_creq->io_Length = (LONG)strlen(text); DoIO((struct IORequest *)VW_creq); } void Display( struct Line *line ) { Inform(ResStr); VW_creq->io_Command = CMD_WRITE; VW_creq->io_Data = (APTR)line->Text; VW_creq->io_Length = (LONG)line->Size-1; if(line->Text[0] == FF) { Inform(FFStr); VW_creq->io_Data = (APTR)&line->Text[1]; VW_creq->io_Length = (LONG)line->Size-2; } DoIO((struct IORequest *)VW_creq); } void CheckDir( UBYTE *name ) { if(name[strlen(name)-1] != ':' && name[strlen(name)-1] != '/' && strlen(name)) strcat(name,"/"); } void LoadFile( long request ) { UBYTE *ppdata; ULONG pplen; BPTR ppout; BOOL pptemp = FALSE; LONG pperr; UBYTE lbuf[7], *fname; UWORD lnum = 1; LONG ret; struct BuffIO *file; struct Line *line; ErrorLine("View v" CX_VERSION " © 1991 Jaba Development"); if(request == TRUE) { RequestTags2[1] = VW_wnd; RequestTags2[3] = Dir; RequestTags2[5] = File; RequestTags2[9] = "Please select file to load..."; ret = AslRequest(VW_freq,(struct TagItem *)&RequestTags2[0]); if(ret) { Dir = VW_freq->rf_Dir; File = VW_freq->rf_File; strcpy(VW_name,Dir); strcpy(VW_patt,VW_freq->rf_Pat); CheckDir(VW_name); strcat(VW_name,File); } else { InfoLine(); return; } } if(VW_text) { FreeAscii(VW_text); VW_text = 0L; CLRBLK(); } Inform(ClearStr); Inform(StdStr); if(PPBase && CheckPP()) { ErrorLine("Loading and decrunching file...."); if((pperr = ppLoadData(VW_name,DECR_POINTER,MEMF_PUBLIC,&ppdata,&pplen,0L)) < 0) { switch(pperr) { case PP_OPENERR: ErrorLine("PPLIB: Can't open the file !"); break; case PP_READERR: ErrorLine("PPLIB: Read error !"); break; case PP_NOMEMORY: ErrorLine("PPLIB: Out of memory !"); break; case PP_PASSERR: ErrorLine("PPLIB: Incorrect password !"); break; case PP_UNKNOWNPP: ErrorLine("PPLIB: Unknown PowerPacker version !"); break; } return; } fname = "T:view.pp.tmp.v" CX_VERSION ".decrunched"; if((ppout = Open(fname,MODE_NEWFILE))) { if(Write(ppout,ppdata,pplen) != pplen) { ErrorLine("Error writing '.tmp' file !"); pptemp = FALSE; } else pptemp = TRUE; Close(ppout); } else { ErrorLine("Can't open '.tmp' file !"); pptemp = FALSE; } FreeMem(ppdata,pplen); if(!pptemp) goto ppCleanUp; } else { ErrorLine("Loading file...."); fname = VW_name; } if((VW_text = AllocAscii(ANSITAB,MAXCOL(VW_wnd,VW_font),ATF_SkipEsc+ATF_TabConvert))) { if((file = BOpen(fname,MODE_OLDFILE))) { while((line = BGetS(file,VW_text))) AddTail((struct List *)VW_text,(struct Node *)line); switch(BIoErr(file)) { case ASE_READ: ErrorLine("READ ERROR !"); goto CleanExit; case ASE_NOMEM: ErrorLine(Lines[1]); goto CleanExit; } BClose(file); VW_first = VW_text->First; VW_found = FALSE; DisplayText(); BytesShown(); ClearMsg(VW_wnd->UserPort); InfoLine(); goto ppCleanUp; } else { ErrorLine("Could not open the file !"); FreeAscii(VW_text); VW_text = 0L; goto ppCleanUp; } } else { ErrorLine(Lines[1]); goto ppCleanUp; } CleanExit: FreeAscii(VW_text); VW_text = 0L; BClose(file); ClearMsg(VW_wnd->UserPort); ppCleanUp: if(pptemp) DeleteFile(fname); } void DisplayText( void ) { UWORD y=1,i=0; if(!VW_text) return; for(VW_last = VW_first; i < VW_maxlin; i++, VW_last = VW_last->Next, y++) { if(VW_last == VW_text->Last->Next) break; MoveTo(1,y); Display(VW_last); if(VW_found && VW_last == VW_search.Line) PrintFound(y); } VW_ymax = y-1; } void MoveTo(UBYTE c, UBYTE r) { sprintf((char *)&MoveStr[1],"%02ld;%02ldH",r,c); Inform(MoveStr); } void LineDown( void ) { if(!VW_text) return; if(VW_last == VW_text->Last->Next) return; VW_first = VW_first->Next; Inform(ScrUpStr); MoveTo(1,VW_ymax); Display(VW_last); VW_shown += VW_last->Size; if(VW_found && VW_last == VW_search.Line) PrintFound(VW_ymax); VW_last = VW_last->Next; } void LineUp( void ) { if(!VW_text) return; if(VW_first == VW_text->First) return; VW_last = VW_last->Prev; VW_shown -= VW_last->Size; VW_first = VW_first->Prev; Inform(ScrDnStr); MoveTo(1,1); Display(VW_first); if(VW_found && VW_first == VW_search.Line) PrintFound(1); } void Top( void ) { if(!VW_text) return; if(VW_first == VW_text->First) return; VW_first = VW_text->First; Inform(ClearStr); DisplayText(); BytesShown(); } void Bottom( void ) { UWORD i; if(!VW_text) return; if(VW_last == VW_text->Last->Next) return; VW_last = VW_first = VW_text->Last; for(i = 1; i < VW_maxlin; i++) VW_first = VW_first->Prev; VW_shown = VW_text->NumBytes; Inform(ClearStr); DisplayText(); } void PageDown( void ) { UWORD i; if(!VW_text) return; if(VW_last == VW_text->Last->Next) return; for(i = 1; i < VW_maxlin; i++) { VW_first = VW_first->Next; VW_shown += VW_last->Size; if((VW_last = VW_last->Next) == VW_text->Last->Next) break; } Inform(ClearStr); DisplayText(); } void PageUp( void ) { UWORD i; if(!VW_text) return; if(VW_first == VW_text->First) return; for(i = 1; i < VW_maxlin; i++) { VW_last = VW_last->Prev; VW_shown -= VW_last->Size; if((VW_first = VW_first->Prev) == VW_text->First) break; } Inform(ClearStr); DisplayText(); } void Percentage( void ) { ULONG perc; char pcbuf[5]; if(!VW_text) return; perc = (ULONG)(VW_shown * 100 / VW_text->NumBytes); if(perc == 100 && (VW_last != VW_text->Last->Next)) perc = 99; VW_num = perc; sprintf(pcbuf,"%3ld%%",perc); SetAPen(VW_rport,3); SetBPen(VW_rport,2); SetDrMd(VW_rport,JAM2); Move(VW_rport,544,VW_font->tf_Baseline); Text(VW_rport,pcbuf,strlen(pcbuf)); SetAPen(VW_rport,1); Move(VW_rport,584,VW_font->tf_Baseline); Text(VW_rport,"Shown.",6); } void BytesShown( void ) { struct Line *line; VW_shown = 0L; for(line = VW_text->First; line != VW_last; line = line->Next) VW_shown += line->Size; } void InfoLine( void ) { UBYTE ibuf[100]; CLRLIN(); VW_err = FALSE; SetAPen(VW_rport,1); SetDrMd(VW_rport,JAM1); if(VW_text) { sprintf(ibuf,"File : %-31.31ls %-6.6ld Lines, %-6.6ld Bytes.",VW_name,VW_text->NumLines-VW_text->NumSplit,VW_text->NumBytes); } else strcpy(ibuf,"No text in memory (press 'l' to load a file)"); Move(VW_rport,1,VW_font->tf_Baseline); Text(VW_rport,ibuf,strlen(ibuf)); } void ErrorLine( UBYTE *text ) { CLRLIN(); VW_err = TRUE; SetAPen(VW_rport,1); SetDrMd(VW_rport,JAM1); Move(VW_rport,1,VW_font->tf_Baseline); Text(VW_rport,text,strlen(text)); } void WaitKey( void ) { while(1) { WaitPort(VW_wnd->UserPort); while(HandleMsg(VW_wnd->UserPort)); if(((VW_code & IECODE_UP_PREFIX) != IECODE_UP_PREFIX) && (!(VW_qual & IEQUALIFIER_REPEAT))) break; } ClearMsg(VW_wnd->UserPort); } void Help( void ) { Move(VW_rport,0,0); SetAPen(VW_rport,0); SetDrMd(VW_rport,JAM1); ClearScreen(VW_rport); MoveTo(1,1); Inform(Header); Inform(HelpText); WaitKey(); Move(VW_rport,0,0); SetAPen(VW_rport,0); SetDrMd(VW_rport,JAM1); ClearScreen(VW_rport); MoveTo(1,1); Inform(Header); Inform(HelpText1); WaitKey(); Move(VW_rport,0,0); SetAPen(VW_rport,0); SetDrMd(VW_rport,JAM1); ClearScreen(VW_rport); DisplayText(); InfoLine(); } long CountEsc(struct Line *line, long off) { UWORD i; LONG c = 0L; char *ptr = line->Text, chr; for(i = 0;i <= off; i++) { if((*ptr == ESC) || (*ptr == CSI)) { while(1) { c++; i++; chr = (*ptr++) - ' '; if((chr >= '?' && chr <= 'Z') || !chr) break; } } else ptr++; } return(c); } void DoFound( void ) { struct Line *line; USHORT i,y=0,yy; VW_last = VW_search.Line; for(i = 0; i < VW_maxlin; i++) if((VW_last = VW_last->Next) == VW_text->Last->Next) break; VW_first = VW_last; for(yy = VW_ymax, i = VW_maxlin; i >= 1; i--, yy--) { if((VW_first = VW_first->Prev) == VW_text->First) break; if(VW_first == VW_search.Line) y = yy; } VW_shown = 0L; for(line = VW_text->First; line != VW_last; line = line->Next) VW_shown += line->Size; Inform(ClearStr); DisplayText(); } void PrintFound( UWORD y ) { char wrd[256]; setmem(&wrd[0],256,0); Inform("\033[32;43m"); strncpy(wrd,(char *)&VW_search.Line->Text[VW_search.TextOffset],VW_search.StringSize); MoveTo(VW_search.TextOffset - CountEsc(VW_search.Line,VW_search.TextOffset)+1,y); Inform(wrd); Inform(ResStr); } void GetSomething( ULONG kind ) { struct Gadget *g = 0L, *glist = 0L; struct Window *w = 0L; struct Line *line; struct NewGadget ng; APTR vi = 0L; ULONG sizex = 0L, sizen = 0L, i; if(!VW_text) return; setmem(&ng,sizeof(struct NewGadget),0); nws.Screen = VW_scr; nws.LeftEdge = (VW_wnd->Width >> 1) - 106; nws.TopEdge = (VW_wnd->Height >> 1) - 12; if(kind == STRING_KIND) nws.Title = GetString; else nws.Title = GetLong; if((w = OpenWindowTagList(&nws,(struct TagItem *)&NewWindowTags[0]))) { if((vi = GetVisualInfoA(VW_scr,(struct TagItem *)&StringTags[4]))) { if((g = CreateContext(&glist))) { ng.ng_LeftEdge = w->BorderLeft; ng.ng_TopEdge = w->BorderTop; ng.ng_Width = 200; ng.ng_Height = 12; ng.ng_TextAttr = &TOPAZ_80; ng.ng_VisualInfo = vi; if(kind == STRING_KIND) g = CreateGadgetA(STRING_KIND,g,&ng,(struct TagItem *)&StringTags[0]); else { IntegerTags[1] = VW_num; g = CreateGadgetA(INTEGER_KIND,g,&ng,(struct TagItem *)&IntegerTags[0]); } if(g) { g->Activation |= GACT_STRINGCENTER; g->Activation |= GACT_STRINGEXTEND; se.InitialModes = NULL; ((struct StringInfo *)g->SpecialInfo)->Extension = &se; AddGList(w,glist,-1L,-1L,NULL); RefreshGList(glist,w,NULL,-1); GT_RefreshWindow(w,NULL); ActivateGadget(g,w,NULL); while(1) { WaitPort(w->UserPort); while(HandleMsg(w->UserPort)); if(VW_class == IDCMP_GADGETUP) { if(kind == STRING_KIND) { strcpy(VW_fbuf,((struct StringInfo *)g->SpecialInfo)->Buffer); CloseWindow(w); w = 0L; ErrorLine(Lines[2]); if(FindFrom(VW_text,VW_fbuf,&VW_search,VW_first,VW_mode)) { VW_found = TRUE; DoFound(); InfoLine(); goto CleanExit; } else { VW_found = FALSE; DisplayBeep(VW_scr); InfoLine(); goto CleanExit; } } else { CloseWindow(w); w = 0L; VW_num = ((struct StringInfo *)g->SpecialInfo)->LongInt; if(VW_num > 0 && VW_num < 100) { sizen = VW_num * VW_text->NumBytes / 100; for(line = VW_text->First; line->Next; line = line->Next) { sizex += line->Size; if(sizex > sizen) break; } VW_first = line; for(i = 1; i < VW_maxlin; i++ ) if((VW_first = VW_first->Prev) == VW_text->First) break; VW_last = VW_first; for(i = 1; i < VW_maxlin; i++) if((VW_last = VW_last->Next) == VW_text->Last->Next) break; VW_shown = 0L; for(line = VW_text->First; line != VW_last->Next; line = line->Next) VW_shown += line->Size; Inform(ClearStr); DisplayText(); goto CleanExit; } else if(VW_num == 100) { Bottom(); goto CleanExit; } else if(!VW_num) { Top(); goto CleanExit; } else { DisplayText(); DisplayBeep(VW_scr); goto CleanExit; } } } } } } } } CleanExit: if(w) CloseWindow(w); if(vi) FreeVisualInfo(vi); if(glist) FreeGadgets(glist); ClearMsg(VW_wnd->UserPort); } struct Line *MakeNewLine( UBYTE *text ) { struct Line *line = NULL, *rep; UBYTE *txt = NULL; UWORD len; rep = VW_first; len = strlen(text)+1; if((line = (struct Line *)AllocItem(VW_text->MemoryUsed,(ULONG)sizeof(struct Line),MEMF_PUBLIC))) { if(txt = (UBYTE *)AllocItem(VW_text->MemoryUsed,(ULONG)len,MEMF_PUBLIC)) { strcpy(txt,text); if(txt[len-1] != 0x0A) txt[len-1] = 0x0A; line->Flags = rep->Flags; line->Size = len-1; line->Text = txt; Insert((void *)VW_text,(void *)line,(void *)rep); Remove(rep); FreeItem(VW_text->MemoryUsed,rep->Text,rep->Size); FreeItem(VW_text->MemoryUsed,rep,(ULONG)sizeof(struct Line)); VW_first = line; Inform(ClearStr); DisplayText(); return; } } ErrorLine(Lines[1]); if(txt) FreeItem(VW_text->MemoryUsed,txt,len); if(line) FreeItem(VW_text->MemoryUsed,line,(ULONG)sizeof(struct Line)); } void EditLine( void ) { struct Gadget *g = 0L, *glist = 0L; struct Window *w = 0L; struct NewGadget ng; APTR vi = 0L; UBYTE TextLine[257]; if(!VW_text) return; setmem(&ng,sizeof(struct NewGadget),0); setmem(&TextLine[0],257,0); nwe.Screen = VW_scr; nwe.LeftEdge = (VW_wnd->Width >> 1) - 166; nwe.TopEdge = (VW_wnd->Height >> 1) - 12; if((w = OpenWindowTagList(&nwe,(struct TagItem *)&NewWindowTags1[0]))) { if((vi = GetVisualInfoA(VW_scr,(struct TagItem *)&StringTags[4]))) { if((g = CreateContext(&glist))) { ng.ng_LeftEdge = w->BorderLeft; ng.ng_TopEdge = w->BorderTop; ng.ng_Width = 320; ng.ng_Height = 12; ng.ng_TextAttr = &TOPAZ_80; ng.ng_VisualInfo = vi; strncpy(TextLine,VW_first->Text,VW_first->Size); StringTags1[1] = TextLine; StringTags1[3] = MAXCOL(VW_wnd,VW_font); g = CreateGadgetA(STRING_KIND,g,&ng,(struct TagItem *)&StringTags1[0]); g->Activation |= GACT_STRINGEXTEND; se.InitialModes = SGM_NOFILTER; ((struct StringInfo *)g->SpecialInfo)->Extension = &se; if(g) { g->Activation |= GACT_STRINGCENTER; AddGList(w,glist,-1L,-1L,NULL); RefreshGList(glist,w,NULL,-1); GT_RefreshWindow(w,NULL); ActivateGadget(g,w,NULL); while(1) { WaitPort(w->UserPort); while(HandleMsg(w->UserPort)); if(VW_class == IDCMP_GADGETUP) { MakeNewLine((UBYTE *)((struct StringInfo *)g->SpecialInfo)->Buffer); break; } else break; } } } } } CleanExit: if(w) CloseWindow(w); if(vi) FreeVisualInfo(vi); if(glist) FreeGadgets(glist); ClearMsg(VW_wnd->UserPort); } void FindN( void ) { if(!VW_text) return; if(VW_found) { ErrorLine(Lines[2]); if(NextOccurrence(&VW_search,VW_mode)) { DoFound(); InfoLine(); return; } } InfoLine(); DisplayBeep(VW_scr); } void FindP( void ) { if(!VW_text) return; if(VW_found) { ErrorLine(Lines[2]); if(PreviousOccurrence(&VW_search,VW_mode)) { DoFound(); InfoLine(); return; } } InfoLine(); DisplayBeep(VW_scr); } /* * Run the editor described in the environment variable * 'EDITOR'. The editor may NOT be crunched! */ void EditFile( void ) { struct Segment *resseg; BPTR segment; WORD elen, rc; UBYTE ebuf[256]; /* should be enough to hold the editor path & name */ if(!VW_text) return; if((elen = GetVar("EDITOR",ebuf,256,NULL)) > 0) { Forbid(); resseg = FindSegment(ebuf,0,0); Permit(); if(resseg) { /* Found it on the resident list */ ScreenToBack(VW_scr); rc = RunCommand(resseg->seg_Seg,8192L,VW_name,strlen(VW_name)); goto RunExit; } else if((segment = LoadSeg(ebuf))) { /* loaded it from disk */ ScreenToBack(VW_scr); rc = RunCommand(segment,8192L,VW_name,strlen(VW_name)); UnLoadSeg(segment); goto RunExit; } else { ErrorLine("Could not run the editor !"); goto CleanExit; } } else { ErrorLine("ENV:EDITOR variable not set (Use SetEnv) !"); goto CleanExit; } RunExit: sprintf(ebuf,"Editor return code : %ld",rc); ErrorLine(ebuf); CleanExit: ScreenToFront(VW_scr); return; } long CheckBlock( UWORD mark ) { UBYTE errl[31]; if(!VW_blk[mark].TopLine || !VW_blk[mark].BottomLine) { sprintf(errl,Lines[4],mark+1); ErrorLine(errl); return(FALSE); } return(TRUE); } void PrintFile( void ) { if(!VW_text) return; if(VW_pmode == PRT_BLOCK) { if(!CheckBlock(VW_pmark)) return; } ProcessTags[1] = PrintProc; if(!CreateNewProc((struct TagItem *)&ProcessTags[0])) ErrorLine("Can't start printing process !"); else { while(!FindTask(Lines[3])); VW_printing = TRUE; } } __geta4 void PrintProc( void ) { struct BuffIO *pfile = 0L; struct Window *pwin = 0L; struct IntuiMessage *pmsg; struct Line *l, *t; ULONG class; if(!VW_text) return; if((pfile = BOpen("PRT:",MODE_NEWFILE))) { nwp.Screen = VW_scr; if((pwin = OpenWindow(&nwp))) { if(VW_pmode == PRT_PAGE) { l = VW_first; t = VW_last; } else if(VW_pmode == PRT_FILE) { l = VW_text->First; t = VW_text->Last->Next; } else { l = VW_blk[VW_pmark].TopLine; t = VW_blk[VW_pmark].BottomLine; } for( ; l != t; l = l->Next) { if((pmsg = GT_GetIMsg(pwin->UserPort))) { class = pmsg->Class; GT_ReplyIMsg(pmsg); } if(class == IDCMP_CLOSEWINDOW) goto CleanExit; BPutS(pfile,l); if(BIoErr(pfile) != ASE_OK) { ErrorLine("Print error !"); goto CleanExit; } } } } else ErrorLine("Printer trouble !"); CleanExit: if(pwin) CloseWindow(pwin); if(pfile) BClose(pfile); } long IsItADir( void ) { struct FileInfoBlock *fib; BPTR lock; long ret = -1L; if((fib = AllocMem((ULONG)sizeof(struct FileInfoBlock),MEMF_PUBLIC))) { if((lock = Lock((char *)&VW_name[0],ACCESS_READ))) { Examine(lock,fib); ret = fib->fib_DirEntryType; UnLock(lock); } FreeMem(fib,(ULONG)sizeof(struct FileInfoBlock)); } return(ret); } long ParseName( char *arg ) { char *str; if(arg) { if((str = (char *)strrchr(arg,'/')) || (str = (char *)strrchr(arg,':'))) { if(IsItADir() < 0) { str++; File = &VW_name[str-arg]; *str = 0; Dir = arg; if(strlen(File)) return TRUE; else return FALSE; } else { Dir = &VW_name[0]; File = &NullStr; return FALSE; } } if(arg[0]) { if(IsItADir() > 0) { Dir = arg; File = &NullStr; return FALSE; } else { File = arg; Dir = &NullStr; return TRUE; } } } Dir = File = &NullStr; return FALSE; } long CheckPP( void ) { BPTR file; ULONG ident; if(!(file = Open(VW_name,MODE_OLDFILE))) { strcat(VW_name,".pp"); if(!(file = Open(VW_name,MODE_OLDFILE))) { ErrorLine("Could not open the file"); return FALSE; } } Read(file,&ident,4L); Close(file); if(ident == 'PP20' || ident == 'PX20') return TRUE; return FALSE; } void myMain( BOOL cli ) { struct WBArg *wba; OpenLibs(); GetRequest(); if(NOT cli) { if(_WBMsg->sm_ArgList->wa_Lock) CurrentDir(_WBMsg->sm_ArgList->wa_Lock); } SetupComm(); MainLoop(); return; } void SetMark( UWORD mark ) { struct Line *line, *lt; UBYTE errl[31]; if(!VW_text) return; if(!VW_blk[mark].TopLine) { VW_blk[mark].TopLine = VW_first; return; } else if(!VW_blk[mark].BottomLine) { VW_blk[mark].BottomLine = VW_last; for(line = VW_text->First; line->Next; line = line->Next) { if(line == VW_blk[mark].TopLine) break; else if(line == VW_blk[mark].BottomLine) { lt = VW_blk[mark].TopLine; VW_blk[mark].TopLine = line->Prev; VW_blk[mark].BottomLine = lt->Next; break; } } sprintf(errl,"Block %-2.2ld marked !",mark+1); ErrorLine(errl); return; } else { sprintf(errl,"Block %-2.2ld already marked !",mark+1); ErrorLine(errl); return; } } void UnSetMark( UWORD mark ) { UBYTE errl[31]; if(!VW_text) return; VW_blk[mark].TopLine = VW_blk[mark].BottomLine = NULL; sprintf(errl,"Block %-2.2ld unmarked !",mark+1); ErrorLine(errl); } void JumpMark( UWORD mark ) { struct Line *line; if(!VW_text) return; if(!CheckBlock(mark)) return; VW_first = VW_blk[mark].TopLine; Inform(ClearStr); DisplayText(); VW_shown = 0L; for(line=VW_text->First; line != VW_last; line = line->Next) VW_shown += line->Size; Percentage(); } void SaveBlock( WORD mark ) { struct BuffIO *ofile; struct Line *f, *t; ULONG ret; UBYTE oname[256]; if(mark >= 0) { if(!CheckBlock(mark)) return; } else { if(NOT VW_text) return; } RequestTags2[1] = VW_wnd; RequestTags2[3] = SDir; RequestTags2[5] = SFile; if(mark >= 0) RequestTags2[9] = "Save text block as..."; else RequestTags2[9] = "Save text as..."; ret = AslRequest(VW_save,(struct TagItem *)&RequestTags2[0]); if(ret) { SDir = VW_save->rf_Dir; SFile = VW_save->rf_File; strcpy(oname,SDir); strcpy(VW_patt,VW_save->rf_Pat); CheckDir(oname); strcat(oname,SFile); } else { InfoLine(); return; } if((ofile = BOpen((char *)&oname[0],MODE_NEWFILE))) { ErrorLine("Writing..."); if(mark >= 0) { f = VW_blk[mark].TopLine; t = VW_blk[mark].BottomLine; } else { f = VW_text->First; t = VW_text->Last->Next; } for( ; f != t; f = f->Next ) BPutS(ofile,f); if(BClose(ofile) != ASE_OK) ErrorLine("Write Error !"); } else ErrorLine("Can't open write file !"); InfoLine(); } void SetupComm( void ) { struct WBArg *wba; char *popwindow, **tooltypes; long priority; if(_WBMsg) { tooltypes = ArgArrayInit( 0L, _WBMsg ); priority = ArgInt( tooltypes, CX_PRIORITY, CX_DEF_PRIORITY ); popwindow = ArgString( tooltypes, CX_POPWINDOW, CX_DEF_POPWINDOW ); VW_viewstr = ArgString( tooltypes, CX_VIEW, CX_DEF_VIEW ); VW_flushstr = ArgString( tooltypes, CX_FLUSH, CX_DEF_FLUSH ); VW_quitstr = ArgString( tooltypes, CX_QUIT, CX_DEF_QUIT ); wba = (struct WBArg *)_WBMsg->sm_ArgList; if(_WBMsg->sm_NumArgs > 1) { wba++; CurrentDir(wba->wa_Lock); strcpy(VW_name,(char *)wba->wa_Name); VW_namestr = (char *)wba->wa_Name; } } else { strcpy(VW_name,(char *)VW_args[0]); VW_namestr = (char *)VW_args[0]; if(VW_args[1]) priority = VW_args[1]; else priority = CX_DEF_PRIORITY; if(VW_args[2]) popwindow = (char *)VW_args[2]; else popwindow = CX_DEF_POPWINDOW; if(VW_args[3]) VW_viewstr = (char *)VW_args[3]; else VW_viewstr = CX_DEF_VIEW; if(VW_args[4]) VW_flushstr = (char *)VW_args[4]; else VW_flushstr = CX_DEF_FLUSH; if(VW_args[5]) VW_quitstr = (char *)VW_args[5]; else VW_quitstr = CX_DEF_QUIT; } if(NOT Stricmp( popwindow, CX_DEF_POPWINDOW )) VW_dopen = TRUE; else VW_dopen = FALSE; if(NOT( VW_cxport = CreateMsgPort())) Quit( RETURN_FAIL ); VW_newbroker.nb_Pri = priority; VW_newbroker.nb_Port = VW_cxport; VW_cxmask = BitMask( VW_cxport->mp_SigBit ); if(NOT( VW_broker = CxBroker( &VW_newbroker, NULL ))) Quit( RETURN_FAIL ); if(NOT( VW_quit = HotKey( VW_quitstr, VW_cxport, CXC_QUIT ))) Quit( RETURN_FAIL ); AttachCxObj( VW_broker, VW_quit ); if(NOT( VW_flush = HotKey( VW_flushstr, VW_cxport, CXC_FLUSH ))) Quit( RETURN_FAIL ); AttachCxObj( VW_broker, VW_flush ); if(NOT( VW_view = HotKey( VW_viewstr, VW_cxport, CXC_VIEW ))) Quit( RETURN_FAIL ); AttachCxObj( VW_broker, VW_view ); if(CxObjError( VW_quit ) || CxObjError( VW_flush ) || CxObjError( VW_view )) Quit( RETURN_FAIL ); if(_WBMsg) ArgArrayDone(); CxOn( VW_broker ); } void QuitComm( void ) { struct Message *tmp; if(VW_broker) DeleteCxObjAll( VW_broker ); if(VW_cxport) { ClearMsg( VW_cxport ); DeleteMsgPort( VW_cxport ); } } void MainLoop( void ) { struct Message *msg; struct IntuiMessage *imsg; ULONG sig, type, id, class; BOOL running = TRUE; if(VW_dopen) OpenDisplay(); do { if(VW_isopen) Percentage(); sig = Wait( SIGBREAKF_CTRL_C | VW_cxmask | VW_idmask ); if(( sig & SIGBREAKF_CTRL_C ) == SIGBREAKF_CTRL_C ) { running = FALSE; } else if(( sig & VW_cxmask ) == VW_cxmask ) { while (( msg = (struct Message *)GetMsg( VW_cxport ))) { id = CxMsgID((CxMsg *)msg); type = CxMsgType((CxMsg *)msg); ReplyMsg(msg); switch( type ) { case CXM_IEVENT: switch( id ) { case CXC_VIEW: if(NOT VW_isopen) OpenDisplay(); else ScreenToFront( VW_scr ); break; case CXC_FLUSH: if(NOT VW_isopen) { FreeAscii(VW_text); VW_text = NULL; } break; case CXC_QUIT: if(NOT VW_isopen) running = FALSE; break; } break; case CXM_COMMAND: switch( id ) { case CXCMD_KILL: running = FALSE; break; case CXCMD_DISABLE: CxOff( VW_broker ); break; case CXCMD_ENABLE: CxOn( VW_broker ); break; case CXCMD_UNIQUE: case CXCMD_APPEAR: if(NOT VW_isopen) OpenDisplay(); else ScreenToFront( VW_scr ); break; case CXCMD_DISAPPEAR: if(VW_isopen) CloseDisplay(); break; } break; } } } else if(VW_isopen) { if(( sig & VW_idmask ) == VW_idmask) { while(HandleMsg(VW_wnd->UserPort)) { Percentage(); Forbid(); if(!FindTask(Lines[3])) VW_printing = FALSE; Permit(); if(VW_class == IDCMP_RAWKEY) HandleKeyboard( VW_code, VW_qual ); } } } } while( running == TRUE ); if(VW_isopen) CloseDisplay(); CxOff( VW_broker ); Quit(NULL); } extern struct Library *SysBase; /* * I don't use the stdio routines from the c.lib and * I use "ReadArgs()" to parse the arguments so I can * safely use the "_main" entry point. This saves a * hell of a lot of bytes in the executable. */ void _main( void ) { struct Process *proc = FindTask(NULL); if(SysBase->lib_Version < 36) /* sanity check */ _exit(RETURN_FAIL); if(proc->pr_CLI) { if((VW_fargs = ReadArgs(Template,&VW_args[0],&VW_iargs))) myMain(TRUE); return; } else { myMain(FALSE); return; } _waitwbmsg(); /* to get the workbench message, dummy! never called! */ atoi(""); }