home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / ST_GUIDE.LZH / STG-UTIL / CALL-ACC / CALL-ACC.C next >
C/C++ Source or Header  |  1994-05-01  |  4KB  |  166 lines

  1. #line 1/*ACE 4 0145 */
  2. /*
  3.  * Dieser Quelltext stammt ursprünglich von Dirk Haun und
  4.  * wurde angepa₧t und erweitert von Holger Weets
  5.  */
  6. #ifdef SOZOBON
  7. #include <gemfast.h>
  8. #include <errno.h>
  9.  
  10. /*
  11.  * AV-Meldungen
  12.  */
  13. #define AV_PROTOKOLL        0x4700
  14. #define AV_SENDKEY          0x4710
  15. #define VA_START            0x4711
  16. #define AV_STARTPROG        0x4722
  17. #define VA_PROGSTART        0x4723
  18. #define AV_ACCWINDOPEN      0x4724
  19. #define VA_DRAGACCWIND      0x4725
  20. #define AV_ACCWINDCLOSED    0x4726
  21. #define  Pexec(mode,prog,tail,env) gemdos(75,mode,prog,tail,env)
  22.  
  23. extern int _argc;
  24. extern char **_argv;
  25. _main()
  26. {
  27.     _exit(main(_argc, _argv));
  28. }
  29. #else
  30. /* Pure-C */
  31. #include <aes.h>
  32. #include <tos.h>
  33. #include <errors.h>
  34. #include <vaproto.h>
  35. #endif
  36.  
  37.  
  38. int main(argc, argv)
  39. int argc;
  40. char **argv;
  41. {
  42.     int event, viewer, gl_apid, open, msg[8];
  43.     int ret;
  44.     int d, buf[8];
  45.     char cmd[150], *p;
  46.  
  47. start:
  48.     ret=0;
  49.     if (argc==2) {
  50.         if ((gl_apid=appl_init())<0)
  51.             return(ENSMEM);
  52.  
  53.         /*
  54.          * ACC suchen: ST-Guide, 1stGuide und 1stView in dieser
  55.          * Reihenfolge
  56.          */
  57.         viewer=appl_find("ST-GUIDE");
  58.         if (viewer<0) viewer=appl_find("1STGUIDE");
  59.         if (viewer<0) viewer=appl_find("1STVIEW ");
  60.         if (viewer<0)
  61.             ret=EFILNF;                     // kein ACC vorhanden
  62.         else {
  63.  
  64.             /*
  65.              * Meldung für ACC basteln
  66.              */
  67.             msg[0]=VA_START;
  68.             msg[1]=gl_apid;
  69.             msg[2]=0;
  70.             *(char **)&msg[3] = argv[1];    // Kommando
  71.             msg[5]=0; msg[6]=0; msg[7]=0;
  72.  
  73.             /*
  74.              * ACC aktivieren
  75.              */
  76.             appl_write(viewer,16,msg);
  77.  
  78.             /*
  79.              * warten, bis ACC geöffnet, oder Timeout
  80.              */
  81.             do {
  82.                 event = evnt_multi(MU_TIMER|MU_MESAG,
  83.                                     0, 0, 0,
  84.                                     0,0,0,0,0,
  85.                                     0,0,0,0,0,
  86.                                     buf, 2000, 0,
  87.                                     &d, &d, &d, &d, &d, &d);
  88.                 if (event & MU_TIMER) break;
  89.             } while (buf[0] != AV_ACCWINDOPEN);
  90.  
  91.             /*
  92.              * wenn Timeout, dann haben wir
  93.              * hier nichts mehr zu tun
  94.              */
  95.             if (event & MU_TIMER)
  96.                 ret=EFILNF;
  97.             else {
  98.  
  99.                 /*
  100.                  * ACC ist jetzt offen. Also mitzählen, wieviele
  101.                  * seiner Fenster noch geöffnet sind, und abbrechen,
  102.                  * sobald das letzte geschlossen wird
  103.                  */
  104.                 open=1;
  105.                 do {
  106.                     event = evnt_multi(MU_MESAG,
  107.                                         0, 0, 0,
  108.                                         0,0,0,0,0,
  109.                                         0,0,0,0,0,
  110.                                         buf, 0, 0,
  111.                                         &d, &d, &d, &d, &d, &d);
  112.                     if (event & MU_MESAG) {
  113.                         if (buf[0] == AV_ACCWINDCLOSED)
  114.                             /* ein Fenster weniger */
  115.                             open--;
  116.                         else if (buf[0] == AV_ACCWINDOPEN)
  117.                             /* ein Fenster mehr */
  118.                             open++;
  119.                         else if (buf[0] == AV_STARTPROG) {
  120.                             /*
  121.                              * Programm sol gestartet werden:
  122.                              *
  123.                              * Kommandozeile für Programmaufruf
  124.                              * zurechtmachen
  125.                              */
  126.                             p = *(char **)&buf[5];
  127.                             if (p) {
  128.                                 strcpy(cmd+1, p);
  129.                                 *cmd = strlen(p);
  130.                             }
  131.                             else {
  132.                                 *cmd = 0;
  133.                             }
  134.                             /*
  135.                              * Hier mü₧te eigentlich noch getestet werden,
  136.                              * ob wir es mit einer TOS- oder GEM- Appl.
  137.                              * zu tun haben...
  138.                              */
  139.                             shel_write(1, 1, 1, *(char **)&buf[3], cmd);
  140.                             open = 0;
  141.  
  142.                             /*
  143.                              * dieses gefiele mir besser,
  144.                              * läuft aber bei mir nicht
  145.                              * (ACC wird nicht geschlossen)
  146.                              * WIESO?
  147.                              */
  148. #                           if 0
  149.                                 appl_exit();
  150.                                 ret = Pexec(0, *(char **)&buf[3],
  151.                                             cmd,
  152.                                             0L);
  153.                                 return(ret);
  154. #                           endif
  155.                         }
  156.                     }
  157.                 } while (open>0);
  158.             }
  159.         }
  160.         appl_exit();
  161.     }
  162.     else
  163.         ret=ENMFIL;
  164.     return(ret);
  165. }
  166.