/* F0:FILEWALT                25.02.88  7:45:37*//* F0:FILEWALT                22.02.88 16:38:03*//* Modulentwurf FILEWALTVersion 1.13/22.02.88/Frevert #&SPEC Modulbeschreibung #PROG Programm #&SPECDer Modul benoetigt Systemteil und GLOBALS aus dem Modul BEFPROCT. Anpassung an vorhandene Hardware an folgender Stelle: #&PP14Dort sind weitere Floppy- und Winchester-Laufwerke einzutragen,wenn vorhanden. Der Modul enthaelt eine Reihe von Prozeduren, die fuer ein Datei-Verwaltungsprogramm benoetigt werden; folgende von ihnen sindGLOBALs: Prozedur zum Einlesen eines Directories    */     DIRECTORYLESEN:PROC(PFAD CHAR(27),                         DATEIEINTRAEGE () DATEIEINTRAG IDENT,                         FILEZAHL FIXED IDENT) GLOBAL      ;    /*   Die Prozedur liest ein, welche Dateien in dem (Sub-)Directory   PFAD vorhanden sind, traegt diese in das Feld DATEIEINTRAEGE ein   und bestimmt ihre Anzahl. DATEIEINTRAEGE ist alphabetisch sortiert   (ASCII-Reihenfolge). Prozedur zur Anwahl eines bestimmten Eintrages         */   DATEIWAHL:PROC(DERNAME CHAR(27),                  ERGEBNISSE () CHAR(27) IDENT,                  STARTZEILE FIXED,                  ENDEZEILE FIXED,                  ARBEITSWEISE FIXED,                  GEWAEHLT BIT(1) IDENT) GLOBAL;   /*   Die Prozedur stellt den Inhalt des (Sub-)Directory DERNAME auf   dem Bildschirm dar und gestattet das Anfahren der Eintraege mit   Hilfe der Cursortasten. Eintraege, die mit der Insert-Taste   ausgewaehlt werden, werden invertiert (weiss auf schwarz) und   in das Feld ERGEBNISSE eingetragen. STARTZEILE und ENDEZEILE   bestimmen, wo der Directory-Inhalt auf dem Bildschirm dargestellt   wird. ARBEITSWEISE legt fest, ob der gesamte Inhalt eines   Directory dargestellt wird, oder nur die Subdirectories   (ARBEITSWEISE==DIRECTRY).   GEWAEHLT wird gesetzt, wenn eine Eintragung gewaehlt wurde.   Die Wahl eines Eintrages kann mit der Delete-Taste rueckgaengig   gemacht werden. Mit der ~-Taste kann der Abstieg in Subdirectories   erfolgen, bzw. der Inhalt von Dateien auf den Bildschirm gebracht   werden (Rollen mit Tiefpfeil). Zurueck geht es mit der 7-Taste.   Am Ende der Directories werden die Tasten-Funktionen dargestellt,   in der Kopfzeile der Name des Directories oder der Datei.   In einer weiteren Menuezeile kann die Auswahl abgeschlossen oder   verworfen werden. Ausserdem koennen hier Dateigruppen mit Masken   ausgewaehlt werden. Prozedur zur Bildung des vollstaendigen Pfadnamens         */ PFADBILDEN:PROC((ERSTER,ZWEITER) CHAR(27)) RETURNS (CHAR(27)) GLOBAL; /* Die Prozedur bildet aus ERSTER und ZWEITER einen vollstaendigen   Pfadnamen und gibt diesen zurueck. Prozedur zur Feststellung, ob eine Datei ueberhaupt da ist */    SCHONDA:PROC(DATEINAME CHAR(27)) RETURNS(BIT(1)) GLOBAL; /*   Die Prozedur stellt fest, ob DATEINAME im System vorhanden ist. Prozedur zur Feststellung, ob sich offene Dateien auf einer Floppybefinden. */ OFFENEDATEIEN:PROC(GERAET CHAR(2),DIELISTE () CHAR(27) IDENT) GLOBAL;/*   Die Prozedur schreibt eventuell vorhanden offene Dateien in   DIELISTE. #PROG*/S=354C;/* */ MODULE FILEWALM; /*Mit Testtask TEST */   /*  #%D KOMPILERDIREKTIVEN FUER TEST #$DL KOMPILERDIREKTIVEN FUER ECHTEN LAUF #P PROBLEMTEIL*//*+L*//* */ MODEND; /* #$DL  *//*-L*//*-M*//*#%D *//*-L*//*+M*//*+T*//*#P  */ PROBLEM; /*  #PTY Datentypen  #PS Spezifikationen  #PK Konstanten-SPECs  #PD Deklarationen  #PP Prozeduren  #%PT Testtask  #PL  Einlesetask fuer Directorylesen  #PF  Einlesetask fuer Bestimmung offener Files #PF  */  OFFENLES:TASK;      CONTROLD:=TOCHAR(4);  PUT 'SUSPEND OFFENLES;O VO:DIRLINK;FILES ',HILFSPFAD,'--C OFFENLES'               TO BEFEHLSINTERPRETER        BY      A,             A,          A       ;      PUT '          ','          '  TO VO BY A,SKIP,A,SKIP;      PUT CONTROLD TO VO BY A;    RELEASE GELESEN;  END;/*#PL  */  DATLES:TASK;      CONTROLD:=TOCHAR(4);      PUT 'SUSPEND DATLES;O VO:DIRLINK;DIR ',HILFSPFAD,' -- C DATLES'               TO BEFEHLSINTERPRETER        BY      A,             A,          A       ;      PUT '          ','          '  TO VO BY A,SKIP,A,SKIP;      PUT CONTROLD TO VO BY A;    RELEASE GELESEN;  END;/*#PK  */ SPC (KEINEEINGABE,NAME,FIXEDZAHL,TEXT,DATEI) INV FIXED GLOBAL; SPC (EINEDATEI,DIRECTRY,LISTE) INV FIXED GLOBAL; SPC (NORMAL,INVERS,UNTERSTRICHEN,INVERSUNTERSTRICHEN) INV FIXED GLOBAL;/*#PD Deklarationen  */  DCL (LEER,UNTERLEGUNG)CHAR(80);  DCL (HOCHPFEIL,TIEFPFEIL,NUL,RETURN,LINKSPFEIL,RECHTSPFEIL) CHAR(1);  DCL ESCAPE CHAR(1);  DCL CONTROLD CHAR(1);  DCL TILDE CHAR(1) INIT('~');  DCL HILFSPFAD CHAR(27);  DCL GELESEN SEMA PRESET(0);  DCL (FERTIG,ENDE,ABBRUCH) BIT(1);/*#%PT Task    */  TEST:TASK;     DCL DATEIEINTRAEGE (120) DATEIEINTRAG,         FILEZAHL FIXED;     DCL LISTE (20) CHAR(27);     DCL GEWAEHLT BIT(1);     CALL DIRECTORYLESEN('F0:',                          DATEIEINTRAEGE,                          FILEZAHL);CALL DIRECTORYAUSGABE('F0:',1,3,DATEIEINTRAEGE,FILEZAHL,0,1,'0'B);  GET FROM DIALOG BY SKIP;     FOR I TO 1 UPB LISTE REPEAT       LISTE(I):=' ';     END;     CALL DATEIWAHL(' '          ,LISTE,10,12,'0'B,    GEWAEHLT   );     FOR I TO 1 UPB LISTE REPEAT       PUT LISTE(I) TO DIALOG BY A,SKIP;       GET FROM DIALOG BY SKIP;     END;     CALL DATEIWAHL(' '          ,LISTE,10,12,  '1'B,    GEWAEHLT   );     FOR I TO 1 UPB LISTE REPEAT       PUT LISTE(I) TO DIALOG BY A,SKIP;       GET FROM DIALOG BY SKIP;     END;  END;/*#PTY Datentypen   */   TYPE DATEIEINTRAG STRUCT[DERNAME CHAR(27),                            SUBDIRECTORY BIT(1),                            GEWAEHLT BIT(1)         ];/*#PP  #PP1 Prozedur zum Einlesen eines Directorys  GLOBAL  #PP2 Prozedur zur Ausgabe des Directorys auf Bildschirm  #PP4 Prozedur zur Anwahl eines bestimmten Eintrages GLOBAL  #PP8 Prozedur zur Bildung des vollstaendigen Pfadnamens GLOBAL  #PPA Prozedur zur Ausgabe der letzten (Steuer-)Zeile  #PPB Prozedur zur Ausgabe der Gebrauchsanleitung  #PPC Prozedur zur Ausgabe der ersten Zeilen einer Datei  #PPE Prozedur zur Feststellung, ob eine Datei ueberhaupt da ist GLOBAL  #PPF Prozedur zur Feststellung, ob auf Floppy noch Dateien offen #PPF  */ OFFENEDATEIEN:PROC(GERAET CHAR(2),DIELISTE () CHAR(27) IDENT) GLOBAL;/* #PPF2  Aktiviere Lesetask mit FILES-Befehl #PPF3  Werte Ergebnis aus   */END; /* #PPF2 */      HILFSPFAD:=GERAET;      ACTIVATE OFFENLES;/*#PPF3 */      REQUEST GELESEN;      GET FROM DIRECTORY BY SKIP; /* erste Zeile ueberlesen */      FOR I TO 1 UPB DIELISTE REPEAT        DIELISTE(I):=' ';      END;      FOR I TO 1 UPB DIELISTE REPEAT        GET DIELISTE(I) FROM DIRECTORY BY SKIP,A;        IF DIELISTE(I)==' ' THEN GOTO EXPPF3;FIN;      END;EXPPF3:; /*#PPE  */    SCHONDA:PROC(DATEINAME CHAR(27)) RETURNS(BIT(1)) GLOBAL; /* #PPE1  Lokale Variable #PPE2  Triff Vorbereitungen      */ REPEAT /* #PPE3    Extrahiere Pfadteil #PPE9    Extrahiere Namen #PPE4    Lies Directory ein #PPE5    stelle fest, ob naechster Pfadteil im Directory #PPE6    Wenn nicht, gib '0'B zurueck #PPE7    Wenn ja und Pfad zu Ende, gib '1'B zurueck      */ END; /*  */END; /* #PPE1 */    DCL (IMDIRECTORY,NAMEZUENDE) BIT(1),FILENAME CHAR(9),        PFADTEIL CHAR(27),DATEIEN (100) DATEIEINTRAG,DATEIZAHL FIXED;        DCL STELLE FIXED;/*#PPE7 */     IF IMDIRECTORY AND NAMEZUENDE THEN RETURN('1'B); FIN;/*#PPE6 */      IF NOT IMDIRECTORY THEN RETURN('0'B); FIN;/*#PPE5   */        IMDIRECTORY:='0'B;        FOR I TO DATEIZAHL WHILE NOT IMDIRECTORY REPEAT           IMDIRECTORY:=DATEIEN(I).DERNAME==FILENAME;        END;/*#PPE4  */     CALL DIRECTORYLESEN(PFADTEIL,DATEIEN,DATEIZAHL);/*#PPE2  */     FILENAME:=' ';     PFADTEIL:=' ';     STELLE:=3;     NAMEZUENDE:='0'B;/*#PPE3  */     FOR I TO STELLE WHILE NOT NAMEZUENDE REPEAT       PFADTEIL.CHAR(I):=DATEINAME.CHAR(I);     END;/*#PPE9  */      FILENAME:=' ';      STELLE:=STELLE+1;      FOR I FROM STELLE TO 27 REPEAT        FILENAME.CHAR(I-STELLE+1):=DATEINAME.CHAR(I);        IF DATEINAME.CHAR(I)=='/'           OR DATEINAME.CHAR(I)==' ' THEN          STELLE:=I;          GOTO EXPP48;        FIN;      END;EXPP48:;      NAMEZUENDE:=DATEINAME.CHAR(STELLE)==' '        OR (DATEINAME.CHAR(STELLE)=='/'           AND DATEINAME.CHAR(STELLE+1)==' ');/*#PPC  */   FILEINHALT:PROC((YANFANG,YENDE) FIXED,                    PFADNAME CHAR(27),                    QUELLDATION DATION IN ALPHIC CONTROL(ALL) IDENT,                    ZIELDATION  DATION OUT ALPHIC CONTROL(ALL) IDENT);/* #PPC1 Lokale Variable #PPC2 Extrahiere Geraetenamen der Quelldatei aus dem Pfadnamen       und den Dateinamen #PPC3 Eroeffne Quelldation     */REPEAT /* #PPC4    Fuelle den Bereich zwischen YANFANG  und YENDE mit den            Zeilen der Quelldatei aus (auf der Zieldation) #PPC6    Warte auf Zeicheneingabe #PPC7    EXIT wenn 7 #PPC8 END Wiederholung #PPC5 Schliesse Quelldatei   */END;/* #PPC7 */IF ZEICHEN.CHAR(1)=='7' THEN GOTO EXPPC;FIN; /* #PPC8 */END;EXPPC:; /* #PPC6 */           ZEICHEN.CHAR(1):=NUL;            WHILE NOT(ZEICHEN.CHAR(1)=='7' OR               ZEICHEN.CHAR(1)==TIEFPFEIL) REPEAT              GET ZEICHEN.CHAR(1) FROM TASTEN BY SKIP,A(1);            END;/*#PPC1 */ DCL LAENGE FIXED,ZEILE CHAR(80),         ZEICHEN CHAR(1),         GERAET CHAR(2),DATEINAME CHAR(24);/*#PPC5  */    CALL REWIND(QUELLDATION);    CLOSE QUELLDATION;/*#PPC4 */      FOR I FROM YANFANG TO YENDE REPEAT        CALL STRINGAUSGABE(' ',80,I,1,NORMAL);      END;      FOR I FROM YANFANG TO YENDE REPEAT        GET ZEILE FROM QUELLDATION BY SKIP,A;        IF ST(QUELLDATION)==0 THEN          LAENGE:=STRINGLAENGE(ZEILE);          CALL STRINGAUSGABE(ZEILE,LAENGE,I,1,NORMAL);         ELSE          GOTO EXPPC4;        FIN;      END;EXPPC4:;/*#PPC3  */    CALL ASSIGN(QUELLDATION,GERAET);    OPEN QUELLDATION BY IDF(DATEINAME);    CALL REWIND(QUELLDATION);/*#PPC2  */       FOR I TO 2 REPEAT         GERAET.CHAR(I):=PFADNAME.CHAR(I);       END;       FOR I FROM 4 TO 27 REPEAT          DATEINAME.CHAR(I-3 ):=PFADNAME.CHAR(I);       END;/*#PPB */ GEBRAUCHSANWEISUNG:PROC(ZEILENLAGE FIXED);   CALL UEBERSCHRIFT( 'Positionieren: Pfeiltasten/Return | Waehlen/Streichen: Insert/Delete',/*12345678901234567890123456789012345678901234567890123456789012345678*/  ZEILENLAGE);   CALL UEBERSCHRIFT( 'Abstieg in (Sub-)Directory/Datei: ~-Taste     |    Rueckkehr 7-Taste',/*12345678901234567890123456789012345678901234567890123456789012345678*/  ZEILENLAGE+1);END;/*#PPA  */ ANWEISUNGEN:PROC((GEWAEHLT,ZEILENLAGE) FIXED,NORMALGEFAERBT BIT(1));  DCL CURSORX FIXED;  DCL(FARBE1,FARBE2,FARBE3) FIXED;  IF GEWAEHLT==0 THEN     CALL STRINGAUSGABE(UNTERLEGUNG,80,ZEILENLAGE,1,NORMAL);  FIN;  FARBE1:=UNTERSTRICHEN;  FARBE2:=UNTERSTRICHEN;  FARBE3:=UNTERSTRICHEN;  IF GEWAEHLT==1 THEN CURSORX:=3;     IF NORMALGEFAERBT THEN        FARBE1:=INVERSUNTERSTRICHEN;     FIN;  FIN; IF GEWAEHLT==2 THEN CURSORX:=20;     IF NORMALGEFAERBT THEN        FARBE2:=INVERSUNTERSTRICHEN;     FIN;  FIN; IF GEWAEHLT==3 THEN CURSORX:=44;     IF NORMALGEFAERBT THEN        FARBE3:=INVERSUNTERSTRICHEN;     FIN;  FIN; IF GEWAEHLT==1 OR GEWAEHLT==0 THEN   CALL STRINGAUSGABE('OK=>Insert',10,                     /*12345678901234567890123456789012  */                      ZEILENLAGE, 3,FARBE1); FIN; IF GEWAEHLT==2 OR GEWAEHLT==0 THEN   CALL STRINGAUSGABE('Abbruch=>Delete',15,                     /*12345678901234567890123456789012  */                      ZEILENLAGE,20,FARBE2); FIN; IF GEWAEHLT==3 OR GEWAEHLT==0 THEN   CALL STRINGAUSGABE('Insert/Delete mit A?B-Maske',27,                     /*12345678901234567890123456789012  */                      ZEILENLAGE,43,FARBE3); FIN;  IF GEWAEHLT/=0 THEN CALL CURSORPOSITION(ZEILENLAGE,CURSORX);FIN; END;/*#PP8 Prozedur zur Bildung des vollstaendigen Pfadnamens         */ PFADBILDEN:PROC((ERSTER,ZWEITER) CHAR(27)) RETURNS (CHAR(27)) GLOBAL;     DCL STELLE FIXED;     DCL DERNAME CHAR(27);     STELLE:=1;     TO 27 WHILE ERSTER.CHAR(STELLE)/=' ' REPEAT       DERNAME.CHAR(STELLE):=ERSTER.CHAR(STELLE);       STELLE:=STELLE+1;     END;     FOR I FROM STELLE TO 27 REPEAT       DERNAME.CHAR(I):=ZWEITER.CHAR(I-STELLE+1);     END;     RETURN(DERNAME);   END;/*#PP4 Prozedur zur Anwahl eines bestimmten Eintrages         */   DATEIWAHL:PROC(DERNAME CHAR(27),                  ERGEBNISSE () CHAR(27) IDENT,                  STARTZEILE FIXED,                  ENDEZEILE FIXED,                  ARBEITSWEISE FIXED,                  GEWAEHLT BIT(1) IDENT) GLOBAL;/* #PP41 Lokale Variable #PP40 Initialisiere Char-Konstanten und Steuerbits  usw. #PP4X Pruefe bei allen Eintragungen in der Ergebnisliste, die        eine Floppy betreffen, ob sie auf der Floppy ist.        Wenn nein, ist die Floppy gewechselt und die Ergebnisliste        muss geloescht werden. #PP42 Lies Directory ein    */ IF ARBEITSWEISE == DIRECTRY  THEN /* #PP4M Streiche alle Eintraege, die kein Directory betreffen    */ FIN; /* #PP4B Kennzeichne schon ausgewaehlte Dateien #PP43 Gib Directory aus #PP4A Gib Schlusszeichen aus #PP4C Gib Gebrauchsanweisung aus      */WHILE NOT(FERTIG OR ABBRUCH) REPEAT /* #PP44   Gib  evtl. alten und  angewaehlten Eintrag  aus #PP45   lies Zeichen ein und gib aktuellen Eintrag abwechselnd         invers und weiss aus, waehrend auf Eingabe gewartet wird #PP46   handle entsprechend #PP47   EXIT WHEN Endebedingung #PP48 Ende Wiederholung #PP4S Setze Ende-Bit zurueck, damit in uebergeordneter Ebene       weiter gearbeitet wird #PP49 Mache ordentlich Schluss       */ END; /* #PP4X  */       NICHTLOESCHEN:='1'B;       FOR I TO 1 UPB ERGEBNISSE WHILE NICHTLOESCHEN REPEAT         IF ERGEBNISSE(I).CHAR(1)=='F' THEN           NICHTLOESCHEN:=NICHTLOESCHEN AND SCHONDA(ERGEBNISSE(I));         FIN;       END;       IF NOT NICHTLOESCHEN THEN         FOR I TO 1 UPB ERGEBNISSE REPEAT           ERGEBNISSE(I):=' ';         END;       FIN;/*#PP4S  */ ENDE:='0'B; /* #PP4M  */       DATEIZEIGER:=1;       FOR I TO 1 UPB DATEIEINTRAEGE               WHILE DATEIZEIGER<=FILEZAHL REPEAT         FOR K FROM 27 BY -1 TO 1 REPEAT           IF DATEIEINTRAEGE(DATEIZEIGER).DERNAME.CHAR(K)/=' ' THEN             STELLE:=K;             GOTO EXPP4M;           FIN;          END;EXPP4M:;        IF NOT (DATEIEINTRAEGE(DATEIZEIGER).DERNAME.CHAR(STELLE)==':'OR            DATEIEINTRAEGE(DATEIZEIGER).DERNAME.CHAR(STELLE)=='/') THEN            FOR K FROM DATEIZEIGER+1 TO FILEZAHL REPEAT              DATEIEINTRAEGE(K-1):=DATEIEINTRAEGE(K);            END;            DATEIEINTRAEGE(FILEZAHL).DERNAME:=' ';            FILEZAHL:=FILEZAHL-1;           ELSE            DATEIZEIGER:=DATEIZEIGER+1;          FIN;       END;/*#PP4B  */       FOR I TO FILEZAHL REPEAT /* #PP4B1  Bilde aus Namen und Dateieintrag vollen Pfad #PP4B2  Untersuche, ob irgendwo Uebereinstimmung mit einem Ergebnis      */ END; /*#PP4B1  */          PFADNAME:=PFADBILDEN(DERNAME,                        DATEIEINTRAEGE(I).DERNAME);/*#PP4B2  */ DATEIEINTRAEGE(I).GEWAEHLT:='0'B;          FOR K TO 1 UPB ERGEBNISSE REPEAT  /* #PP4B21  Der erste Teil des Ergebniseintrages muss mit dem Namen          uebereinstimmen, wenn dieser nicht leer ist #PP4B22  Der darauf folgende Teil muss entweder ganz oder bis zum          ersten Schraegstrich oder Doppelpunkt uebereinstimmen #PP4B23  Trage Ergebnis ein        */ END; /* #PP4B21  */         NAMENSGLEICH:='1'B;         FOR J TO 27  WHILE NAMENSGLEICH REPEAT           IF DERNAME.CHAR(J)==' ' THEN              STELLE:=J;              GOTO EXPP4B21;           FIN;           NAMENSGLEICH:=DERNAME.CHAR(J)==ERGEBNISSE(K).CHAR(J);         END;EXPP4B21:;         NAMENSGLEICH:=NAMENSGLEICH OR DERNAME.CHAR(1)==' ';/*#PP4B22  */         FOR J FROM STELLE TO 27 WHILE NAMENSGLEICH REPEAT           NAMENSGLEICH:=PFADNAME.CHAR(J)==ERGEBNISSE(K).CHAR(J);           IF PFADNAME.CHAR(J)=='/'              OR  PFADNAME.CHAR(J)==':'              OR  PFADNAME.CHAR(J)==' '               THEN GOTO EXPP4B2;FIN;         END;EXPP4B2:;/*#PP4B23 */       IF NAMENSGLEICH THEN         DATEIEINTRAEGE(I).GEWAEHLT:='1'B;       FIN;/*#PP4A  */   CALL ANWEISUNGEN(0,ENDEZEILE+1,'1'B);/*#PP4C  */    CALL GEBRAUCHSANWEISUNG(ENDEZEILE+2);/*#PP41 Lokale Variable  */     DCL NICHTLOESCHEN BIT(1);     DCL ISTSCHONDA BIT(1);     DCL MASKE CHAR(80);     DCL FILEZAHL FIXED;     DCL ZEICHEN CHAR(2);     DCL DATEIZEIGER FIXED;     DCL ALTERZEIGER FIXED;     DCL (ZEILENLAGE,SPALTENLAGE) FIXED;     DCL PFADNAME CHAR(27);     DCL DATEIEINTRAEGE (120) DATEIEINTRAG;     DCL NAMENSGLEICH BIT(1),(FREISTELLE,STELLE) FIXED;     DCL ROLLANFANG FIXED;/*#PP40 */  ESCAPE:=TOCHAR 27;  HOCHPFEIL:=TOCHAR(11);  TIEFPFEIL:=TOCHAR(10);  NUL      :=TOCHAR(0);  RETURN   :=TOCHAR(13);  LINKSPFEIL:=TOCHAR(8);  RECHTSPFEIL:=TOCHAR(12);  MASKE:=' ';  FERTIG:='0'B;ABBRUCH:='0'B;ENDE:='0'B;  ROLLANFANG:=1;/*#PP42 Lies Directory ein   */     CALL DIRECTORYLESEN(DERNAME,                          DATEIEINTRAEGE,                          FILEZAHL);/*#PP43 Gib es aus  */  CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,                 ENDEZEILE,DATEIEINTRAEGE,                        FILEZAHL,0,ROLLANFANG,'0'B);  DATEIZEIGER:=1;  ALTERZEIGER:=1;/*#PP44   Gib alten und angewaehlten Eintrag aus */   IF DATEIZEIGER<=FILEZAHL THEN     CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,ENDEZEILE,                           DATEIEINTRAEGE,FILEZAHL,                           DATEIZEIGER,ROLLANFANG,'1'B);    ELSE     IF DATEIZEIGER>FILEZAHL THEN       CALL ANWEISUNGEN(DATEIZEIGER-FILEZAHL,ENDEZEILE+1,'1'B);     FIN;   FIN;   IF ALTERZEIGER<=FILEZAHL THEN     CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,ENDEZEILE,                           DATEIEINTRAEGE,FILEZAHL,                           ALTERZEIGER,ROLLANFANG,'1'B);    ELSE     IF ALTERZEIGER>FILEZAHL THEN       CALL ANWEISUNGEN(ALTERZEIGER-FILEZAHL,ENDEZEILE+1,'0'B);     FIN;   FIN;   ALTERZEIGER:=DATEIZEIGER;/*#PP45   lies Zeichen ein */         ZEICHEN.CHAR(1):=NUL;         ZEICHEN.CHAR(2):=NUL;    WHILE ZEICHEN.CHAR(1)==NUL REPEAT      IF DATEIZEIGER<=FILEZAHL THEN        CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,ENDEZEILE,                           DATEIEINTRAEGE,FILEZAHL,                           DATEIZEIGER,ROLLANFANG,'0'B);      FIN;      IF DATEIZEIGER>FILEZAHL THEN        CALL ANWEISUNGEN(DATEIZEIGER-FILEZAHL,ENDEZEILE+1,'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 DATEIZEIGER<=FILEZAHL THEN        CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,ENDEZEILE,                           DATEIEINTRAEGE,FILEZAHL,                           DATEIZEIGER,ROLLANFANG,'1'B);      FIN;      IF DATEIZEIGER>FILEZAHL THEN        CALL ANWEISUNGEN(DATEIZEIGER-FILEZAHL,ENDEZEILE+1,'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 evtl. in naechste Ebene oder            nimm in Liste auf oder streiche aus Liste oder lies            Maske ein oder brich ab #PP468 Wenn Tilde und Subdirectorywahl, gehe in naechste Ebene #PP469 Wenn 4, setze Ende-Bit oder komm aus Textanzeige zurueck #PP46A Wenn Tilde und kein Subdirectory, zeige Dateianfang #PP466 Wenn Delete, streiche Dateien in Ergebnisliste #PP467 Wenn Return, gehe an Anfang der Schlusszeile #PP46A Wenn Tilde und kein Subdirectory, zeige Dateianfang       */      IF DATEIZEIGER<=FILEZAHL THEN      IF ZEICHEN.CHAR(1)==TILDE AND           NOT   DATEIEINTRAEGE(DATEIZEIGER).SUBDIRECTORY THEN /* #PP46A1 Gib Ueberschrift aus #PP46A2 Gib Dateiinhalt aus #PP46A5 Gib Directory wieder aus   */ FIN;FIN;   /* #PP46A1 Gib Ueberschrift aus  */          PFADNAME:=PFADBILDEN(DERNAME,                        DATEIEINTRAEGE(DATEIZEIGER).DERNAME);      CALL UEBERSCHRIFT('Datei-Inhalt von ' CAT PFADNAME CAT            ' (Ausschnitt)',STARTZEILE);/*#PP46A2 Gib Dateianfang aus */    CALL FILEINHALT(STARTZEILE+1,ENDEZEILE,                       PFADNAME,QUELLE,DIALOG);/*#PP46A5 Gib Directory wieder aus */  CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,                        ENDEZEILE,DATEIEINTRAEGE,                        FILEZAHL,0,ROLLANFANG,'0'B);/*#PP469   */    IF ZEICHEN.CHAR(1)=='7' THEN           ENDE:='1'B;    FIN;/*#PP468 Wenn Tilde und Subdirectory, gehe in naechste Ebene   */IF ZEICHEN.CHAR(1)==TILDE AND DATEIZEIGER<=FILEZAHL THEN       IF DATEIEINTRAEGE(DATEIZEIGER).SUBDIRECTORY  THEN/* #PP465221  Bilde Pfadnamen #PP465222  Rufe DATEIWAHL rekursiv auf #PP465223  Stelle urspruenglichen Zustand wieder her        */ FIN; /*  */ FIN;/*#PP461 Wenn Linkspfeil, gehe nach links */      IF ZEICHEN.CHAR(1) == LINKSPFEIL THEN        IF DATEIZEIGER >1 THEN           DATEIZEIGER:=DATEIZEIGER-1;        FIN;      FIN;/*#PP462 Wenn Rechtspfeil, gehe nach rechts */      IF ZEICHEN.CHAR(1) == RECHTSPFEIL THEN        IF DATEIZEIGER < FILEZAHL+3 THEN           DATEIZEIGER:=DATEIZEIGER+1;        FIN;      FIN;/*#PP463 Wenn Hochpfeil, gehe nach oben  */       IF ZEICHEN.CHAR(1) == HOCHPFEIL THEN         IF DATEIZEIGER > 8 AND DATEIZEIGER <= FILEZAHL    THEN           DATEIZEIGER:=DATEIZEIGER-8;         FIN;         IF DATEIZEIGER > FILEZAHL THEN           DATEIZEIGER:=(FILEZAHL-1)//8*8+1;         FIN;       FIN;/*#PP464 Wenn Tiefpfeil, gehe nach unten                      */       IF ZEICHEN.CHAR(1) == TIEFPFEIL THEN         IF DATEIZEIGER <= FILEZAHL-8 THEN           DATEIZEIGER:=DATEIZEIGER+8;          ELSE           IF DATEIZEIGER <= (FILEZAHL-1)//8*8 THEN              DATEIZEIGER:=FILEZAHL;             ELSE              DATEIZEIGER:=FILEZAHL+1;           FIN;         FIN;       FIN;/*#PP465   */         IF ZEICHEN.CHAR(1)==ESCAPE AND (ZEICHEN.CHAR(2)==RECHTSPFEIL                                    OR ZEICHEN.CHAR(2)==LINKSPFEIL)             THEN   /* #PP4651  IF auf Datei oder Subdirectory gezeigt wird #PP4652    THEN handle entsprechend         */FIN;/* #PP4654  IF auf Maskeneingabe gezeigt wird #PP4653    THEN behandle Maske          */ FIN; /* #PP4655  IF auf OK gezeigt wird und Insert #PP4656     THEN gehe ganz zurueck          */ FIN; /* #PP4657  IF auf Abbruch gezeigt wird und Delete #PP4658     THEN brich ganz ab          */ FIN; /*   */ FIN; /* #PP4657 */      IF ZEICHEN.CHAR(2)==LINKSPFEIL AND DATEIZEIGER==FILEZAHL+2/*#PP4658 */  THEN ABBRUCH:='1'B; /* #PP4655  */      IF ZEICHEN.CHAR(2)==RECHTSPFEIL AND DATEIZEIGER==FILEZAHL+1/*#PP4656   */THEN      FERTIG:='1'B;/*#PP4654 */IF DATEIZEIGER==FILEZAHL+3 /* #PP4651  */ IF DATEIZEIGER<=FILEZAHL   /* #PP4652  */ THEN /* #PP46521  IF Subdirectory und keine Directory-Auswahl #PP46522    THEN gehe in Subdirectory-Ebene #PP46523   ELSE trage Merkbit ein         */ FIN; /* #PP46522    */ THEN /* #PP465221  Bilde Pfadnamen #PP465222  Rufe DATEIWAHL rekursiv auf #PP465223  Stelle urspruenglichen Zustand wieder her, wenn nicht fertig #PP46521 */ IF DATEIEINTRAEGE(DATEIZEIGER).SUBDIRECTORY               AND  ARBEITSWEISE/=DIRECTRY/*#PP465221  */              PFADNAME:=PFADBILDEN(DERNAME,                        DATEIEINTRAEGE(DATEIZEIGER).DERNAME);/*#PP465222 */                CALL DATEIWAHL(PFADNAME,                               ERGEBNISSE,STARTZEILE,                               ENDEZEILE,ARBEITSWEISE,                               GEWAEHLT);     DATEIEINTRAEGE(DATEIZEIGER).GEWAEHLT:=GEWAEHLT;/*#PP465223  */   CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,                      ENDEZEILE,DATEIEINTRAEGE,                FILEZAHL,0,ROLLANFANG,'0'B);     CALL ANWEISUNGEN(0,ENDEZEILE+1,'0'B);     CALL GEBRAUCHSANWEISUNG(ENDEZEILE+2);/*#PP4653    */THEN  /* #PP465322  Lies Maske ein #PP465323  Trage in alle Dateien (nicht in Subdirectories) evtl. das            Merkbit ein #PP465322  Lies Maske ein  */   CALL ANWEISUNGEN(4,ENDEZEILE+1,'1'B);    CALL ZEILENEINGABE(MASKE,8,STELLE,               ENDEZEILE+1,72,TASTEN);/*#PP465323  */             FOR I TO FILEZAHL REPEAT              IF NOT DATEIEINTRAEGE(I).SUBDIRECTORY THEN               GEWAEHLT:='1'B;               FOR K TO STELLE WHILE GEWAEHLT REPEAT                 IF MASKE.CHAR(K)/='?' THEN                   GEWAEHLT:=GEWAEHLT AND  MASKE.CHAR(K)==                             DATEIEINTRAEGE(I).DERNAME.CHAR(K);                 FIN;                 IF MASKE.CHAR(K)==' ' THEN GOTO EXPP467;FIN;               END;EXPP467:;               IF GEWAEHLT THEN                  IF ZEICHEN.CHAR(2)==RECHTSPFEIL THEN                     DATEIEINTRAEGE(I).GEWAEHLT:=GEWAEHLT;                   ELSE                     DATEIEINTRAEGE(I).GEWAEHLT:=NOT GEWAEHLT;                  FIN;               FIN;              FIN;             END;   CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,                          ENDEZEILE,DATEIEINTRAEGE,                           FILEZAHL,0,ROLLANFANG,'0'B);/*#PP46523   */ ELSE /* #PP465230 Loesche bei entsprechender Arbeitsweise das 1. Ergebnis,             damit es spaeter neu eingetragen wird #PP465231 Bei Delete (Linkspfeil) loesche Merkbit #PP465232 Bei Insert (Rechtspfeil) setze Merkbit und loesche es           eventuell bei dem Konkurrenten und gib diesen aus #PP465230 */      IF ARBEITSWEISE==DIRECTRY OR ARBEITSWEISE==EINEDATEI THEN        ERGEBNISSE(1):=' ';      FIN;/*#PP465231 Bei Delete (Linkspfeil) loesche Merkbit               */    IF ZEICHEN.CHAR(2)==LINKSPFEIL THEN      DATEIEINTRAEGE(DATEIZEIGER).GEWAEHLT:='0'B;    FIN;/*#PP465232 */    IF ZEICHEN.CHAR(2)==RECHTSPFEIL THEN      IF ARBEITSWEISE==DIRECTRY OR ARBEITSWEISE==EINEDATEI THEN        FOR I TO FILEZAHL REPEAT         IF DATEIEINTRAEGE(I).GEWAEHLT THEN           DATEIEINTRAEGE(I).GEWAEHLT:='0'B;CALL DIRECTORYAUSGABE(DERNAME,STARTZEILE,ENDEZEILE,                           DATEIEINTRAEGE,FILEZAHL,                           I,ROLLANFANG,'1'B);         FIN;        END;      FIN;      DATEIEINTRAEGE(DATEIZEIGER).GEWAEHLT:='1'B;    FIN;/*#PP467 */       IF ZEICHEN.CHAR(1)==RETURN  THEN             DATEIZEIGER:=FILEZAHL+1;       FIN;/*#PP47   EXIT WHEN Endebedingung*/   IF FERTIG OR ABBRUCH OR ENDE THEN GOTO EXPP4;FIN; /*#PP48 Ende Wiederholung     */ END;EXPP4:;/*#PP49 Mache ordentlich Schluss #PP490 Bei Abbruch: loesche alle Merkbits #PP491 Nimm an, dass nichts gewaehlt wurde #PP492 Uebertrage gewaehlte Dateien auf freien Platz in Ergebnisliste #PP494 Komprimiere Ergebnisliste #PP497 Positioniere Cursor hinter Dateienliste #PP497 */    CALL CURSORPOSITION(ENDEZEILE+1,1);/*#PP490 Bei Abbruch: loesche alle Merkbits                           */     IF ABBRUCH THEN       FOR I TO FILEZAHL REPEAT         DATEIEINTRAEGE(I).GEWAEHLT:='0'B;       END;     FIN;/*#PP494       */REPEAT /* #PP4941    Suche freie Stelle #PP4942    Suche Stelle mit Eintragung #PP4943    EXIT WHEN keine gefunden #PP4944    Verschiebe nach vorn #PP4947    Loesche freigewordene Plaetze am Schluss #PP4945 Ende Wiederholung #PP4947  */    FOR I FROM (1 UPB ERGEBNISSE - (STELLE-FREISTELLE)+1)             TO 1 UPB ERGEBNISSE REPEAT       ERGEBNISSE(I):=' ';    END;/*#PP4941    Suche freie Stelle     */         FREISTELLE:=1 UPB ERGEBNISSE+1;         FOR I TO 1 UPB ERGEBNISSE REPEAT           IF ERGEBNISSE(I)==' '  THEN              FREISTELLE:=I;              GOTO EXPP4941;           FIN;         END;EXPP4941:;/*#PP4942    Suche Stelle mit Eintragung    */         STELLE:=1 UPB ERGEBNISSE+1;         FOR I FROM FREISTELLE+1  TO 1 UPB ERGEBNISSE REPEAT           IF ERGEBNISSE(I)/=' ' THEN              STELLE:=I;              GOTO EXPP4942;           FIN;         END;EXPP4942:;/*#PP4943    EXIT WHEN keine gefunden   */ IF STELLE>1 UPB ERGEBNISSE THEN GOTO EXPP494; FIN; /* #PP4944    Verschiebe nach vorn           */         FOR I FROM STELLE TO 1 UPB ERGEBNISSE REPEAT           ERGEBNISSE(I-(STELLE-FREISTELLE)):=                ERGEBNISSE(I);         END;/*#PP4945 Ende Wiederholung       */ END;EXPP494:;  /* #PP491  */      GEWAEHLT:='0'B;/*#PP492 */      FOR I TO FILEZAHL REPEAT /* #PP4921 Wenn der Eintrag gewaehlt wurde #PP4922   THEN trage ihn evtl. ein      */ FIN; /*      */ END; /* #PP4921 Wenn der Eintrag gewaehlt wurde  */        IF DATEIEINTRAEGE(I).GEWAEHLT/*#PP4922   THEN trage ihn evtl. ein       */ THEN /* #PP49221 Merke, dass gewaehlt wurde #PP49222 IF es kein Subdirectory-Eintrag ist und entsprechende              Arbeitsweise #PP49223    THEN trage ihn ein, wenn er neu ist        */ FIN; /* #PP49224 IF entsprechende Arbeitsweise und noch nicht eingetragen #PP49225   THEN trage ihn auf ersten Listenplatz       */ FIN; /* #PP49224 IF entsprechende Arbeitsweise und noch nicht eingetragen  */     IF (ARBEITSWEISE==EINEDATEI OR ARBEITSWEISE==DIRECTRY)         AND ERGEBNISSE(1)==' '/*#PP49225  */THEN                ERGEBNISSE(1):=                          PFADBILDEN(DERNAME,                              DATEIEINTRAEGE(I).DERNAME);/*#PP49221 Merke, dass gewaehlt wurde  */          GEWAEHLT:='1'B;/*#PP49222 IF es kein Subdirectory-Eintrag ist         */          IF ((NOT DATEIEINTRAEGE(I).SUBDIRECTORY)            AND ARBEITSWEISE==DATEI)/*#PP49223    THEN trage ihn ein wenn er neu ist       */ THEN /* #PP492231 Bilde kompletten Pfadnamen #PP492232 IF Eintrag noch nicht da ist #PP492233   THEN trage ihn auf freier Stelle ein           */ FIN; /*#PP492231 Bilde kompletten Pfadnamen        */              PFADNAME:=PFADBILDEN(DERNAME,                        DATEIEINTRAEGE(I).DERNAME);/*#PP492232 IF Eintrag noch nicht da ist  */        ISTSCHONDA:='0'B;        FOR M TO 1 UPB ERGEBNISSE WHILE NOT ISTSCHONDA REPEAT          ISTSCHONDA:= ERGEBNISSE(M)==PFADNAME;        END;        IF NOT ISTSCHONDA                      /*#PP492233   THEN trage ihn auf freier Stelle ein */          THEN             FREISTELLE:=1 UPB ERGEBNISSE+1;             FOR K TO 1 UPB ERGEBNISSE REPEAT                IF ERGEBNISSE(K)==' ' THEN                  FREISTELLE:=K;                  GOTO EXPP492;                FIN;             END;EXPP492:;             IF FREISTELLE <= 1 UPB ERGEBNISSE THEN                  ERGEBNISSE(FREISTELLE):=PFADNAME;               ELSE                CALL STRINGAUSGABE(                 'Zu viele Dateien fuer Dateiliste',32,           /*     12345678901234567890123456789012       */          ENDEZEILE+3  ,24,INVERS);                AFTER 1 SEC RESUME;             FIN;/*#PP466 */     IF ZEICHEN.CHAR(2)==LINKSPFEIL THEN      FOR I TO FILEZAHL REPEAT          IF NOT DATEIEINTRAEGE(I).SUBDIRECTORY             AND NOT DATEIEINTRAEGE(I).GEWAEHLT THEN              PFADNAME:=PFADBILDEN(DERNAME,                        DATEIEINTRAEGE(I).DERNAME);             FOR K TO 1 UPB ERGEBNISSE REPEAT                IF ERGEBNISSE(K)==PFADNAME THEN                  ERGEBNISSE(K):=' ';                  GOTO EXPP493;                FIN;             END;EXPP493:;          FIN;      END;    FIN;/*#PP2 Prozedur zur Ausgabe des Directorys auf Bildschirm         */     DIRECTORYAUSGABE:PROC(PFAD CHAR(27),                           (STARTZEILE,ENDEZEILE) FIXED,                           DATEIEINTRAEGE () DATEIEINTRAG IDENT,                           (FILEZAHL,DATEIZEIGER) FIXED,                            ROLLANFANG FIXED IDENT,                            NORMALGEFAERBT BIT(1));    /*  #PP21 Lokale Variable #PP22 IF EINTRAGNR ==0 #PP23    THEN gib das ganze Directory bis zur Endezeile aus #PP24    ELSE gib nur die angegebene Eintragung aus    */ FIN; /* */ END; /* #PP21 Lokale Variable  */      DCL (ZEILE,SPALTE) FIXED,FARBE FIXED,         (RUECKROLLEN,VORROLLEN) BIT(1);/*#PP22 IF EINTRAGNR ==0 */      IF DATEIZEIGER==0/*#PP23    THEN gib das ganze Directory aus   */   THEN /* #PP230 Initialisiere Variable #PP232 Loesche Directorybereich #PP231 Gib Ueberschrift aus #PP233 Gib Directorybereich aus #PP234 Gib eventuell Leerunterlegung und Leermeldung aus #PP234 Gib eventuell Leerunterlegung aus    */  IF FILEZAHL==0 THEN ZEILE:=STARTZEILE;FIN;  FOR I FROM ZEILE+1 TO ENDEZEILE REPEAT    CALL STRINGAUSGABE(LEER,80,I,1,NORMAL);  END;  IF FILEZAHL==0 THEN    CALL STRINGAUSGABE('Keine Datei bzw. kein Subdirectory',   /*                        1234567890123456789012345678901234   */                          34,STARTZEILE+1,1,UNTERSTRICHEN);  FIN;/*#PP230 Initialisiere Variable   */        LEER:='|.......................................' CAT       /*      1234567890123456789012345678901234567890      */              '.......................................|'; UNTERLEGUNG:='#_______________________________________' CAT              '_______________________________________#';/*#PP232 Loesche Directorybereich  */     FOR I FROM STARTZEILE TO ENDEZEILE REPEAT       CALL STRINGAUSGABE(UNTERLEGUNG,80,I,1,NORMAL);     END;/*#PP231 Gib Ueberschrift aus */   IF FILEZAHL>(ENDEZEILE-STARTZEILE)*8 THEN     CALL UEBERSCHRIFT('Directory ' CAT PFAD CAT ' (Ausschnitt)',                                    STARTZEILE);    ELSE     CALL UEBERSCHRIFT('Directory ' CAT PFAD,STARTZEILE);   FIN;/*#PP233 Gib Directorybereich aus    */     FOR I FROM ROLLANFANG TO FILEZAHL REPEAT       IF DATEIEINTRAEGE(I).GEWAEHLT THEN FARBE:=INVERSUNTERSTRICHEN;         ELSE FARBE:=UNTERSTRICHEN; FIN;       ZEILE:=(I-ROLLANFANG)//8+STARTZEILE+1;       IF ZEILE>ENDEZEILE THEN GOTO EXPP233;FIN;       SPALTE:=((I-ROLLANFANG)-              (I-ROLLANFANG)//8*8)*10+2;       CALL STRINGAUSGABE(DATEIEINTRAEGE(I).DERNAME,8,                          ZEILE,                          SPALTE,                          FARBE);    END;EXPP233:;/*#PP24    ELSE gib nur die angegebene Eintragung aus  */      ELSE /* #PP241 IF Eintragung nicht im dargestellten Bereich liegt #PP242   THEN berechne Rollanfang und gib Directory neu aus     */ FIN; /* #PP243 Gib Eintragung aus #PP241 #PP2411 IF fuer das Directory mehr als 3 Zeilen zur Verfuegung         stehen #PP2412   THEN wird bei der zweitletzten Zeile gerollt #PP2413   ELSE wird bei der letzten Zeile gerollt       */ FIN; /*  */  IF VORROLLEN OR RUECKROLLEN  /* #PP2411 */ IF ENDEZEILE-STARTZEILE>=3 /* #PP2412  */THEN   VORROLLEN:=        ( (DATEIZEIGER-ROLLANFANG+1)>(ENDEZEILE-STARTZEILE-1)*8           AND ( DATEIZEIGER<=FILEZAHL-8) )          OR (((DATEIZEIGER>(FILEZAHL-1)//8*8)             AND (ROLLANFANG<(((FILEZAHL-1)//8+1)                         -(ENDEZEILE-STARTZEILE))*8+1)));   RUECKROLLEN:=                DATEIZEIGER<ROLLANFANG+8 AND ROLLANFANG>=8;/*#PP2413  */ ELSE   VORROLLEN:=          (DATEIZEIGER-ROLLANFANG+1)>(ENDEZEILE-STARTZEILE)*8;   RUECKROLLEN:=           DATEIZEIGER < ROLLANFANG AND ROLLANFANG >=8;/*#PP242 */ THEN          IF RUECKROLLEN THEN            ROLLANFANG:=ROLLANFANG-8;           ELSE             IF DATEIZEIGER>(FILEZAHL-1)//8*8 THEN               ROLLANFANG:=(((FILEZAHL-1)//8+1)                         -(ENDEZEILE-STARTZEILE))*8+1;              ELSE                ROLLANFANG:=ROLLANFANG+8;             FIN;          FIN;  CALL DIRECTORYAUSGABE(PFAD,STARTZEILE,ENDEZEILE,DATEIEINTRAEGE,                         FILEZAHL,0,ROLLANFANG,'0'B);/*#PP243 Gib Eintragung aus */    IF DATEIEINTRAEGE(DATEIZEIGER).GEWAEHLT THEN      IF NORMALGEFAERBT THEN        FARBE:=INVERSUNTERSTRICHEN;     ELSE        FARBE:=UNTERSTRICHEN;      FIN;    FIN;    IF NOT DATEIEINTRAEGE(DATEIZEIGER).GEWAEHLT THEN      IF NOT NORMALGEFAERBT THEN        FARBE:=INVERSUNTERSTRICHEN;     ELSE        FARBE:=UNTERSTRICHEN;      FIN;    FIN;    ZEILE:=(DATEIZEIGER-ROLLANFANG)//8+STARTZEILE+1;    SPALTE:=((DATEIZEIGER-ROLLANFANG)-              (DATEIZEIGER-ROLLANFANG)//8*8)*10+2;    CALL STRINGAUSGABE(                        DATEIEINTRAEGE(DATEIZEIGER).DERNAME,8,                      ZEILE,SPALTE,                      FARBE       );    CALL CURSORPOSITION(ZEILE,SPALTE);/*#PP1 Prozedur zum Einlesen eines Directories    */     DIRECTORYLESEN:PROC(PFAD CHAR(27),                         DATEIEINTRAEGE () DATEIEINTRAG IDENT,                         FILEZAHL FIXED IDENT) GLOBAL      ;    /* #PP11  Lokale Variable #PP12  Bestimme Pfadlaenge #PP13  IF Pfadlaenge 0 #PP14    THEN trage Devicenamen ein #PP15    ELSE lies Directory ein     */ FIN; /* #PP16  IF ED-Directory #PP17     THEN mache Sonderbehandlung und sortiere #PP18     ELSE stelle nur fest, ob Subdirectory  (Pfadlaenge/='0')        */ FIN; /*     */ END; /* #PP18  */ ELSE  IF PFADLAENGE/=0 THEN    FOR I TO FILEZAHL REPEAT      FOR K FROM 8 BY -1 TO 1 REPEAT         IF DATEIEINTRAEGE(I).DERNAME.CHAR(K)/=' ' THEN           STELLE:=K;           GOTO EXPP18;         FIN;      END;EXPP18:;      DATEIEINTRAEGE(I).SUBDIRECTORY:=              DATEIEINTRAEGE(I).DERNAME.CHAR(STELLE)=='/';     END;  FIN;/*#PP16  */        IF PFADLAENGE/=0 AND PFAD.CHAR(1)=='E'            AND PFAD.CHAR(2)=='D'/*#PP17   */ THEN /* #PP171  Haenge Devicenamen bzw. Pfad vor alle Eintragungen #%PP18  Gib Directory aus #PP172   Kuerze bis zum ersten / nach dem Pfad #PP1B   Sortiere Directory #%PP18  gib Directory aus #PP173   Streiche Doppeleintraege #%PP18  gib Directory aus #PP13 */ IF PFADLAENGE==0 /* #PP14 */ THEN         DATEIEINTRAEGE(1).DERNAME:='ED:';         DATEIEINTRAEGE(2).DERNAME:='F0:';         DATEIEINTRAEGE(3).DERNAME:='H0:';         DATEIEINTRAEGE(1).SUBDIRECTORY:='1'B;         DATEIEINTRAEGE(2).SUBDIRECTORY:='1'B;         DATEIEINTRAEGE(3).SUBDIRECTORY:='1'B;         DATEIEINTRAEGE(1).GEWAEHLT:='0'B;         DATEIEINTRAEGE(2).GEWAEHLT:='0'B;         DATEIEINTRAEGE(3).GEWAEHLT:='0'B;         FILEZAHL:=3;/*#PP15 */ ELSE  /* #PP152  Lies Directory ein #PP154  IF Editor-Directory #PP155   THEN lies Directory normal ein #PP156    ELSE stehen mehrere Namen in einer Zeile       */FIN; /* #PP157  Pruefe auf zu grosse Laenge #PP158  loesche Pipe-Datei VO:DIRLINK #PP158  */   PUT 'ERASE VO:DIRLINK' TO BEFEHLSINTERPRETER BY A,SKIP;/*#PP173  */     STELLE:=2;     WHILE STELLE <=FILEZAHL  REPEAT       WHILE DATEIEINTRAEGE(STELLE-1).DERNAME==                   DATEIEINTRAEGE(STELLE).DERNAME                 AND STELLE <= FILEZAHL                      REPEAT         FOR K FROM STELLE TO FILEZAHL-1 REPEAT            DATEIEINTRAEGE(K):=DATEIEINTRAEGE(K+1);         END;         FILEZAHL:=FILEZAHL-1;       END;       STELLE:=STELLE+1;     END;/*#PP1B   */        VERTAUSCHT:='1'B;        SORTIERMENGE:=FILEZAHL;        WHILE SORTIERMENGE>1 AND VERTAUSCHT REPEAT          FOR I TO SORTIERMENGE-1  REPEAT            IF KLEINER(DATEIEINTRAEGE(I+1).DERNAME,               DATEIEINTRAEGE(I).DERNAME) THEN               HILFSEINTRAG:=DATEIEINTRAEGE(I);               DATEIEINTRAEGE(I):=DATEIEINTRAEGE(I+1);               DATEIEINTRAEGE(I+1):=HILFSEINTRAG;               VERTAUSCHT:='1'B;            FIN;           END;           SORTIERMENGE:=SORTIERMENGE-1;         END;/*#PP171   MARKE #PP1714  Berechne Hilfspfad #PP1712  Verschiebe Eintragung nach hinten #PP1713  Haenge Pfad davor #PP1714  Berechne Hilfspfad */    IF PFAD.CHAR(1)=='E' AND PFAD.CHAR(2)=='D' THEN      HILFSPFAD:='ED:';      HILFSPFADLAENGE:=3;     ELSE      HILFSPFAD:=PFAD;      HILFSPFADLAENGE:=PFADLAENGE;    FIN;/*#PP1713    */    FOR I TO FILEZAHL REPEAT      FOR K TO HILFSPFADLAENGE REPEAT         DATEIEINTRAEGE(I).DERNAME.CHAR(K):=HILFSPFAD.CHAR(K);      END;    END;/*#PP1712      */    FOR I TO FILEZAHL REPEAT      FOR K FROM 27 BY -1 TO HILFSPFADLAENGE+1 REPEAT         DATEIEINTRAEGE(I).DERNAME.CHAR(K):=           DATEIEINTRAEGE(I).DERNAME.CHAR(K-HILFSPFADLAENGE);      END;    END;/*#PP12  */     PFADLAENGE:=0;     FOR I FROM 24 BY -1 TO 1 REPEAT       IF PFAD.CHAR(I)/=' ' THEN          PFADLAENGE:=I;          GOTO EXPP1A1;       FIN;    END;EXPP1A1:;/*#PP172   */        FOR I TO FILEZAHL REPEAT          DATEIEINTRAEGE(I).GEWAEHLT:='0'B;          DATEIEINTRAEGE(I).SUBDIRECTORY:='0'B;          STELLE:=9;          FOR K FROM 1 TO 27-PFADLAENGE REPEAT            DATEIEINTRAEGE(I).DERNAME.CHAR(K):=              DATEIEINTRAEGE(I).DERNAME.CHAR(K+PFADLAENGE);          END;          FOR K TO STELLE REPEAT             IF DATEIEINTRAEGE(I).DERNAME.CHAR(K)=='/' THEN                STELLE:=K;                DATEIEINTRAEGE(I).SUBDIRECTORY:='1'B;                GOTO EXPP19;             FIN;          END;EXPP19:;          FOR K FROM STELLE+1 TO 27 REPEAT            DATEIEINTRAEGE(I).DERNAME.CHAR(K):=' ';          END;        END;/*#%PP18  */       FOR I TO FILEZAHL REPEAT         PUT DATEIEINTRAEGE(I).DERNAME TO DIALOG BY SKIP,A;       END;/* #PP154                          */    IF PFAD.CHAR(1)=='E' AND PFAD.CHAR(2)=='D'/*#PP155 */ THEN       FILEZAHL:=1 UPB DATEIEINTRAEGE+1;       GET  FROM DIRECTORY BY SKIP,SKIP;          /* erste Zeile ueberlesen */       FOR I TO 1 UPB DATEIEINTRAEGE REPEAT         GET DATEIEINTRAEGE(I).DERNAME FROM DIRECTORY BY X(2),A;         IF DATEIEINTRAEGE(I).DERNAME==' ' THEN            FILEZAHL:=I-1;             GOTO EXPP14;         FIN;       END;EXPP14:;/*#PP157   */       IF FILEZAHL>1 UPB DATEIEINTRAEGE THEN          PUT'Kapazitaet des Programmes reicht nicht fuer zu langes Directory'           TO DIALOG BY A,SKIP;       FIN;/*#PP156    */ ELSE /* #PP1563  Zaehler 1 setzen #PP1561  Eine Zeile ueberlesen       */ FOR I TO 1 UPB DATEIEINTRAEGE REPEAT /* #PP1562  in jeder Zeile stehen 5 Eintraege, in der ersten ein leerer       */ END;EXPP16:;   /* #PP1561 */ GET FROM DIRECTORY BY SKIP,SKIP;           FILEZAHL:= 1 UPB DATEIEINTRAEGE+1;/*#PP1562 #PP15621  IF in zweiter Zeile erster Eintrag  und kein Subdirectory #PP15622      THEN ueberlesen       */ FIN; /* #PP15624  Eintrag lesen #PP15623  IF kein weiterer Eintrag oder Eintrag leer, EXIT #PP15625  Auf naechsten Eintrag weiterschalten #PP1563 */ ZAEHLER:=1;          /* #PP15625  */         ZAEHLER:=ZAEHLER+1;         IF ZAEHLER>5 THEN            ZAEHLER:=1;            GET FROM DIRECTORY BY SKIP;           ELSE            GET FROM DIRECTORY BY X(8);          FIN;/*#PP15624 */    GET DATEIEINTRAEGE(I).DERNAME FROM DIRECTORY BY A(8);/*#PP15621 */        IF I==1 AND ZAEHLER == 1               AND PFAD.CHAR(PFADLAENGE)/='/'/*#PP15622  */ THEN          GET FROM DIRECTORY BY X(16);          ZAEHLER:=ZAEHLER+1;/*#PP15623 */          IF DATEIEINTRAEGE(I).DERNAME==' '  THEN            FILEZAHL:=I-1;            GOTO EXPP16;          FIN;/*#PP11  Lokale Variable                                        */      DCL ZAEHLER FIXED;      DCL ZEICHEN CHAR(1);      DCL STELLE FIXED;      DCL PFADLAENGE FIXED;      DCL SORTIERMENGE FIXED;      DCL HILFSEINTRAG DATEIEINTRAG;      DCL VERTAUSCHT BIT(1);      DCL HILFSPFADLAENGE FIXED;      CONTROLD:=TOCHAR 4;/*#PP152  Lies Directory    */      HILFSPFAD:=PFAD;      IF PFAD.CHAR(PFADLAENGE)=='/' THEN        HILFSPFAD.CHAR(PFADLAENGE):=' ';      FIN;      ACTIVATE DATLES;      REQUEST GELESEN;/*#PS */    SPC SCANNER DATION IN ALPHIC CONTROL(ALL) GLOBAL;    SPC DIRECTORY DATION IN ALPHIC CONTROL(ALL) GLOBAL;    SPC DIALOG              DATION  INOUT ALPHIC CONTROL(ALL) GLOBAL;    SPC (BEFEHLSINTERPRETER,VO)              DATION  OUT ALPHIC CONTROL(ALL) GLOBAL;    SPC TASTEN DATION IN ALPHIC CONTROL(ALL) GLOBAL;    SPC QUELLE DATION IN ALPHIC CONTROL(ALL) GLOBAL;    SPC OFFENLES TASK;    SPC DATLES TASK;    SPC SCHONDA ENTRY RETURNS(BIT(1));    SPC CURSORPOSITION ENTRY GLOBAL;    SPC DIRECTORYLESEN ENTRY;    SPC DIRECTORYAUSGABE ENTRY;    SPC KLEINER ENTRY RETURNS(BIT(1)) GLOBAL;    SPC UNGLEICHSUCHE ENTRY RETURNS(FIXED) GLOBAL;    SPC PFADBILDEN ENTRY RETURNS(CHAR(27));    SPC ZEILENEINGABE ENTRY GLOBAL;    SPC DATEIWAHL ENTRY;    SPC ANWEISUNGEN ENTRY;    SPC GEBRAUCHSANWEISUNG ENTRY;    SPC FILEINHALT ENTRY;    SPC STRINGAUSGABE ENTRY GLOBAL;    SPC STRINGLAENGE ENTRY RETURNS(FIXED) GLOBAL;    SPC ASSIGN ENTRY GLOBAL;    SPC CURPOS ENTRY GLOBAL;    SPC UEBERSCHRIFT ENTRY GLOBAL;/*//