*DECK BASSRE2 
PROC BASSRE2; 
BEGIN 
XDEF FUNC BASSRE; 
XREF
 BEGIN
  PROC BASPOS;  #RETURN POSITION OF CHARACTER STRING# 
  PROC BASSMTS;  #TRUNCATE STRING#
  PROC BASSMGS;  #GET STRING SPACE# 
  PROC BASSMES;  #EXTEND TEMPORARY STRING#
 END
FUNC BASSRE((ADD1),(LEN1),(ADD2),(LEN2),(ADD3),(LEN3),(M)); 
# 
  
FUNCTION BASSRE PROCESSES THE BASIC 3 STRING FUNCTION 
SREP$(A$,M,B$,C$).  THE INPUTS ARE THE ABSOLUTE FWA'S AND 
LENGTHS (CHARACTER) OF THE STRINGS A$,B$,C$ RESPECIVELY.
THE FINAL PARAMETER IS THE STARTING POSITION M.  NOTE THAT
BASSRE ASSUMES CALL BY VALUE NOT BY ADDRESS.
  
BASSRE RETURNS -1 IF M>LEN(A$), OTHERWISE, IT RETURNS THE ABSOLUTE
ADDRESS OF THE TEMPORARY OUTPUT STRING POINTER. 
  
IMPORTANT NOTE%  THE ROUTINE BASPOS (WHICH IS THE PROCESSOR FOR 
THE BASIC 3 FUNCTION 'POS') IS CALLED FROM THIS ROUTINE.  FOR 
COMPILE-TO-CORE EXECUTIONS, THIS ROUTINE *MUST* BE AFTER THE
BASPOS ROUTINE TO AVOID CODE BEING MOVED OVER BASPOS (I.E.
THE ENTRY POINT BASXPOS < BASTSRE). 
  
# 
BEGIN  #BASSRE# 
# 
          INPUT PARAMETERS
# 
ITEM ADD1, ADD2, ADD3 I; # STRING ADDRESSES # 
ITEM LEN1, LEN2, LEN3 I; # STRING LENGTHS IN CHARACTERS # 
ITEM M I; # INITIAL STARTING POSITION # 
# 
          WORKING STORAGE 
# 
ITEM CH1, CH4 I; #0..9 CHARACTER POSITION#
ITEM POS1, POS4 I; #0..13108 WORD POSITION# 
ITEM CHARCOUNT, OLDPOSITION, OLDCOUNT I; #BASPOS RETURN VALUE#
ITEM MAX4 I; #MAXIMUM WORD COUNT FOR STRING 4#
ITEM DUMMY I; 
ITEM CHARS I=0; 
ITEM ADDR I=0;
ITEM STRPOINTER I=0  #OUTPUT STRING POINTER#; 
ITEM SAVSTRA I; #HOLDS ADDRESS OF STRPOINTER# 
ARRAY ZRO [0:0] S(1);  #CREATE A BINARY ZERO CHARACTER-TYPE WORD# 
 BEGIN
  ITEM IZERO I(0,0,60); 
  ITEM CZERO C(0,0,10); 
 END
BASED ARRAY STR4 [0:13108];  #OUTPUT STRING#
ITEM STRNG4 C(0,0,10);
  
# 
          PROCEDURE/FUNCTION DECLARATIONS 
# 
PROC INC10 (CHPOS, WDPOS)  #INCREMENT CHARACTER/WORD POINTERS#; 
 ITEM CHPOS I;
 ITEM WDPOS I;
 BEGIN #INC10#
  CHPOS = CHPOS+1;
  IF CHPOS GQ 10 THEN CHPOS = 0  #SIMULATE MODULO WRAP AROUND#; 
  IF CHPOS EQ  0 THEN WDPOS = WDPOS+1;
  RETURN; 
END #INC10# 
# 
 -------------------- 
# 
PROC EXTEND #EXTEND LENGTH OF OUTPUT STRING#; 
 BEGIN #EXTEND# 
  ADDR=LOC(STRPOINTER); 
  CHARS=LEN1; 
  BASSMES(ADDR,CHARS)  #GET -LEN1- MORE OUTPUT SPACE#;
  P<STR4> = ADDR; 
  MAX4 = (CHARS+9)/10;
  RETURN; 
END #EXTEND#
# 
 -------------------- 
# 
PROC COPY1  #COPY INPUT STRING TO OUTPUT STRING#; 
 ITEM I I;
 BEGIN #COPY1#
  COPYSTRING((ADD1), POS1, CH1, (CHARCOUNT)); 
  FOR I = 1 STEP 1 UNTIL LEN2 DO INC10(CH1,POS1); 
  RETURN; 
