|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7680 (0x1e00) Types: TextFile Names: »filtertx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »filtertx «
; dh 87.05.06 filter algorithm for search page ...00... b. a11, b3, c1, d5 w. ;This algorithm enables search to filter the output of catalog entries ;found according to a given scope specification. The filter works on ;the entry name and the document name of an entry. ; ;Syntax (augments): ;------------------ ;( )1 ( )* ;(<out file> = ) search <scope spec> (<filter>) ;( )0 ( )0 ; ; ( )* ;<filter> ::= <substring>(.<substring>) ; ( )0 ; ; ( <generalized name> ) ;<substring> ::= ( <name> ) ; (<apostrophized name>) ; ;Function: ;--------- ; The main catalog is scanned, and a subset of it is listed with an ;output format as for lookup. If an outfile is specified, the list of ;catalog entries is printed on that file, otherwise current output is ;used. Messages from search are always printed on current output. ; If no filters are given, all entries from the main catalog accor- ;ding to the scope spec (see Scope specification) are listed, other- ;wise, the set of catalog entries is further delimited by means of ;filters (see Filter specification below). ; ;Filter specification: ;--------------------- ; A filter consists of one or more substrings concatenated by period. ;If a list of filters exists, an entry selected for listing will only ;be listed if either its name or its document name contain all the sub- ;strings of at least one of the filters. The order of the substrings ;in a filter is irrellevant. ; Thus, in a possible list of filters, you may consider space as "or" ;and period as "and", where the precedence of "and" and "or" is as in ;Algol. \f ; dh 87.05.07 filter algorithm for search page ...01... ;requirements: ; w0 w1 w2 w3 r0 r1 ; ;entry: irr. irr. irr. return item after catalog ; scope spec entry ; ;exit: all registers and variables unchanged. ; ; the procedure returns to return+0 in case of failure ; and to return+2 in case of success. ; ds. w3 b3. ; save registers rl. w3 r0. ; el w2 x3 ; if item after scope spec = end command sh w2 2 ; then goto letitpass1; jl. a11. ; ds. w1 b2. ; rl. w2 r1. ; name in entry := entry name; al w2 x2+6 ; c1: al w3 x3+2 ; repeat <* entry- and document-name *> ds. w3 d1. ; text part(item) := first item addr + 2; al w3 10 ; x := 10; ; string := name in entry; a0: rs. w3 d2. ; al w1 x3 ; repeat jl. w3 c0. ; namelength := x; rl. w3 d2. ; l := takechar(x, string); al w3 x3-1 ; x := namelength - 1; sn w1 0 ; until l <> 0; jl. a0. ; a1: ; repeat <* all possibillities of filter *> \f ; dh 87.05.05 filter algorithm for search page ...02... ;a1: ; repeat <* items in a filter *> rl. w0 d2. ; j := namelength; <* charcount in an entry *> a2: rs. w0 d3. ; repeat <* stepping backward through the ; name in the entry *> al w3 0 ; jl. a4. ; for i := 0, a3: rl. w3 d4. ; <*i controls pos in an item *> al w3 x3+1 ; i+1 while l = k do se. w1 (d5.) ; begin jl. a5. ; a4: rs. w3 d4. ; am. (d3.) ; k := takechar al w1 x3 ; (j+i, name in entry); rl. w2 d0. ; jl. w3 c0. ; rs. w1 d5. ; rl. w1 d4. ; l := takechar rl. w2 d1. ; (i, item); jl. w3 c0. ; sn w1 0 ; if l = 0 jl. a6. ; then goto found; jl. a3. ; end while loop; a5: rl. w0 d3. ; es. w0 1 ; j := j - 1; sl w0 0 ; until j < 0 <* end backward stepping *>; jl. a2. ; comment when the loop is exhausted, l<>0; a6: ;found: al w2 x2+10 ; nopass := l <> 0; <* variable kept in w1 *> rs. w2 d1. ; item := next item; el w0 x2-2 ; sep := item separator; se w0 8 ; until sep <> '.' jl. a7. ; or nopass <* end items in a filter *>; sn w1 0 ; comment hereafter either all substrings in a jl. a1. ; filter have suceeded, or a filter failed; \f ; dh 87.05.07 filter algorithm for search page ...03... a7: sn w1 0 ; if -,nopass <* i.e. a filter suceeded *> jl. a10. ; then goto letitpass; a8: se w0 8 ; comment a filter failed, therfore: ; jl. a9. ; while sep = '.' do al w2 x2+10 ; begin el w0 x2-2 ; item := next item; sep := item separator; jl. a8. ; end; a9: rs. w2 d1. ; comment we may now examine the next filter; sl w0 4 ; until sep = end command; jl. a1. ; comment all filters have failed on this name; rl. w2 r1. ; name in entry := document name; al w2 x2+16 ; item := item after scope spec; rl. w3 r0. ; se. w2 (d0.) ; until document name tested once before; jl. c1. ; comment the names have been tested with all filters; dl. w1 b2. ;failure: dl. w3 b3. ; restore registers; jl x3 ; return failure; a10: dl. w1 b2. ;letitpass: a11: dl. w3 b3. ;letitpass1: restore registers; jl x3+2 ; return success; \f ; dh 87.05.05 filter algorithm for search page ...04... c0: ;subprocedure takechar(pos, string); ; call: w0: -; w1: pos; w2: string; w3: return al w0 0 ; exit: w0: -; w1: char; w2: unch; w3: unch wd. w1 b0. ; addr := pos // 3; am x1 ; subpos := pos mod 3; am x1 ; rl w1 x2 ; substring := word(2*addr + string); ls w0 3 ; am (0) ; char := substring shift(subpos*8 -16) ls w1 -16 ; extract 7; la. w1 b1. ; jl x3 ; return; b0: 3 ; constant 3 <* chars per word *> b1: 8.177 ; constant: last 7 bits; 0, b2: 0, 0, b3: 0 ; room for registers; d0: 0 ; addr of name in an entry; d1: 0 ; addr of text part of an item; d2: 0 ; namelength, i.e. length of name part in an entry d3: 0 ; var: j <* stepping through name in an entry *> d4: 0 ; var: i <* stepping through an item *> d5: 0 ; var: k <* char from an entry *> e. ; end block ▶EOF◀