home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / text / golded / data / tools / prjsource / main.c next >
C/C++ Source or Header  |  1995-02-27  |  4KB  |  172 lines

  1. /* -----------------------------------------------------------------------------
  2.  
  3.   Example: How to read GoldED's project list. DICE:
  4.  
  5.   Exemple: Comment lire la liste des projets de GoldED. DICE:
  6.  
  7.   dcc main.c -// -o ram:ReadList
  8.  
  9.   ------------------------------------------------------------------------------
  10. */
  11.  
  12. /// "includes & prototypes"
  13.  
  14. #include <amiga20/exec/exec.h>
  15. #include <amiga20/rexx/errors.h>
  16. #include <amiga20/rexx/rxslib.h>
  17. #include <amiga20/clib/exec_protos.h>
  18. #include <amiga20/clib/rexxsyslib_protos.h>
  19.  
  20. #define Prototype extern
  21.  
  22. Prototype void   main(ULONG, char **);
  23. Prototype struct RexxMsg *SendRexxCommand(char *, char *, struct MsgPort *);
  24. Prototype void   FreeRexxCommand (struct RexxMsg *);
  25. Prototype ULONG  WaitForAnswer(struct MsgPort *, char *);
  26.  
  27. ///
  28. /// "main"
  29.  
  30. void
  31. main(argc, argv)
  32.  
  33. ULONG argc;
  34. char *argv[];
  35. {
  36.     const char *version = "$VER: PRJ 1.1 (24.3.94)";
  37.  
  38.     struct MsgPort *replyPort;
  39.  
  40.     char *host = "GOLDED.1";
  41.  
  42.     if (replyPort = CreateMsgPort()) {
  43.  
  44.         if (SendRexxCommand(host, "LOCK CURRENT", replyPort)) {
  45.  
  46.             char result[80];
  47.  
  48.             if (WaitForAnswer(replyPort, result) == RC_OK) {
  49.  
  50.                 if (SendRexxCommand(host, "QUERY PRJLIST", replyPort)) {
  51.  
  52.                     if (WaitForAnswer(replyPort, result) == RC_OK) {
  53.  
  54.                         struct List *list;
  55.                         struct Node *node;
  56.  
  57.                         list = (struct List *)atol(result);
  58.  
  59.                         if (list->lh_Head->ln_Succ) {
  60.  
  61.                             for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  62.                                 printf("%s (selected: %s)\n", node->ln_Name, node->ln_Pri ? "YES" : "NO");
  63.                         }
  64.                         else
  65.                             puts("project list is empty");
  66.                     }
  67.                 }
  68.                 if (SendRexxCommand(host, "UNLOCK", replyPort))
  69.                     WaitForAnswer(replyPort, result);
  70.             }
  71.         }
  72.         DeleteMsgPort(replyPort);
  73.     }
  74.     exit(0);
  75. }
  76.  
  77. ///
  78. /// "ARexx"
  79.  
  80. /* -------------------------------------- WaitForAnswer -----------------------
  81.  
  82.   Wait for answer on previously sent message. Free message afterwards. Primary
  83.   return code is returned, the result string (if any) written to <result>.
  84.  
  85.   Attendre la réponse d'un message préalablement envoyé. Le message est ensuite
  86.   libéré. Le code de retour primaire est retourné, la chaîne-résultat est
  87.   écrite (si jamais elle existe) dans <result>.
  88.  
  89. */
  90.  
  91. ULONG
  92. WaitForAnswer(port, result)
  93.  
  94. struct MsgPort *port;
  95. char   *result;
  96. {
  97.     struct RexxMsg *rexxMsg;
  98.     ULONG  error;
  99.  
  100.     *result = NULL;
  101.  
  102.     do {
  103.         
  104.         WaitPort(port);
  105.  
  106.         if (rexxMsg = (struct RexxMsg *)GetMsg(port))
  107.             if ((error = rexxMsg->rm_Result1) == RC_OK)
  108.                 if (rexxMsg->rm_Result2)
  109.                     strcpy(result, (char *)rexxMsg->rm_Result2);
  110.  
  111.     } while (!rexxMsg);
  112.  
  113.     FreeRexxCommand(rexxMsg);
  114.     return(error);
  115. }
  116.  
  117. /* ------------------------------------- FreeRexxCommand ----------------------
  118.  
  119.  Free ARexx message
  120.  
  121. */
  122.  
  123. void
  124. FreeRexxCommand(rexxmessage)
  125.  
  126. struct RexxMsg *rexxmessage;
  127. {
  128.     if (rexxmessage->rm_Result1 == RC_OK) 
  129.         if (rexxmessage->rm_Result2)
  130.             DeleteArgstring((char *)rexxmessage->rm_Result2);
  131.  
  132.     DeleteArgstring((char *)ARG0(rexxmessage));
  133.  
  134.     DeleteRexxMsg(rexxmessage);
  135. }
  136.  
  137. /* ---------------------------------- SendRexxCommand -------------------------
  138.  
  139.  Send ARexx message
  140.  
  141. */
  142.  
  143. struct RexxMsg *
  144. SendRexxCommand(port, cmd, replyPort)
  145.  
  146. char   *cmd,   *port;
  147. struct MsgPort *replyPort;
  148. {
  149.     struct MsgPort *rexxport;
  150.     struct RexxMsg *rexx_command_message = NULL;
  151.  
  152.     Forbid();
  153.  
  154.     if (rexxport = FindPort(port)) {
  155.  
  156.         if (rexx_command_message = CreateRexxMsg(replyPort, NULL, NULL)) {
  157.  
  158.             if (rexx_command_message->rm_Args[0] = CreateArgstring(cmd, strlen(cmd))) {
  159.  
  160.                 rexx_command_message->rm_Action = RXCOMM | RXFF_RESULT;
  161.  
  162.                 PutMsg(rexxport, &rexx_command_message->rm_Node);
  163.             }
  164.         }
  165.     }
  166.  
  167.     Permit();
  168.     return(rexx_command_message);
  169. }
  170.  
  171. ///
  172.