Trailing-Edge
-
PDP-10 Archives
-
decuslib20-01
-
decus/20-0002/recout.sai
There is 1 other file named recout.sai in the archive. Click here to see a list.
COMMENT VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY RECOUT
C00004 00003 INTEGER SIMPROC FLDVAL(INTEGER FLD,TYP)
C00007 00004 SIMPROC STAOUT(POINTER IOWINTEGER CHN)
C00009 00005 SIMPROC ARROUT(POINTER ARRINTEGER CHN)
C00011 00006 INTEGER SIMPLE PROCEDURE RECSW0
C00015 00007 ! OUTPUT ALL STRINGS AND ARRAYS
C00017 ENDMK
C;
ENTRY RECOUT;
BEGIN "RECOUT"
REQUIRE "PROLOG.HDR[SYS,PDQ]" SOURCEFILE;
REQUIRE "LIB.HDR[SYS,PDQ]" SOURCEFILE;
INTEGER DISKLOC;
EXTERNAL POINTER RECCHN;
POINTER RECS1,RECS1P1;
INTEGER RECNUM,TOTNUM;
DEFINE RING=INTEGER;
EXTERNAL RECORDCLASS $CLASS(RING RECRNGS;PROCEDURE HNDLER;INTEGER RECSIZ;
INTEGER ARRAY TYPARR;STRING ARRAY TXTARR);
RPTR($CLASS) PROCEDURE RECCLS(RPTR(ANYCLASS) R);
STARTCODE MOVE 1,R;HRRZ 1,(1);END;
INTERNAL INTEGER PROCEDURE RECLEN(RPTR(ANYCLASS) R);
RETURN($CLASS:RECSIZ[RECCLS(R)]);
INTERNAL STRING PROCEDURE CVRTS(RPTR(ANYCLASS) REC);
RETURN(IF REC=NIL THEN "NIL"
ELSE $CLASS:TXTARR[RECCLS(REC)][0]);
DEFINE MEMLOC(X)=MEMORY[LOCATION(X)];
INTEGER SIMPROC FLDVAL(INTEGER FLD,TYP);
STARTCODE
DEFINE SP='16;
LABEL FX,F0,ST1,F2S,ARR,FS;
SKIPN 1,FLD;
JRST FX; ! NOTHING TO DO FOR NULL FIELD;
HLRZ 3,TYP;
LSH 3,-5; ! ADJUST TYPE BITS;
TRNE 3,'20; ! ARRAY?;
SOJA 1,ARR; ! YES;
CAIN 3,'15; ! RECORD?;
HLRZ 1,(1); ! GET RECORD #;
CAIE 3,3; ! STRING?;
JRST FX; ! NO, DONE;
HRLI 1,-1; ! STRING POINTER HAS -1 IN LEFT HALF;
PUSH SP,1; ! PUSH POINTER TO STRING DESC;
HRRZ 4,-1(1); ! LENGTH OF STRING;
ADDI 4,1; ! EXTRA NULL AT END OF STRING;
IDIVI 4,5;
SKIPE 5;
ADDI 4,1; ! # WORDS FOR STRING;
JRST FS; ! ALLOCATE SPACE;
ARR: HRLI 1,0; ! ZERO LEFT HALF;
CAIE 3,'27; ! COMPLICATED CASE OF ARRAY;
AOJA 1,F0;
! HERE WE HAVE A STRING ARRAY;
! WE MUST COMPUTE THE SPACE IT WILL TAKE;
HRLZ 2,-1(1); ! LENGTH;
MOVNS 2;
HRR 2,1; ! IOWD TO ARRAY;
MOVEI 4,0;
ST1: HRRZ 3,(2); ! GET LENGTH OF STRING;
ADDI 4,1(3); ! SUM(LENGTH(I)+1);
ADD 2,['1000001];
AOBJN 2,ST1;
IDIVI 4,5; ! TOTAL WORDS NEEDED FOR STRINGS;
SKIPE 5;
ADDI 4,1; ! +1;
MOVE 2,4;
HLL 2,-1(1); ! # DIMS;
JRST F2S; ! IOWD FOR DISK VERSION OF STRING ARRAY;
F0: CAIN 3,'41;
HRLI 1,1; ! RECORD ARRAY - INDICATE IN LEFT HALF;
MOVE 2,-1(1); ! #DIMS,,LENGTH;
F2S: PUSH SP,1; ! REMEMBER POINTER TO ARRAY;
HLRE 4,2; ! #DIMS;
MOVMS 4;
ADDI 4,1(4); ! 2*#DIMS+1;
ADDI 4,(2); ! TOTAL LENGTH OF OUTPUT;
FS: MOVN 1,4;
MOVSS 1;
HRR 1,DISKLOC; ! RETURN IOWD TO ARRAY ON DISK;
ADDM 4,DISKLOC; ! ACCUMULATE ARRAY LENGTHS;
FX:
END;
SIMPROC STAOUT(POINTER IOW;INTEGER CHN);
! OUTPUT A STRING ARRAY;
BEGIN INTEGER XOPT,WD,CHNL;
XOPT_POINT(7,WD,-1);
CHNL_CHN;
STARTCODE
LABEL NW,NC,DC,STX,NXT,NXTS,NCEND;
DEFINE A=1,OPT=2,PT=3,N=4,C=5,P='17;
MOVE A,IOW; ! IOWD TO LIST OF STRINGS;
MOVE OPT,XOPT;
NXTS: MOVE PT,(A); ! STRING POINTER;
HRRZ N,-1(A); ! LENGTH;
NCEND: PUSH P,A;
NW: NC: JUMPLE N,STX;
ILDB C,PT;
DC: IDPB C,OPT;
TLNE OPT,'760000;
SOJA N,NC; ! WORD FILLED;
PUSH P,N;
PUSH P,PT;
PUSH P,CHNL;
PUSH P,WD;
PUSHJ P,WORDOUT; ! OUTPUT THE WORD;
POP P,PT;
POP P,N;
MOVE OPT,XOPT;
SOJA N,NW;
STX: JUMPL N,NXT;
MOVEI C,0;
SOJA N,DC; ! END WITH A NULL CHAR;
NXT: POP P,A;
ADD A,['2000002];
JUMPL A,NXTS; ! AGAIN WITH NEXT STRING;
MOVEI N,3;
MOVEI PT,0;
TLNN A,-1;
JRST NCEND; ! DEPOSIT 4 NULLS TO FLUSH LAST WORD;
END;
END "STAOUT";
SIMPROC STOUT(POINTER ST;INTEGER CHN);
! OUTPUT A SINGLE STRING;
STARTCODE MOVEI 1,-2;HRLM 1,-2('17);JRST STAOUT;END;
SIMPROC ARROUT(POINTER ARR;INTEGER CHN);
! OUTPUT ALL KINDS OF ARRAYS;
BEGIN
DEFINE P='17;
INTEGER DIM,WDS,DIMWD;
POINTER AR,RA,IOW;
STARTCODE
MOVE 1,ARR;
HRRZM 1,AR;
HLRZM 1,RA;
MOVE 2,-1(1); ! #DIMS,,LENGTH;
MOVEM 2,DIMWD;
HLRE 3,2; ! #DIMS;
MOVMS 3;
MOVEM 3,DIM;
HRRZM 2,WDS;
MOVNS 2;
HRL 1,2;
MOVEM 1,IOW; ! IOWD TO ARRAY;
END;
BEGIN
INTEGER L,W;
WORDOUT(CHN,DIMWD);
FOR L_1 STEP 1 UNTIL DIM DO
BEGIN WORDOUT(CHN,MEMORY[W_AR-1-3*L]); ! LOWER BOUND;
WORDOUT(CHN,MEMORY[W+1]); ! UPPER BOUND;
END;
END;
IF RA=1 THEN
STARTCODE ! OUTPUT THE RECORD ARRAY;
LABEL L1;
MOVE 1,IOW; ! IOWD TO ARRAY;
L1: MOVE 2,(1); ! ARRAY ELEMENT;
HLRZ 2,(2); ! RECORD#;
PUSH P,1;
PUSH P,CHN;
PUSH P,2;
PUSHJ P,WORDOUT;
POP P,1;
AOBJN 1,L1;
END
ELSE IF DIMWD0 THEN ! OUTPUT SIMPLE ARRAY;
STARTCODE PUSH P,CHN;PUSH P,AR;PUSH P,WDS;PUSHJ P,ARRYOUT;END
ELSE STAOUT(IOW+1,CHN); ! OUTPUT STRING ARRAY;
END "ARROUT";
INTEGER SIMPLE PROCEDURE RECSW0;
! DETERMINE NUMBER OF MARKED RECORDS: LENGTH OF CHAIN;
STARTCODE
DEFINE N=1,A=2;
LABEL L,LX;
MOVEI N,0;
HLRZ A,RECCHN;
L: CAIN A,-1; ! END OF CHAIN?;
JRST LX; ! YES, DONE;
HLRZ A,(A); ! NO, FOLLOW CHAIN;
AOJA N,L;
LX: END;
EXTERNAL PROCEDURE $RMARK;
INTERNAL PROCEDURE RECOU2(RPTR(ANYCLASS) HANDLE;INTEGER CHN);
BEGIN
RPTR(ANYCLASS) R;
POINTER LST,SPSAV,SPTOP;
INTEGER I;
PROCEDURE OUTREC(RPTR(ANYCLASS) R;INTEGER CHN);
BEGIN
INTEGER N,I,NAM;
POINTER LR,LC;
RPTR($CLASS) RCL;
RCL_RECCLS(R);
N_$CLASS:RECSIZ[RCL];
NAM_CVSIX($CLASS:TXTARR[RCL][0]);
LC_MEMLOC($CLASS:TYPARR[RCL]); ! POINTER TO TYPARR;
LR_MEMLOC(R); ! POINTER TO RECORD;
WORDOUT(CHN,NAM); ! OUTPUT RECORD CLASS ID;
FOR I_1 STEP 1 UNTIL N DO
WORDOUT(CHN,FLDVAL(MEMORY[LR+I],MEMORY[LC+I])); ! EACH FIELD;
END "OUTREC";
STARTCODE
MOVE 1,HANDLE;HRROS (1);HRROM 1,RECCHN;! MARK ALL ACCESSIBLE FROM HANDLE;
MOVEM '16,SPSAV; ! REMEMBER STRING STACK POINTER;
END;
$RMARK; ! MARK ALL RECORDS ACCESSABLE FROM REC;
RECNUM_RECSW0; ! DETERMINE NUMBER OF RECORDS;
! 1ST SWEEP PASS - ASSIGN RECORD #S;
BEGIN
RPTR(ANYCLASS) ARRAY RECARR[1:RECNUM];
STARTCODE
DEFINE RECSIZ=3,TYPARR=4,TXTARR=5;
DEFINE A=1,L=2,H=3,N=4,S=5,B=7;
LABEL L1,L2,LX;
MOVE S,RECNUM; ! SIZE_RECNUM+SUM(RECSIZ(I));
MOVEI N,2;
MOVE L,RECARR;
HLRZ A,RECCHN;
MOVE H,HANDLE;
MOVE B,(H); ! CLASS;
ADD S,RECSIZ(B); ! SIZE OF HANDLE;
MOVEM H,(L); ! RECARR[1]_HANDLE;
AOJA L,L2;
L1: HLRZ A,(A);
L2: CAIN A,-1;
JRST LX; ! DONE;
CAMN A,H; ! DON'T INDEX HANDLE AGAIN;
JRST L1;
MOVEM A,(L);
MOVE B,(A); ! CLASS;
MOVE B,RECSIZ(B); ! SIZE OF RECORD;
ADD S,B; ! ACCUMULATE RECORD SIZES;
HLRZ B,(A); ! FOLLOW CHAIN;
HRLM N,(A); ! INSERT RECORD INDEX;
MOVE A,B;
AOS L;
AOJA N,L2;
LX: MOVEI N,1;
HRLM N,(H); ! INDEX HANDLE;
MOVEM S,TOTNUM;
END;
DISKLOC_1+TOTNUM;
WORDOUT(CHN,RECNUM);
FOR I_1 STEP 1 UNTIL RECNUM DO
OUTREC(RECARR[I],CHN); ! OUTPUT ALL RECORDS;
! OUTPUT ALL STRINGS AND ARRAYS;
STARTCODE
DEFINE SP='16,P='17;
LABEL L,LX;
MOVEM SP,SPTOP;
MOVE SP,SPSAV;
L: CAMN SP,SPTOP;
JRST LX; ! DONE;
ADD SP,['1000001];
PUSH P,(SP);
PUSH P,CHN;
SKIPL (SP);
PUSHJ P,ARROUT; ! ARRAY;
SKIPGE (SP);
PUSHJ P,STOUT; ! STRING;
JRST L;
LX: MOVE SP,SPSAV;
END;
! LAST PASS TO UNMUNG RECORD INDEX (MARK) FIELDS;
FOR I_1 STEP 1 UNTIL RECNUM DO
BEGIN R_RECARR[I];
QUICKCODE MOVE 1,R;HRRZS (1);END;
END;
END;
END "RECOU2";
INTERNAL PROCEDURE RECOUT(RPTR(ANYCLASS) R;STRING FILE);
BEGIN
INTEGER CHN;
RPTR(IO) ODEV;
CHN_MKIODEV(FILE);
ODEV_IOCHANS[CHN];
IO:MODE[ODEV]_'14;
FILEOP("E",CHN);
RECOU2(R,CHN);
FILEOP("R",CHN);
END;
END "RECOUT";