STRPTR comm,arg[3],cp;
struct IntuitionBase *IntuitionBase;
struct Window *w;
struct MsgPort *wpBuf,*upBuf;
struct IntuiMessage *mess;

UBYTE marke[2];

main(argc,argv)
 SHORT argc;
 STRPTR argv[];
 {
  SHORT i; 

  if(argc < 2) /* Abfrage nach Argumentübergabe */
   {
    Write(Output(),"Usage : jump \" <string> \" ",26L);
    Write(Output(),"[x y z ...] (=gültige Antworten)\r\n",34L);
    ende(100L);
   }
  Write(Output(),"\r\n",2L);  
  Write(Output(),argv[1],(LONG)strlen(argv[1]));
  Write(Output(),"\r\n",2L);

  IntuitionBase = (struct IntuitionBase *)OpenLibrary(
                    "intuition.library",0L);
  if(!IntuitionBase)ende(100L);

/******************************************************
 * Den Zeiger auf das CLI-Window, bekommt das Programm
 * durch Abfrage des aktiven Windows. Daher ist es
 * nötig das CLI-Window während des Programmstartes
 * aktiv zu lassen.
 *****************************************************/
  w = IntuitionBase->ActiveWindow;

/******************************************************
 * Das Öffnen von IDCMP auf das CLI-Window, hat den
 * Vorteil daß nach einem Tastendruck kein 
 * zusätzliches <RETURN> erfolgen muß. Damit nach dem
 * Programm die Konsole wieder zur Verfügung steht,
 * müssen allerdings die Ports des Windows gerettet
 * werden, bevor IDCMP benutzt wird.
 *****************************************************/
  wpBuf = w->WindowPort;
  upBuf = w->UserPort;
  ModifyIDCMP(w,VANILLAKEY);

  FOREVER
   {
    /* Warten auf einen Tastendruck */
    Wait(1L<<w->UserPort->mp_SigBit);

    while(mess = (struct IntuiMessage *)
                      GetMsg(w->UserPort))
     {
     /**********************************************
       * Der Asciiwert der gedrückten Taste, findet *
      * sich in den niedrigeren 8-Bit der 16-Bit   *
      * Variablen <mess->Code> wieder.             *
      * cp ist ein Zeiger auf 8-Bit der auf dieses *
      * 16-Bit Wort zeigt. Wird cp um eins         *
      * hochgezählt, so zeigt es auf den Asciiwert *
      * der gedrückten Taste.                      *
      **********************************************/
      cp = (STRPTR)&mess->Code;
      ReplyMsg(mess);

     /**********************************************
      * Wenn im Programmaufruf bestimmte Antworten *
      * vorgegeben werden, so wird die gedrückte   *
      * Taste hier mit diesen verglichen.          *
      **********************************************/
      if(argc > 2)
       {
        for(i = 2;i < (argc + 1) ; i++)
         {
          if( *argv[i] == *(cp+1) )
           {
            argc = 2;
            break;
           }
         }
       }

     /**********************************************
      * Ist die Antwort erlaubt, so wird hier der  *
      * Sprung vorbereitet und ausgeführt.         *
      **********************************************/
      if(argc == 2)
       {
        marke[1] = 0;
        marke[0] = *(cp+1);
        arg[1] = &marke[0];
        arg[2] = NULL;

        fexecv("skip",arg);
        ende(NULL);
       }

     /* Falls nicht ... */ 
     Write(Output(),"So geht's nicht !! Try it again\n",32L);
     } /* end of while */
   } /* end of FOREVER */
 } /* end of main */

/******************************************************
 * Das Aufräumen :
 * Die IDCMP werden wieder entfernt, und dem Window
 * die Ports der Konsole zurückgegeben.
 *****************************************************/
ende(retval)
 LONG retval;
 {
  if(IntuitionBase)
   {
    ModifyIDCMP(w,NULL);
    w->UserPort = upBuf;
    w->WindowPort = wpBuf;
    CloseLibrary(IntuitionBase);
   }
  Exit(retval);
 }
