60000 #include "rundecs.h"
60010     (*  COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER  *)
60020 (**)
60030 (**)
60040 PROCEDURE GARBAGE (ANOBJECT: OBJECTP); EXTERN ;
60050 FUNCTION CRSTRING(LENGTH: OFFSETRANGE): OBJECTP; EXTERN;
60060 FUNCTION SAFEACCESS (LOCATION: OBJECTP) : UNDRESSP; EXTERN;
60070 (**)
60080 (**)
60090 FUNCTION CATCC(LCH, RCH: CHAR): OBJECTP;
60100 (*PCAT*)
60110   VAR POINT :OBJECTP;
60120     BEGIN
60130     POINT := CRSTRING(2);
60140     WITH POINT^ DO
60150       BEGIN CHARVEC[1] := LCH; CHARVEC[2] := RCH END;
60160     CATCC := POINT;
60170     END;
60180 (**)
60190 (**)
60200 FUNCTION CATSS(LEFT, RIGHT: OBJECTP): OBJECTP;
60210 (*PCAT-1*)
60220   VAR POINT: OBJECTP;
60230       I, D: INTEGER; C: CHAR;
60240     BEGIN
60250     WITH LEFT^ DO
60260       BEGIN D := STRLENGTH;
60270       IF
60280         ( PCOUNT = 0 )
60290       AND
60300         ( STRLENGTH+RIGHT^.STRLENGTH <= (STRLENGTH + CHARPERWORD - 1) DIV CHARPERWORD * CHARPERWORD ) THEN
60310         BEGIN POINT := LEFT; I := D+RIGHT^.STRLENGTH; POINT^.STRLENGTH := I END
60320       ELSE
60330         BEGIN POINT := CRSTRING(STRLENGTH+RIGHT^.STRLENGTH);
60340         FOR I := 1 TO STRLENGTH DO
60350           BEGIN C := CHARVEC[I]; POINT^.CHARVEC[I] := C END;
60360         IF FPTST(LEFT^) THEN GARBAGE(LEFT)
60370         END
60380       END;
60390     WITH RIGHT^ DO
60400     FOR I := 1 TO RIGHT^.STRLENGTH DO
60410         BEGIN C := CHARVEC[I]; POINT^.CHARVEC[I+D] := C END;
60420     IF FPTST(RIGHT^) THEN GARBAGE(RIGHT);
60430     CATSS := POINT;
60440     END;
60450 (**)
60460 (**)
60470 FUNCTION PLABSS(LEFT, RIGHT: OBJECTP): OBJECTP;
60480 (*PPLUSABCH, PPLUSABCH-1*)
60490   VAR TEMP: OBJECTP;
60500       PILPTR: UNDRESSP;
60510     BEGIN
60520     WITH LEFT^ DO
60530       IF SORT = REFN THEN
60540         BEGIN
60550         WITH PVALUE^ DO FDEC; (*SO THAT CATSS CAN POSSIBLY RE-USE IT*)
60560         PVALUE := CATSS(PVALUE, RIGHT);
60570         WITH PVALUE^ DO FINC
60580         END
60590       ELSE
60600         BEGIN
60610         PILPTR := SAFEACCESS(LEFT);
60620         TEMP := PILPTR^.FIRSTPTR;
60630         WITH TEMP^ DO FDEC; (*SO THAT CATSS CAN POSSIBLY RE-USE IT*)
60640         PILPTR^.FIRSTPTR := CATSS(TEMP, RIGHT);
60650         WITH PILPTR^.FIRSTPTR^ DO FINC
60660         END;
60670     PLABSS := LEFT;
60680     END;
60690 (**)
60700 (**)
60710 FUNCTION PLTOSS(LEFT, RIGHT: OBJECTP): OBJECTP;
60720 (*PPLUSTOCS, PPLUSTOCS-1*)
60730   VAR TEMP: OBJECTP;
60740       PILPTR: UNDRESSP;
60750     BEGIN
60760     WITH RIGHT^ DO
60770       IF SORT = REFN THEN
60780         BEGIN
60790         WITH PVALUE^ DO FDEC;
60800         PVALUE := CATSS(LEFT, PVALUE);
60810         WITH PVALUE^ DO FINC
60820         END
60830       ELSE
60840         BEGIN
60850         PILPTR := SAFEACCESS(RIGHT);
60860         TEMP := PILPTR^.FIRSTPTR;
60870         WITH TEMP^ DO FDEC;
60880         PILPTR^.FIRSTPTR := CATSS(LEFT, TEMP);
60890         WITH PILPTR^.FIRSTPTR^ DO FINC
60900         END;
60910     PLTOSS := RIGHT;
60920     END;
60930 (**)
60940 (**)
60950 (*-02() BEGIN END ; ()-02*)
60960 (*+01()
60970 BEGIN (*OF MAIN PROGRAM*)
60980 END (*OF EVERYTHING*).
60990 ()+01*)
