Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/libsim/menu.sim
There is 1 other file named menu.sim in the archive. Click here to see a list.
OPTIONS(/E/C/-A/-Q/-I/-D);
! The MENU procedure is designed to be used in validity checks
! at MENU-like command requests.
!
! The MENU procedure will check for nonambiguous
! correspondance between T and the text array TABLE elements.
! (Note that an exact match will allways be accepted, even if it is a
! substring of another table element.) The table must contain
! upper case letters only with no trailing blanks. The input
! may have lower case letters.
! If no match is found, I will return 0.
! If T is ambiguous, I returns -1 else
! the table matching index will be returned.
! An example:
!
! BEGIN TEXT ARRAY menu[1:5];
! INTEGER index;
! BOOLEAN ok;
! TEXT t;
!
! menu[1]:- Copy("STOP");
! menu[2]:- Copy("START");
! menu[3]:- Copy("END");
! menu[4]:- Copy("ENDURE");
! menu[5]:- Copy("EXIT");
!
! t:- <... input ...>;
! ok:= menu(t,index,menu,5);
!
! OK will become TRUE if T is equal to
!
! START (INDEX = 2)
! start (INDEX = 2)
! Sta (INDEX = 2)
! sto (INDEX = 1)
! enD (INDEX = 3)
! endure (INDEX = 4)
! endu (INDEX = 4)
!
! and FALSE for
!
! S (INDEX = -1)
! ST (INDEX = -1)
! x (INDEX = 0)
! e (INDEX = -1)
! en (INDEX = -1)
;
EXTERNAL TEXT PROCEDURE upcase;
BOOLEAN PROCEDURE menu(t,i,table,n);
NAME i; TEXT t; TEXT ARRAY table; INTEGER i,n;
BEGIN TEXT u; INTEGER j,k,hit;
! Checking the array index bounds: ;
OPTIONS(/A); u:- table[1]; u:- table[n];; OPTIONS(/-A);
u:- upcase(t.Strip);
FOR j:= 1 STEP 1 UNTIL n DO
IF u = table[j] THEN
BEGIN hit:= 1; k:= j; GO TO ready END ELSE
IF u.Length < table[j].Length THEN
BEGIN
IF u = table[j].Sub(1,u.Length) THEN
BEGIN k:= j; hit:= hit + 1 END
END;
ready:
menu:= hit = 1;
i:= IF hit = 1 THEN k ELSE Sign(-hit)
END of menu;