<< LINES .001/.009 ARE RESERVED FOR SYSTEMS INTEGRATION>>               00005000
$CONTROL MAP,CODE,USLINIT                                               00010000
<<HELPUSER - MODULE 84>>                                                00015000
<< HP32002C MPE SOURCE C.00.00 >>                                       00020000
$COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980. ",            & 00025000
$     "THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A ",      & 00030000
$     "TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR ",    & 00035000
$     "STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION ",& 00040000
$     "OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED ",  & 00045000
$     "WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY."   00050000
$CONTROL SEGMENT=HELPUSER,MAIN=HELPUSER << MODULE 84 >>                 00055000
COMMENT                                                                 00060000
   THIS IS THE HELP SUBSYSTEM, ACCESSED THROUGH THE PROCEDURE           00065000
   HELPROC.  THE COMMAND :HELP CALLS THIS ROUTINE.                      00070000
   WHEN THIS SEGMENT IS ADDED TO THE SL IT MUST BE PUT                  00075000
   IN AS A PERMANENTLY ALLOCATED SEGMENT, NOT AS A SYSTEM               00080000
   SEGMENT.  THIS IS TO GET CONTROL Y TO WORK.  SYSDUMP                 00085000
   DIALOG: "HELPUSER,U84,P"                                             00090000
;                                                                       00095000
BEGIN                                                                   00100000
                                                                        00105000
EQUATE                                                                  00110000
   NONDUP            = 0, <<NON DUPLIC. LIST DEV>>             <<02343>>00115000
   JOB               = 2, <<IF IN :JOB>>                       <<02343>>00120000
   TERMSIZEWM1       = 35, << 72 BYTES FOR TERMINAL >>                  00125000
   HRECSIZE          = 40,                                              00130000
   HRECSIZEM1        = HRECSIZE -1,                                     00135000
   HRECSIZEB         = HRECSIZE *2,                                     00140000
   HBUFFSIZE         = HRECSIZE -4,                                     00145000
   HBUFFSIZEB        = HRECSIZEB -8, <<HELP NEVER READS LINENOS>>       00150000
   HBLKFACTOR        = 16,                                     <<01310>>00155000
   HPHYSBLK          = HBLKFACTOR * HRECSIZE,                  <<01310>>00160000
   HSECTORSPERBLK    = HPHYSBLK / 128,                         <<01310>>00165000
   CACHE0LABELS      = 4 * HSECTORSPERBLK - 1,                 <<01310>>00170000
   CACHE0WORDS       = CACHE0LABELS * 128,                     <<01310>>00175000
   OTHERCACHELABELS  = 4 * HSECTORSPERBLK,                     <<01310>>00180000
   OTHERCACHEWORDS   = OTHERCACHELABELS * 128,                 <<01310>>00185000
   HMAXDIRSIZE       = OTHERCACHEWORDS,                        <<01310>>00190000
   HMAXDIRSIZEM1     = HMAXDIRSIZE - 1;                        <<01310>>00195000
                                                               <<01310>>00200000
DEFINE                                                         <<01310>>00205000
   LABELS'PER'CACHE = (IF CACHE = 0                            <<01310>>00210000
                         THEN CACHE0LABELS                     <<01310>>00215000
                         ELSE OTHERCACHELABELS) #;             <<01310>>00220000
DEFINE                                                         <<01310>>00225000
   WORDS'PER'CACHE  = (IF CACHE = 0                            <<01310>>00230000
                         THEN CACHE0WORDS                      <<01310>>00235000
                         ELSE OTHERCACHEWORDS) #;              <<01310>>00240000
                                                               <<01310>>00245000
DEFINE                                                         <<02343>>00250000
   JOB'TYPE = (12:2)#,    <<JOB/SESSION BITS>>                 <<02343>>00255000
   LIST'TYPE = (14:1)#;   <<DUP./NON DUP. LIST DEV>>           <<02343>>00260000
                                                               <<01310>>00265000
                                                                        00270000
                                                                        00275000
INTEGER                                                                 00280000
   STATUS = Q-1,                                                        00285000
   S0 =S-0,                                                             00290000
   X = X;                                                               00295000
                                                                        00300000
BYTE POINTER BPS0 = S-0;                                                00305000
POINTER PS0 = S-0;                                                      00310000
DOUBLE POINTER DPS0 = S-0;                                              00315000
                                                                        00320000
                                                                        00325000
EQUATE                                                                  00330000
   CR                = %15,                                             00335000
   HELPSET           = 17,                                              00340000
                                                                        00345000
                                                                        00350000
   NOINFO            = 11,                                              00355000
   VENTRY'INVITEM    = 12,                                              00360000
   IGNORED           = 13,                                              00365000
   ENDOFCAT          = 14,                                              00370000
   MAXSYNTAXERR      = 29,                                              00375000
                                                                        00380000
   CTLY              = 40,                                              00385000
   BREAKHIT          = 41,                                              00390000
   INPUTEOF          = 42,                                              00395000
                                                                        00400000
   FATALERR          = 50,                                              00405000
   CATERR            = 51,                                              00410000
   NOUSERLABEL       = 52,                                              00415000
   NOHELPDIR         = 53,                                              00420000
   USERLABELERR      = 54,                                              00425000
   OPENSTDINERR      = 55,                                              00430000
   READERR           = 56,                                              00435000
   LISTERR           = 57,                                              00440000
                                                                        00445000
   ALLX              = 1,                                               00450000
   SETX              = 2,                                               00455000
   ENTRYX            = 3,                                               00460000
   ITEMX             = 4,                                               00465000
   SUBITEMX          = 5,                                               00470000
   ANYX              = 6,                                               00475000
   STOPHELP          = 6,                                               00480000
   STARTHELP         = 7,                                               00485000
   SUBSET            = 8,                                               00490000
   KEY'CONTINUED     = 9,                                      <<01310>>00495000
                                                                        00500000
   DISP              = 2,                                               00505000
   NODISP            = 0;                                               00510000
                                                                        00515000
                                                                        00520000
                                                                        00525000
INTRINSIC RESETCONTROL,PRINT,SEARCH,MYCOMMAND,FWRITE,FOPEN,             00530000
   FGETINFO,WHO,                                               <<02343>>00535000
   FCLOSE,FREAD,FREADDIR,FCHECK,FREADLABEL;                             00540000
                                                                        00545000
INTEGER PROCEDURE DEBLANK(BUFF,WIDTH);                                  00550000
   VALUE WIDTH; BYTE ARRAY BUFF; INTEGER WIDTH;                         00555000
   OPTION EXTERNAL;                                                     00560000
                                                                        00565000
LOGICAL PROCEDURE REQUESTSERVICE; OPTION EXTERNAL;                      00570000
                                                                        00575000
INTEGER PROCEDURE GENMSGU(A,B);                                         00580000
   VALUE A,B;                                                           00585000
   LOGICAL A,B;                                                         00590000
   OPTION EXTERNAL;                                                     00595000
                                                                        00600000
<< FORWARD DECLS >>                                                     00605000
                                                                        00610000
PROCEDURE PRINTCARET(OFFSET);                                           00615000
   VALUE OFFSET; INTEGER OFFSET; OPTION INTERNAL,FORWARD;               00620000
                                                                        00625000
