Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/libsim/search.mac
There are 3 other files named search.mac in the archive. Click here to see a list.
COMMENT * SIMULA specification;
OPTIONS(/E:QUICK,search);
INTEGER PROCEDURE search(master,config);
TEXT master,config;
COMMENT Starting at master.Pos, search looks for a subtext of master = config.
If such a subtext is found, SEARCH gives Pos of the first character, i e
master.Sub(search(master,config)-1,config.Length) is the subtext sought,
otherwise SEARCH returns master.Length+1.
;
!*;! MACRO-10 code !*;!
TITLE search
ENTRY search
SUBTTL SIMULA utility, Lars Enderin Nov 1975
;!*** Copyright 1975 by the Swedish Defence Research Institute. ***
;!*** Copying is allowed. ***
;! Last Edit: [125], 1976-06-21/LE
sall
search simmac,simmcr,simrpa
macinit
;! Local definitions ;!
master==XWAC1
s==master ;! Local copy
config==XWAC3
cfp==config
c1==cfp+1 ;! To hold first character of config
ls==s+1 ;! (Remaining) length of master
lc==XIAC ;! Length of config
xa==XWAC6 ;! Work ac, usually word address in master
sp==xa
xb==XWAC7 ;! Work ac
sp1==xb
ls1==XWAC10 ;! Work ac, remaining characters at start of initial
;! match in master
cfp1==XWAC11
search: PROC
IF ;! Top ac is not XWAC1
CAIN XTAC,XWAC1
GOTO FALSE
THEN ;! Save ac's
nn==0
repeat 4,<
EXCH XWAC1+nn,nn(XTAC)
nn==nn+1
>
FI
SAVE <cfp1,c1,sp,sp1,ls1,ls,lc>
STACK XTAC
LF lc,ZTVLNG(,config)
STACK XWAC1 ;! Place text descr in stack
HRRZ s,XPDP
STACK XWAC2
LF ls,ZTVLNG(s) ;! s.Length
JUMPE lc,L8 ;! config.Length=0
LF X1,ZTVCP(s)
SUBI ls,(X1) ;! rest(s).Length
SETO ls1, ;! remaining length-1 at match:=-1
CAIGE ls,(lc)
GOTO nomatch ;! if config too long to fit
;! Compute byte pointers for CONFIG and MASTER
LF sp,ZTVSP(,config)
IF ;! config starts at beginning of config.Main
JUMPN sp,FALSE
THEN ;! Convert directly to byte pointer
ADD cfp,ptab+1
ELSE ;! Compute via word and byte offsets
IDIVI sp,5
ADDI cfp,2(sp)
HLL cfp,ptab+1(sp+1)
FI
LF sp,ZTVSP(s) ;! startpos(s)-1
SETZ sp1,
ADDI sp,(X1) ;! + s.Pos-1
IF ;! Non-zero effective offset
JUMPE sp,FALSE
THEN
IDIVI sp,5 ;! sp1:=offset in first word
FI
ADD sp,(s) ;! Address of first word to consider
ADDI sp,2
HLL sp,ptab(sp1) ;! Create byte pointer for master
LDB c1,cfp ;! c1:=config.Getchar
L1():! SUBI ls,-1(lc)
LOOP ;! Through initial characters of master
SOJL ls,nomatch
ILDB sp
AS
CAIE (c1)
GOTO TRUE
SA
;! c1 matched a character of master here
;! Now check following characters if any
ADDI ls,-1(lc)
LI ls1,(ls) ;! Remember 1st match
L sp1,sp
LI x2,(lc)
L cfp1,cfp
LOOP ;! Matching characters from config and master
SOJLE X2,fullmatch
ILDB X1,cfp1
SOJL ls,nomatch
ILDB sp
AS
CAIN (X1)
GOTO TRUE
SA
LI ls,(ls1)
L sp,sp1
SETZ ls1,
GOTO L1
nomatch:SETO ls1,
fullmatch:
LF ,ZTVLNG(s)
SUBI 1(ls1)
SF ,ZTVCP(s)
L8():! LF XWAC1,ZTVCP(s)
SUB XPDP,[2,,2] ;! Remove text descr from stack
ADDI XWAC1,1
UNSTK XTAC
RESTORE
IF ;! Xtop is not XWAC1
CAIN XTAC,XWAC1
GOTO FALSE
THEN ;! Restore ac's
nn==4
repeat 4,<
nn==nn-1
EXCH XWAC1+nn,nn(XTAC)
>
FI
POPJ XPDP,
EPROC
ptab: POINT 7,2,-1
POINT 7,2,6
POINT 7,2,13
POINT 7,2,20
POINT 7,2,27
POINT 7,2,34 ;! [125]
END;