======= AREXX CMDS ======
Major modifications to this file by Kerry Zimmerman [71470,1340] 4/14/89
o  Changed output buffer to 62, input buffer to 61 to avoid conflict with
   Eric Kennedy's VI extensions.
o  altctl-9 now displays current autotraffic status
o  altctl-0 now asks for a command name and a list of macronums.
   It adds these to the end of file U:REXXCOMM.  This file is a database
   of macros understood by the new rexx autotraffic handler.

Edit Rexx output buffer 62
<altCtl-1:
	equateLoc(buf62,sPage,sFile)
	editBuf(buf62) >

Edit Rexx input buffer 61
<altCtl-2:
	equateLoc(buf61,sPage,sFile)
	editBuf(buf61) >

Send output buffer 62 to Rexx
<altCtl-3:
	equateNum(n98,0)					 .. 0 flag means send msg, not reply
	rexxOut(buf62,all,0,n98,n99)   .. 0 ActionResult means default to RXCOMM
	runKey(virtual-s) >

Fetch Rexx input into buffer 61
<altCtl-4:
	if (rexxIn(buf61,sFile,n97,n98,n99)) {
		..if (eqNum(n98,0)) {		.. if Msg
			equateLoc(buf61,sPage,sFile)
			editBuf(buf61)
		..}
	 }
	 runKey(virtual-r) >

Send hilite region to Rexx.
<altCtl-5:
	equateNum(n98,0)							   .. 0 means msg, not reply
	rexxOut(curFile,hilite,0,n98,n99)  .. 0 means default to Action = RXCOMM
	runKey(virtual-s) >

Fetch Rexx input at cursor
<altCtl-6:
	rexxIn(curFile,atCursor,n97,n98,n99)
	runKey(virtual-r) >

Send an OK reply to Rexx  (NOTE: Amiga-ESC abort sends Failed reply.)
<altCtl-7:
	equateNum(n98,1)							   .. 1 means reply, not msg
	rexxOut(" ",all,0,n98,n99)  						 .. 0 is OKAY result
	runKey(virtual-s) >

Send an OK reply to Rexx along with text in hilite region
<altCtl-8:
	equateNum(n98,1)
	rexxOut(curFile,hilite,0,n98,n99) ..text NOT sent, if not RXFB_RESULT msg
	runKey(virtual-s) >

Toggle flag to handle Rexx traffic automatically during idle periods.
<altCtl-9:
	.. will swap in the rexxKey cmd below
	if (getFlag(curFile,userGlobalB)) putMsg("AutoTraffic is OFF")
	else putMsg("AutoTraffic is ON")
	flipFlag(curFile,userGlobalB)							  .. toggle flag
	swapKey(rexxKey,virtual-t)    .. swap in/out the auto-traffic rexxKey cmd
>

