DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 1 DSK:SSCAN.SIM 16-JAN-1979 13:23 1 OPTIONS(/E/C); 2 ! 3 Integer procedure SSCAN will identify specified KEYs in a COMMAND text 4 string. SCAN performs - in order - 5 1. Does COMPRESS and storbokstav on the COMMAND string 6 2. If the parm. DEFAULTKEY belongs to [1:N] and COMMAND string does 7 not start with the text KEY[DEFAULTKEY] then that key will 8 be assumed present in front of COMMAND. 9 3. Locates (in order 1 to N) possible occurrences of the texts 10 defined in text array KEY[1:N]. 11 4. Makes ARG[x] :- whatever follows KEY[x] up to next KEY. 12 If the KEY is just present, but with no text following 13 then Blanks(1) is returned. Nonpresent KEY is indicated 14 with ARG[x] == NOTEXT. 15 5. SCAN returns index for multiple used key in command string. 16 Thus, normally SCAN should return zero, indicating no 17 multiple used key. 18 19 Differences between SCAN and SSCAN: 20 21 a. SCAN makes fields not given to NOTEXT, SSCAN leaves them 22 untouched. 23 b. SSCAN uses "storbokstav" instead of "upcase". This does not 24 matter usually for english commands, but is better for 25 swedish commands. 26 27 Note that the contents of KEY must have Upper case letters only. 28 An example: 29 ! BEGIN 30 ! EXTERNAL TEXT PROCEDURE conc,storbokstav,compress, 31 ! rest,inline,checkextension; 32 ! EXTERNAL CHARACTER PROCEDURE findtrigger; 33 ! EXTERNAL INTEGER PROCEDURE search,scanint,scan; 34 ! EXTERNAL REF (Infile) PROCEDURE findinfile; 35 ! EXTERNAL REF (Outfile) PROCEDURE findoutfile; 36 ! 37 ! TEXT ARRAY key,arg,default[1:6]; 38 ! TEXT command,infilename,outfilename; 39 ! INTEGER avalue,index; 40 ! BOOLEAN na,nb; 41 ! REF (Infile) inf; 42 ! REF (Outfile) outf; 43 ! 44 ! key[1]:- Copy("/DEFAULT:/A:/NA/NB/N="); 45 ! ! Save some space with this trick!; 46 ! key[2]:- key[1].Sub(10,3); !/A: ; 47 ! key[3]:- key[1].Sub(13,3); !/NA ; 48 ! key[4]:- key[1].Sub(16,3); !/NB ; 49 ! ! This keyword (5) must come after /NA and /NB 50 ! ! else it will swamp those keys (if present); 51 ! key[5]:- key[1].Sub(19,2); !/N ; 52 ! key[6]:- key[1].Sub(21,1); != ; DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 1-1 DSK:SSCAN.SIM 16-JAN-1979 13:23 53 ! key[1]:- key[1].Sub(1,9); !/DEFAULT: ; 54 ! 55 ! start: 56 ! FOR index:= sscan(inline("*",Sysin),6,arg,key,1) 57 ! WHILE index NE 0 DO 58 ! BEGIN Outtext("? Keyword:"); 59 ! Outtext(key[index]); 60 ! Outtext(" used more than once. Please try again."); 61 ! Outimage; 62 ! END loop; 63 ! 64 ! ! Analyze result:; 65 ! ! Assume the user entered: abc=def/A:12/N ; 66 ! ! The result will then be: 67 ! ! arg[1] = "ABC" 68 ! ! arg[2] = "12" 69 ! ! arg[3] == NOTEXT 70 ! ! arg[4] == NOTEXT 71 ! ! arg[5] = " " 72 ! ! arg[6] = "DEF" 73 ! ; 74 ! 75 ! ! Test file information; 76 ! ! Default inputname is outputname; 77 ! IF arg[6] == NOTEXT THEN arg[6]:- arg[1]; 78 ! infilename:- arg[6]; 79 ! 80 ! ! We also demonstrate a way of checking 81 ! ! entered file specifications; 82 ! IF infilename NE "TTY:" THEN 83 ! BEGIN 84 ! infilename:- 85 ! checkextension(infilename,".EXT"); 86 ! FOR inf:- findinfile(infilename) WHILE 87 ! inf == NONE DO 88 ! BEGIN Outtext("? Cannot find Infile:"); 89 ! Outtext(infilename); 90 ! Outimage; 91 ! infilename:- 92 ! inline("Enter name of infile:",Sysin); 93 ! infilename:- 94 ! checkextension(infilename,".EXT"); 95 ! END loop; 96 ! END not TTY ELSE 97 ! inf:- Sysin; 98 ! 99 ! outfilename:- arg[1]; 100 ! IF outfilename NE "TTY:" THEN 101 ! BEGIN 102 ! outfilename:- 103 ! checkextension(outfilename,".EXT"); 104 ! FOR outf:- DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 1-2 DSK:SSCAN.SIM 16-JAN-1979 13:23 105 ! findoutfile(outfilename) WHILE outf == 106 ! NONE DO 107 ! BEGIN 108 ! Outtext("? Cannot create Outfile:"); 109 ! Outtext(outfilename); 110 ! Outimage; 111 ! outfilename:- 112 ! inline("Enter name of outfile:",Sysin); 113 ! outfilename:- checkextension(outfilename,".EXT"); 114 ! END loop 115 ! END ELSE outf:- Sysout; 116 ! 117 ! ! Check value switch /A: ; 118 ! IF arg[2] == NOTEXT THEN 119 ! BEGIN !.... Set default value arg[2]:- Copy("..."); 120 ! END; 121 ! avalue:= scanint(arg[2]); 122 ! ! Assume range [1,99]; 123 ! ! Check result, Pos = 1 is unsuccesfull 124 ! deediting, More indicates 125 ! ! superfluous information in value; 126 ! IF avalue < 0 OR avalue > 99 OR arg[2].Pos = 1 127 ! OR arg[2].More THEN 128 ! BEGIN Outtext("? Illegal /A: value:"); 129 ! Outtext(arg[2]); 130 ! Outimage; 131 ! GO TO start; 132 ! END; 133 ! 134 ! ! Assume /N short for /NA ; 135 ! IF arg[3] == NOTEXT THEN arg[3]:- arg[5]; 136 ! na:= arg[3] =/= NOTEXT; 137 ! ! More strict: IF arg[3] = " " THEN na:= TRUE 138 ! ELSE Error; 139 ! ! Error would indicate the string 140 ! "/NAxxx/...."; 141 ! 142 ! nb:= arg[4] =/= NOTEXT; 143 ! 144 ! !....; 145 ! 146 ! END of program 147 ; 148 EXTERNAL TEXT PROCEDURE conc,storbokstav,compress; 149 EXTERNAL INTEGER PROCEDURE search; 150 151 INTEGER PROCEDURE sscan(command,n,arg,key,defaultkey); TEXT command; 152 INTEGER n; TEXT ARRAY arg,key; INTEGER defaultkey; B1 153 BEGIN 154 INTEGER ARRAY keypos[1:n]; INTEGER i,j,posmin,keyposi; 155 156 command:- compress(command,' '); DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 1-3 DSK:SSCAN.SIM 16-JAN-1979 13:23 157 storbokstav(command); 158 IF defaultkey > 0 AND defaultkey <= n THEN B2 159 BEGIN 160 IF (IF command.Length < key[defaultkey].Length THEN TRUE 161 ELSE command.Sub(1,key[defaultkey].Length) NE key[defaultkey]) THEN 162 command:- conc(key[defaultkey],command); E2 163 END default key ELSE command:- Copy(command); 164 165 FOR i:= 1 STEP 1 UNTIL n DO B3 166 BEGIN 167 command.Setpos(1); 168 j:= search(command,key[i]); 169 IF j <= command.Length THEN B4 170 BEGIN 171 command.Sub(j,key[i].Length):= NOTEXT; 172 keypos[i]:= j; 173 command.Setpos(j+key[i].Length); 174 IF search(command,key[i]) <= command.Length THEN B5 E5 175 BEGIN sscan:= i; GO TO exit; END mult key; E4 176 END key found; E3 177 END i loop; 178 179 FOR i:= 1 STEP 1 UNTIL n DO 180 IF keypos[i] > 0 THEN B6 181 BEGIN 182 keyposi:= keypos[i]; 183 ! Search smallest keypos[j] > keypos[i]; 184 posmin:= command.Length + 1; 185 FOR j:= 1 STEP 1 UNTIL n DO 186 IF keypos[j] > keyposi THEN B7 187 BEGIN 188 IF keypos[j] < posmin THEN posmin:= keypos[j]; E7 189 END j loop; 190 191 j:= keyposi + key[i].Length; 192 arg[i]:- IF posmin = j THEN Blanks(1) ELSE 193 command.Sub(j,posmin-j); E6 194 END keypos[i] > 0; 195 196 exit: E1 197 END of scan; SWITCHES CHANGED FROM DEFAULT: -A NO CHECK OF ARRAY INDEX -D NO SYMBOL TABLE GENERATED FOR DEBUG E EXTERNAL CLASS/PROCEDURE -I NO LINENUMBER TABLE GENERATED -Q NO CHECK OF QUALIFICATION NO ERRORS DETECTED DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 2 DSK:SSCAN.SIM 16-JAN-1979 13:23 LINE NUMBER TABLE 0 000007 0 000362 DECsystem-20 SIMULA %4A(310) 25-JAN-1981 18:36 PAGE 3 DSK:SSCAN.SIM 16-JAN-1979 13:23 CROSS REFERENCE TABLE ARG 151D 192 BLANKS 192 COMMAND 151D 156M 157 160 161 162M 163M 167 168 169 171 173 174M 184 193 COMPRESS 148DE 156 CONC 148DE 162 COPY 163 DEFAULTKEY 151D 158M 160 161M 162 EXIT 175 196D I 154D 165 168 171 172 173 174 175 179 180 182 191 192 J 154D 168 169 171 172 173 185 186 188M 191 192 193M KEY 151D 160 161M 162 168 171 173 174 191 KEYPOSI 154D 182 186 191 KEYPOS 154D 172 180 182 186 188M LENGTH 160M 161 169 171 173 174 184 191 N 151D 154 158 165 179 185 POSMIN 154D 184 188M 192 193 SEARCH 149DE 168 174 SETPOS 167 173 SSCAN 151D 175 STORBOKSTAV 148DE 157 SUB 161 171 193