home *** CD-ROM | disk | FTP | other *** search
- #include "globals.h"
- #include "minrexx.h"
- #include "ARexxWdw.h"
-
- extern struct RxsLib *RexxSysBase;
- struct RexxMsg *LinerRexxMsg;
- int LinerDispatch();
-
- /*Function definitions private to arexx.c*/
- void DoOpen(),DoSave(),DoDoubClick(),DoSetTitleMsg();
- void DoGetStats(),DoPrintDisk(),DoGetChar(),DoGetWord(),DoGetLineText();
- void DoCursorRight(),DoCursorLeft(),DoDoubSpacing(),DoInterlaced();
- void DoIcons(),DoScrnSize(),DoStartingLevel(),DoLoadPrefs(),DoARexxSearch();
- void DoInsertText();
- void DoGetLine(),DoStartLine(),DoEndLine(),DoPushIn(),DoPullOut();
- void DoFakeReturn(),SpecReplyToRexx();
- void DoGetFilename(),DoPutPrefs();
-
- struct rexxCommandList rcl[]= /*The list of all the ARexx commands and*/
- { /*their associated functions*/
- { "open" , (APTR)&DoOpen},
- { "save" , (APTR)&DoSave},
- { "getfilename" , (APTR)&DoGetFilename},
- { "new" , (APTR)&NewAll},
- { "printprinter", (APTR)&HandlePrintPrinter},
- { "printdisk" , (APTR)&DoPrintDisk},
- { "quit" , (APTR)&CloseStuff },
- { "doubclick" , (APTR) &DoDoubClick},
- { "settitlemsg" , (APTR) &DoSetTitleMsg},
- { "getstats" , (APTR) &DoGetStats},
- { "getchar" , (APTR) &DoGetChar},
- { "getword" , (APTR) &DoGetWord},
- { "getlinetext" , (APTR) &DoGetLineText},
- { "cut" , (APTR) &HandleCut},
- { "copy" , (APTR) &HandleCopy},
- { "paste" , (APTR) &HandlePaste},
- { "erase" , (APTR) &HandleErase},
- { "cursorup" , (APTR) &CursorUp},
- { "cursordown" , (APTR) &CursorDown},
- { "cursorright" , (APTR) &DoCursorRight},
- { "cursorleft" , (APTR) &DoCursorLeft},
- { "totop" , (APTR) &JumpToTop},
- { "tobottom" , (APTR) &JumpToBottom},
- { "upscreen" , (APTR) &WholeScreenUp},
- { "downscreen" , (APTR) &WholeScreenDown},
- { "doubspacing" , (APTR) &DoDoubSpacing},
- { "interlaced" , (APTR) &DoInterlaced},
- { "icons" , (APTR) &DoIcons },
- { "scrnsize" , (APTR)&DoScrnSize},
- { "startinglevel" , (APTR)&DoStartingLevel},
- { "loadprefs" , (APTR)&HandleReloadPrefs},
- { "sveprefs" , (APTR)&DoPutPrefs},
- { "search" , (APTR)&DoARexxSearch},
- { "instext" , (APTR)&DoInsertText},
- { "getline" , (APTR)&DoGetLine},
- { "fakereturn" , (APTR)&DoFakeReturn},
- { "fakebs" , (APTR)&HandleBS},
- { "pushin" , (APTR)&DoPushIn},
- { "pullout" , (APTR)&DoPullOut},
- { "startline" , (APTR)&DoStartLine},
- { "endline" , (APTR) &DoEndLine},
- { NULL , NULL}
- };
-
- void OpenARexx() /*Open the ARexx port*/
- {
- ARexxSigBit=upRexxPort("liner",rcl,"liner",&LinerDispatch);
- }
-
- void CloseARexx() /*Close the ARexx port*/
- {
- dnRexxPort();
- }
-
- void CheckRexxPort() /*Check the ARexx port for commands*/
- {
- dispRexxPort();
- }
-
- int LinerDispatch(msg,rcl,p) /*The minrexx userdisp function*/
- struct RexxMsg *msg;
- struct rexxCommandList *rcl;
- char *p;
- {
-
- LinerRexxMsg=(struct RexxMsg *)msg;
-
- ((int(*)())(rcl->userdata))(p); /*Call the function associated with the */
- /*ARexx command received*/
-
- /*If the function is one of those that returns something to ARexx*/
- if(strcmp(rcl->name,"open")==0 || strcmp(rcl->name,"printdisk")==0 ||
- strcmp(rcl->name,"getlinetext")==0 || strcmp(rcl->name,"getline")==0 ||
- strcmp(rcl->name,"getchar")==0 || strcmp(rcl->name,"linersearch")==0 ||
- strcmp(rcl->name,"getstats")==0 || strcmp(rcl->name,"getword")==0 ||
- strcmp(rcl->name,"startinglevel")==0||strcmp(rcl->name,"fakereturn")==0
- || strcmp(rcl->name,"pushin") || strcmp(rcl->name,"pullout") ||
- strcmp(rcl->name,"getfilename") || strcmp(rcl->name,"sveprefs") )
- return(1); /*Tell minrexx not to replyRexxCmd()*/
- else
- return(0);
- }
-
- void DoOpen(p) /*Open a file under ARexx control*/
- char *p;
- {
-
- /*Setup the filename*/
- strcpy(FileName,&p[1]);
- if(ReadItemList(FileName,TRUE)) /*Do the read*/
- {
- Modified=FALSE;
- TitleErrorCancel();
- SplitFilename(FileName,SFileName,SDirName);
- replyRexxCmd(LinerRexxMsg,0,0,"true");
- }
- else
- replyRexxCmd(LinerRexxMsg,0,0,"false");
- }
-
- void DoSave(p) /*Save a file under ARexx*/
- char *p;
- {
- strcpy(FileName,&p[1]);
- SplitFilename(FileName,SFileName,SDirName);
- Save(); /*Write the file out*/
- }
-
- void DoGetFilename()
- {
- char filename[183];
-
- strcpy(filename,SDirName);
- if(filename[strlen(filename)-1]!=':' && filename[strlen(filename)-1]!=NULL)
- strcat(filename,"/"); /*Append a / if not at the root*/
- strcat(filename,SFileName);
- replyRexxCmd(LinerRexxMsg,0,0,filename);
- }
-
- void DoPrintDisk(p) /*Print a file to disk*/
- char *p;
- {
- SplitFilename(++p,PFileName,PDirName);
- SpecReplyToRexx(HandlePrintDisk(TRUE,p),TRUE);
- }
-
- void DoDoubClick(p) /*Fake a double click (good for highlighting blocks)*/
- char *p;
- {
- p++;
- PtrY=CurY;
- if(strcmp(p,"true")==0) /*if the click is meant to be outside a line*/
- PtrX=1;
- else
- PtrX=CurX;
- HandleInvs();
- BLastX=CurX;
- }
-
- void DoSetTitleMsg(p) /*Print message in 'p' in title bar*/
- char *p;
- {
- TitleError(&p[1]);
- }
-
- void DoGetStats() /*Tell ARexx the CurrentItem's level, number, and */
- { /*whether or not it's a continuation*/
- char buffer1[7];
- static char buffer2[12];
-
- stci_d(buffer2,CurrentItem->Level); /*Convert the numbers into text*/
- strcat(buffer2," ");
- stci_d(buffer1,CurrentItem->ItemNumber);
- strcat(buffer2,buffer1);
- if(CurrentItem->cont)
- strcat(buffer2," true"); /*true==continuation*/
- else
- strcat(buffer2," false");
-
- replyRexxCmd(LinerRexxMsg,0,0,buffer2);
-
-
- }
-
- void DoGetChar() /*Send the character under the cursor to ARexx*/
- {
- char letter[2];
-
- letter[1]=NULL;
- letter[0]=CurrentItem->Text[PosInText(CurrentItem->Level)];/*Get the letter*/
- replyRexxCmd(LinerRexxMsg,0,0,letter);
- }
-
- void DoGetWord() /*Send the word under the cursor to ARexx*/
- {
- static result[80];
- BYTE c;
-
- for(c=0;c<80;result[c++]=NULL); /*Clear the string (weird things happen*/
- /*if I don't, and I don't know why...)*/
- strcpy(result,"");
- GetWord(result,CurrentItem);
- replyRexxCmd(LinerRexxMsg,0,0,result);
- }
-
- void DoGetLineText() /*Send the current line's text to ARexx*/
- {
- static buffer[100];
- strcpy(buffer,CurrentItem->Text);
- replyRexxCmd(LinerRexxMsg,0,0,buffer);
- }
-
- void DoCursorRight() /*Move the cursor to the right*/
- {
- CursorRight(0);
- }
-
- void DoCursorLeft() /*Move the cursor to the left*/
- {
- CursorLeft(0);
- }
-
- void DoDoubSpacing(p) /*Set the spacing*/
- char *p;
- {
- p++;
- if(strcmp(p,"true")==0) /*Set double spacing*/
- {
- if(!prefs.DS) /*If not double spaced*/
- {
- DoubleSpacing();
- ModifyMenus(32+StartingLevel); /*Change menus appropriately*/
- }
- }
- else /*Unset double spacing*/
- if(prefs.DS) /*If double spaced*/
- {
- DoubleSpacing();
- ModifyMenus(StartingLevel);
- }
- }
-
- void DoInterlaced(p) /*Determine whether the screen is/isn't interlaced*/
- char *p;
- {
- p++;
-
- if(!prefs.Laced) /*If interlaced*/
- {
- if(strcmp(p,"true")==0) /*Switch to non-interlaced*/
- {
- HandleInterlaced();
- ModifyOtherMenus(1);
- }
- }
- else
- if(strcmp(p,"false")==0) /*Switch to interlaced*/
- {
- HandleInterlaced();
- ModifyOtherMenus(1);
- }
-
- }
-
- void DoIcons(p) /*Set program to create/not create icons*/
- char *p;
- {
- p++;
- if(((prefs.Icons) && (strcmp(p,"false")==0)) ||
- ((!prefs.Icons) && (strcmp(p,"true")==0) ) )
- {
- ModifyOtherMenus(2); /*Modify the menu flag*/
- HandleIcons();
- }
- }
-
- void DoScrnSize(p) /*Set the screen size (workbench or standard)*/
- char *p;
- {
- p++;
-
- if( ( (prefs.Screen == 0) && (strcmp(p,"workbench")==0) ) ||
- ( (prefs.Screen == 1) && (strcmp(p,"standard")==0) ) )
- {
- ModifyOtherMenus(3); /*Modify the menu flag*/
- SwapScrnSize(); /*Change the screen size*/
- }
- }
-
- void DoStartingLevel(p) /*Set the starting level*/
- char *p;
- {
- int level;
- p++;
- p[1]=NULL;
- stcd_i(p,&level); /*Get the level (as a number)*/
- if(level < 0 || level > 5)
- SpecReplyToRexx(FALSE);
- if(level == StartingLevel)
- SpecReplyToRexx(TRUE);
-
- if(prefs.DS) /*If double spaced*/
- level+=32; /*Alter level for ModifyMenus()*/
- ModifyMenus(level);
- StartingLevel=level; /*Record the new starting level*/
- Refresh(); /*And update the display*/
- SpecReplyToRexx(TRUE);
-
- }
-
- void DoARexxSearch(p) /*Do a search/replace*/
- char *p;
- {
- BYTE cse,partial,repl,c,i,old;
- char search[80],replace[80];
- search[0]=replace[0]=NULL;
-
- for(c=0;c<80;search[c++]=NULL)
- replace[c]=NULL;
-
- cse=Interp(p[1]);
- partial=Interp(p[2]);
- repl=Interp(p[3]);
-
- if(!(p[4]==NULL || p[5]==NULL)) /*If there is a word to search for*/
- { /*use it. Otherwise, use what the user has specified*/
- for(c=5,i=0;p[c] != NULL && p[c]!=' ';i++,c++);
- strncpy(search,&p[5],i);
- if(p[c]!=NULL && p[c+1]!=NULL)
- {
- for(old=++c,i=0;p[c]!=NULL && p[c]!=' ';++i,c++);
- strncpy(replace,&p[old],i);
- }
- }
-
- /*Set the appropriate search variables*/
- ModifyParams(search,replace,cse,partial,repl);
- if(DoSearch(TRUE,TRUE)) /*Do the actual search*/
- strcpy(search,"true");
- else
- strcpy(search,"false");
-
- /*Give ARexx the result*/
- replyRexxCmd(LinerRexxMsg,0,0,search);
-
- }
-
- Interp(p) /*Used by DoARexxSearch. Determines if a parameter send by ARexx*/
- char p; /*specified setting a search variable to TRUE, FALSE, or leaving it*/
- { /*unchanged*/
- switch(p)
- {
- case 't':
- case 'T':
- return(TRUE);
- case 'f':
- case 'F':
- return(FALSE);
- case 'u':
- case 'U':
- return(100); /*Unchanged*/
- }
- return(100); /*If none of the above, something's screwy. Best to not*/
- } /*change anything*/
-
- void DoInsertText(p) /*Insert a text string into the line after the cursor*/
- char *p;
- {
- char WorkString[160];
- UBYTE TempX;
-
- WorkString[0]=NULL;
-
- strcpy(WorkString,CurrentItem->Text);
- WorkString[PosInText(CurrentItem->Level)]=NULL;
- strcat(WorkString,&p[1]);
- strcat(WorkString,&CurrentItem->Text[PosInText(CurrentItem->Level)]);
- WorkString[MaxLen(CurrentItem->Level)]=NULL;
- strcpy(CurrentItem->Text,WorkString);
- TempX=CurX;
- PlotCursor(1,CurY);
- PrintItem(CurrentItem);
- PlotCursor(TempX,CurY);
-
- }
-
- void DoGetLine() /*Return an entire line to ARexx (incl. line number)*/
- {
- static buffer[100]; /*static to make sure it doesn't disappear before*/
-
- MakeTextLine(buffer,CurrentItem); /*ARexx gets it*/
- buffer[strlen(CurrentItem->Text)-1]=NULL;
- replyRexxCmd(LinerRexxMsg,0,0,buffer);
- }
-
- void DoFakeReturn(p) /*Let ARexx push the return button (i.e. create a line)*/
- char *p;
- {
- BYTE stat;
- p++;
- if(strcmp(p,"shift")==0)
- stat=HandleReturn(3);
- else
- stat=HandleReturn(0);
- SpecReplyToRexx(stat);
- }
-
- void DoStartLine()
- {
- CursorLeft(8); /*Fake a SHIFT-CURSOR-LEFT*/
- }
-
- void DoEndLine()
- {
- CursorRight(8); /*Fake a SHIFT-CURSOR-RIGHT*/
- }
-
- void DoPushIn() /*Fake a TAB*/
- {
- SpecReplyToRexx(HandleTAB(0));
- }
-
- void DoPullOut() /*Fake a SHIFT-TAB*/
- {
- SpecReplyToRexx(HandleTAB(3));
- }
-
- void DoPutPrefs()
- {
- SpecReplyToRexx(PutPrefs("liner:liner.prefs",TRUE));
- }
-
- void SpecReplyToRexx(stat) /*Send a 'true' or 'false' to ARexx*/
- BYTE stat;
- {
- if(stat)
- replyRexxCmd(LinerRexxMsg,0,0,"true");
- else
- replyRexxCmd(LinerRexxMsg,0,0,"false");
- }
-
- void GetWord(result,item) /*Get the word under the cursor*/
- char *result;
- struct LineItem *item;
- {
- BYTE start,end,pos;
-
- pos=PosInText(CurrentItem->Level);
- if(pos>=strlen(CurrentItem->Text))
- {
- strcpy(result,"");
- return;
- }
-
- start=pos;
- if(pos!=0)
- for(start--;CurrentItem->Text[start]!=' ' && start >= 0;start--);
-
- if(CurrentItem->Text[pos]!=NULL) /*Not at the end of the line...*/
- for(end=pos;CurrentItem->Text[end]!=' ' && CurrentItem->Text[end]!=NULL;
- end++);
-
- strncpy(result,&CurrentItem->Text[start+1],end-start);
- }
-
- void EngageMacro(name) /*Start an external ARexx macro ('ENGAGE!' - J-LP :-)*/
- char *name;
- {
- asyncRexxCmd(name);
- }
-
- void GetMacroInfo() /*Open the window to get the macro names*/
- {
- struct Window *MacroWdw;
- struct IntuiMessage *mesg;
- struct Gadget *gadg;
- char Name[4][80],Macro[4][80];
- BYTE c;
-
- for(c=0;c<4;c++) /*Store the Names and Macro filename in case CANCEL*/
- { /*gets pushed*/
- strcpy(Name[c],prefs.Name[c]);
- strcpy(Macro[c],prefs.Macro[c]);
- }
-
- NewWindowStructure1.Screen=(struct Screen *) Screen;
- MacroWdw=(struct Window *)OpenWindow(&NewWindowStructure1);
- if(MacroWdw==NULL)
- {
- Leave(0,"Couldn't open the window!");
- return;
- }
-
- PrintIText(MacroWdw->RPort,&IntuiTextList1,0,0); /*Print the text*/
-
- Wait(1<<MacroWdw->UserPort->mp_SigBit); /*Wait for Done to be pressed*/
-
- mesg=(struct IntuiMessage *)GetMsg(MacroWdw->UserPort);
- gadg=(APTR)mesg->IAddress;
- ReplyMsg(mesg);
-
- if(gadg->GadgetID == 10) /*Cancel was pressed*/
- for(c=0;c<4;c++)
- {
- strcpy(prefs.Name[c],Name[c]);
- strcpy(prefs.Macro[c],Macro[c]);
- }
- else /*OK*/
- CopyPrefsToMenus();
-
- CloseWindow(MacroWdw);
- }
-
- void SplitFilename(Filename,file,dir) /*Split a full filename into */
- char *Filename,*file,*dir; /*path, filename, and extension*/
- {
- char path[150];
- char ext[150];
-
- strsfn(Filename,dir,path,file,ext);
- strcat(dir,path);
- strcpy(file,&Filename[strlen(dir)+((Filename[strlen(dir)]=='/') ? 1 : 0)]);
- /* strcat(file,ext); */
- }
-
- /*End of arexx.c*/
-