/* F0:BEFWALT                 25.02.88  7:45:17*//* BEFWALT   Version 1.9/25.02.88/Frevert #&SPEC Programmbeschreibung #PROG Programm#&SPECDer Modul dient zum Aufbau und zur Verwaltung hierarchischer Menues.Er benoetigt die Module BEFPROCT und FILEWALT (letzteren nur, wennin den Menues auch Dateien angewaehlt werden sollen).Der Modul enthaelt folgende globale Prozeduren: */LISTENAUSGABE:PROC(DLISTE () CHAR(27) IDENT,                      DUEBERSCHRIFT  CHAR(40),                      (STARTZEILE,ENDZEILE) FIXED                                                        ) GLOBAL;   /*  Die Prozedur gibt eine Liste DLISTE so aus, dass moeglichst viele  Eintraege, durch ein Leerzeichen getrennt, in einer Zeile stehen.  Davor steht DUEBERSCHRIFT. STARTZEILE und ENDEZEILE bestimmen, wo  sich die Liste auf dem Bildschirm befindet. */  MENUEINIT:PROC(MENUEEINTRAEGE () MENUEEINTRAG IDENT,                    (INDEX,MENUENR,XKOORD,YKOORD,TOCHTER) FIXED,                    DTEXT CHAR(38),                    (EINGABEART,DANTWORTLAENGE,MINIMUM,MAXIMUM,                            AUSWAHLBEDINGUNG) FIXED                                                           ) GLOBAL;/*  Die Prozedur dient zur erstmaligen Auffuellung von MENUEEINTRAEGE.  INDEX ist der Index der Eintragung, MENUENR die Nummer des Menues  (Hauptmenue mit Menuenr 0), XKOORD und YKOORD sind die Stellen,  an denen DTEXT auf dem Bildschirm dargestellt wird (1,1 linke  obere Ecke), TOCHTER die Nummer des Tochtermenues, in das bei  Anwahl eines Eintrages gegangen wird.  EINGABEART legt fest, welche Eingabe bei Anwahl eines Eintrages  erwartet wird, DANTWORTLAENGE die geforderte Laenge eines  Eintrages.  MINIMUM und MAXIMUM haben je nach Eingabeart die folgende Bedeutung:   EINGABEART               MINIMUM                 MAXIMUM  -----------------------------------------------------------  FIXED              untere Grenze des Wertes     obere Grenze                     bei zulaessigen Eingaben   LISTE              Zeilenposition der 1. Zeile                        der Liste   DATEI              Position 1. Zeile Directory   AUSWAHLBEDINGUNG legt fest, ob bei Anwahl eines Eintrages die  uebrigen Eintraege in den Status "nicht gewaehlt" gebracht werden  sollen, ob alle Eintraege eine Eingabe erfordern, wenn das  Programm, das das Menue benutzt, richtig arbeiten soll, oder  ob es sich um zusaetzliche Optionen handelt.  */ BEFEHLSWAHL:PROC((STARTZEILE,MAXY) FIXED,MENUENR FIXED,                  MENUEEINTRAEGE () MENUEEINTRAG IDENT,                  UEBERSCHRIFTTEXT  CHAR(80),                  DATEILISTE () CHAR(27) IDENT,                  GEWAEHLT BIT(1) IDENT)           GLOBAL;  /*  Die Prozedur dient zur Auswahl von Eintragungen in hierarchischen  Menues. Die Menues werden zwischen STARTZEILE und MAXY auf den  Bildschirm gebracht, mit UEBERSCHRIFTTEXT. Fallls ein Eintrag  mit den Cursortasten angefahren und mit der Insert-Taste gewaehlt  wurde, wird im Menueeintrag das Bit .GEWAEHLT gesetzt. Konkurrie-  rende Eintraege werden eventuell (je nach AUSWAHLBEDINGUNG, s.  MENUEINIT) auf nicht gewaehlt gesetzt.  Nach erfolgter Auswahl muss in der Schlusszeile der "ok"-Eintrag  angefahren werden (mit Return) und mit Insert bestaetigt werden.  Falls Eingaben von Parametern usw. nicht vollstaendig sind, springt  der Cursor automatisch auf die betreffende Menueeintragung.  Bei Auswahl von Directory-Eintraegen werden diese in DATEILISTE  eingetragen.  GEWAEHLT gibt bei Rueckkehr aus BEFEHLSWAHL an, ob ueberhaupt eine  Menueeintragung angewaehlt worden war.*/ MENUEANTWORT:PROC(DMENUE () INV MENUEEINTRAG IDENT,                   MENUENR FIXED,DTEXT CHAR(38))               RETURNS (CHAR(27)) GLOBAL;  /*  Die Prozedur dient zum vereinfachten Zugriff auf die in DMENUE  eingetragenen Antworten. Diese werden ermittelt, indem  die zugehoerige MENUENR und der DTEXT des Eintrages (anstelle  des Indexes, der bei der Programmentwicklung erfahrungsgemaess  oefter geaendert wird) an die Prozedur uebergeben werden. */ BEFEHLGEWAEHLT:PROC(DMENUE () INV MENUEEINTRAG IDENT,                      MENUENR FIXED,DTEXT CHAR(38))                     RETURNS(BIT(1)) GLOBAL; /*  Dient zur vereinfachten Feststellung, ob ein Menueeintrag  gewaehlt wurde. Ubergeben wird die MENUENR und der DTEXT  des Eintrages. #PROG*/S=3FB2;/* */ MODULE BEFWALM;/*Mit Testtask BEFTEST */   /*  #%D KOMPILERDIREKTIVEN FUER TEST #$DL KOMPILERDIREKTIVEN FUER ECHTEN LAUF #%S SYSTEMTEIL  fuer Betrieb ohne Darteiauswahl #P PROBLEMTEIL*//*+L*//* */ MODEND; /*#$DL  *//*-L*//*-M*//*#%D *//*-L*//*+M*//*+T*//*#P  */ PROBLEM; /*  #PTY Datentypen und zugehoerige Konstanten  #PS Spezifikationen  #$PSM Spezifikationen fuer Betrieb mit Datei-Auswahl  #%PSM Spezifikationen fuer Betrieb ohne Dateiauswahl  #PK Konstanten  #PD Deklarationen  #%PDO Deklarationen fuer Betrieb ohne Dateiauswahl  #PP Prozeduren #%PSM  */    SPC DIALOG              DATION  INOUT ALPHIC CONTROL(ALL);    SPC SCANNER DATION IN ALPHIC CONTROL(ALL);    SPC TASTEN DATION IN ALPHIC CONTROL(ALL);/*#$PSM */ /* Konstanten fuer Festlegung der geforderten Eingabe */ SPC (KEINEEINGABE,TEXT,DATEI,EINEDATEI,NAME) INV FIXED GLOBAL; SPC (DIRECTRY,FIXEDZAHL,LISTE) INV FIXED GLOBAL;    SPC DATEIWAHL ENTRY GLOBAL;    SPC DIALOG              DATION  INOUT ALPHIC CONTROL(ALL) GLOBAL;    SPC TASTEN DATION IN ALPHIC CONTROL(ALL) GLOBAL;    SPC SCANNER DATION IN ALPHIC CONTROL(ALL) GLOBAL;/*#%PDO  */ /* Konstanten fuer Festlegung der geforderten Eingabe */ DCL (KEINEEINGABE,NAME,FIXEDZAHL,TEXT,DATEI) INV FIXED GLOBAL INIT     (    0       ,1   ,2        ,3   , 4            ); DCL (EINEDATEI,DIRECTRY,LISTE) INV FIXED GLOBAL INIT     (    5    ,  6     , 7      );/*#PK  */ DCL (NORMAL,INVERS,UNTERSTRICHEN,INVERSUNTERSTRICHEN) INV FIXED  INIT(1 ,    2    , 3     ,        4);/*#PD Deklarationen  */  DCL ERSTESMAL BIT(1) INIT('1'B);  DCL LEER CHAR(80);  DCL UNTERLEGUNG CHAR(80);  DCL MENUELEVEL FIXED INIT(0);  DCL (ABBRUCH,ALLESOK) BIT(1);  DCL (HOCHPFEIL,TIEFPFEIL,NUL,RETURN,LINKSPFEIL,RECHTSPFEIL) CHAR(1);  DCL ESCAPE CHAR(1);/*#PTY Datentypen   */   TYPE MENUEEINTRAG STRUCT[TEXT CHAR(38),                            LAENGE FIXED,                            ANTWORT CHAR(27),                            ANTWLAENGE FIXED,                            (EINGABE,                             MINIMUM,                             MAXIMUM)  FIXED,                            EINGABEART FIXED,                            MENUENR FIXED,                            TOCHTERMENUE FIXED,                            (X,Y) FIXED,                            BEDINGUNG FIXED,                            GEWAEHLT BIT(1)         ]; /* Konstanten fuer Festlegung von BEDINGUNG:           */ DCL (KEINEBEDINGUNG,EXKLUSIV,ALLENOTWENDIG) INV FIXED GLOBAL INIT     (     0        ,    1,       2        );  DCL ANTWORTLAENGE INV FIXED INIT(27);/*#PP  #PP1 Prozedur zur Initialisierung des Menues  #PP2 Prozedur zur Ausgabe des Menues auf Bildschirm  #PP4 Prozedur zur Anwahl eines bestimmten Eintrages  #PP6 Prozedur zur Berechnung von Anfangs- und Endezeiger  #PP7 Prozedur zur Loeschung des GEWAEHLT-Bits in Untermenues  #PP8 Prozedur zur Ausgabe der Gebrauchsanleitung  #PPA Prozedur zur Ausgabe der Menue-Endzeile  #PPB Prozedur zur Umwandlung einer Ziffernkette in eine FIXED-Zahl  #PPC Prozedur zur Umwandlung einer FIXED-Zahl in die Zeichenkette  #PPD Prozedur zur Syntaxpruefung von Eingabestrings  #PPE Prozedur zur Feststellung, ob Menueeintragung gewaehlt  #PPF Prozedur zur Rueckgabe einer Menueantwort  #PPX Prozedur zur Ausgabe einer Liste in CHAR(80)-ZEILEN  #PPY Prozedur zum Sortieren der Liste #PPF */ MENUEANTWORT:PROC(DMENUE () INV MENUEEINTRAG IDENT,                   MENUENR FIXED,DTEXT CHAR(38))               RETURNS (CHAR(27)) GLOBAL;    FOR I TO 1 UPB DMENUE REPEAT       IF DMENUE(I).TEXT==DTEXT             AND DMENUE(I).MENUENR==MENUENR THEN         RETURN(DMENUE(I).ANTWORT);       FIN;    END;    RETURN(' '); END;/*#PPE  */   BEFEHLGEWAEHLT:PROC(DMENUE () INV MENUEEINTRAG IDENT,                      MENUENR FIXED,DTEXT CHAR(38))                     RETURNS(BIT(1)) GLOBAL;     FOR I TO 1 UPB DMENUE REPEAT       IF DMENUE(I).TEXT==DTEXT AND DMENUE(I).MENUENR==MENUENR          AND DMENUE(I).GEWAEHLT THEN         RETURN('1'B);       FIN;    END;    RETURN('0'B);  END;/* #PPD */    SYNTAXPRUEFEN:PROC(STRING CHAR(27) IDENT,                     LAENGE FIXED,                     PRUEFART FIXED) RETURNS(BIT(1));      DCL FEHLER BIT(1) INIT('0'B);          DCL (VORZEICHENGEFUNDEN,               ENDE,              ZIFFERGEFUNDEN) BIT(1) INIT('0'B,'0'B,'0'B);           DCL ZEICHENGEFUNDEN BIT(1) INIT ('0'B);      CASE PRUEFART       ALT/*NAME*/         FOR I FROM LAENGE+1 TO 27 REPEAT            STRING.CHAR(I):=' ';         END;         FOR I FROM LAENGE BY -1 TO 1 REPEAT           IF STRING.CHAR(I)/=' ' THEN             ZEICHENGEFUNDEN:='1'B;           FIN;           IF ZEICHENGEFUNDEN THEN             IF NOT((TOFIXED STRING.CHAR(I)>=TOFIXED '0' AND                     TOFIXED STRING.CHAR(I)<=TOFIXED '9' AND                     I/=1)                 OR (TOFIXED STRING.CHAR(I)>=TOFIXED 'A' AND                     TOFIXED STRING.CHAR(I)<=TOFIXED 'Z')) THEN                FEHLER:='1'B;                STRING.CHAR(I):='?';             FIN;           FIN;        END;      ALT /*FIXEDZAHL*/        FOR I FROM 1 TO 6 REPEAT          IF NOT (((STRING.CHAR(I)=='+' OR                   STRING.CHAR(I)=='-') AND                   NOT VORZEICHENGEFUNDEN    AND                   NOT ZIFFERGEFUNDEN)               OR STRING.CHAR(I)==' '               OR ((TOFIXED STRING.CHAR(I)>=TOFIXED '0' AND                   TOFIXED STRING.CHAR(I)<=TOFIXED '9') AND                   NOT ENDE )) THEN             FEHLER:='1'B;             STRING.CHAR(I):='?';          FIN;          IF STRING.CHAR(I)=='+' OR             STRING.CHAR(I)=='-' THEN            VORZEICHENGEFUNDEN:='1'B;          FIN;          IF (TOFIXED STRING.CHAR(I)>=TOFIXED '0'              AND TOFIXED STRING.CHAR(I)<=TOFIXED '9') THEN             ZIFFERGEFUNDEN:='1'B;          FIN;          IF ZIFFERGEFUNDEN AND STRING.CHAR(I)==' ' THEN            ENDE:='1'B;          FIN;      END;    FIN;    RETURN(FEHLER); END;/*#PPC  */    FIXEDMACHEN:PROC(ZIFFERN CHAR(6)) RETURNS(FIXED);      DCL (ZAHL,VORZEICHEN) FIXED;      ZAHL:=0;      VORZEICHEN:=1;      FOR I TO 6 REPEAT        IF ZIFFERN.CHAR(I)=='-' THEN VORZEICHEN:=-1; FIN;        IF TOFIXED ZIFFERN.CHAR(I)>=TOFIXED '0'           AND  TOFIXED ZIFFERN.CHAR(I)<=TOFIXED '9' THEN         ZAHL:=ZAHL*10+(TOFIXED ZIFFERN.CHAR(I)-TOFIXED '0');        FIN;      END;      RETURN(ZAHL*VORZEICHEN);    END;/*#PPB  */   FIXEDZIFFERN:PROC(ZAHL FIXED) RETURNS(CHAR(6));      DCL KETTE CHAR(6);      DCL (STELLE,REST) FIXED;      DCL VORZEICHEN CHAR(1);      IF ZAHL>=0 THEN        VORZEICHEN:=' ';       ELSE        VORZEICHEN:='-';        ZAHL:=-ZAHL;      FIN;      FOR I FROM 6 BY -1 TO 1 WHILE ZAHL>0 REPEAT         REST:=ZAHL-ZAHL//10*10;         KETTE.CHAR(I):=TOCHAR(REST+TOFIXED'0');         ZAHL:=ZAHL//10;         IF ZAHL==0 THEN STELLE:=I-1;FIN;      END;      IF VORZEICHEN=='-' THEN        KETTE.CHAR(STELLE):=VORZEICHEN;        STELLE:=STELLE-1;      FIN;      FOR I FROM STELLE+1 TO 6 REPEAT          KETTE.CHAR(I-STELLE):=KETTE.CHAR(I);      END;      FOR I FROM 6-STELLE+1 TO 6 REPEAT          KETTE.CHAR(I):=' ';      END;      RETURN(KETTE);  END;/*#PPY  */  LISTE27SORTIEREN:PROC(DLISTE () CHAR(27) IDENT,                        LISTENLAENGE FIXED);        DCL VERTAUSCHT BIT(1),SORTIERMENGE FIXED,HILFSEINTRAG CHAR(27);        VERTAUSCHT:='1'B;        SORTIERMENGE:=LISTENLAENGE;        WHILE SORTIERMENGE>1 AND VERTAUSCHT REPEAT          FOR I TO SORTIERMENGE-1  REPEAT            IF KLEINER(DLISTE(I+1),               DLISTE(I)) THEN               HILFSEINTRAG:=DLISTE(I);               DLISTE(I):=DLISTE(I+1);               DLISTE(I+1):=HILFSEINTRAG;               VERTAUSCHT:='1'B;            FIN;           END;           SORTIERMENGE:=SORTIERMENGE-1;         END;  END;/*#PPX   */   LISTENAUSGABE:PROC(DLISTE () CHAR(27) IDENT,                      DUEBERSCHRIFT  CHAR(40),                      (STARTZEILE,ENDZEILE) FIXED                                                        ) GLOBAL;   /*  #PPX1 Lokale Variable #PPX2 Stelle Listenende fest #PPX3 Sortiere Liste #PPX4 Loesche Listenbereich #PPX5 Beginne am Anfang  und gib Ueberschrift aus #PPX7   Gib Eintragung aus #PPX9   Schalte auf naechste Eintragung #PPX8 Ende Wiederholung  */ END; /* #PPX1   */   DCL (ARBEITSZEIGER,LAENGE,ZEILENY,ZEILENX,LISTENLAENGE) FIXED;/*#PPX9  */    ARBEITSZEIGER:=ARBEITSZEIGER+1;/*#PPX7 #PPX71 IF Eintragung nicht mehr  in die Zeile passt #PPX73   THEN setze auf Anfang naechster Zeile     */ FIN; /* #PPX74 Gib Zeile aus, falls zulaessig #PPX73  */ THEN   ZEILENY:=ZEILENY+1;ZEILENX:=3; IF ZEILENY<=ENDZEILE THEN    CALL STRINGAUSGABE('|',1,ZEILENY,1,NORMAL);    CALL STRINGAUSGABE('|',1,ZEILENY,80,NORMAL);    CALL STRINGAUSGABE(' ',78,ZEILENY,2,NORMAL); FIN;/*#PPX74 */   IF ZEILENY<=ENDZEILE THEN     CALL STRINGAUSGABE(DLISTE(ARBEITSZEIGER),                      LAENGE,                      ZEILENY,ZEILENX,NORMAL);     ZEILENX:=ZEILENX+LAENGE+1;   FIN;/*#PPX71 */    LAENGE:=STRINGLAENGE(DLISTE(ARBEITSZEIGER));    IF ZEILENX+LAENGE> 79/*#PPX8  */ END; /* #PPX5 */  ZEILENY:=STARTZEILE;ZEILENX:=2;  ARBEITSZEIGER:=1; IF ZEILENY<=ENDZEILE THEN  CALL STRINGAUSGABE('|',1,ZEILENY,1,NORMAL);  CALL STRINGAUSGABE('|',1,ZEILENY,80,NORMAL);  CALL STRINGAUSGABE(' ',78,ZEILENY,2,NORMAL);  CALL STRINGAUSGABE(DUEBERSCHRIFT,STRINGLAENGE(DUEBERSCHRIFT),                       ZEILENY,ZEILENX,UNTERSTRICHEN);  ZEILENX:=ZEILENX+STRINGLAENGE(DUEBERSCHRIFT)+1; FIN;  WHILE ARBEITSZEIGER<=LISTENLAENGE AND ZEILENY<=ENDZEILE REPEAT/*#PPX4 */     FOR I FROM STARTZEILE+1 TO ENDZEILE REPEAT       CALL STRINGAUSGABE(LEER,80,I,1,NORMAL);     END;/*#PPX3  */   CALL LISTE27SORTIEREN(DLISTE,LISTENLAENGE);/*#PPX2 */     LISTENLAENGE:=1 UPB DLISTE;     FOR I TO 1 UPB DLISTE WHILE LISTENLAENGE==1 UPB DLISTE REPEAT       IF DLISTE(I)==' ' THEN         LISTENLAENGE:=I-1;       FIN;     END;/*#PP8 Prozedur zur Ausgabe der Gebrauchsanleitung                */  ANLEITUNG:PROC(MAXY FIXED);   CALL UEBERSCHRIFT(      'Positionieren: Return-/Pfeiltasten | ' CAT     /*123456789012345678901234567890123456789012345678901234   */      'Ins vorige Submenue: 7-Taste',  MAXY+2); CALL UEBERSCHRIFT(      'JA: Insert- |  Nein: Delete-  | ' CAT     /*123456789012345678901234567890123456789012345678901234   */      'Eingabe vorbereiten: Insert-Taste',  MAXY+3);END;/*#PPA Prozedur zur Ausgabe der Menue-Endzeile                    */MENUEENDE:PROC(MAXY FIXED,ANWAHL FIXED,INVERTIERT BIT(1));  DCL (ART1,ART2)FIXED;  IF ANWAHL==0 THEN    CALL STRINGAUSGABE(UNTERLEGUNG,80,MAXY+1,1,NORMAL);  FIN;  ART1:=UNTERSTRICHEN;ART2:=UNTERSTRICHEN;  IF ANWAHL==1 AND INVERTIERT THEN     ART1:=INVERSUNTERSTRICHEN;  FIN;  IF ANWAHL==2 AND INVERTIERT THEN     ART2:=INVERSUNTERSTRICHEN;  FIN;  IF ANWAHL==1 OR ANWAHL==0 THEN   CALL STRINGAUSGABE(           'OK ==> Insert-Taste',   /*       123456789012345678901234567890123456789012345  */                   20,MAXY+1,10,ART1);  FIN;  IF ANWAHL==2 OR ANWAHL==0 THEN   CALL STRINGAUSGABE(           'Abbruch ==> Delete-Taste',   /*       123456789012345678901234567890123456789012345  */                   24,MAXY+1,50,ART2);   FIN;   IF ANWAHL==1 THEN     CALL CURSORPOSITION(MAXY+1,10);   FIN;   IF ANWAHL==2 THEN     CALL CURSORPOSITION(MAXY+1,50);   FIN;END;/*#PP7 Prozedur zur Loeschung des GEWAEHLT-Bits in Untermenues     */      GEWAEHLTLOESCHEN:PROC(MENUEEINTRAEGE () MENUEEINTRAG IDENT,                            (MENUENR,                            STARTZEILE,ENDEZEILE) FIXED); /* #PP70 Lokale Variable #PP71 Berechne Untermenuedaten #PP72 Loesche Merkbits, Menuetexte und Untermenues #PP73 Loesche Menuezeilen, wenn kein Abbruch    */ END; /* #PP70 Lokale Variable                                          */    DCL (ANFANGSZEIGER,ENDEZEIGER,MINY,MAXZEILE,MENUEZAHL) FIXED;/*#PP71 Berechne Untermenuedaten */  CALL ZEIGERBERECHNEN(MENUEEINTRAEGE,MENUENR,STARTZEILE,                       ANFANGSZEIGER,ENDEZEIGER,                            MENUEZAHL,MINY,MAXZEILE      );/*#PP72  */ FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT  /* #PP721  Loesche Merkbits #PP723  Loesche evtl. vorhandene Untermenues     */ END; /*  #PP721  Loesche Merkbits */               MENUEEINTRAEGE(I).GEWAEHLT:='0'B;/*#PP73  Loesche Menuetext  */  IF NOT ABBRUCH THEN    FOR I FROM MINY+STARTZEILE TO ENDEZEILE REPEAT               CALL STRINGAUSGABE(LEER,80,I,1,NORMAL);    END;  FIN;/*#PP723  Loesche evtl. vorhandene Untermenues */               IF MENUEEINTRAEGE(I).TOCHTERMENUE>0 THEN                 CALL GEWAEHLTLOESCHEN(MENUEEINTRAEGE,                                       MENUEEINTRAEGE(I).TOCHTERMENUE,                                       STARTZEILE,ENDEZEILE);               FIN;/*#PP6   */       ZEIGERBERECHNEN:PROC(MENUEEINTRAEGE () MENUEEINTRAG IDENT,                             MENUENR FIXED,STARTZEILE FIXED,                            (ANFANGSZEIGER,ENDEZEIGER,                             MENUEZAHL,MINY,MAXZEILE) FIXED IDENT);      ANFANGSZEIGER:=1 UPB MENUEEINTRAEGE+1;      FOR I TO 1 UPB MENUEEINTRAEGE REPEAT         IF MENUEEINTRAEGE(I).MENUENR == MENUENR THEN            ANFANGSZEIGER:=I;            GOTO EXPP42A;         FIN;      END;EXPP42A:;      ENDEZEIGER:=1 UPB MENUEEINTRAEGE+1;      FOR I FROM ANFANGSZEIGER TO 1 UPB MENUEEINTRAEGE REPEAT         IF MENUEEINTRAEGE(I).MENUENR /= MENUENR THEN            ENDEZEIGER:=I;            GOTO EXPP42B;         FIN;      END;EXPP42B:;      ENDEZEIGER:=ENDEZEIGER-1;      MENUEZAHL:=ENDEZEIGER-ANFANGSZEIGER+1;    MINY:=100;MAXZEILE:=0;    FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT       IF MENUEEINTRAEGE(I).Y<MINY THEN          MINY:=MENUEEINTRAEGE(I).Y;       FIN;    END;    FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT       IF MENUEEINTRAEGE(I).Y>MAXZEILE THEN          MAXZEILE:=MENUEEINTRAEGE(I).Y;       FIN;    END;  END;/*#PP1 */     MENUEINIT:PROC(MENUEEINTRAEGE () MENUEEINTRAG IDENT,                    (INDEX,MENUENR,XKOORD,YKOORD,TOCHTER) FIXED,                    DTEXT CHAR(38),                    (EINGABEART,DANTWORTLAENGE,MINIMUM,MAXIMUM,                            AUSWAHLBEDINGUNG) FIXED                                                           ) GLOBAL;        DCL LAENGE FIXED,POINTER REF CHAR(38);  IF ERSTESMAL THEN    ERSTESMAL:='0'B;    LEER:='|.......................................' CAT          '.......................................|';    /*     1234567890123456789012345678901234567890   */      UNTERLEGUNG:='#_______________________________________' CAT             /*     1234567890123456789012345678901234567890  */                   '_______________________________________#'; FIN;     IF INDEX>0 AND INDEX<=1 UPB MENUEEINTRAEGE THEN        MENUEEINTRAEGE(INDEX).TEXT       :=DTEXT             ;        MENUEEINTRAEGE(INDEX).X          :=XKOORD           ;        MENUEEINTRAEGE(INDEX).Y          :=YKOORD           ;        MENUEEINTRAEGE(INDEX).MENUENR    :=MENUENR          ;        MENUEEINTRAEGE(INDEX).TOCHTERMENUE:=TOCHTER          ;        MENUEEINTRAEGE(INDEX).BEDINGUNG  :=AUSWAHLBEDINGUNG ;        MENUEEINTRAEGE(INDEX).GEWAEHLT   :='0'B             ;        MENUEEINTRAEGE(INDEX).EINGABEART :=EINGABEART       ;        MENUEEINTRAEGE(INDEX).MINIMUM    :=MINIMUM          ;        MENUEEINTRAEGE(INDEX).MAXIMUM    :=MAXIMUM          ;        MENUEEINTRAEGE(INDEX).EINGABE    :=MINIMUM          ;        MENUEEINTRAEGE(INDEX).ANTWORT    :=' '              ;        MENUEEINTRAEGE(INDEX).ANTWLAENGE :=DANTWORTLAENGE    ;      ELSE        PUT 'Indexfehler bei Menue-Initialisierung'              TO DIALOG BY SKIP,A,SKIP;        GET FROM DIALOG BY SKIP;    FIN;    POINTER:=MENUEEINTRAEGE(INDEX).TEXT;    LAENGE:=1;    FOR J FROM 38 BY -1 TO 1 REPEAT      IF POINTER.CHAR(J) /=' ' THEN         LAENGE:=J;         GOTO EXIT;      FIN;    END;EXIT:;    MENUEEINTRAEGE(INDEX).LAENGE:=LAENGE;   END;/*#PP4 Prozedur zur Anwahl eines bestimmten Eintrages         */   BEFEHLSWAHL:PROC((STARTZEILE,MAXY) FIXED,MENUENR FIXED,                  MENUEEINTRAEGE () MENUEEINTRAG IDENT,                  UEBERSCHRIFTTEXT  CHAR(80),                  DATEILISTE () CHAR(27) IDENT,                  GEWAEHLT BIT(1) IDENT)           GLOBAL;/* #PP41 Lokale Variable #PP40 Initialisiere Char-Konstanten und ALLESOK, ABBRUCH und ZURUECK #PP42 Bestimme Zeiger auf ersten und letzten Eintrag usw. #PP4M Erhoehe Menuelevel #PP4K Bei Menuelevel 1 trage Hintergrundzeilen ein,       gib Ueberschrift aus       und aktiviere Blinktask #PP43 Gib Menue aus und setze Zeiger #PP4A Gib Schlusszeichen aus #PP4C Gib Gebrauchsanweisung aus    */ REPEAT /* #PP44   Gib  angewaehlten Eintrag aus #PP45   lies Zeichen ein #PP46   handle entsprechend #PP47   EXIT WHEN Alles OK oder Abbruch oder ZURUECK #PP48 Ende Wiederholung #PP4R Bei Menuelevel 2 setze Merkbits zurueck #PP49 Mache ordentlich Schluss    */ IF MENUELEVEL ==1 THEN  /* #PP4O Gib Menue noch einmal aus und positioniere Cursor in Folgezeile    */ FIN; /* #PP4N Erniedrige Menuelevel       */ END; /* #PP4K  */ IF MENUELEVEL==1 THEN       FOR I FROM STARTZEILE+1 TO MAXY REPEAT                   CALL STRINGAUSGABE(LEER,80,I,1,NORMAL);       END;     FIN;     CALL UEBERSCHRIFT(UEBERSCHRIFTTEXT,STARTZEILE);/*#PP4N */ MENUELEVEL:=MENUELEVEL-1;  /*#PP4M */ MENUELEVEL:=MENUELEVEL+1;  /* #PP47 */    IF ALLESOK OR ABBRUCH OR ZURUECK THEN GOTO EXPP4;FIN;/*#PP42 */  CALL ZEIGERBERECHNEN(MENUEEINTRAEGE,MENUENR,STARTZEILE,                       ANFANGSZEIGER,ENDEZEIGER,                            MENUEZAHL,MINY,MAXZEILE);/*#PP4A  */    CALL MENUEENDE(MAXY,0,'0'B );/*#PP4C  */     CALL ANLEITUNG(MAXY);/*#PP41 Lokale Variable  */     DCL (ZUSATZWAHL,EXKLUSIVWAHL,NOTWENDIGWAHL) BIT(1);     DCL ZURUECK BIT(1);     DCL TRENNZEICHEN CHAR(2);     DCL EINGABEFEHLER BIT(1);     DCL HILFSZAHL FIXED;     DCL HILFSSTRING CHAR(27);     DCL HILFSLISTE (1) CHAR(27);     DCL LAENGE FIXED;     DCL ZEILE CHAR(80);     DCL ALTESMENUE FIXED;     DCL MASKE CHAR(8);     DCL ZEICHEN CHAR(2);     DCL EINTRAGZEIGER FIXED;     DCL ALTERZEIGER FIXED;     DCL (ANFANGSZEIGER,ENDEZEIGER,MENUEZAHL) FIXED;     DCL (ZEILENLAGE,SPALTENLAGE) FIXED;     DCL (MAXZEILE,MINY) FIXED;/*#PP40 */  ESCAPE:=TOCHAR 27;  HOCHPFEIL:=TOCHAR(11);  TIEFPFEIL:=TOCHAR(10);  NUL      :=TOCHAR(0);  RETURN   :=TOCHAR(13);  LINKSPFEIL:=TOCHAR(8);  RECHTSPFEIL:=TOCHAR(12);  MASKE:=' ';  ABBRUCH:='0'B;  ALLESOK:='0'B;  ZURUECK:='0'B;/*#PP43 Gib es aus #PP431 Setze Zeiger auf evtl. gewaehlten exclusiven Eintrag #PP432 Gib Menue aus #PP432 */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'1'B);/*#PP431 */     EINTRAGZEIGER:=ANFANGSZEIGER;     FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT       IF MENUEEINTRAEGE(I).GEWAEHLT AND           MENUEEINTRAEGE(I).BEDINGUNG==EXKLUSIV THEN         EINTRAGZEIGER:=I;         GOTO EXPP431;       FIN;     END;EXPP431:;     ALTERZEIGER:=EINTRAGZEIGER;/*#PP4O  */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'1'B);   CALL CURSORPOSITION(MAXY+3,1);/*#PP44   Gib alten und angewaehlten Eintrag aus   */   IF ALTERZEIGER<=ENDEZEIGER THEN     CALL MENUEAUSGABE(STARTZEILE,                       MENUEEINTRAEGE,DATEILISTE,MENUENR,MAXY,                           ALTERZEIGER,'1'B);    ELSE    CALL MENUEENDE(MAXY,ALTERZEIGER-ENDEZEIGER,'0'B);   FIN;   IF EINTRAGZEIGER<=ENDEZEIGER THEN     CALL MENUEAUSGABE(STARTZEILE,                       MENUEEINTRAEGE,DATEILISTE,MENUENR,MAXY,                           EINTRAGZEIGER,'1'B);    ELSE     IF EINTRAGZEIGER>ENDEZEIGER THEN    CALL MENUEENDE(MAXY,EINTRAGZEIGER-ENDEZEIGER,'1'B);     FIN;   FIN;     ALTERZEIGER:=EINTRAGZEIGER;/*#PP45   lies Zeichen ein */         ZEICHEN.CHAR(1):=NUL;         ZEICHEN.CHAR(2):=NUL;  WHILE ZEICHEN.CHAR(1)==NUL REPEAT    IF EINTRAGZEIGER<=ENDEZEIGER THEN       CALL MENUEAUSGABE(STARTZEILE,                       MENUEEINTRAEGE,DATEILISTE,MENUENR,MAXY,                           EINTRAGZEIGER,'0'B);    FIN;    IF EINTRAGZEIGER>ENDEZEIGER THEN      CALL MENUEENDE(MAXY,EINTRAGZEIGER-ENDEZEIGER,'0'B);    FIN;    TO 10 WHILE ZEICHEN.CHAR(1)==NUL REPEAT         GET ZEICHEN.CHAR(1) FROM SCANNER BY SKIP,A(1);       AFTER 0.01 SEC RESUME;    END;    IF EINTRAGZEIGER<=ENDEZEIGER THEN       CALL MENUEAUSGABE(STARTZEILE,                       MENUEEINTRAEGE,DATEILISTE,MENUENR,MAXY,                           EINTRAGZEIGER,'1'B);    FIN;    IF EINTRAGZEIGER>ENDEZEIGER THEN       CALL MENUEENDE(MAXY,EINTRAGZEIGER-ENDEZEIGER,'1'B);    FIN;    TO 90 WHILE ZEICHEN.CHAR(1)==NUL REPEAT         GET ZEICHEN.CHAR(1) FROM SCANNER BY SKIP,A(1);       AFTER 0.01 SEC RESUME;    END;  END;       IF ZEICHEN.CHAR(1)==ESCAPE THEN          GET ZEICHEN.CHAR(2) FROM SCANNER BY SKIP,A;       FIN;/*#PP46   handle entsprechend #PP461 Wenn Linkspfeil, gehe nach links #PP462 Wenn Rechtspfeil, gehe nach rechts #PP463 Wenn Hochpfeil, gehe nach oben #PP464 Wenn Tiefpfeil, gehe nach unten #PP465 Wenn Insert oder Delete, gehe in naechste Ebene oder          fuehre Eingabe durch #PP468 Wenn 7-Taste, setze Rueckkehr-Bit #PP467 Wenn Return, gehe an Anfang der letzten Zeile #PP468  */ZURUECK:=ZEICHEN.CHAR(1)=='7';/* #PP461 Wenn Linkspfeil, gehe nach links */      IF ZEICHEN.CHAR(1) == LINKSPFEIL THEN        IF EINTRAGZEIGER > ANFANGSZEIGER THEN           EINTRAGZEIGER:=EINTRAGZEIGER-1;        FIN;      FIN;/*#PP462 Wenn Rechtspfeil, gehe nach rechts */      IF ZEICHEN.CHAR(1) == RECHTSPFEIL THEN        IF EINTRAGZEIGER <= ENDEZEIGER+2 THEN           EINTRAGZEIGER:=EINTRAGZEIGER+1;        FIN;      FIN;/*#PP463 Wenn Hochpfeil, gehe nach oben  */       IF ZEICHEN.CHAR(1) == HOCHPFEIL THEN          IF EINTRAGZEIGER>ENDEZEIGER THEN             EINTRAGZEIGER:=ENDEZEIGER;           ELSE            FOR I FROM ANFANGSZEIGER TO EINTRAGZEIGER REPEAT              IF MENUEEINTRAEGE(I).Y==                 MENUEEINTRAEGE(EINTRAGZEIGER).Y-1 THEN               EINTRAGZEIGER:=I;               GOTO EXPP463;             FIN;           END;EXPP463:;         FIN;       FIN;/*#PP464 Wenn Tiefpfeil, gehe nach unten                      */       IF ZEICHEN.CHAR(1) == TIEFPFEIL THEN          FOR I FROM EINTRAGZEIGER TO ENDEZEIGER REPEAT            IF MENUEEINTRAEGE(I).Y==              MENUEEINTRAEGE(EINTRAGZEIGER).Y+1 THEN              EINTRAGZEIGER:=I;              GOTO EXPP464;            FIN;          END;EXPP464:;       FIN;/*#PP465   */         IF ZEICHEN.CHAR(1)==ESCAPE AND (ZEICHEN.CHAR(2)==RECHTSPFEIL                                    OR ZEICHEN.CHAR(2)==LINKSPFEIL)             THEN   /* #PP4651  IF auf Menueintragung gezeigt wird #PP4652    THEN handle entsprechend #PP4653    ELSE bereite Schlussmachen vor          */ FIN; /*   */ FIN; /* #PP4653 */   ELSE  /* #PP46531 Setze Merkbit #PP46532 IF ALLESOK gesetzt, #PP46533    THEN  Pruefe, ob wirklich alles ausgefuellt, und triff             evtl. weitere Massnahmen     */FIN; /* #PP46531 Setze Merkbit   */    ALLESOK:=       EINTRAGZEIGER==ENDEZEIGER+1 AND ZEICHEN.CHAR(2)==RECHTSPFEIL;    ABBRUCH:=       EINTRAGZEIGER==ENDEZEIGER+2 AND ZEICHEN.CHAR(2)==LINKSPFEIL;/*#PP46532 IF ALLESOK gesetzt  */         IF ALLESOK/*#PP46533 */ THEN   /* #PP465333  Pruefe, ob alle notwendigen Eintragungen gemacht             worden sind. Setze Eintragzeiger auf den fehlenden.          */ IF ALLESOK THEN /* #PP465331  Pruefe, ob ein Eintrag ohne Bedingung gewaehlt wurde              (zusaetzliche Optionen) und setze EINTRAGZEIGER #PP465332  Wenn bei der vorigen Pruefung nichts herauskam, kann             trotzdem alles ok sein: wenn naemlich ein EXKLUSIV-              Eintrag gewaehlt wurde. Setze Eintragzeiger. #PP465335  Wenn hier etwas gewaehlt wurde, ist alles ok          */ FIN; /* #PP465334  Setze evtl. Cursor #PP465335 */ ALLESOK:=NOTWENDIGWAHL OR ZUSATZWAHL OR EXKLUSIVWAHL;/*#PP465331 */     ZUSATZWAHL:='0'B;       FOR I FROM ANFANGSZEIGER TO ENDEZEIGER             WHILE NOT ZUSATZWAHL REPEAT         IF MENUEEINTRAEGE(I).BEDINGUNG==KEINEBEDINGUNG THEN            ZUSATZWAHL:=MENUEEINTRAEGE(I).GEWAEHLT;            EINTRAGZEIGER:=I;         FIN;       END;/*#PP465333  */       NOTWENDIGWAHL:='0'B;       FOR I FROM ANFANGSZEIGER TO ENDEZEIGER WHILE ALLESOK REPEAT         IF MENUEEINTRAEGE(I).BEDINGUNG==ALLENOTWENDIG THEN            ALLESOK:=MENUEEINTRAEGE(I).GEWAEHLT AND ALLESOK;            IF MENUEEINTRAEGE(I).GEWAEHLT THEN               NOTWENDIGWAHL:='1'B;            FIN;            EINTRAGZEIGER:=I;         FIN;       END;/*#PP465332 */       EXKLUSIVWAHL:='0'B;       FOR I FROM ANFANGSZEIGER TO ENDEZEIGER               WHILE NOT EXKLUSIVWAHL REPEAT         IF MENUEEINTRAEGE(I).BEDINGUNG==EXKLUSIV THEN            EXKLUSIVWAHL:=MENUEEINTRAEGE(I).GEWAEHLT;            EINTRAGZEIGER:=I;         FIN;       END;/*#PP465334 */       IF NOT ALLESOK THEN         CALL CURSORPOSITION(MENUEEINTRAEGE(EINTRAGZEIGER).Y,                             MENUEEINTRAEGE(EINTRAGZEIGER).X);       FIN;/*#PP4651  */ IF EINTRAGZEIGER<=ENDEZEIGER   /* #PP4652  */ THEN /* #PP4652A  Setze Merkkbit je nachdem, ob Insert oder Delete #PP4652B  IF Merkbit bei Insert gesetzt #PP4652C     THEN fuehre Massnahmen durch #PP4652E     ELSE mache Massnahmen evtl. rueckgaengig         */FIN; /* #PP4652D   Loesche evtl. die Untermenues #PP4652F   Gib Menue noch einmal aus #PP4652F */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'1'B);/*#PP4652E  */ ELSE /* #PP4652E1 IF Listeneingabe  oder Dirctory gezeigt wurde #PP4652E2    THEN loesche Dateiliste im Menue    */ FIN; /* #PP4652E1 IF Listeneingabe    */    IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==LISTE         OR MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==DATEI/*#PP4652E2  */THEN       FOR J FROM          MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM+STARTZEILE TO                                                        MAXY  REPEAT        CALL STRINGAUSGABE(LEER,80,J,1,NORMAL);      END;/*#PP4652D              */  IF MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE/=0        AND NOT GEWAEHLT THEN     CALL GEWAEHLTLOESCHEN(MENUEEINTRAEGE,                           MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE,                           STARTZEILE,MAXY);  FIN;/*#PP4652B  IF Merkbit bei Insert gesetzt                              */          IF GEWAEHLT/*#PP4652C  */ THEN /* #PP4652C0  Loesche bei EXKLUSIV die Konkurrenten #PP4652C1 IF irgendetwas gemacht werden soll #PP4652C2    THEN mache es         */ FIN; /* #PP4652C3  IF Subdirectory #PP4652C4    THEN gehe in Subdirectory-Ebene        */ FIN; /* #PP4652A  */      GEWAEHLT:=ZEICHEN.CHAR(2)==RECHTSPFEIL;      MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT:=GEWAEHLT;/*#PP4652C2  */THEN/* #PP4652C21 IF Antwort gegeben werden muss #PP4652C22    THEN fordere Antwort an         */FIN; /* #PP4652C23 IF Dateien gewaehlt werden muessen #PP4652C24    THEN waehle Dateien         */FIN; /* #PP4652C25 IF ein Directory oder nur eine Datei gewaehlt werden muss #PP4652C26    THEN waehle ein Directory         */FIN; /* #PP4652C27 IF die Datei-Liste ausgegeben werden soll #PP4652C28    THEN gib die Liste aus         */FIN; /*#PP4652C27 IF die Datei-Liste ausgegeben werden soll */    IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==LISTE/*#PP4652C28 */ THEN   CALL LISTENAUSGABE(DATEILISTE,                MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM+STARTZEILE,                MAXY);/*#PP4652C25 */        IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==DIRECTRY         OR  MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==EINEDATEI/*#PP4652C26  */THEN    /*  #PP4652C261 Gib Eintragung und Directory bzw. Datei invertiert aus  #PP4652C262 Rufe Dateiwahl auf (Anfang naechste Zeile)  #PP4652C24H Gib Hintergrundzeilen aus  #PP4652C263 Gib Menue wieder aus #PP4652C261                        */     CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                       MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                       MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                       MENUEEINTRAEGE(EINTRAGZEIGER).X,                       INVERSUNTERSTRICHEN);        TRENNZEICHEN:='==';        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                  INVERSUNTERSTRICHEN);        CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT,                  MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE+2,                  INVERSUNTERSTRICHEN);/*#PP4652C262 Rufe Dateiwahl auf (Anfang naechste Zeile)               */           HILFSLISTE(1):=MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT;           CALL DATEIWAHL(' ',HILFSLISTE,              MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM+STARTZEILE,              MAXY,              MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART,                         GEWAEHLT);           MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT:=GEWAEHLT;           MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT:=HILFSLISTE(1);/*#PP4652C263 Gib Menue wieder aus  */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'1'B);    CALL MENUEENDE(MAXY,0,'0'B);     CALL ANLEITUNG(MAXY);/* #PP4652C1     */     IF  MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART/=KEINEEINGABE/*#PP4652C0  Loesche bei EXKLUSIV die Konkurrenten            */        IF MENUEEINTRAEGE(EINTRAGZEIGER).BEDINGUNG==EXKLUSIV THEN           FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT             IF MENUEEINTRAEGE(I).GEWAEHLT AND                 MENUEEINTRAEGE(I).BEDINGUNG==EXKLUSIV AND                      I/=EINTRAGZEIGER THEN               MENUEEINTRAEGE(I).GEWAEHLT:='0'B;               CALL STRINGAUSGABE(MENUEEINTRAEGE(I).TEXT,                       MENUEEINTRAEGE(I).LAENGE,                       MENUEEINTRAEGE(I).Y+STARTZEILE,                       MENUEEINTRAEGE(I).X,                       NORMAL);                IF MENUEEINTRAEGE(I).EINGABEART==TEXT OR                    MENUEEINTRAEGE(I).EINGABEART==NAME      OR                    MENUEEINTRAEGE(I).EINGABEART==FIXEDZAHL OR                    MENUEEINTRAEGE(I).EINGABEART==EINEDATEI OR                    MENUEEINTRAEGE(I).EINGABEART==DIRECTRY THEN              CALL STRINGAUSGABE(LEER,MENUEEINTRAEGE(I).ANTWLAENGE,                    MENUEEINTRAEGE(I).Y+STARTZEILE,                    MENUEEINTRAEGE(I).X+                    MENUEEINTRAEGE(I).LAENGE,                    NORMAL);                FIN;             IF MENUEEINTRAEGE(I).EINGABEART==LISTE THEN              FOR J FROM MENUEEINTRAEGE(I).MINIMUM TO               MENUEEINTRAEGE(I).MAXIMUM REPEAT                CALL STRINGAUSGABE(LEER,80,J+STARTZEILE,1,NORMAL);               END;              FIN;               IF MENUEEINTRAEGE(I).TOCHTERMENUE/=0 THEN                 CALL GEWAEHLTLOESCHEN(MENUEEINTRAEGE,                                       MENUEEINTRAEGE(I).TOCHTERMENUE,                                       STARTZEILE,MAXY);               FIN;             FIN;           END;        FIN;/*#PP4652C21 IF Antwort gegeben werden muss    */             IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT              OR MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==FIXEDZAHL              OR MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==NAME/*#PP4652C22 */ THEN  /* #PP4652C221  Gib Eintragung invertiert aus #PP4652C222  Bereite Ausgabe der Antwort vor #PP4652C223  Lass Anwtort eingeben, bis sie fehlerlos ist #PP4652C224  Trage Antwort in Menuefeld ein #PP4652C225  Gib Antwort invertiert aus #PP4652C221  Gib Eintragung invertiert aus                      */     CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                       MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                       MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                       MENUEEINTRAEGE(EINTRAGZEIGER).X,                       INVERSUNTERSTRICHEN);     TRENNZEICHEN:='==';        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                  INVERSUNTERSTRICHEN);/*#PP4652C222                             */       IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT          OR MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==NAME THEN          ZEILE:=MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT;       FIN;       IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==FIXEDZAHL THEN          ZEILE:=FIXEDZIFFERN(                   MENUEEINTRAEGE(EINTRAGZEIGER).EINGABE);        FIN;/*#PP4652C223  Lass Antwort eingeben, #PP4652CX31  Wiederhole,bis Eingabe fehlerlos #PP4652CX32     Gib alte Antwort aus #PP4652CX33     Lass  Antwort eingeben #PP4652CX34     IF Name #PP4652CX35      THEN pruefe Namenssyntax               */ FIN; /* #PP4652CX36     IF Fixedzahl #PP4652CX37      THEN pruefe Syntax und Einhaltung der Grenzen               */ FIN; /* #PP4652CX38     IF Text #PP4652CX39         THEN ist er fehlerlos #PP4652CX3A         ELSE muss Neuausgabe vorbereitet werden               */ FIN; /*    */ END; /* #PP4652CX3B  Trage Antwort ein #PP4652CX37   */ THEN    HILFSSTRING:=ZEILE;    EINGABEFEHLER:=SYNTAXPRUEFEN(HILFSSTRING,                                 6,                                 FIXEDZAHL);    IF NOT EINGABEFEHLER THEN       HILFSZAHL:=FIXEDMACHEN(HILFSSTRING);       IF HILFSZAHL<              MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM THEN           EINGABEFEHLER:='1'B;          HILFSSTRING:=FIXEDZIFFERN(                   MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM);          TRENNZEICHEN:='>=';       FIN;       IF HILFSZAHL>                  MENUEEINTRAEGE(EINTRAGZEIGER).MAXIMUM THEN           EINGABEFEHLER:='1'B;          HILFSSTRING:= FIXEDZIFFERN(                   MENUEEINTRAEGE(EINTRAGZEIGER).MAXIMUM);          TRENNZEICHEN:='<=';       FIN;    FIN;/*#PP4652CX36  */      IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==FIXEDZAHL/* #PP4652CX3B  Trage Antwort ein   */      IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT        OR MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==NAME THEN         MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT:=ZEILE;      FIN;      IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==FIXEDZAHL THEN         MENUEEINTRAEGE(EINTRAGZEIGER).EINGABE:=HILFSZAHL;      FIN;      TRENNZEICHEN:='==';/*#PP4652CX31  Wiederhole,bis Eingabe fehlerlos                     */   EINGABEFEHLER:='1'B;   WHILE EINGABEFEHLER REPEAT /*#PP4652CX32     Gib alte Antwort aus    */        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                  UNTERSTRICHEN); CALL STRINGAUSGABE(ZEILE,MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE+2,                  UNTERSTRICHEN);/*#PP4652CX33     Lass  Antwort eingeben     */     CALL CURSORPOSITION(                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE);      CALL ZEILENEINGABE(ZEILE,                MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                 LAENGE,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                MENUEEINTRAEGE(EINTRAGZEIGER).X+                MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE+2,                TASTEN);/*#PP4652CX34                               */   IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==NAME/*#PP4652CX35    */THEN      HILFSSTRING:=ZEILE;      EINGABEFEHLER:=SYNTAXPRUEFEN(HILFSSTRING,                               MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                               NAME);/*#PP4652CX38 */   IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT/*#PP4652CX39 */      THEN  EINGABEFEHLER:='0'B;/*#PP4652CX3A    */   ELSE  ZEILE:=HILFSSTRING;/*#PP4652C224  Trage Antwort in Menuefeld ein          */          MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT:=ZEILE;/*#PP4652C225  Gib Antwort invertiert aus                   */        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                  INVERSUNTERSTRICHEN);CALL STRINGAUSGABE(ZEILE,MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE+2,                  INVERSUNTERSTRICHEN);/*#PP4652C23 IF Dateien gewaehlt werden muessen   */        IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==DATEI/*#PP4652C24  */THEN    /*  #PP4652C241 Gib Eintragung invertiert aus  #PP4652C242 Rufe Dateiwahl auf (Beginn in Minimum)  #PP4652C24H Gib Hintergrundzeilen aus  #PP4652C24I Gib Dateiliste aus  #PP4652C243 Gib Menue wieder aus #PP4652C24I Gib Dateiliste aus    */   CALL LISTENAUSGABE(DATEILISTE,                MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM+STARTZEILE,                MAXY);/*#PP4652C24H Gib Hintergrundzeilen aus */   FOR I FROM         MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE+1 TO MAXY REPEAT     CALL STRINGAUSGABE(LEER,80,I,1,NORMAL);   END;/*#PP4652C241 Gib Eintragung invertiert aus                         */     CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                       MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                       MENUEEINTRAEGE(EINTRAGZEIGER).Y+STARTZEILE,                       MENUEEINTRAEGE(EINTRAGZEIGER).X,                       INVERSUNTERSTRICHEN);/*#PP4652C242 Rufe Dateiwahl auf (Anfang naechste Zeile)               */           CALL DATEIWAHL(' ',DATEILISTE,              MENUEEINTRAEGE(EINTRAGZEIGER).MINIMUM+STARTZEILE,              MAXY,              MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART,                              GEWAEHLT);           MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT:=GEWAEHLT;/*#PP4652C243 Gib Menue wieder aus  */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'1'B);    CALL MENUEENDE(MAXY,0,'0'B);     CALL ANLEITUNG(MAXY);/*#PP4652C4    */ THEN /* #PP4652C42  Rufe MENUEWAHL rekursiv auf #PP4652C44  Streiche evtl. Untermenues #PP4652C43  Stelle urspruenglichen Zustand wieder her,  wenn kein             Abbruch #PP4652C47  positioniere evtl. Cursor auf OK oder Abbruch-Befehl #PP4R   */ IF MENUELEVEL==2 THEN                 ABBRUCH:='0'B;            FIN;/*#PP4652C47   */       IF ABBRUCH THEN           EINTRAGZEIGER:=ENDEZEIGER+2;       FIN;       IF ALLESOK THEN          EINTRAGZEIGER:=ENDEZEIGER+1;       FIN;/*#PP4652C44   */         IF NOT GEWAEHLT             AND MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE>0 THEN           CALL GEWAEHLTLOESCHEN(MENUEEINTRAEGE,                    MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE,                                     STARTZEILE,MAXY    );         FIN;/*#PP4652C3 */            IF MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE>0/*#PP4652C42 #PP4652C421  Merke Dir das Menue, in das die Rueckkehr erfolgt #PP4652C422  Gib es ohne nicht gewaehlte Eintragungen aus #PP4652C424  Rufe Auswahl im Untermenue auf #PP4652C425  Merke Dir, ob wirklich gewaehlt wurde #PP4652C421  Merke Dir das Menue, in das die Rueckkehr erfolgt     */    ALTESMENUE:= MENUENR;/*#PP4652C422  Gib es ohne Unterlegung aus                             */     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                        MENUENR,MAXY,0,'0'B);/*#PP4652C424  Rufe Auswahl im Untermenue auf                    */    CALL BEFEHLSWAHL(STARTZEILE,                   MAXY,                   MENUEEINTRAEGE(EINTRAGZEIGER).TOCHTERMENUE,                   MENUEEINTRAEGE,                   UEBERSCHRIFTTEXT,                   DATEILISTE,                   GEWAEHLT);/*#PP4652C425  Merke Dir, ob wirklich gewaehlt wurde                 */    MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT:=GEWAEHLT;/*#PP4652C43   */IF NOT ABBRUCH  THEN  CALL ZEIGERBERECHNEN(MENUEEINTRAEGE,MENUENR,STARTZEILE,                       ANFANGSZEIGER,ENDEZEIGER,                            MENUEZAHL,MINY,MAXZEILE);   CALL STRINGAUSGABE(UNTERLEGUNG,80,MAXY+1,1,NORMAL);    CALL MENUEENDE(MAXY,0,'0'B);    CALL MENUEENDE(MAXY,EINTRAGZEIGER-ENDEZEIGER,'1'B);     CALL MENUEAUSGABE(STARTZEILE,MENUEEINTRAEGE,DATEILISTE,                           MENUENR,MAXY,0,'1'B);/* #PP4C  Gib Gebrauchsanweisung aus */ FIN; /* #PP467 Wenn Return, gehe ans Ende oder mache Schluss*/       IF ZEICHEN.CHAR(1)==RETURN  THEN  /* #PP4673    gehe aufs Endezeichen      */FIN;/*#PP4673 */              EINTRAGZEIGER:=ENDEZEIGER+1;/*#PP48 Ende Wiederholung     */ END;EXPP4:;/*#PP49 Mache ordentlich Schluss      */ IF ABBRUCH  THEN /* #PP493 Loesche Merkbits, Menue und Submenues      */FIN; /* #PP491 Nimm an, dass nichts gewaehlt wurde #PP492 Setze Gewaehlt, wenn doch eine Wahl stattfand #PP493  */                 CALL GEWAEHLTLOESCHEN(MENUEEINTRAEGE,                                       MENUENR,                                       STARTZEILE,MAXY     );/* #PP491  */      GEWAEHLT:='0'B;/*#PP492  */     FOR I FROM ANFANGSZEIGER TO ENDEZEIGER WHILE NOT GEWAEHLT REPEAT       MENUEEINTRAEGE(I).GEWAEHLT:=MENUEEINTRAEGE(I).GEWAEHLT              AND NOT ABBRUCH;       GEWAEHLT:=MENUEEINTRAEGE(I).GEWAEHLT;     END;/*#PP2 Prozedur zur Ausgabe des Menues auf Bildschirm         */     MENUEAUSGABE:PROC(START FIXED,                           MENUEEINTRAEGE () MENUEEINTRAG IDENT,                           DATEILISTE () CHAR(27) IDENT  ,                           MENUENR FIXED,                           MAXY FIXED,                            EINTRAGZEIGER FIXED,                            UNTERSTRICH BIT(1)      );        /*     UNTERSTRICH bewirkt bei Ausgabe des ganzen Menues die Ausgabe     aller Eintragungen #PP21 Lokale Variable #PP22 IF EINTRAGNR ==0 #PP23    THEN gib das ganze Menue aus #PP24    ELSE gib nur die angegebene Eintragung aus    */ FIN; /* */ END; /* #PP21 Lokale Variable  */      DCL TRENNZEICHEN CHAR(2);      DCL DUNTERLEGUNG CHAR(80);      DCL (ZEILE,SPALTE,MENUEZAHL) FIXED,FARBE FIXED;      DCL (ANFANGSZEIGER,ENDEZEIGER,MINY) FIXED;      DCL LAENGE FIXED;      DCL MAXZEILE FIXED;/*#PP22 IF EINTRAGNR ==0 */      IF EINTRAGZEIGER==0/*#PP23  */THEN /*    gib das ganze Menue aus #PP231 Berechne die Menuedaten #PP235 Gib die Unterlegung aus (~ oder Leerzeichen)*/      FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT  /* #PP233 Gib evtl. den zugehoerigen Text #PP236 Gib eventuell die Dateiliste aus #PP232 Gib evtl. die Eintragung aus    */ END; /**/      FOR I FROM ANFANGSZEIGER TO ENDEZEIGER REPEAT  /* #PP234 Gib evtl. zugehoerige Untermenues aus    */ END; /* #PP2332 Versieh die Eintragung evtl mit Gleichheitszeichen */ IF MENUEEINTRAEGE(I).GEWAEHLT THEN     TRENNZEICHEN:='==';    ELSE     TRENNZEICHEN:=' ';FIN;        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(I).Y+START,                  MENUEEINTRAEGE(I).X+                  MENUEEINTRAEGE(I).LAENGE,                  FARBE);/*#PP235   */   IF UNTERSTRICH THEN      DUNTERLEGUNG:=UNTERLEGUNG;     ELSE      DUNTERLEGUNG:=LEER;   FIN;     FOR I FROM MINY+START TO MAXZEILE+START REPEAT       CALL STRINGAUSGABE(DUNTERLEGUNG,80,I,1,NORMAL);     END;/*#PP231 Berechne die Menuedaten  */  CALL ZEIGERBERECHNEN(MENUEEINTRAEGE,MENUENR,START,                       ANFANGSZEIGER,ENDEZEIGER,                            MENUEZAHL,MINY,MAXZEILE);/*#PP234 Gib evtl. das zugehoerige Untermenue aus oder loesche es  */   IF  MENUEEINTRAEGE(I).TOCHTERMENUE>0    AND MENUEEINTRAEGE(I).GEWAEHLT THEN         CALL MENUEAUSGABE(START,MENUEEINTRAEGE,DATEILISTE,                              MENUEEINTRAEGE(I).TOCHTERMENUE,                                   MAXY,0,'1'B);   FIN;/*#PP232 Gib die Eintragung aus  */            IF MENUEEINTRAEGE(I).GEWAEHLT                 THEN FARBE:=INVERSUNTERSTRICHEN;              ELSE FARBE:=UNTERSTRICHEN; FIN;IF MENUEEINTRAEGE(I).GEWAEHLT OR UNTERSTRICH THEN            CALL STRINGAUSGABE(MENUEEINTRAEGE(I).TEXT,                             MENUEEINTRAEGE(I).LAENGE,                             MENUEEINTRAEGE(I).Y+START,                             MENUEEINTRAEGE(I).X,                             FARBE);FIN;/*#PP233 Gib evtl. den zugehoerigen Text aus #PP2330 IF Text ausgegeben werden muss     */ THEN /* #PP2331 Gib den zugehoerigen Text aus #PP2332 Versieh die Eintragung evtl mit Gleichheitszeichen    */FIN; /* #PP2330   */             IF MENUEEINTRAEGE(I).EINGABEART==TEXT OR                 MENUEEINTRAEGE(I).EINGABEART==NAME      OR                 MENUEEINTRAEGE(I).EINGABEART==FIXEDZAHL OR                 MENUEEINTRAEGE(I).EINGABEART==EINEDATEI OR                 MENUEEINTRAEGE(I).EINGABEART==DIRECTRY/*#PP2331 Gib den zugehoerigen Text aus  */               IF MENUEEINTRAEGE(I).EINGABEART==FIXEDZAHL THEN                  MENUEEINTRAEGE(I).ANTWORT:=                      FIXEDZIFFERN(MENUEEINTRAEGE(I).EINGABE);               FIN;               IF MENUEEINTRAEGE(I).GEWAEHLT                   THEN FARBE:=INVERSUNTERSTRICHEN;                ELSE FARBE:=UNTERSTRICHEN;               FIN;                CALL STRINGAUSGABE(MENUEEINTRAEGE(I).ANTWORT,                  MENUEEINTRAEGE(I).ANTWLAENGE,                  MENUEEINTRAEGE(I).Y+START,                  MENUEEINTRAEGE(I).X+                  MENUEEINTRAEGE(I).LAENGE+2,                  FARBE);/*#PP236 Gib eventuell die Dateiliste aus      */    IF MENUEEINTRAEGE(I).EINGABEART==LISTE OR      MENUEEINTRAEGE(I).EINGABEART==DATEI THEN      IF MENUEEINTRAEGE(I).GEWAEHLT THEN       CALL LISTENAUSGABE(DATEILISTE,          MENUEEINTRAEGE(I).TEXT,         MENUEEINTRAEGE(I).MINIMUM+START,          MAXY);       ELSE        FOR J FROM         MENUEEINTRAEGE(I).MINIMUM+START TO MAXY REPEAT         CALL STRINGAUSGABE(LEER,80,J,1,NORMAL);        END;       FIN;    FIN;/*#PP24    ELSE gib nur die angegebene Eintragung aus                   */      ELSE  /* #PP241  Triff Vorbereitungen (Unterstreichung) #PP242  Gib evlt. Antwort aus #PP243  Gib Text aus #PP244  Positioniere Cursor #PP241  Triff Vorbereitungen (Unterstreichung)                    */    IF MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT THEN      IF UNTERSTRICH THEN        FARBE:=INVERSUNTERSTRICHEN;       ELSE        FARBE:=UNTERSTRICHEN;       FIN;     ELSE      IF UNTERSTRICH THEN        FARBE:=UNTERSTRICHEN;       ELSE        FARBE:=INVERSUNTERSTRICHEN;       FIN;    FIN;/*#PP243  Gib Text aus    */    CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).TEXT,                      MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                      MENUEEINTRAEGE(EINTRAGZEIGER).Y+START,                      MENUEEINTRAEGE(EINTRAGZEIGER).X,                      FARBE       );/*#PP242  Gib evlt. Antwort aus #PP2421 IF Antwort ausgegeben werden muss     */ THEN /* #PP2422    Gib Antwort aus #PP2423    Versieh Text evtl. mit Gleichheitszeichen    */ FIN; /* #PP2423  */ IF MENUEEINTRAEGE(EINTRAGZEIGER).GEWAEHLT THEN     TRENNZEICHEN:='==';    ELSE     TRENNZEICHEN:=' ';FIN;        CALL STRINGAUSGABE(TRENNZEICHEN,2,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+START,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE,                  FARBE);/*#PP2421 IF Antwort ausgegeben werden muss   */    IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==NAME OR       MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==DIRECTRY  OR       MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==EINEDATEI OR       MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==FIXEDZAHL OR       MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT/*#PP2422    Gib Antwort aus                     */       IF MENUEEINTRAEGE(EINTRAGZEIGER).EINGABEART==TEXT THEN         MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT:=            FIXEDZIFFERN(MENUEEINTRAEGE(EINTRAGZEIGER).EINGABE);       FIN;        CALL STRINGAUSGABE(MENUEEINTRAEGE(EINTRAGZEIGER).ANTWORT,                  MENUEEINTRAEGE(EINTRAGZEIGER).ANTWLAENGE,                  MENUEEINTRAEGE(EINTRAGZEIGER).Y+START,                  MENUEEINTRAEGE(EINTRAGZEIGER).X+                  MENUEEINTRAEGE(EINTRAGZEIGER).LAENGE+2,                  FARBE);/*#PP244  Positioniere Cursor  */    CALL CURSORPOSITION(                      MENUEEINTRAEGE(EINTRAGZEIGER).Y+START,                      MENUEEINTRAEGE(EINTRAGZEIGER).X);/*#PS */    SPC BEFEHLGEWAEHLT ENTRY RETURNS(BIT(1));    SPC MENUEANTWORT ENTRY RETURNS(CHAR(27));    SPC UEBERSCHRIFT ENTRY GLOBAL;    SPC CURPOS ENTRY(CHAR(1) IDENT,CHAR(1) IDENT) GLOBAL;    SPC KLEINER ENTRY RETURNS(BIT(1)) GLOBAL  ;    SPC UNGLEICHSUCHE ENTRY RETURNS(FIXED) GLOBAL ;    SPC LISTE27SORTIEREN ENTRY;    SPC STRINGLAENGE ENTRY RETURNS(FIXED) GLOBAL;    SPC LISTENAUSGABE ENTRY;    SPC STRINGAUSGABE ENTRY GLOBAL;    SPC CURSORPOSITION ENTRY GLOBAL;    SPC MENUEAUSGABE ENTRY;    SPC GEWAEHLTLOESCHEN ENTRY;    SPC BEFEHLSWAHL ENTRY;    SPC MENUEINIT ENTRY;    SPC ZEILENEINGABE ENTRY GLOBAL;    SPC ZEIGERBERECHNEN ENTRY;    SPC (ANLEITUNG,MENUEENDE) ENTRY;    SPC SYNTAXPRUEFEN ENTRY RETURNS(BIT(1));    SPC FIXEDMACHEN ENTRY RETURNS(FIXED);    SPC FIXEDZIFFERN ENTRY RETURNS(CHAR(6));/*#%S  */    SYSTEM;    DIALOG:  A1<->;    TASTEN:A1(TFU=1,AI=$3E00)     <-;    SCANNER:C1(TFU=1,AI=$3E00)     <-;/*//