home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d5xx
/
d546
/
2view.lha
/
2View
/
Source
/
ARexx.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-19
|
6KB
|
217 lines
/*ARexx.c: This is the ARexx support code module*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <clib/intuition_protos.h>
#include "minrexx.h"
#include "arexx.h"
#include <pragmas/exec_pragmas.h>
#include <pragmas/intuition_pragmas.h>
enum ButtonTypes {none=0,select,menu};
typedef enum ButtonTypes ButtonTypes;
extern struct Library *SysBase;
extern struct Library *IntuitionBase;
struct RexxMsg *rexxMsg;
/*These variables are defined in 2View.c, and are used to enable the ARexx*/
/*routines to communicate with the rest of the program*/
/*This variable is used to tell 2View to quit or advance*/
extern ButtonTypes rexxAbort;
extern struct Screen *prevScreen; /*The current screen*/
extern char *picFilename; /*The filename of the current picture*/
extern char *playListFilename; /*The name of the playlist*/
extern UWORD ticks; /*The number of ticks remaining to show each picture*/
extern UWORD ticksRemaining; /*The time left to show the current picture*/
extern BOOL loop; /*TRUE if the user specified 'loop'*/
extern BOOL printPics; /*TRUE if we're printing each picture*/
extern char *version; /*2View's version string*/
void rQuit(char *p);
void rAdvance(char *p);
void rGet(char *p);
void rPicToFront(char *p);
void rPicToBack(char *p);
void rPrint(char *p);
struct rexxCommandList commandList[] =
{
{ "quit" , (APTR)&rQuit }, /*Abort a picture sequence*/
{ "advance", (APTR)&rAdvance }, /*Show the next picture in the sequence*/
{ "get", (APTR)&rGet }, /*Multi-purpose*/
{ "pictofront", (APTR)&rPicToFront }, /*Bring the picture to the front*/
{ "pictoback", (APTR)&rPicToBack }, /*Send the picture to the back*/
{ "print", (APTR)&rPrint }, /*Print the picture*/
{ NULL, NULL }
};
char portName[16];
char arexxBuf[140];
/*Open the ARexx port*/
long initRexxPort(void)
{
determinePortName(portName); /*Get the port name*/
/*Ask minrexx to open the port and return the port's signal bit*/
return(upRexxPort(portName,commandList,"rx",(APTR)&disp));
}
char *result="RESULT";
UBYTE errorNum=0;
/*Determine what the ARexx port name should be. The first running instance*/
/*of 2View should have an ARexx port named '2View.1'. The second, '2View.2'*/
/*etc. This starts at '2View.1' and works up until it finds a free space*/
/*(up to 2View.99)*/
void determinePortName(char *portName)
{
ULONG c=1;
UBYTE len;
strcpy(portName,"2View.");
do
{
len=stcu_d(&portName[6],c++);
portName[6+len]=NULL;
}
while(FindPort(portName)!=NULL && c<100);
if(FindPort(portName)!=NULL)
exit(50);
return;
}
/*The ARexx command dispatch function. This calls the functions associated*/
/*with a particular command*/
int disp(struct RexxMsg *msg,struct rexxCommandList *dat,char *p)
{
rexxMsg=msg;
/*Call the function that supports the command*/
((int (*)())(dat->userdata))(p);
/*Reply to ARexx, using the reply string and error number set by the*/
/*function just called*/
replyRexxCmd(rexxMsg,errorNum,0,arexxBuf);
errorNum=0;
return(1); /*1 means that minrexx shouldn't reply to the rexx message*/
}
/*quit: Abort a sequence of pictures*/
void rQuit(char *p)
{
rexxAbort=menu; /*It's like the user pressed the right mouse button*/
strcpy(arexxBuf,result);
}
/*advance: Advance to the next picture in this sequence*/
void rAdvance(char *p)
{
rexxAbort=select; /*Like pressing the left mouse button*/
strcpy(arexxBuf,result);
}
/*get: This function gets information about the current picture/playlist*/
void rGet(char *p)
{
p++;
/*The picture's filename*/
if(stricmp(p,"name")==0)
strcpy(arexxBuf,picFilename);
/*The picture width*/
else if(stricmp(p,"width")==0)
stcu_d(arexxBuf,prevScreen->Width);
/*The height*/
else if(stricmp(p,"height")==0)
stcu_d(arexxBuf,prevScreen->Height);
/*The number of bitplanes*/
else if(stricmp(p,"depth")==0)
stcu_d(arexxBuf,prevScreen->BitMap.Depth);
/*The viewmodes of the picture (HAM, HIRES, LACE, etc.*/
else if(stricmp(p,"viewmodes")==0)
stci_h(arexxBuf,prevScreen->ViewPort.Modes);
/*The time left to display this picture*/
else if(stricmp(p,"timeleft")==0)
stcu_d(arexxBuf,ticksRemaining);
/*The time to display each picture*/
else if(stricmp(p,"timeperpicture")==0)
stcu_d(arexxBuf,ticks);
/*The version number and date of this program*/
else if(stricmp(p,"version")==0)
strcpy(arexxBuf,&version[12]);
/*The name of the playlist, or '?NONE?' if there is no playlist*/
else if(stricmp(p,"playlistname")==0)
if(playListFilename==NULL)
strcpy(arexxBuf,"?NONE?");
else
strcpy(arexxBuf,playListFilename);
/*Returns 'TRUE' if the user specified 'loop' on the command line, 'FALSE'*/
/*if he didn't*/
else if(stricmp(p,"looping")==0)
if(loop)
strcpy(arexxBuf,"TRUE");
else
strcpy(arexxBuf,"FALSE");
/*Returns 'TRUE' if the user specified 'print' on the command line,*/
/*FALSE if she didn't*/
else if(stricmp(p,"printpictures")==0)
if(printPics)
strcpy(arexxBuf,"TRUE");
else
strcpy(arexxBuf,"FALSE");
/*Otherwise, we don't understand, so return an error*/
else
{
errorNum=100;
strcpy(arexxBuf,"ERROR");
}
}
/*pictofront: Send the picture's screen to the front*/
void rPicToFront(char *p)
{
ScreenToFront(prevScreen);
strcpy(arexxBuf,result);
}
/*pictoback: Send the picture's screen to the back*/
void rPicToBack(char *p)
{
ScreenToBack(prevScreen);
strcpy(arexxBuf,result);
}
/*print: Print the currently displayed picture*/
void rPrint(char *p)
{
dumpRastPort(&(prevScreen->RastPort),&(prevScreen->ViewPort));
strcpy(arexxBuf,result);
}
/*End of ARexx.c*/