home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d131
/
mg1b.lha
/
Mg1b
/
Source
/
rexx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-03-14
|
5KB
|
232 lines
/*
* This file sends out REXX commands. Now we start to get into
* the fun stuff. Actually, it's pretty straightforward, from
* the TeX information.
*
* For now, we do a no-no; we open and close the emacs port.
* Actually, this is probably fine, as we only expect REXX to
* send us messages in response to our messages.
*
* The first thing we do is set up a cliplist variable called
* mg.
*/
#include "exec/ports.h"
#include "functions.h"
#include "fcntl.h"
#include "rexx/storage.h"
/*
* This is a hack.
*/
#undef TRUE
#undef FALSE
#undef VOID
#include "def.h"
extern BUFFER *curbp ;
extern WINDOW *curwp ;
struct MsgPort *mgport, *rport ;
long waitbits ;
struct REXXmsg {
struct Message msgheader ;
long *RexxTask, *LibBase ;
long Command, Result1, Result2 ;
char *Arg0, *Arg1, *Arg2 ; /* The rest we really don't care about */
char *Args[13] ;
void *PassPort, *CommAddr, *FileExt ;
long Stdin, Stdout, avail ;
} *REXXmsg, setCmsg ;
/*
* This routine dispatches any REXX messages coming
* in. We simply call our brand new fancy parsing
* routine! (Getting some of those strings right
* might be fun, though . . .)
*/
mgdisp() {
register char *p ;
while (REXXmsg = (struct REXXmsg *)GetMsg(mgport)) {
ewprintf(REXXmsg->Arg0) ;
REXXmsg->Result1 = (excline(REXXmsg->Arg0) == TRUE ? 0 : 1) ;
REXXmsg->Result2 = 0 ;
ReplyMsg(REXXmsg) ;
}
}
openmsgs() {
Forbid() ;
if (FindPort("mg")==NULL)
mgport = CreatePort("mg", 0L) ;
Permit() ;
REXXmsg = NULL ;
rport = CreatePort("mg:reply", 0L) ;
}
closemsgs() {
if (mgport) {
FreeSignal((long)(mgport->mp_SigBit)) ;
RemPort(mgport) ;
mgdisp() ;
DeletePort(mgport) ;
}
if (rport) {
FreeSignal((long)(rport->mp_SigBit)) ;
RemPort(rport) ;
DeletePort(rport) ;
}
}
struct MsgPort *rexxport ;
poststring(n,s)
char *n, *s ;
{
setCmsg.Arg0 = n ;
setCmsg.Arg1 = s ;
setCmsg.Arg2 = (char *)(long)strlen(s) ;
setCmsg.Command = RXADDCON ;
setCmsg.msgheader.mn_Node.ln_Type = NT_MESSAGE ;
setCmsg.msgheader.mn_ReplyPort = rport ;
Forbid() ;
rexxport = FindPort("REXX") ;
if (rexxport) {
PutMsg(rexxport, &setCmsg) ;
}
Permit() ;
if (rexxport) {
WaitPort(rport) ;
GetMsg(rport) ;
}
}
int pendingrexx ;
rexxcommand(f, n, k) {
register BUFFER *bp;
int s;
char cmd[120];
if (pendingrexx)
return(FALSE) ;
pendingrexx = 1 ;
openmsgs() ;
if (rport == NULL || mgport == NULL)
goto failure ;
/*
* Now we tell everyone the name of the file we are editing,
* if any.
*/
poststring("mg.BufferName", ((curbp && curbp->b_fname[0]) ?
curbp->b_bname : "")) ;
/*
* Now, finally, we send out the message to the REXX port.
*/
if ((s=ereply("REXX command: ", cmd, 120)) != TRUE)
goto sfailure ;
setCmsg.Arg0 = cmd ;
setCmsg.Arg1 = (char *)(long)strlen(setCmsg.Arg0) ;
setCmsg.Command = RXCOMM | RXFB_TOKEN | RXFB_NOIO ;
setCmsg.FileExt = "mg" ;
setCmsg.CommAddr = "mg" ;
setCmsg.msgheader.mn_Node.ln_Type = NT_MESSAGE ;
setCmsg.msgheader.mn_ReplyPort = rport ;
Forbid() ;
rexxport = FindPort("REXX") ;
if (rexxport) {
PutMsg(rexxport, &setCmsg) ;
}
Permit() ;
if (! rexxport)
goto failure ;
/*
* Now we iterate, waiting until we get the correct message.
*/
waitbits = (1L << rport->mp_SigBit) | (1L << mgport->mp_SigBit) ;
while (1) {
Wait(waitbits) ;
mgdisp() ;
if (GetMsg(rport)) {
s = (setCmsg.Result1 ? FALSE : TRUE) ;
goto sfailure ;
}
}
failure:
s = FALSE ;
sfailure:
/*
* Here we clean up by closing down and deleting the ports.
*/
closemsgs() ;
pendingrexx = 0 ;
return(s) ;
}
static char *rline(p)
struct LINE *p ;
{
p->l_text[p->l_used] = 0 ;
return(p->l_text) ;
}
static char *rint(i)
short i ;
{
static char temp[8] ;
char *p ;
p = temp + 7 ;
*p-- = 0 ;
do {
*p = ( i % 10 ) + '0' ;
i = i / 10 ;
p-- ;
} while (i != 0) ;
return(p+1) ;
}
publishline() {
if (! curbp)
return(FALSE) ;
if (! pendingrexx)
openmsgs() ;
if (rport == NULL || mgport == NULL) {
closemsgs() ;
return(FALSE) ;
}
if (curwp->w_dotp) {
poststring("mg.DotLine", rline(curwp->w_dotp)) ;
poststring("mg.DotPos", rint(curwp->w_doto)) ;
} else {
poststring("mg.DotLine", "") ;
poststring("mg.DotPos", "") ;
}
/* if (curwp->w_markp) {
poststring("mg.MarkLine", rline(curwp->w_markp)) ;
poststring("mg.MarkPos", rint(curwp->w_marko)) ;
} else {
poststring("mg.MarkLine", "") ;
poststring("mg.MarkPos", "") ;
} */
if (! pendingrexx)
closemsgs() ;
return(TRUE) ;
}
extern struct Window *EmW ;
windowfront() {
if (EmW)
WindowToFront(EmW) ;
return(TRUE) ;
}
windowback() {
if (EmW)
WindowToBack(EmW) ;
return(TRUE) ;
}
/*
* Bump our priority by 2. (Editors are important!)
*/
static int oprior ;
bumpprior() {
struct Task *task ;
task = FindTask(0L) ;
oprior = task->tc_Node.ln_Pri ;
SetTaskPri(task, (long)(2+oprior)) ;
}
unbumpprior() {
struct Task *task ;
task = FindTask(0L) ;
SetTaskPri(task, (long)oprior) ;
}