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