END #COPY1# 
# 
 -------------------- 
# 
PROC COPY3  #COPY REPLACEMENT STRING TO OUTPUT STRING#; 
 ITEM A,B I;
 BEGIN #COPY3#
  A=0;
  B=0;
  COPYSTRING((ADD3), A, B, (LEN3)); 
  RETURN; 
END #COPY3# 
# 
 -------------------- 
# 
PROC COPYSTRING((POINT), WORD, CHAR, (COUNT)); #COPY STRING TO STRING 4#
 ITEM POINT I #ADDRESS OF BASED INPUT ARRAY#; 
 ITEM WORD I  #WORD POSITION IN INPUT ARRAY#; 
 ITEM CHAR I  #CHARACTER POSITION IN INPUT ARRAY WORD#; 
 ITEM COUNT I; #NUMBER OF CHARACTERS TO TRANSFER# 
  
 ITEM L I #LOOP VARIABLE#;
 BASED ARRAY STR [0:13108]; 
 ITEM STRNG C(0,0,10);
  
 BEGIN #COPYSTRING# 
 IF COUNT EQ 0 THEN RETURN; 
 P<STR> = POINT #FIND INPUT STRING#;
 FOR L = 1 STEP 1 UNTIL COUNT DO
  BEGIN 
   C<CH4,1>STRNG4[POS4] = C<CHAR,1>STRNG[WORD] #MOVE TO STRING 4#;
   INC10(CH4,POS4) #INCREMENT TO NEXT CHARACTER#; 
   IF CH4 EQ 0 THEN STRNG4[POS4]=CZERO; 
   IF POS4 GR MAX4 THEN EXTEND  #NEED MORE STRING SPACE#; 
   INC10(CHAR,WORD)  #INCREMENT TO NEXT CHARACTER#; 
  END #FOR# 
  RETURN; 
END #COPYSTRING#
# 
 -------------------- 
# 
PROC INIT  # INITIALIZE POINTERS, ETC. #; 
 BEGIN #INIT# 
  CHARS = -LEN1  #INITIAL OUTPUT STRING LENGTH#;
  ADDR = LOC(STRPOINTER); 
  BASSMGS(ADDR,CHARS)  #GET STRING SPACE#;
  P<STR4> = ADDR; 
  IZERO=0;
  STRNG4[0]=CZERO  #ZERO FIRST ENTRY#;
  POS4=0; 
  CH4=0;
  MAX4 = (CHARS+9)/10;
  
  POS1=0; 
  CH1=0;
  
  CHARCOUNT=M;
  OLDPOSITION=1;
  BASPOS(ADD1,LEN1,ADD2,LEN2,CHARCOUNT);  #INITIAL SEARCH#
  RETURN; 
END #INIT#
# 
 -------------------- 
# 
PROC FINI  #COMPLETION#;
 BEGIN #FINI# 
  CHARCOUNT = LEN1 - (POS1*10 + CH1) + 1; 
  CHARS = POS4*10 + CH4-1;
  IF CHARCOUNT GQ 0 THEN  #COPY REMAINING CHARACTERS# 
   BEGIN
    COPY1;
    CHARS = POS4*10 + CH4 - 1;
   END
  ADDR = LOC(STRPOINTER); 
  BASSMTS(ADDR,CHARS)  #TRUNCATE STRING TO ACTUAL LENGTH#;
  RETURN; 
END #FINI#
# 
 -------------------- 
# 
  
# 
  
          MAIN PROGRAM ENTRY
  
# 
INIT  #INITIALIZE PROGRAM#; 
CONTROL SLOWLOOP; 
  
FOR DUMMY=0 WHILE CHARCOUNT GR 0 DO 
 BEGIN
 OLDCOUNT=CHARCOUNT;
 CHARCOUNT = CHARCOUNT-OLDPOSITION  #CONVERT POSITION TO COUNT#;
 COPY1  #COPY INPUT STRING TO OUTPUT STRING#; 
 COPY3  #COPY REPLACEMENT STRING TO OUTPUT STRING#; 
 CHARCOUNT = OLDCOUNT+LEN2;  OLDPOSITION=CHARCOUNT; 
 BASPOS(ADD1,LEN1,ADD2,LEN2,CHARCOUNT)  #KEEP GOING#; 
END #DO#
  
FINI  #COMPLETE COPY AND TRUNCATE OUTPUT STRING#; 
SAVSTRA= LOC(STRPOINTER);  #SAVE ADDRESS OF STRING POINTER# 
BASSRE = LOC(SAVSTRA);  #RETURN ADDR OF ADDR OF STRING POINTER# 
RETURN; 
  
END #BASSRE#
END #BASSRE2# 
TERM
