$DEBUG PAGELENGTH(50) /*********************/ /* */ /* G E T $ M E N U */ /* */ /*********************/ M$GET$MENU: DO; $NOLIST $INCLUDE(COMMON.DCL) $INCLUDE(ISIS.DCL) $INCLUDE(:F1:ISISIO.DCL) $LIST /****************************************************/ /* */ /* PROCEDURE NAME - GET$MENU */ /* */ /* FUNCTION - DISPLAY MENU CHOICES, GET RESPONSE */ /* FROM KEYBOARD, DISPLAY NEXT MENU, */ /* ETC... TILL NEXT CHOISE IS AN */ /* EXECUTION PROCEDURE. */ /* */ /* INPUT - MENU$TREE$P : POINTER TO FIRST MENU */ /* TREE TO BE DISPLAYED */ /* */ /* OUTPUT - POINTER TO AN EXECUTION ROUTINE, */ /* TO WHICH CONTROL WILL BE */ /* TRANSFERRED. NULL POINTER ( = 0 ) */ /* DENOTES THAT A RETURN TO START OF */ /* MENU PROGRAM HAS BEEN REQUESTED. */ /* */ /* LAST UPDATED - 26.5.82 DROR */ /* */ /****************************************************/ GET$MENU: PROCEDURE(MENU$TREE$P) ADDRESS PUBLIC; DECLARE MENU$TREE$P ADDRESS; DECLARE (MENU$TREE BASED MENU$TREE$P) STRUCTURE( MSG$P ADDRESS, PARENT$P ADDRESS, N$SONS BYTE, SONS$TYPE(8) BYTE, SONS$P(8) ADDRESS ); DECLARE TYPE BYTE; /*VERTEX(0) OR EXEC(1) */ DECLARE CHAR BYTE; /*CHARACTER FROM KEYBOARD*/ DECLARE MSG1(*) BYTE DATA(CLR$EOS, 'DIRECTINS: 1. Read the menu choices listed below.',CR,LF, ' 2. Type the number of section you want.',CR,LF, ' Type ''P'' to get the previous menu,',CR,LF, ' Type ''B'' to get the main menu.',CR,LF, '----------------------------------------', '----------------------------------------', LF, LF, LF, LF, LF, LF, LF, '----------------------------------------', '----------------------------------------', C$UP,C$UP,C$UP,C$UP,C$UP,C$UP,C$UP,C$UP, 0); DECLARE MSG2(*) BYTE DATA( LF, LF, CLR$LIN,'Please type here : ', 0); DECLARE MSG3(*) BYTE DATA( CR, C$UP, C$UP, C$UP, CLR$LIN,C$UP, CLR$LIN,C$UP, CLR$LIN,C$UP, CLR$LIN,C$UP, CLR$LIN,C$UP, CLR$LIN,C$UP, CLR$LIN, 0); DECLARE MSG4(*) BYTE DATA( C$UP,C$UP,C$UP,C$UP,C$UP, CLR$EOS, 0); CALL MSG$OUT(.MSG1); TYPE=0; /* VERTEX */ DO WHILE ((TYPE=0) AND (MENU$TREE$P<>0)); CALL MSG$OUT(MENU$TREE.MSG$P); CALL MSG$OUT(.MSG2); CHAR=CI; /* READ FROM KEYBOARD */ DO WHILE NOT((UPPER(CHAR)='B') OR (UPPER(CHAR)='P') OR ((CHAR>='1') AND (CHAR<='0'+MENU$TREE.N$SONS))); CALL CO(BELL); /* BEEP */ CHAR=CI; /* READ AGAIN */ END; CALL CO(CHAR); /* ECHO ON SCREEN */ IF (UPPER(CHAR)='B') THEN DO; TYPE=1; MENU$TREE$P=0; END; ELSE IF (UPPER(CHAR)='P') THEN DO; TYPE=0; MENU$TREE$P=MENU$TREE.PARENT$P; END; ELSE DO; /* '1'<= CHAR <= N$SONS */ TYPE=MENU$TREE.SONS$TYPE(CHAR-'0'-1); MENU$TREE$P=MENU$TREE.SONS$P(CHAR-'0'-1); END; CALL MSG$OUT(.MSG3); END; CALL MSG$OUT(.MSG4); RETURN(MENU$TREE$P); END GET$MENU; END M$GET$MENU;