PROCEDURE READCAT'(A,B,C,D,E);                                          00630000
   VALUE A,D;INTEGER A,C,D,E;                                           00635000
   ARRAY B;OPTION FORWARD;                                              00640000
                                                                        00645000
INTEGER PROCEDURE TRAVERSE(CATFN,FN,RECNO,STOPPER,ERRNO);               00650000
   VALUE CATFN,FN,RECNO,STOPPER;                                        00655000
   INTEGER CATFN,FN,RECNO,STOPPER,ERRNO;                                00660000
   OPTION FORWARD;                                                      00665000
$TITLE "BUZZFETCH"                                                      00670000
INTEGER PROCEDURE BUZZFETCH(STRING);                                    00675000
   VALUE STRING; BYTE POINTER STRING;                                   00680000
   OPTION INTERNAL;                                            <<01650>>00685000
COMMENT                                                                 00690000
   RETURNS BUZZ NUMBER FROM BUZZ WORD ARRAY. RETURNS 0 IF               00695000
   IT CAN'T FIND A MATCH.                                               00700000
;                                                                       00705000
BEGIN                                                                   00710000
                                                                        00715000
INTEGER LEN;                                                            00720000
                                                                        00725000
                                                                        00730000
BYTE ARRAY DICT(*) = PB :=                                              00735000
    5,3,"ALL",       << 1 >>                                            00740000
    5,3,"SET",       << 2 >>                                            00745000
    7,5,"ENTRY",     << 3 >>                                            00750000
    6,4,"ITEM",      << 4 >>                                            00755000
    9,7,"SUBITEM",   << 5 >>                                            00760000
   10,8,"STOPHELP",  << 6 >>                                            00765000
   11,9,"STARTHELP", << 7 >>                                            00770000
    8,6,"SUBSET",    << 8 >>                                            00775000
   10,8,"CONTINUE",  << 9 >>                                   <<01310>>00780000
   0;                                                                   00785000
                                                                        00790000
BYTE ARRAY ENDICT(*) = PB :=0; << END ADDRESS OF DICT >>                00795000
                                                                        00800000
BYTE POINTER DICTP;                                                     00805000
                                                                        00810000
TOS := 0;                   << SET UP DB DICT ARRAY >>                  00815000
@DICTP := @S0 & LSL(1);     << BYTE ADDRESS >>                          00820000
TOS := X := (@ENDICT - @DICT + 1 ) & LSR(1);                   <<01310>>00825000
                            << WORD LENGTH OF DICT >>                   00830000
ASSEMBLE( ADDS 0 );         << ALLOCATE SPACE >>                        00835000
TOS := @DICTP & LSR(1);     << WORD ADR TARGET >>                       00840000
TOS := @DICT & LSR(1);      << WORD ADR SOURCE >>                       00845000
TOS := X;                   << COUNT >>                                 00850000
ASSEMBLE( MOVE PB );        << PUT DICT INTO STACK >>                   00855000
                                                                        00860000
MOVE STRING := STRING WHILE ANS,1;                                      00865000
LEN := TOS -@STRING;                                                    00870000
                                                                        00875000
BUZZFETCH := SEARCH(STRING,LEN,DICTP);                                  00880000
END; << BUZZFETCH >>                                                    00885000
$TITLE "CONTROLYTRAP"                                                   00890000
PROCEDURE CONTROLYTRAP;                                                 00895000
   OPTION INTERNAL;                                                     00900000
BEGIN << THIS IS A DUMMY, JUST USED TO ENABLE CTL Y >>                  00905000
   TOS := %31400 +TOS;                                                  00910000
   ASSEMBLE( XEQ 0);                                                    00915000
END; << CONTROLYTRAP >>                                                 00920000
$TITLE "DISPLAYBLOCK"                                                   00925000
INTEGER PROCEDURE DISPLAYBLOCK(CATFN,FN,RECNO,BUFF',BUZZNO,             00930000
      ERRNO);                                                           00935000
   VALUE CATFN,FN,RECNO;                                                00940000
   INTEGER CATFN,FN,RECNO,BUZZNO,ERRNO;                                 00945000
   ARRAY BUFF';                                                         00950000
   OPTION INTERNAL;                                                     00955000
COMMENT                                                                 00960000
   READS FROM CATALOG STARTING AT RECNO & WRITES TO FN UNTIL            00965000
   A RECORD CONTAINING "\'BUZZWORD'" IS FOUND. IF FN IS ZERO,           00970000
   THE WRITE IS SKIPPED. ERRNO MAY CONTAIN CATERR,BREAKHIT,             00975000
   LISTERR,CTLY. RETURNS NEXT RECORD NUMBER IN THE FILE.                00980000
;                                                                       00985000
BEGIN                                                                   00990000
                                                                        00995000
INTEGER                                                                 01000000
   SAVEFN,                                                              01005000
   LEN;                                                                 01010000
                                                                        01015000
BYTE ARRAY BUFF(*) = BUFF';                                             01020000
                                                                        01025000
