Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0135/05/sscan.sim
There are 7 other files named sscan.sim in the archive. Click here to see a list.
OPTIONS(/E/C);
!
Integer procedure SSCAN will identify specified KEYs in a COMMAND text
string. SCAN performs - in order -
1. Does COMPRESS and storbokstav on the COMMAND string
2. If the parm. DEFAULTKEY belongs to [1:N] and COMMAND string does
not start with the text KEY[DEFAULTKEY] then that key will
be assumed present in front of COMMAND.
3. Locates (in order 1 to N) possible occurrences of the texts
defined in text array KEY[1:N].
4. Makes ARG[x] :- whatever follows KEY[x] up to next KEY.
If the KEY is just present, but with no text following
then Blanks(1) is returned. Nonpresent KEY is indicated
with ARG[x] == NOTEXT.
5. SCAN returns index for multiple used key in command string.
Thus, normally SCAN should return zero, indicating no
multiple used key.
Differences between SCAN and SSCAN:
a. SCAN makes fields not given to NOTEXT, SSCAN leaves them
untouched.
b. SSCAN uses "storbokstav" instead of "upcase". This does not
matter usually for english commands, but is better for
swedish commands.
Note that the contents of KEY must have Upper case letters only.
An example:
! BEGIN
! EXTERNAL TEXT PROCEDURE conc,storbokstav,compress,
! rest,inline,checkextension;
! EXTERNAL CHARACTER PROCEDURE findtrigger;
! EXTERNAL INTEGER PROCEDURE search,scanint,scan;
! EXTERNAL REF (Infile) PROCEDURE findinfile;
! EXTERNAL REF (Outfile) PROCEDURE findoutfile;
!
! TEXT ARRAY key,arg,default[1:6];
! TEXT command,infilename,outfilename;
! INTEGER avalue,index;
! BOOLEAN na,nb;
! REF (Infile) inf;
! REF (Outfile) outf;
!
! key[1]:- Copy("/DEFAULT:/A:/NA/NB/N=");
! ! Save some space with this trick!;
! key[2]:- key[1].Sub(10,3); !/A: ;
! key[3]:- key[1].Sub(13,3); !/NA ;
! key[4]:- key[1].Sub(16,3); !/NB ;
! ! This keyword (5) must come after /NA and /NB
! ! else it will swamp those keys (if present);
! key[5]:- key[1].Sub(19,2); !/N ;
! key[6]:- key[1].Sub(21,1); != ;
! key[1]:- key[1].Sub(1,9); !/DEFAULT: ;
!
! start:
! FOR index:= sscan(inline("*",Sysin),6,arg,key,1)
! WHILE index NE 0 DO
! BEGIN Outtext("? Keyword:");
! Outtext(key[index]);
! Outtext(" used more than once. Please try again.");
! Outimage;
! END loop;
!
! ! Analyze result:;
! ! Assume the user entered: abc=def/A:12/N ;
! ! The result will then be:
! ! arg[1] = "ABC"
! ! arg[2] = "12"
! ! arg[3] == NOTEXT
! ! arg[4] == NOTEXT
! ! arg[5] = " "
! ! arg[6] = "DEF"
! ;
!
! ! Test file information;
! ! Default inputname is outputname;
! IF arg[6] == NOTEXT THEN arg[6]:- arg[1];
! infilename:- arg[6];
!
! ! We also demonstrate a way of checking
! ! entered file specifications;
! IF infilename NE "TTY:" THEN
! BEGIN
! infilename:-
! checkextension(infilename,".EXT");
! FOR inf:- findinfile(infilename) WHILE
! inf == NONE DO
! BEGIN Outtext("? Cannot find Infile:");
! Outtext(infilename);
! Outimage;
! infilename:-
! inline("Enter name of infile:",Sysin);
! infilename:-
! checkextension(infilename,".EXT");
! END loop;
! END not TTY ELSE
! inf:- Sysin;
!
! outfilename:- arg[1];
! IF outfilename NE "TTY:" THEN
! BEGIN
! outfilename:-
! checkextension(outfilename,".EXT");
! FOR outf:-
! findoutfile(outfilename) WHILE outf ==
! NONE DO
! BEGIN
! Outtext("? Cannot create Outfile:");
! Outtext(outfilename);
! Outimage;
! outfilename:-
! inline("Enter name of outfile:",Sysin);
! outfilename:- checkextension(outfilename,".EXT");
! END loop
! END ELSE outf:- Sysout;
!
! ! Check value switch /A: ;
! IF arg[2] == NOTEXT THEN
! BEGIN !.... Set default value arg[2]:- Copy("...");
! END;
! avalue:= scanint(arg[2]);
! ! Assume range [1,99];
! ! Check result, Pos = 1 is unsuccesfull
! deediting, More indicates
! ! superfluous information in value;
! IF avalue < 0 OR avalue > 99 OR arg[2].Pos = 1
! OR arg[2].More THEN
! BEGIN Outtext("? Illegal /A: value:");
! Outtext(arg[2]);
! Outimage;
! GO TO start;
! END;
!
! ! Assume /N short for /NA ;
! IF arg[3] == NOTEXT THEN arg[3]:- arg[5];
! na:= arg[3] =/= NOTEXT;
! ! More strict: IF arg[3] = " " THEN na:= TRUE
! ELSE Error;
! ! Error would indicate the string
! "/NAxxx/....";
!
! nb:= arg[4] =/= NOTEXT;
!
! !....;
!
! END of program
;
EXTERNAL TEXT PROCEDURE conc,storbokstav,compress;
EXTERNAL INTEGER PROCEDURE search;
INTEGER PROCEDURE sscan(command,n,arg,key,defaultkey); TEXT command;
INTEGER n; TEXT ARRAY arg,key; INTEGER defaultkey;
BEGIN
INTEGER ARRAY keypos[1:n]; INTEGER i,j,posmin,keyposi;
command:- compress(command,' ');
storbokstav(command);
IF defaultkey > 0 AND defaultkey <= n THEN
BEGIN
IF (IF command.Length < key[defaultkey].Length THEN TRUE
ELSE command.Sub(1,key[defaultkey].Length) NE key[defaultkey]) THEN
command:- conc(key[defaultkey],command);
END default key ELSE command:- Copy(command);
FOR i:= 1 STEP 1 UNTIL n DO
BEGIN
command.Setpos(1);
j:= search(command,key[i]);
IF j <= command.Length THEN
BEGIN
command.Sub(j,key[i].Length):= NOTEXT;
keypos[i]:= j;
command.Setpos(j+key[i].Length);
IF search(command,key[i]) <= command.Length THEN
BEGIN sscan:= i; GO TO exit; END mult key;
END key found;
END i loop;
FOR i:= 1 STEP 1 UNTIL n DO
IF keypos[i] > 0 THEN
BEGIN
keyposi:= keypos[i];
! Search smallest keypos[j] > keypos[i];
posmin:= command.Length + 1;
FOR j:= 1 STEP 1 UNTIL n DO
IF keypos[j] > keyposi THEN
BEGIN
IF keypos[j] < posmin THEN posmin:= keypos[j];
END j loop;
j:= keyposi + key[i].Length;
arg[i]:- IF posmin = j THEN Blanks(1) ELSE
command.Sub(j,posmin-j);
END keypos[i] > 0;
exit:
END of scan;