home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 100-199 / ff153.lzh / Dme / src / rexx.c < prev    next >
C/C++ Source or Header  |  1987-06-15  |  5KB  |  246 lines

  1.  
  2. /*
  3.  *  REXX.C
  4.  *
  5.  *    (c) Copyright 1987 by Kim DeVaughn, All Rights Reserved
  6.  *
  7.  *  ARexx interface code, etc.
  8.  *
  9.  */
  10.  
  11.  
  12. #include "defs.h"
  13. #include "rexx.h"
  14.  
  15. #if AREXX
  16.  
  17. int foundcmd;        /* control for implicit ARexx macro invocation   */
  18. int cmderr;        /* global command error flag for do_rexx()'s use */
  19.  
  20. APTR OpenLibrary();
  21. APTR FindPort();
  22. APTR GetMsg();
  23. APTR CreateRexxMsg();
  24. APTR CreateArgstring();
  25.  
  26. struct RxsLib *RexxSysBase;
  27.  
  28.  
  29.  
  30. /*
  31.  * initialization for ARexx ... just open rexsyslib.library
  32.  */
  33.  
  34. void
  35. openrexx()
  36. {
  37.     RexxSysBase = (struct RxsLib *)OpenLibrary("rexxsyslib.library", (ULONG)RXSVERS);
  38.     return;
  39. }
  40.  
  41.  
  42.  
  43. /*
  44.  * cleanup any open ARexx stuff ...  just close rexsyslib.library for now
  45.  */
  46.  
  47. void
  48. closerexx()
  49. {
  50.     if (RexxSysBase) {
  51.     CloseLibrary(RexxSysBase);
  52.     }
  53.     return();
  54. }
  55.  
  56.  
  57.  
  58. /*
  59.  *  explicit invocation interface between do_command() and do_rexx
  60.  *  for ARexx macros having NO arguments (i.e., for the "rx" command)
  61.  */
  62.  
  63. do_rx()
  64. {
  65.     do_rexx(av[1]);
  66.     return();
  67. }
  68.  
  69.  
  70.  
  71. /*
  72.  *  explicit invocation interface between do_command() and do_rexx
  73.  *  for ARexx macros having ONE argument (i.e., for the "rx1" command)
  74.  */
  75.  
  76. do_rx1()
  77. {
  78.     char macbuf[256];
  79.  
  80.     strcpy(macbuf, av[1]);
  81.     strcat(macbuf, " ");
  82.     strcat(macbuf, av[2]);
  83.     do_rexx(macbuf);
  84.     return();
  85. }
  86.  
  87.  
  88.  
  89. /*
  90.  *  explicit invocation interface between do_command() and do_rexx
  91.  *  for ARexx macros having TWO arguments (i.e., for the "rx2" command)
  92.  */
  93.  
  94. do_rx2()
  95. {
  96.     char macbuf[256];
  97.  
  98.     strcpy(macbuf, av[1]);
  99.     strcat(macbuf, " ");
  100.     strcat(macbuf, av[2]);
  101.     strcat(macbuf, " ");
  102.     strcat(macbuf, av[3]);
  103.     do_rexx(macbuf);
  104.     return();
  105. }
  106.  
  107.  
  108.  
  109. /*
  110.  *  implicit invocation interface between do_command() and do_rexx
  111.  *  for ARexx macros implicitly called; arbitrary number of arguments
  112.  */
  113.  
  114. do_rxImplied(cmd, args)
  115. char *cmd;
  116. char *args;
  117. {
  118.     char macbuf[256];
  119.  
  120.     strcpy(macbuf, cmd);
  121.     strcat(macbuf, " ");
  122.     strcat(macbuf, args);
  123.     do_rexx(macbuf);
  124.     return();
  125. }
  126.  
  127.  
  128.  
  129. /*
  130.  *  issue a command to ARexx ...
  131.  */
  132.  
  133. do_rexx(macstr)
  134. char *macstr;
  135. {
  136.     struct RexxArg *macarg;
  137.  
  138.     struct MsgPort  RexxPort;
  139.     struct MsgPort *ARexxPort;
  140.  
  141.     struct RexxMsg *macptr;
  142.     struct RexxMsg *cmdptr;
  143.  
  144.     char host[16];
  145.     char hexbuf[12];        /* should only need 9 bytes */
  146.     char errmsg[80];        /* don't build a larger error message */
  147.  
  148.     int  ret;
  149.     int  err;
  150.  
  151.  
  152.     if (RexxSysBase == 0) {
  153.     title("Unknown Command   -   No Macros:  ARexx Not Installed ");   /* no rexxsyslib */
  154.     return(0);
  155.     }
  156.  
  157.  
  158.     ClearMem(&RexxPort, sizeof(struct MsgPort));
  159.     strcpy(host, "DME");
  160.     sprintf(hexbuf, "%08x", &RexxPort);
  161.     strcat(host, hexbuf);
  162.     InitPort(&RexxPort, host);      /* need to error check this */
  163.     AddPort(&RexxPort);
  164.     /* return here if InitPort failed */
  165.  
  166.  
  167.     if (macarg = (struct RexxArg *)CreateArgstring(macstr, strlen(macstr))) {
  168.     if (macptr = (struct RexxMsg *)CreateRexxMsg(&RexxPort, "dme", host)) {
  169.         ACTION(macptr) = RXCOMM;
  170.         ARG0(macptr)   = (STRPTR)macarg;
  171.  
  172.         Forbid();
  173.         if (ARexxPort = (struct MsgPort *)FindPort("REXX")) {
  174.         PutMsg(ARexxPort, macptr);
  175.         Permit();
  176.         title("Calling ARexx Macro ... ");
  177.  
  178.         for (;;) {
  179.             WaitPort(&RexxPort);
  180.             cmdptr = (struct RexxMsg *)GetMsg(&RexxPort);
  181.  
  182.             if (IsRexxMsg(cmdptr)) {
  183.  
  184.             foundcmd = 0;
  185.             cmderr = CMD_INITIAL;
  186.             ret = do_command(ARG0(cmdptr));
  187.             err = cmderr;
  188.             if (foundcmd) {
  189.                 ret = (ret == 1) ? 0 : 5;   /* cmd error:  RC = 5  */
  190.             } else {
  191.                 ret = do_rexx(ARG0(cmdptr));    /* another macro? */
  192.             }
  193.  
  194.             RESULT1(cmdptr) = ret;
  195.             RESULT2(cmdptr) = 0;
  196.             ReplyMsg(cmdptr);
  197.             }
  198.             do_command("null");     /* a kludge to set "foundcmd" */
  199.             if (macptr == cmdptr) break;
  200.         }
  201.  
  202.  
  203.         if (ret = RESULT1(cmdptr)) {
  204.             if (RESULT2(cmdptr)) {
  205.             if (RESULT2(cmdptr) == 1) {
  206.                 title("Unknown Command ");
  207.             } else {
  208.                 sprintf(errmsg, "ARexx Macro Error:  Code = %d  Severity = %d ", RESULT2(cmdptr), ret);
  209.                 title(errmsg);
  210.             }
  211.             } else {
  212.             sprintf(errmsg, "User Specified Macro Error:  RC = %d ", ret);
  213.             title(errmsg);
  214.             }
  215.         } else {
  216.             if (err <= TITLE_THRESHHOLD) {
  217.             title("OK ");
  218.             }
  219.         }
  220.         ret = ret + err;
  221.         } else {
  222.         Permit();
  223.         title("Unknown Command   -   No Macros:  ARexx Not Active ");   /* no REXX port */
  224.  
  225.         ret = -1;
  226.         }
  227.         DeleteRexxMsg(macptr);
  228.     } else {
  229.         title("CreateRexxMsg() Failed ");   /* may be overkill, and not need to ckeck this */
  230.         ret = -1;
  231.     }
  232.     DeleteArgstring(macarg);
  233.     } else {
  234.     title("CreateArgstring() Failed ");     /* may be overkill, and not need to check this */
  235.     ret = -1;
  236.     }
  237.  
  238.  
  239.     RemPort(&RexxPort);
  240.     FreePort(&RexxPort);
  241.     return(ret);
  242. }
  243.  
  244. #endif
  245.  
  246.