home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / amiga / arexx.c < prev    next >
C/C++ Source or Header  |  1992-11-07  |  4KB  |  146 lines

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #include <stdio.h>
  6. #include <exec/types.h>
  7. #include <libraries/dos.h>
  8. #include <string.h>
  9. #ifdef LATTICE
  10. #include <clib/alib_protos.h>
  11. #include <clib/exec_protos.h>
  12. #include <clib/dos_protos.h>
  13. #include <pragmas/dos_pragmas.h>
  14. #include <pragmas/exec_pragmas.h>
  15. #else
  16. #include <functions.h>
  17. #endif
  18.  
  19. extern struct DosLibrary    *DOSBase;
  20. extern struct ExecBase        *SysBase;
  21.  
  22. #include <rexx/rxslib.h>
  23. #include <rexx/errors.h>
  24.  
  25.  
  26. #define EXTERN extern
  27. #include "texd.h"
  28.  
  29. int do_rexx;        /* work with rexx ?? */
  30.  
  31.  
  32.  
  33. static int PutRexxMsg(struct MsgPort *mp,
  34.                       long action,
  35.                       STRPTR arg0,
  36.                       struct RexxMsg *arg1);
  37.  
  38.  
  39. STRPTR        CreateArgstring(STRPTR, long);
  40. void        DeleteArgstring(STRPTR);
  41. struct RexxMsg    *CreateRexxMsg(struct MsgPort *, STRPTR, STRPTR);
  42. void        DeleteRexxMsg(struct RexxMsg *);
  43.  
  44. #pragma libcall RexxSysBase CreateArgstring 7e 0802
  45. #pragma libcall RexxSysBase DeleteArgstring 84 801
  46. #pragma libcall RexxSysBase CreateRexxMsg   90 09803
  47. #pragma libcall RexxSysBase DeleteRexxMsg   96 801
  48.  
  49. #define PORTNAME    "TeX-Rexx-Port"
  50. #define RXEXTENS    "rexx"
  51.  
  52. struct RxsLib *RexxSysBase = NULL;
  53.  
  54.  
  55. static int PutRexxMsg(struct MsgPort *mp, long action, STRPTR arg0,
  56.         struct RexxMsg *arg1)
  57. {
  58.   struct RexxMsg *rm;
  59.   struct MsgPort *rp;
  60.  
  61.   if ((rm = CreateRexxMsg(mp, RXEXTENS, mp->mp_Node.ln_Name)) != NULL) {
  62.     rm->rm_Action  = action;
  63.     rm->rm_Args[0] = arg0;
  64.     rm->rm_Args[1] = (STRPTR)arg1;
  65.     rm->rm_Stdin   = Output();
  66.     rm->rm_Stdout  = Output();
  67.     Forbid();
  68.     if ((rp = FindPort(RXSDIR)) != NULL) {
  69.       PutMsg(rp, (struct Message *)rm);
  70.     }
  71.     Permit();
  72.     if (rp == NULL) {
  73.       DeleteRexxMsg(rm);
  74.     }
  75.   }
  76.   return rm != NULL && rp != NULL;
  77. }
  78.  
  79.  
  80. int call_rexx(char *str)
  81. {
  82.   char *arg;
  83.   struct MsgPort *mp;
  84.   struct RexxMsg *rm, *rm2;
  85.   int ret = 0;
  86.   int pend;
  87.  
  88.   if ((RexxSysBase = (struct RxsLib *)OpenLibrary(RXSNAME, 0)) == NULL) {
  89.     fprintf(stderr, "Can't open \"%s\"!\n", RXSNAME);
  90.   }
  91.   else {
  92.     mp = NULL;
  93.     Forbid();
  94.     if (FindPort(PORTNAME) == NULL) {
  95.       mp = CreatePort(PORTNAME, 0);
  96.       Permit();
  97.       if (mp != NULL) {
  98.         if ((arg = CreateArgstring(str, strlen(str))) != NULL) {
  99.           if (PutRexxMsg(mp, RXCOMM | RXFF_STRING, arg, NULL)) {
  100.  
  101.             for (pend = 1; pend != 0; ) {
  102.               if (WaitPort(mp) != NULL) {
  103.                 while ((rm = (struct RexxMsg *)GetMsg(mp)) != NULL) {
  104.                   if (rm->rm_Node.mn_Node.ln_Type == NT_REPLYMSG) {
  105.                     ret = 1;    /* true == ok */
  106.                     if (rm->rm_Result1 != 0) {
  107.                       fprintf(stderr, "\"%s\" failed! (Res1 = %ld, Res2 = %ld)\n",
  108.                               rm->rm_Args[0], rm->rm_Result1, rm->rm_Result2);
  109.                       ret = 0;    /* false */
  110.                     }
  111.                     if ((rm2 = (struct RexxMsg *)rm->rm_Args[1]) != NULL) {
  112.                       rm2->rm_Result1 = rm->rm_Result1;
  113.                       rm2->rm_Result2 = 0;
  114.                       ReplyMsg((struct Message *)rm2);
  115.                     }
  116.                     DeleteRexxMsg(rm);
  117.                     pend--;
  118.                   }
  119.                   else {
  120.                     rm->rm_Result2 = 0;
  121.                     if (PutRexxMsg(mp, rm->rm_Action, rm->rm_Args[0], rm)) {
  122.                       pend++;
  123.                     }
  124.                     else {
  125.                       rm->rm_Result1 = RC_FATAL;
  126.                       ReplyMsg((struct Message *)rm);
  127.                     }
  128.                   }
  129.                 }
  130.               }
  131.             }        /* for */
  132.           }
  133.           DeleteArgstring(arg);
  134.         }
  135.         DeletePort(mp);
  136.       }
  137.     }            /* Find port */
  138.     else {
  139.       Permit();
  140.     }
  141.     CloseLibrary((struct Library *)RexxSysBase);
  142.   }
  143.   return ret;
  144. }
  145.  
  146.