Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/meny.sim
There is 1 other file named meny.sim in the archive. Click here to see a list.
OPTIONS(/E/C/-A/-Q/-I/-D);
    ! Proceduren MENY {r konstruerad f`r att anv{ndas i validitets-
    ! kontroller vid meny-dialog-inmatning.
    !
    ! Proceduren testar om inmatningen T {r en otvetydig
    ! f`rkortning av n}got element i tabellen TABELL.
    ! (Obs! Exakt match accepteras alltid, {ven om den skulle vara
    ! en delstr{ng av ett annat element.) Tabellen m}ste
    ! inneh}lle endast STORA bokst{ver utan avslutande blanka.
    ! Inmatningen f}r inneh}lla sm} bokst{ver.
    ! Om ingen tr{ff s} returnernar I v{rdet 0.
    ! Om T {r tvetydigt returnerar I v{rdet -1 annars
    ! returneras matchande tabellindex.
    ! Ett exempel:
    !
    ! BEGIN   TEXT ARRAY tabell[1:6];
    !     INTEGER index;
    !     BOOLEAN ok;
    !     TEXT t;
    !
    !     tabell[1]:- Copy("STOP");
    !     tabell[2]:- Copy("START");
    !     tabell[3]:- Copy("END");
    !     tabell[4]:- Copy("ENDURE");
    !     tabell[5]:- Copy("EXIT");
    !     tabell[6]:- Copy("G$");
    !
    !     t:- <... input ...>;
    !     ok:= meny(t,index,tabell,5);
    !
    ! OK blir TRUE om T {r
    !
    ! START	(INDEX =  2)
    ! start	(INDEX =  2)
    ! Sta	(INDEX =  2)
    ! sto	(INDEX =  1)
    ! enD	(INDEX =  3)
    ! endure	(INDEX =  4)
    ! endu	(INDEX =  4)
    ! g}	       (INDEX =  6)
    ! g		(INDEX =  6)
    !
    ! och FALSE om
    !
    ! S		(INDEX = -1)
    ! ST	(INDEX = -1)
    ! x		(INDEX =  0)
    ! e		(INDEX = -1)
    ! en	(INDEX = -1)
    ;
    EXTERNAL TEXT PROCEDURE storbokstav;
    BOOLEAN PROCEDURE meny(t,i,tabell,n);
    NAME i;   TEXT t;   TEXT ARRAY tabell;   INTEGER i,n;
    BEGIN   TEXT u;   INTEGER j,k,hit;   CHARACTER c;

	! Checking the array index bounds: ;
	OPTIONS(/A);   u:- tabell[1];   u:- tabell[n];;   OPTIONS(/-A);
	u:- storbokstav(t.Strip);

	FOR j:= 1 STEP 1 UNTIL n DO
	IF u = tabell[j] THEN
	BEGIN   hit:= 1;   k:= j;   GO TO ready  END ELSE
	IF u.Length < tabell[j].Length THEN
	BEGIN
		IF u = tabell[j].Sub(1,u.Length) THEN
		BEGIN   k:= j;   hit:= hit + 1   END
	END;

	ready:
	meny:= hit = 1;
	i:= IF hit = 1 THEN k ELSE Sign(-hit)

    END of meny;