Make an x.rexx program with commands to send to Uedit.
<altCtl-0:
	freebuf(buf35)
	if (!loadfile("REXXCOMM")) loadfile("S:REXXCOMM")
	movecursor(curFile,eFile)
	putmsg("Enter new command's name")
	freebuf(buf50)
	inputString(buf50)
	insertRgn(curFile,atCursor,buf50,all)
	insertRgn(curFile,atCursor,"		|
",all)
	movecursor(curFile,sChar)
	movecursor(curFile,sChar)
	updateDisplay
	while (nothing) {
		putMsg("Give desired inputs.  Amiga-ESC when done.  F2 to save.")
		getKeyVal(macroNum,inputChar)
		toWord(curFile,macroNum)
		insertChar(curFile,"+")
		toWord(curFile,inputChar)
		insertChar(curFile," ")
		updateDisplay
		fileSize(curFile,n54) .. force pack, avoid mem-abort
	}
>

<virtual-t:
	if (rexxIn(buf61,eFile,n97,n98,n99)) {  		 .. if fetched something
		 ..runKey(virtual-r)		 .. show flags - slower if use this line
		if (eqNum(n98,0)) { 				  .. if recvd a Msg, not a Reply

			equateNum(n96,0)
			push(n99,searchCaps)	 .. (RS mod)
			equateNum(searchCaps,0) .. turn off case sensitivity (RS mod)
			runkey(virtual-y)
			pop(n99,searchCaps) 	 .. restore orig case sensitivity (RS mod)
			freeBuf(buf61)
			if(not eqNum(n96,0)) return .. comand already sent a reply
			if(eqLoc(curFile,sInvert,eInvert)) goto label(50)
			rexxOut(curFile,Invert,0,1,n99) .. search uses this as an example
			return

label(50)	rexxOut(" ",all,0,1,n99)
		}
	}
>

handle named macro messages
<virtual-y:
				.. if buf35 doesn't contain the named commands yet
				.. read it in
					moveCursor(buf35,sfile)
					freeBuf(buf50)
					insertRgn(buf50,atCursor,"REXXCOMM",all)
		  			setSearch(buf50)
		  			if(not search(buf35,sHilite,eHilite,1)) {
						freeBuf(buf35)
						if(!insertFile(buf35,sfile,"REXXCOMM")
							& !insertFile(buf35,sfile,"S:REXXCOMM")) {
							putmsg("file REXXCOMM not found")
							returnFalse
						}
					}

				.. extract 1st word of buf61 which is the command
					moveCursor(buf61,sfile)
					equateLoc(buf61,sHilite,atCursor)
					moveCursor(buf61,eWord)
					equateLoc(buf61,eHilite,atCursor)
					freebuf(buf50)
					insertRgn(buf50,sFile,buf61,Hilite) ..save command

					clearRgn(buf61,Hilite) ..erase command leaving any args
					while(is(buf61,whiteSpace))
						clearChar(buf61)
					setSearch(buf50)

				.. search for this command in list of commands in buf35
					moveCursor(buf35,sfile)
					moveCursor(buf35,eLine) .. start search after 1st line
					if(not search(buf35,sHilite,eHilite,1)) {
						freeBuf(buf54)
						insertRgn(buf54,efile,"REXX command NOT found: ",all)
						insertRgn(buf54,efile,buf50,all)
						returnFalse
					}

				.. move to the first macronum
					moveCursor(buf35,eHilite)

				.. process each macronum+inputchar pair until "|" found

		   label(10)
					while(is(buf35,whitespace))
						moveCursor(buf35,echar)
				.. return if end of commands
					if(is(buf35,"|") | is(buf35,eFile)) returnTrue

				.. convert xx+yy to macronum-xx, inputchar-yy
					equateNum(macroNum,0)
					equateNum(inputChar,0)
					if(is(buf35,digit)) {
						toNumber(macroNum,buf35)
						while(is(buf35,digit))
							moveCursor(buf35,echar)
						if(is(buf35,"+")){
							moveCursor(buf35,echar)
							if(is(buf35,digit)){
								toNumber(inputChar,buf35)
								while(is(buf35,digit))
									moveCursor(buf35,echar)
							}
						}
					}
				 .. run valid macroNum, or type valid inputChar
					if(inUse(macroNum)) runKey(macroNum)
					else if(gtNum(inputChar,0)) TypeChar(inputChar)
					else return
					goto label(10) >


Show numbers for a received Arexx msg or reply
<virtual-r:
		if (not eqNum(n99,0)) runKey(virtual-m) 		  .. rexxIn() failed
		else {  									   .. rexxIn() succeeded
			if (eqNum(n98,0)) { 			 .. MSG: show action & modifiers
				and(n96,n97,0X0F000000) 			   .. get ACTION code
				and(n95,n97,0X000F0000) 			   .. get MODIFIER
				if(gtNum(n95,0)) div(n95,n95,0x10000)
				freeBuf(buf54)
				insertRgn(buf54,atCursor,"Msg fetched:  Action = ",all)
				toWord(buf54,n96)
				insertRgn(buf54,atCursor,"  Modifier = ",all)
				toWord(buf54,n95)
				..insertRgn(buf54,atCursor,"  -- press return",all)
				putMsg(buf54)
			} else {											  .. REPLY:
				if (eqNum(n97,0)) putMsg("Reply fetched.  Result OKAY")
				else {
					freeBuf(buf54)
					insertRgn(buf54,atCursor,
						"Reply received:  Result = ERROR ",all)
					toWord(buf54,n97)
					..insertRgn(buf54,atCursor,"  -- press return",all)
					putMsg(buf54)
				}
			}
		}
..getkey(n50)
>

Show numbers for a sent ARexx msg or reply
<virtual-s:
		if (not eqNum(n99,0)) runKey(virtual-m) 		 .. rexxOut() failed
		else {
			if (eqNum(n98,0)) putMsg("Msg sent")
			else			  putMsg("Reply sent")
		}
>

Show returncode error msgs
<virtual-m:
	switch(n99) {
	case(-1) { putMsg("ARexx not up") }
	case(-2) { putMsg("No memory or no text") }
	case(-3) { putMsg("Msg/reply > 65535 bytes") }
	case(-4) { putMsg("Nothing to fetch or reply to") }
	case(-5) { putMsg("Fetch reply before sending this msg/reply") }
	}
	returnFalse 				  .. so virtual-r/-s above will return False
>

====================================================================
Some useful functions for the arexx macros

The 'ask' macro.  Usage:  ask 'Do you want to continue?'
ask a question and return true or false
<virtual-i:
		equateNum(n96,1)
		if(askYesNo(buf61))
			rexxOut("YES",all,0,1,n99)
		else
			rexxOut("NO",all,0,1,n99)
>

the 'text' macro.  Usage:  text 'this will be inserted'
insert text at cursor
<virtual-h: insertRgn(curFile,atCursor,buf61,all)
			updatedisplay>

the 'loadfile' macro.  Usage: loadfile 'sys:myfile'
edit given file
<virtual-j:	loadfile(buf61)>

the 'gotoline' macro  Usage: gotoline 100
goto line
<virtual-n:	toNumber(n50,buf61)
			lineToLoc(curFile,atCursor,n50) >

the 'searchfor' macro  Usage: searchfor pattern
search for a given string
<virtual-o:	push(buf99,buf61)
			pop(buf99,buf49)
			setsearch(buf49)
			runkey(normal-f9) >

The 'message' macro  Usage: message 'my message'
issue a message
<virtual-p:	putmsg(buf61) >