SAVEFN := FN;                                                           01030000
LEN := BUZZNO := ERRNO := 0;                                            01035000
DO BEGIN                                                                01040000
   READCAT'(CATFN,BUFF',LEN,RECNO,ERRNO);                               01045000
   IF ERRNO <> 0 THEN  << ERRNO = CATERR >>                             01050000
   ELSE                                                                 01055000
   IF REQUESTSERVICE THEN ERRNO := BREAKHIT                             01060000
   ELSE                                                                 01065000
   BEGIN                                                                01070000
      RESETCONTROL;                                                     01075000
      IF = THEN ERRNO := CTLY                                           01080000
      ELSE                                                              01085000
      IF BUFF = "\" THEN                                                01090000
      BEGIN                                                             01095000
         BUZZNO := BUZZFETCH(BUFF(1));                                  01100000
         IF BUZZNO = STOPHELP THEN                                      01105000
         BEGIN                                                          01110000
            BUZZNO := 0;                                                01115000
            FN := NODISP;                                               01120000
         END                                                            01125000
         ELSE                                                  <<01310>>01130000
         IF BUZZNO = KEY'CONTINUED THEN                        <<01310>>01135000
            BUZZNO := 0                                        <<01310>>01140000
         ELSE                                                           01145000
         IF BUZZNO = STARTHELP THEN                                     01150000
         BEGIN                                                          01155000
            BUZZNO := 0;                                                01160000
            FN := SAVEFN;                                               01165000
         END;                                                           01170000
      END                                                               01175000
      ELSE                                                              01180000
      BEGIN                                                             01185000
         IF FN <> NODISP THEN                                           01190000
         BEGIN                                                          01195000
            PRINT(BUFF',-LEN,0);                                        01200000
            IF <> THEN ERRNO := LISTERR;                                01205000
         END;                                                           01210000
      END;                                                              01215000
   END;                                                                 01220000
   RECNO := RECNO +1;                                                   01225000
END UNTIL ERRNO <> 0 OR BUZZNO <> 0;                                    01230000
DISPLAYBLOCK := RECNO-1;                                                01235000
BUFF(LEN) := CR;  << TERMINATOR FOR MYCOMMAND >>                        01240000
                                                                        01245000
END; << DISPLAYBLOCK >>                                                 01250000
$TITLE "DISPLAYKEY"                                                     01255000
PROCEDURE DISPLAYKEY(CATFN,FN,KEYREC);                                  01260000
   VALUE CATFN,FN,KEYREC;                                               01265000
   INTEGER CATFN,FN,KEYREC;                                             01270000
   OPTION INTERNAL;                                                     01275000
COMMENT PRINTS LIST OF KEYWORDS WHICH ARE BRANCHES FROM                 01280000
   CURRENT HELP TREE NODE. LIST IS FOUND IN RECORD OF CATALOG           01285000
   CONTAINING "\ENTRY".                                                 01290000
;                                                                       01295000
BEGIN                                                                   01300000
                                                                        01305000
INTEGER                                                                 01310000
   BUFFLEN,                                                             01315000
   I,                                                                   01320000
   LEN,                                                                 01325000
   NUMPARMS,                                                            01330000
   OINDEX;                                                              01335000
BYTE POINTER PTR;                                                       01340000
DOUBLE ARRAY PARMS''(0:15);                                             01345000
INTEGER ARRAY PARMS'(*) = PARMS'';                                      01350000
ARRAY BUFF'(0:36);                                                      01355000
BYTE ARRAY BUFF(*) = BUFF';                                             01360000
ARRAY OBUFF'(0:39);                                                     01365000
BYTE ARRAY OBUFF(*) = OBUFF';                                           01370000
                                                                        01375000
READCAT'(CATFN,BUFF',BUFFLEN,KEYREC,I);                                 01380000
<< EXTRACT KEYWORDS >>                                                  01385000
BUFF(BUFFLEN) := CR;                                                    01390000
MYCOMMAND(BUFF(1),,16,NUMPARMS,PARMS'');                                01395000
IF NUMPARMS > 2 THEN                                                    01400000
BEGIN << HAVE SOME TO DISPLAY >>                                        01405000
   MOVE OBUFF := "KEYWORDS: "; OINDEX := 10;                            01410000
   I := 1; << STARTS AT THIRD PARM >>                                   01415000
                                                               <<01310>>01420000
   WHILE ( I := I + 1 ) < NUMPARMS   DO                        <<01310>>01425000
   BEGIN                                                       <<01310>>01430000
                                                               <<01310>>01435000
      @PTR := PARMS'( I*2 );                                   <<01310>>01440000
      LEN := PARMS'( I*2+1 ).(0:8);                            <<01310>>01445000
                                                               <<01310>>01450000
   << CHECK FOR CONTINUATION (KEYWORD OF ZERO LENGTH).   >>    <<01310>>01455000
      IF LEN = 0 THEN                                          <<01310>>01460000
      BEGIN                                                    <<01310>>01465000
                                                               <<01310>>01470000
         PRINT( OBUFF', -( OINDEX ), 0 );                      <<01310>>01475000
         OBUFF := " ";                                         <<01310>>01480000
         MOVE OBUFF(1) := OBUFF, (79);                         <<01310>>01485000
         OINDEX := 10;                                         <<01310>>01490000
         READCAT'( CATFN, BUFF', BUFFLEN, KEYREC+1, I );       <<01310>>01495000
         IF BUFFLEN < 9 OR BUFF <> "\CONTINUE" THEN            <<01310>>01500000
         BEGIN                                                 <<01310>>01505000
            PRINT ( OBUFF', -(OINDEX-1), 0 );                  <<01310>>01510000
            MOVE OBUFF :=                                      <<01310>>01515000
               "***EXPECTED CONTINUE LINE FROM 'MAKECAT'. ";   <<01310>>01520000
            PRINT ( OBUFF', -42, 0 );                          <<01310>>01525000
            MOVE OBUFF :=                                      <<01310>>01530000
               "   ENTIRE KEYWORD LIST NOT DISPLAYED.     ";   <<01310>>01535000
            PRINT ( OBUFF', -42, 0 );                          <<01310>>01540000
            RETURN;                                            <<01310>>01545000
         END;                                                  <<01310>>01550000
         KEYREC := KEYREC + 1;                                 <<01310>>01555000
         BUFF( BUFFLEN ) := CR;                                <<01310>>01560000
         MYCOMMAND( BUFF(1),, 16, NUMPARMS, PARMS'' );         <<01310>>01565000
         I := 0;                                               <<01310>>01570000
                                                               <<01310>>01575000
      END                                                      <<01310>>01580000
                                                               <<01310>>01585000
   << IF THE KEYWORD IS THERE, ADD IT TO THE BUFFER.     >>    <<01310>>01590000
      ELSE                                                     <<01310>>01595000
      BEGIN                                                    <<01310>>01600000
                                                               <<01310>>01605000
         MOVE OBUFF( OINDEX ) := PTR, (LEN);                   <<01310>>01610000
         OBUFF( OINDEX + LEN ) := ",";                         <<01310>>01615000
         OINDEX := OINDEX + LEN + 1;                           <<01310>>01620000
                                                               <<01310>>01625000
      END;                                                     <<01310>>01630000
                                                               <<01310>>01635000
   END;  << KEYWORD EXTRACTING LOOP. >>                        <<01310>>01640000
                                                               <<01310>>01645000
   PRINT(OBUFF',-(OINDEX-1),0);                                         01650000
END;                                                                    01655000
END; << DISPLAYKEY >>                                                   01660000
$TITLE "FINDKEY"                                                        01665000
INTEGER PROCEDURE FINDKEY(CATFN,RECNO,ITEM,ITEMLEN,BUZZNO,              01670000
      ERRNO);                                                           01675000
   VALUE CATFN,RECNO,ITEMLEN;                                           01680000
   BYTE ARRAY ITEM;                                                     01685000
   INTEGER CATFN,RECNO,ITEMLEN,BUZZNO,ERRNO;                            01690000
   OPTION INTERNAL;                                                     01695000
COMMENT                                                                 01700000
   STARTS AT RECNO IN CATALOG & SEARCHES FOR A MATCH BETWEEN            01705000
   ITEM AND ITEM SPECIFIED IN THE CATALOG RECORD. THE RECORD            01710000
   NUMBER OF THE MATCH IS RETURNED. BUZZNO IS THE INDEX INTO            01715000
   THE ARRAY OF "SET,ENTRY,ITEM,SUBITEM,ALL". ZERO IS RETURNED          01720000
   IF ITEM CAN'T BE FOUND OR I/O ERROR.                                 01725000
;                                                                       01730000
BEGIN                                                                   01735000
                                                                        01740000
INTEGER                                                                 01745000
   NUMPARMS,                                                            01750000
   LEN;                                                                 01755000
DOUBLE ARRAY PARMS''(0:1) = Q;                                          01760000
BYTE POINTER PARM1 = PARMS'';                                           01765000
BYTE POINTER PARM2 = PARMS'' +2;                                        01770000
INTEGER ARRAY PARMS'(*) = PARMS'';                                      01775000
DEFINE                                                                  01780000
   PARM1LEN = PARMS'(1).(0:8)#,                                         01785000
   PARM2LEN = PARMS'(3).(0:8)#;                                         01790000
ARRAY BUFF'(0:HBUFFSIZE);                                               01795000
BYTE ARRAY BUFF(*) = BUFF';                                             01800000
                                                                        01805000
DO BEGIN                                                                01810000
   RECNO := DISPLAYBLOCK(CATFN,NODISP,RECNO,BUFF',BUZZNO,               01815000
      ERRNO) +1;                                                        01820000
   IF ERRNO <> 0 THEN GO OUTL;                                          01825000
   IF BUZZNO = ALLX THEN GO OUTL;                                       01830000
      << EOF IN CATALOG >>                                              01835000
   MYCOMMAND(BUFF(1),,2,NUMPARMS,PARMS'');                              01840000
END UNTIL BUZZNO = ENTRYX OR ITEMLEN =PARM2LEN AND                      01845000
   PARM2 = ITEM,(ITEMLEN);                                              01850000
IF BUZZNO <> ENTRYX THEN FINDKEY := RECNO -1;                           01855000
OUTL:                                                                   01860000
                                                                        01865000
END; << FINDKEY >>                                                      01870000
$TITLE "HELPARSE"                                                       01875000
PROCEDURE HELPARSE(COMIMAGE,PARM1,PARM1LEN,PARM2,PARM2LEN,              01880000
      PARM3);                                                           01885000
   BYTE ARRAY COMIMAGE;                                                 01890000
   INTEGER PARM1LEN,PARM2LEN;                                           01895000
   BYTE POINTER PARM1,PARM2,PARM3;                                      01900000
   OPTION INTERNAL;                                                     01905000
BEGIN                                                                   01910000
                                                                        01915000
@PARM3 := PARM1LEN := PARM2LEN := 0;                                    01920000
SCAN COMIMAGE WHILE %6440,1; << INIT. DEBLANK >>                        01925000
@PARM1 := TOS;                                                          01930000
IF NOCARRY THEN << SOME TEXT >>                                         01935000
BEGIN                                                                   01940000
   MOVE PARM1 := PARM1 WHILE ANS,1;                                     01945000
   @PARM2 := TOS;                                                       01950000
   PARM1LEN := @PARM2 -@PARM1;                                          01955000
   SCAN PARM2 WHILE %6440,1; << DEBLANK AFTER 1ST PARM >>               01960000
   @PARM2 := TOS;                                                       01965000
   IF NOCARRY THEN << MORE TEXT >>                                      01970000
   BEGIN                                                                01975000
      IF PARM2 = SPECIAL THEN << DELIM >>                               01980000
         @PARM2 := @PARM2(1); << SKIP DELIM >>                          01985000
      SCAN PARM2 WHILE %6440,1; << DEBLANK >>                           01990000
      @PARM2 := TOS;                                           <<01129>>01995000
      IF NOCARRY THEN << REALLY IS  PARM >>                             02000000
      BEGIN                                                             02005000
         MOVE PARM2 := PARM2 WHILE ANS,1;                               02010000
         PARM2LEN := TOS -@PARM2;                                       02015000
            << CHECK FOR 3RD PARM >>                                    02020000
         SCAN PARM2(PARM2LEN) WHILE %6440,1;                            02025000
         @PARM3 := TOS;                                                 02030000
         IF PARM3 = CR THEN @PARM3 := 0;                                02035000
      END;                                                              02040000
   END;                                                                 02045000
END;                                                                    02050000
                                                                        02055000
END; << HELPARSE >>                                                     02060000
$TITLE "HELPROC"                                                        02065000
PROCEDURE HELPROC(CATFN,LISTFN,COMIMAGE,COMBASE,ERRNO,                  02070000
   INTERACT);                                                           02075000
   VALUE CATFN,LISTFN,INTERACT;                                         02080000
   INTEGER CATFN,LISTFN,ERRNO;                                          02085000
   BYTE ARRAY COMIMAGE,COMBASE;                                         02090000
   LOGICAL INTERACT;                                                    02095000
BEGIN                                                                   02100000
                                                                        02105000
LABEL                                                                   02110000
   OUTL,                                                                02115000
   ABORTL;                                                              02120000
                                                                        02125000
INTEGER                                                                 02130000
   STOPPER,     << FIRST DECL, USED AS STOPPER >>                       02135000
   RECNO,                                                               02140000
   NEXTREC,                                                             02145000
   KEYREC,                                                              02150000
   MENUREC,                                                             02155000
   PARM1LEN,                                                            02160000
   PARM2LEN,                                                            02165000
   BUZZNO,                                                              02170000
   LEN,                                                                 02175000
   INDEX = STOPPER,                                                     02180000
   KLEN,                                                                02185000
   INFN,                                                                02190000
   ERRORFOUND,       << FLAG TO TELL WHAT LABEL TO GO TO >>    <<06033>>02195000
                     << 0 RETURN; 1 ==> OUTL; 2 ==>ABORTL>>    <<06033>>02200000
   OLDPLABEL;                                                           02205000
                                                                        02210000
LOGICAL                                                                 02215000
   DUMMY,                                                      <<01310>>02220000
   DONE,                                                                02225000
   NOTFIRST,                                                            02230000
   GOTOOUTLFLAG := FALSE ,                                     <<06357>>02235000
   GOTOABORTLFLAG := FALSE ,                                   <<06357>>02240000
   MORE,                                                                02245000
   CATEOF;                                                              02250000
                                                                        02255000
BYTE POINTER                                                            02260000
   DEFN, << FOR SEARCH >>                                               02265000
   PARM1,                                                               02270000
   PARM2,                                                               02275000
   PARM3,                                                               02280000
   COMPTR,                                                              02285000
   CARETBASE;                                                           02290000
                                                                        02295000
POINTER                                                                 02300000
   CARETBASE';                                                          02305000
                                                                        02310000
INTEGER PROMPT := ">>";                                                 02315000
BYTE NOCARET := 0;                                                      02320000
                                                                        02325000
EQUATE DSIZE = 20;                                             <<00730>>02330000
BYTE ARRAY DICT(*) =PB :=                                               02335000
5,3,"ALL",                                                              02340000
5,3,"END",                                                              02345000
6,4,"EXIT",                                                             02350000
3,1,"E",                                                                02355000
0;                                                                      02360000
BYTE ARRAY DICTP(0:DSIZE-1);                                   <<00730>>02365000
                                                                        02370000
                                                                        02375000
ARRAY INBUFF'(0:TERMSIZEWM1);                                           02380000
BYTE ARRAY INBUFF(*) = INBUFF';                                         02385000
                                                                        02390000
ARRAY KBUFF'(0:36);                                                     02395000
BYTE ARRAY KBUFF(*) = KBUFF';                                           02400000
                                                                        02405000
INTEGER ARRAY DIR'(0:HMAXDIRSIZE);                                      02410000
BYTE ARRAY DIR(*) = DIR';                                               02415000
                                                                        02420000
DEFINE                                                                  02425000
   ERRETN = ERRNO); ERR(ERRNO,NOCARET #,                                02430000
                                                                        02435000
   SETUPDICT = MOVE DICTP := DICT,(DSIZE)#;                             02440000
                                                               <<06033>>02445000
DEFINE                                                         <<06033>>02450000
   EXAMINEERRFLAG =                                            <<06033>>02455000
      IF GOTOOUTLFLAG OR GOTOABORTLFLAG THEN                   <<06033>>02460000
         RETURN#,                                              <<06033>>02465000
                                                               <<06033>>02470000
   EXAMINEGOTOFLAG =                                           <<06033>>02475000
      IF GOTOOUTLFLAG THEN GOTO OUTL;                          <<06033>>02480000
      IF GOTOABORTLFLAG THEN GOTO ABORTL#;                     <<06033>>02485000
                                                               <<06033>>02490000
                                                                        02495000
INTEGER                                                        <<01310>>02500000
   CACHE,              << CACHE NUMBER CURRENTLY IN DIR. >>    <<01310>>02505000
   CACHE'LIMIT := 0,   << # OF CACHES IN WHOLE DIRECTORY >>    <<01310>>02510000
   FIRSTCACHE,         << FIRST CACHE CHECKED THIS COMMND>>    <<01310>>02515000
   TOTAL'LABELS,       << NUM OF LABELS IN HELP CATALOG. >>    <<01310>>02520000
   WORDS'IN'DIRECTORY, << WORD COUNT; FIRST WORD IN DIR. >>    <<01310>>02525000
   LNUM;               << LABEL NUMBER INDEX.            >>    <<01310>>02530000
                                                               <<01310>>02535000
LOGICAL                                                        <<01310>>02540000
   INITIAL'SETUPDIR    << FLAG FOR FIRST CACHE SET UP.   >>    <<01310>>02545000
         := TRUE,                                              <<01310>>02550000
   HELPSUBSYS:=FALSE,   <<TRUE IF IN SUB SYSTEM>>              <<02343>>02555000
   MODE,                <<SESSION/JOB, ETC>>                   <<02343>>02560000
   NONDUPLIST,          <<TRUE IF NON DUP. LIST DEV>>          <<02343>>02565000
   CONTINUE;           << LOOPING FLAG.                  >>    <<01310>>02570000
                                                               <<01310>>02575000
INTRINSIC DEBUG,PRINT,READ,MYCOMMAND,XCONTRAP;                          02580000
                                                                        02585000
SUBROUTINE WARN(ERRNUM,PTR);                                            02590000
   VALUE ERRNUM; INTEGER ERRNUM;                                        02595000
   BYTE POINTER PTR;                                                    02600000
BEGIN                                                                   02605000
                                                               <<01515>>02610000
IF INTERACT OR HELPSUBSYS                                      <<02343>>02615000
      THEN PRINTCARET( @PTR - @CARETBASE );                    <<01515>>02620000
   GENMSGU( HELPSET, ERRNUM );                                 <<01515>>02625000
                                                               <<01515>>02630000
END; << WARN >>                                                         02635000
                                                                        02640000
                                                                        02645000
SUBROUTINE ERR(ERRNUM,PTR);                                             02650000
   VALUE ERRNUM; INTEGER ERRNUM;                                        02655000
   BYTE ARRAY PTR;                                                      02660000
COMMENT                                                                 02665000
   ALWAYS CALLED AFTER DISPLAYING. IF ERRNUM=0 THEN                     02670000
   CONTROL IS RETURNED TO THE CALLER. IF ERRNUM <> 0           <<06033>>02675000
   THEN THE GOTOOUTLFLAG IS SET TO TRUE TO  INDICATE           <<06033>>02680000
   TO GO TO LABEL OUTL, GOTOABORTLFLAG IS TO GO TO ABORTL.     <<06033>>02685000
   INITIALLY THESE ARE SET TO FALSE WHEN ERR ENTERED.          <<06033>>02690000
;                                                                       02695000
BEGIN                                                                   02700000
                                                                        02705000
GOTOOUTLFLAG := FALSE;                                         <<06033>>02710000
GOTOABORTLFLAG := FALSE;                                       <<06033>>02715000
                                                               <<06033>>02720000
IF ERRNUM <> 0 THEN                                                     02725000
BEGIN                                                                   02730000
   ERRNO := ERRNUM;                                                     02735000
   RECNO:= NEXTREC; << RESTORE CLOBBERED PTR>>                          02740000
   IF ERRNO <= MAXSYNTAXERR THEN                               <<01515>>02745000
   BEGIN                                                                02750000
       IF (PTR <> 0) AND (INTERACT OR HELPSUBSYS)              <<02343>>02755000
         THEN PRINTCARET( @PTR - @CARETBASE );                 <<01515>>02760000
      GENMSGU(HELPSET,ERRNO);                                           02765000
      GOTOOUTLFLAG := TRUE;                                    <<06033>>02770000
   END                                                                  02775000
   ELSE                                                                 02780000
   IF ERRNO = CTLY THEN                                                 02785000
   BEGIN                                                                02790000
      ERRNO := 0;                                                       02795000
      GOTOOUTLFLAG := TRUE;                                    <<06033>>02800000
   END                                                                  02805000
   ELSE GOTOABORTLFLAG := TRUE;                                <<06033>>02810000
                                                                        02815000
      << ERRORFOUND HOLDS EITHER A 1,A 2, OR A 0    >>         <<06033>>02820000
      << TO RETURN TO THE CALLER.                   >>         <<06033>>02825000
                                                               <<06033>>02830000
                                                               <<06033>>02835000
                                                               <<06033>>02840000
END;                                                                    02845000
                                                                        02850000
END; << ERR >>                                                          02855000
                                                                        02860000
LOGICAL SUBROUTINE FIND(REC,PARM,PLEN);                                 02865000
   VALUE REC,PLEN;INTEGER REC,PLEN;                                     02870000
   BYTE ARRAY PARM;                                                     02875000
BEGIN                                                                   02880000
   RECNO := FINDKEY(CATFN,REC+1,PARM,PLEN,BUZZNO,ERRETN);               02885000
   IF RECNO <> 0 THEN FIND := TRUE;                                     02890000
END; << FIND >>                                                         02895000
                                                                        02900000
LOGICAL SUBROUTINE READMORE;                                            02905000
BEGIN                                                                   02910000
                                                                        02915000
HELPSUBSYS:=TRUE;         <<WANT TO PRINT CARET ON ERRORS>>    <<02343>>02920000
@COMPTR := @CARETBASE := @INBUFF;                                       02925000
PRINT(PROMPT,-1,%320);                                                  02930000
LEN := FREAD(INFN,INBUFF',-72);                                         02935000
IF <> THEN                                                     <<06033>>02940000
   BEGIN                                                       <<06033>>02945000
      IF < THEN ERR(READERR,NOCARET)                           <<06033>>02950000
      ELSE                                                     <<06033>>02955000
      IF > THEN ERR(INPUTEOF,NOCARET);                         <<06033>>02960000
      << CHECK TO SEE IF WE SHOULD GO TO ABORTL >>             <<06033>>02965000
      IF GOTOABORTLFLAG THEN                                   <<06033>>02970000
         BEGIN                                                 <<06033>>02975000
            READMORE := TRUE;                                  <<06033>>02980000
            RETURN;                                            <<06033>>02985000
         END;                                                  <<06033>>02990000
                                                               <<06033>>02995000
   END;                                                        <<06033>>03000000
IF REQUESTSERVICE THEN ERR(BREAKHIT,NOCARET);                           03005000
     << CHECK TO SEE IF WE SHOULD GO TO ABORTL >>              <<06033>>03010000
IF GOTOABORTLFLAG  THEN                                        <<06033>>03015000
    BEGIN                                                      <<06033>>03020000
       READMORE := TRUE;                                       <<06033>>03025000
       RETURN;                                                 <<06033>>03030000
    END;                                                       <<06033>>03035000
IF NONDUPLIST  THEN PRINT(INBUFF',-LEN,0); <<ECHO>>            <<02343>>03040000
COMPTR(LEN) := CR;                                                      03045000
NOTFIRST := TRUE;                                                       03050000
                                                                        03055000
END; << READMORE >>                                                     03060000
$PAGE                                                          <<01310>>03065000
<<******************************************************>>     <<06033>>03070000
<<                                                      >>     <<06033>>03075000
<<  S U B R O U T I N E   S E T U P D I R               >>     <<06033>>03080000
<<                                                      >>     <<06033>>03085000
<<******************************************************>>     <<06033>>03090000
LOGICAL SUBROUTINE SETUPDIR;                                   <<01310>>03095000
BEGIN                                                                   03100000
                                                               <<01310>>03105000
<< DETERMINE THE NEXT CACHE TO BE PLACED IN "DIR".         >>  <<01310>>03110000
   IF INITIAL'SETUPDIR THEN                                    <<01310>>03115000
   BEGIN                                                       <<01310>>03120000
      CACHE := 0;                                              <<01310>>03125000
      FGETINFO( CATFN, ,,,,,,,,,,,,,,,, TOTAL'LABELS );        <<01310>>03130000
      IF TOTAL'LABELS <= 0 THEN                                <<06033>>03135000
         BEGIN                                                 <<06033>>03140000
            ERR( NOUSERLABEL, NOCARET );                       <<06033>>03145000
            EXAMINEERRFLAG;                                    <<06033>>03150000
         END                                                   <<06033>>03155000
   END                                                         <<01310>>03160000
   ELSE                                                        <<01310>>03165000
   BEGIN                                                       <<01310>>03170000
      CACHE := IF CACHE + 1 > CACHE'LIMIT                      <<01310>>03175000
                  THEN 0                                       <<01310>>03180000
                  ELSE CACHE + 1;                              <<01310>>03185000
      IF CACHE = FIRSTCACHE THEN                               <<01310>>03190000
      BEGIN                                                    <<01310>>03195000
         SETUPDIR := FALSE;                                    <<01310>>03200000
         CACHE := IF CACHE = 0        << DON'T READ IN >>      <<01310>>03205000
                     THEN CACHE'LIMIT << NEXT CACHE    >>      <<01310>>03210000
                     ELSE CACHE - 1;                           <<01310>>03215000
         RETURN;                                               <<01310>>03220000
      END;                                                     <<01310>>03225000
   END; << NOT INITIAL'SETUPDIR >>                             <<01310>>03230000
                                                               <<01310>>03235000
<< READ IN NEXT DIRECTORY CACHE.                           >>  <<01310>>03240000
   FOR INDEX := 0 UNTIL HMAXDIRSIZEM1 DO  DIR'( INDEX ) := 0;  <<01310>>03245000
   IF CACHE = 0 THEN                                           <<01310>>03250000
      LNUM := 0                                                <<01310>>03255000
   ELSE                                                        <<01310>>03260000
      LNUM := CACHE0LABELS + ( CACHE-1 ) * OTHERCACHELABELS;   <<01310>>03265000
   IF LNUM > TOTAL'LABELS THEN                                 <<01310>>03270000
   BEGIN                                                       <<01310>>03275000
      ERR( USERLABELERR, NOCARET );                            <<01310>>03280000
      EXAMINEERRFLAG;                                          <<06033>>03285000
   END;                                                        <<01310>>03290000
   FREADLABEL( CATFN, DIR', 128, LNUM );                       <<01310>>03295000
   IF <> THEN                                                  <<01310>>03300000
   BEGIN                                                       <<01310>>03305000
      ERR( USERLABELERR, NOCARET );                            <<01310>>03310000
      EXAMINEERRFLAG;                                          <<06033>>03315000
   END;                                                        <<01310>>03320000
                                                               <<01310>>03325000
<< IF THIS IS THE INTIAL EXECUTION OF THIS SUBROUTINE,     >>  <<01310>>03330000
<< DETERMINE THE TOTAL NUMBER OF CACHES IN THE DIRECTORY.  >>  <<01310>>03335000
   IF INITIAL'SETUPDIR THEN                                    <<01310>>03340000
   BEGIN                                                       <<01310>>03345000
      IF DIR' = 0 THEN                                         <<01310>>03350000
         BEGIN                                                 <<06033>>03355000
            ERR( NOHELPDIR, NOCARET );                         <<06033>>03360000
            EXAMINEERRFLAG;                                    <<06033>>03365000
         END                                                   <<06033>>03370000
      ELSE                                                     <<01310>>03375000
         WORDS'IN'DIRECTORY := DIR';                           <<01310>>03380000
      IF TOTAL'LABELS <= CACHE0LABELS  THEN                    <<01310>>03385000
         CACHE'LIMIT := 0                                      <<01310>>03390000
      ELSE                                                     <<01310>>03395000
         CACHE'LIMIT := 1 +                                    <<01310>>03400000
            (TOTAL'LABELS-CACHE0LABELS-1) / OTHERCACHELABELS;  <<01310>>03405000
      INITIAL'SETUPDIR := FALSE;                               <<01310>>03410000
   END;                                                        <<01310>>03415000
                                                               <<01310>>03420000
<< FINISH FILLING THIS CACHE.                              >>  <<01310>>03425000
   INDEX := 1;                                                          03430000
   CONTINUE := TRUE;                                           <<01310>>03435000
   WHILE CONTINUE DO                                           <<01310>>03440000
   BEGIN                                                                03445000
      FREADLABEL( CATFN, DIR'( INDEX*128 ), 128,               <<01310>>03450000
                  ( LNUM + INDEX )  );                         <<01310>>03455000
      IF > THEN CONTINUE := FALSE                              <<01310>>03460000
      ELSE IF < THEN                                           <<01310>>03465000
         BEGIN                                                 <<06033>>03470000
            ERR( USERLABELERR, NOCARET );                      <<06033>>03475000
             EXAMINEERRFLAG;                                   <<06033>>03480000
         END                                                   <<06033>>03485000
      ELSE                                                     <<01310>>03490000
      BEGIN                                                    <<01310>>03495000
         INDEX := INDEX + 1;                                   <<01310>>03500000
         IF INDEX >= LABELS'PER'CACHE                          <<01310>>03505000
            THEN CONTINUE := FALSE;                            <<01310>>03510000
      END;                                                     <<01310>>03515000
   END;                                                                 03520000
                                                               <<01310>>03525000
<< REPLACE WORD COUNT ENTRY WHERE APPROPRIATE.             >>  <<01310>>03530000
   IF CACHE = 0 THEN                                           <<01310>>03535000
   BEGIN                                                       <<01310>>03540000
      DIR      := 2;       <<  NULL   >>                       <<01310>>03545000
      DIR( 1 ) := 0;       <<  ENTRY  >>                       <<01310>>03550000
   END;                                                        <<01310>>03555000
                                                               <<01310>>03560000
   SETUPDIR := TRUE;                                           <<01310>>03565000
                                                               <<01310>>03570000
END; << SETUPDIR >>                                                     03575000
                                                               <<01310>>03580000
<<******************************************************>>     <<06033>>03585000
<<                                                      >>     <<06033>>03590000
<<  S U B R O U T I N E   H E L P S E A R C H           >>     <<06033>>03595000
<<                                                      >>     <<06033>>03600000
<<******************************************************>>     <<06033>>03605000
LOGICAL SUBROUTINE HELPSEARCH;                                 <<01310>>03610000
BEGIN                                                          <<01310>>03615000
                                                               <<01310>>03620000
<< SEARCH THE CURRENT DIRECTORY CACHE FOR THE PARAMETER.   >>  <<01310>>03625000
   FIRSTCACHE := CACHE;                                        <<01310>>03630000
                                                               <<01310>>03635000
   TRYSEARCH:                                                  <<01310>>03640000
                                                               <<01310>>03645000
   IF SEARCH( PARM1, PARM1LEN, DIR, DEFN ) > 0 THEN            <<01310>>03650000
   BEGIN                                                       <<01310>>03655000
      RECNO.(0:8) := DEFN;                                     <<01310>>03660000
      RECNO.(8:8) := DEFN(1);                                  <<01310>>03665000
      HELPSEARCH := TRUE;                                      <<01310>>03670000
      RETURN;                                                  <<01310>>03675000
   END                                                         <<01310>>03680000
                                                               <<01310>>03685000
<< PARAMETER NOT FOUND IN THE CACHE.  CHECK OTHER CACHES.  >>  <<01310>>03690000
   ELSE IF SETUPDIR THEN                                       <<01310>>03695000
           GO TRYSEARCH                                        <<01310>>03700000
        ELSE                                                   <<01310>>03705000
           HELPSEARCH := FALSE;                                <<01310>>03710000
                                                               <<01310>>03715000
END;  << HELPSEARCH >>                                         <<01310>>03720000
                                                                        03725000
SUBROUTINE SETMENU;                                                     03730000
BEGIN                                                                   03735000
   KEYREC := NEXTREC := RECNO := MENUREC;                               03740000
END; << SETMENU >>                                                      03745000
                                                                        03750000
<<******************************************************>>     <<06033>>03755000
<<                                                      >>     <<06033>>03760000
<<  S U B R O U T I N E   D I S P L A Y                 >>     <<06033>>03765000
<<                                                      >>     <<06033>>03770000
<<******************************************************>>     <<06033>>03775000
SUBROUTINE DISPLAY(STOPPER);                                            03780000
   VALUE STOPPER;INTEGER STOPPER;                                       03785000
BEGIN                                                                   03790000
                                                                        03795000
IF MORE AND CATEOF THEN                                                 03800000
BEGIN << AT END OF CATALOG & CR TYPED>>                                 03805000
   MORE := FALSE;                                                       03810000
   ERR(ENDOFCAT,NOCARET);                                               03815000
   EXAMINEERRFLAG;                                             <<06033>>03820000
                                                               <<06033>>03825000
END;                                                                    03830000
NEXTREC := RECNO := TRAVERSE(CATFN,DISP,RECNO,STOPPER,                  03835000
   ERRETN);                                                             03840000
IF NOT MORE THEN DISPLAYKEY(CATFN,DISP,KEYREC);                         03845000
MORE := FALSE;                                                          03850000
IF RECNO= 0 THEN                                                        03855000
BEGIN   << HIT END OF CATALOG, SET BACK TO ENTRY >>                     03860000
   NEXTREC := RECNO := KEYREC;                                          03865000
   CATEOF := TRUE;                                                      03870000
END                                                                     03875000
ELSE CATEOF := FALSE;                                                   03880000
                                                                        03885000
END; << DISPLAY >>                                                      03890000
                                                                        03895000
<< MAIN BODY >>                                                         03900000
                                                                        03905000
<<CHECK IF LIST DEVICE (IN :JOB) IS NON DUPLICATIVE>>          <<02343>>03910000
WHO(MODE);                                                     <<02343>>03915000
IF MODE.JOB'TYPE = JOB   AND   MODE.LIST'TYPE = NONDUP         <<02343>>03920000
  THEN NONDUPLIST:=TRUE    <<NEED TO ECHO INPUTS>>             <<02343>>03925000
ELSE NONDUPLIST:=FALSE;    <<NO NEED TO ECHO>>                 <<02343>>03930000
                                                               <<02343>>03935000
<< SETUP >>                                                             03940000
<< OPEN $STDIN >>                                                       03945000
INFN := FOPEN(,%44);                                                    03950000
IF <> THEN                                                     <<06033>>03955000
   BEGIN                                                       <<06033>>03960000
   ERR(OPENSTDINERR,NOCARET);                                  <<06033>>03965000
   EXAMINEGOTOFLAG;  << GET LABEL TO GO TO  >>                 <<06033>>03970000
   END;                                                        <<06033>>03975000
STOPPER := CR;                                                          03980000
NOTFIRST := MORE := ERRNO := 0;                                         03985000
@CARETBASE := @COMBASE;                                                 03990000
   << DEBLANK COMIMAGE >>                                               03995000
SCAN COMIMAGE WHILE %6440,1;                                            04000000
@COMPTR := TOS;                                                         04005000
DONE := IF COMPTR =CR THEN FALSE ELSE TRUE;                             04010000
                                                                        04015000
SETUPDICT;                                                              04020000
DUMMY := SETUPDIR;                                             <<01310>>04025000
EXAMINEGOTOFLAG;     << CHECK FOR ERRORS >>                    <<06033>>04030000
                                                               <<06033>>04035000
XCONTRAP(@CONTROLYTRAP,OLDPLABEL);                                      04040000
<< FETCH MENU RECORD. FIRST NODE >>                                     04045000
INDEX := DIR(2);                                                        04050000
MENUREC.(0:8) := DIR(INDEX);                                            04055000
MENUREC.(8:8) := DIR(INDEX+1);                                          04060000
SETMENU;                                                                04065000
                                                                        04070000
<< GRAND LOOP. FIND, DISPLAY & READ >>                                  04075000
                                                                        04080000
DO BEGIN                                                                04085000
   BUZZNO := SUBITEMX;                                                  04090000
   HELPARSE(COMPTR,PARM1,PARM1LEN,PARM2,PARM2LEN,PARM3);                04095000
   IF @PARM3 <> 0 THEN WARN(IGNORED,PARM3);                             04100000
   CASE SEARCH(PARM1,PARM1LEN,DICTP) OF                                 04105000
   BEGIN                                                                04110000
                                                                        04115000
   BEGIN << 0: UNKNOWN COMMAND >>                                       04120000
      IF PARM1LEN = 0 THEN IF NOTFIRST THEN                             04125000
         MORE := TRUE << CR >> ELSE                                     04130000
      ELSE                                                              04135000
      BEGIN                                                             04140000
         IF HELPSEARCH THEN                                             04145000
         BEGIN << FOUND ENTRY. CHECK FOR ITEM >>                        04150000
            KEYREC := RECNO;                                            04155000
            IF PARM2LEN <> 0 THEN                                       04160000
            IF PARM2LEN=3 AND PARM2="ALL" THEN BUZZNO:=ENTRYX           04165000
            ELSE                                                        04170000
            IF NOT FIND(RECNO,PARM2,PARM2LEN) THEN                      04175000
               BEGIN                                           <<06033>>04180000
               ERR(VENTRY'INVITEM,PARM2);                               04185000
               EXAMINEGOTOFLAG;  <<NEED TO GOTO END ??>>       <<06033>>04190000
               END                                             <<06033>>04195000
         END                                                            04200000
         ELSE                                                           04205000
         BEGIN << NOT ENTRY >>                                          04210000
            IF NOT FIND(KEYREC,PARM1,PARM1LEN) THEN                     04215000
            IF FIND(MENUREC,PARM1,PARM1LEN) THEN                        04220000
               KEYREC := MENUREC << MENU ITEM >>                        04225000
            ELSE                                               <<06033>>04230000
               BEGIN                                           <<06033>>04235000
                  ERR(NOINFO,PARM1);                           <<06033>>04240000
                  EXAMINEGOTOFLAG; <<NEED TO GOTO END ??>>     <<06033>>04245000
               END;                                            <<06033>>04250000
               << FOUND AS ITEM UNDER CURRENT ENTRY >>                  04255000
            IF PARM2LEN <> 0 THEN WARN(IGNORED,PARM2);                  04260000
         END;                                                           04265000
      END;                                                              04270000
      DISPLAY(BUZZNO);                                                  04275000
      EXAMINEGOTOFLAG;  << NEED TO GOTO END ??>>               <<06033>>04280000
                                                               <<06033>>04285000
   END;               << 0 : UNKNOWN COMMAND >>                <<06033>>04290000
                                                                        04295000
                                                                        04300000
   BEGIN     << 1  >>                                          <<06033>>04305000
      DISPLAY(ENTRYX);     << CASE 1 :    ALL  >>              <<06033>>04310000
      EXAMINEGOTOFLAG;  << NEED TO GOTO END ?? >>              <<06033>>04315000
   END;      << 1  >>                                          <<06033>>04320000
                                                                        04325000
   << CASE 2:         END       >>                             <<06033>>04330000
   IF HELPSUBSYS THEN  DONE:=TRUE                              <<02343>>04335000
    ELSE                                                       <<06033>>04340000
       BEGIN                                                   <<06033>>04345000
          ERR(NOINFO,PARM1);                                   <<06033>>04350000
          EXAMINEGOTOFLAG;  << NEED TO GOTO END ?? >>          <<06033>>04355000
       END;                                                    <<06033>>04360000
                                                               <<02343>>04365000
   << CASE 3:      EXIT    >>                                  <<06033>>04370000
   IF HELPSUBSYS THEN  DONE:=TRUE                              <<02343>>04375000
    ELSE                                                       <<06033>>04380000
       BEGIN                                                   <<06033>>04385000
          ERR(NOINFO,PARM1);                                   <<06033>>04390000
          EXAMINEGOTOFLAG;  << NEED TO GOTO END ?? >>          <<06033>>04395000
       END;                                                    <<06033>>04400000
                                                               <<06033>>04405000
<< ********** END CASE 3:  EXIT ****************>>             <<06033>>04410000
                                                               <<06033>>04415000
                                                               <<02343>>04420000
   << CASE 4:         E    >>                                  <<06033>>04425000
    IF HELPSUBSYS THEN  DONE:=TRUE                             <<02343>>04430000
     ELSE                                                      <<06033>>04435000
        BEGIN                                                  <<06033>>04440000
           ERR(NOINFO,PARM1);                                  <<06033>>04445000
           EXAMINEGOTOFLAG; << NEED TO GOTO END ?? >>          <<06033>>04450000
        END;                                                   <<06033>>04455000
<<********* END CASE 4:    E **************>>                  <<06033>>04460000
                                                               <<06033>>04465000
                                                                        04470000
   END; << CASE >>                                                      04475000
                                                                        04480000
OUTL:                                                                   04485000
                                                                        04490000
END UNTIL DONE OR READMORE;                                             04495000
                                                                        04500000
ABORTL:                                                                 04505000
XCONTRAP(OLDPLABEL,OLDPLABEL);                                          04510000
FCLOSE(INFN,0,0);  << CLOSE $STDINX >>                                  04515000
                                                                        04520000
END; << HELPROC >>                                                      04525000
$TITLE "PRINTCARET"                                                     04530000
PROCEDURE PRINTCARET(OFFSET);                                           04535000
   VALUE OFFSET;                                                        04540000
   INTEGER OFFSET;                                                      04545000
   OPTION INTERNAL;                                                     04550000
BEGIN                                                                   04555000
                                                                        04560000
ARRAY BUFF'(0:TERMSIZEWM1);                                             04565000
BYTE ARRAY BUFF(*) = BUFF';                                             04570000
                                                                        04575000
BUFF := " ";                                                            04580000
MOVE BUFF(1) := BUFF,(OFFSET);                                          04585000
BUFF(OFFSET +1) := "^";                                                 04590000
PRINT(BUFF',-OFFSET -2,0);                                              04595000
                                                                        04600000
END; << PROCEDURE PRINTCARET >>                                         04605000
$TITLE "READCAT'"                                                       04610000
PROCEDURE READCAT'(CATFN,BUFF',LEN,RECNO,ERRNO);                        04615000
   VALUE CATFN,RECNO;                                                   04620000
   INTEGER CATFN,LEN,RECNO,ERRNO;                                       04625000
   ARRAY BUFF';                                                         04630000
   OPTION INTERNAL;                                                     04635000
BEGIN                                                                   04640000
                                                                        04645000
BYTE ARRAY BUFF(*) = BUFF';                                             04650000
                                                                        04655000
LEN := 0; << IN CASE FREAD FAILS >>                                     04660000
FREADDIR(CATFN,BUFF',HBUFFSIZE,DOUBLE(RECNO));                          04665000
IF <> THEN ERRNO := CATERR                                              04670000
ELSE                                                                    04675000
BEGIN                                                                   04680000
   ERRNO := 0;                                                          04685000
                                                                        04690000
   LEN := DEBLANK(BUFF,HBUFFSIZEB);                                     04695000
END;                                                                    04700000
                                                                        04705000
END; << READCAT' >>                                                     04710000
$TITLE "TRAVERSE"                                                       04715000
INTEGER PROCEDURE TRAVERSE(CATFN,FN,RECNO,STOPPER,ERRNO);               04720000
   VALUE CATFN,FN,RECNO,STOPPER;                                        04725000
   INTEGER CATFN,FN,RECNO,STOPPER,ERRNO;                                04730000
   OPTION INTERNAL;                                                     04735000
COMMENT DISPLAYS HELP TREE. STARTS AT RECNO & CONTINUES UNTIL           04740000
A NODE >= STOPPER IS FOUND. THE RECORD NUMBER OF THE NODE IS            04745000
RETURNED, UNLESS THIS IS THE END OF THE TREE IN WHICH CASE A            04750000
ZERO IS RETURNED. AN I/O ERROR SETS ERRNO TO NON-ZERO.                  04755000
;                                                                       04760000
BEGIN                                                                   04765000
INTEGER                                                                 04770000
   BUZZNO,                                                              04775000
   DUMMY = BUZZNO;                                                      04780000
                                                                        04785000
ARRAY BUFF'(0:HBUFFSIZE);                                               04790000
                                                                        04795000
DO BEGIN                                                                04800000
   RECNO := DISPLAYBLOCK(CATFN,FN,RECNO+1,BUFF',BUZZNO,                 04805000
      ERRNO);                                                           04810000
END UNTIL ERRNO <> 0 OR STOPPER >= BUZZNO;                              04815000
TRAVERSE := IF BUZZNO = ALLX THEN 0 ELSE RECNO;                         04820000
IF ERRNO = CTLY THEN PRINT(DUMMY,0,0);                                  04825000
                                                                        04830000
END; << TRAVERSE >>                                                     04835000
$CONTROL SEGMENT=MAIN                                                   04840000
END. << HELPUSER >>                                                     04845000
