home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 164.lha / ARexx / Flist_etc / rexxport.c < prev    next >
C/C++ Source or Header  |  1988-04-28  |  2KB  |  121 lines

  1. /*
  2. *
  3. *   This module is responsible for communicating with Rexx.
  4. *   Specifically it opens a message port and tells rexx to execute
  5. *   a program. Rexx should signal host of errors or death.
  6. *
  7. */
  8.  
  9. #include "exec/types.h"
  10. #include "exec/exec.h"
  11. #include "rexx/storage.h"
  12. #include "rexx/rxslib.h"
  13. #include "rexx/errors.h"
  14.  
  15. /* system types */
  16.  
  17. extern void ClearMem(),AddPort(),FreePort(),InitPort(),RemPort(),Forbid();
  18. extern void Permit();
  19. extern LONG OpenLibrary();
  20. extern struct RexxMsg *GetMsg();
  21.  
  22. /* My stuff */
  23.  
  24. struct RexxMsg *rmsg;
  25. struct RexxTask *rxt;
  26. struct RexxMsg *rxmsg, *port;
  27.  
  28. extern struct RexxLib *RexxSysBase;
  29.  
  30. #define PUBFAST MEMF_FAST+MEMF_PUBLIC+MEMF_CLEAR
  31.  
  32. void OpenRexxPort(string,port)
  33. char *string;
  34. struct MsgPort *port;
  35. {
  36.  
  37.     ClearMem(port,(LONG)sizeof(struct MsgPort));
  38.     InitPort(port,string);
  39.     AddPort(port);
  40.  
  41. }
  42.  
  43. void DeleteRexxPort(port)
  44. struct MsgPort *port;
  45. {
  46.  
  47.     RemPort(port);
  48.     FreePort(port);
  49.  
  50. }
  51.  
  52. long OpenLib(library,version)
  53. char *library;
  54. long version;
  55. {
  56.     long base;
  57.     base = OpenLibrary(library,version);
  58.     if( base == NULL ){
  59.         printf("You need the %s library!\n",library);
  60.         return(NULL);
  61.     }
  62.     return(base);
  63. }
  64.  
  65. struct RexxMsg *PollRexxPort(port)
  66. struct MsgPort *port;
  67. {
  68.     struct RexxMsg *rxport;
  69.  
  70.     rxport = GetMsg(port);
  71.     if( rxport == NULL )
  72.         return((struct RexxMsg *)NULL);
  73.     return(rxport);
  74.  
  75. }
  76.  
  77. struct RexxMsg *WaitRexxPort(port)
  78. struct MsgPort *port;
  79. {
  80.  
  81.     Wait(1<<port->mp_SigBit);
  82.     return(PollRexxPort(port));
  83.  
  84. }
  85.  
  86. /* Used by main routine... saves me some typing there. */
  87. long CleanupRexx(rexport)
  88. struct RexxMsg *rexport;
  89. {
  90.     struct RexxMsg *rmg;
  91.  
  92.     rmg = WaitRexxPort(rexport);
  93.     ClearRexxMsg(rxmsg,1L);  /* this releases the string in the msg */
  94.     DeleteRexxMsg(rxmsg);
  95. }
  96.  
  97. long StartRexxProg(rexport)
  98. struct RexxMsg *rexport;
  99. {
  100.     struct RexxMsg *rmg;
  101.  
  102.     rxmsg = CreateRexxMsg(rexport,"flex","flport");
  103.  
  104.     Forbid();
  105.     port = (struct RexxMsg *)FindPort("REXX");
  106.     if(port == NULL){
  107.         Permit();
  108.         DeleteRexxMsg(rxmsg);
  109.         return(FALSE);
  110.     }
  111.  
  112.     rxmsg->rm_Args[0] = "fl";
  113.     rxmsg->rm_Action = RXCOMM;
  114.  
  115.     FillRexxMsg(rxmsg,1L,0L); /* store the message */
  116.  
  117.     PutMsg(port,rxmsg); /* email in it's truest form */
  118.     Permit();
  119.     return(TRUE);
  120. }
  121.