*DECK NDLWNCF
USETEXT NDLFETT
USETEXT NDLTBLT
PROC NDLWNCF(TABLE$ID,WSA,LENGTH);
BEGIN
*IF,DEF,IMS
#
** NDL$WNF - WRITE RECORD TO NCF
*
* D.K. ENDO 81/11/10
*
* THIS PROCEDURE MAKES AN ENTRY IN NCF INDEX OR LINE RECORD INDEX
* AND WRITES RECORD TO NCF.
*
* PROC NDL$WNF(TABLE$ID,WSA,LENGTH)
*
* ENTRY TABLE$ID = NUMBER IDENTIFYING TABLE.
* WSA = FIRST WORD ADDRESS OF TABLE OR RECORD.
* IF A BASED ARRAY, THE POINTER WORD ITSELF
* MUST BE PASSED.
* LENGTH = LENGTH IN CP WORDS OF TABLE OR RECORD.
*
* EXIT NONE.
*
* METHOD
*
* SELECT CASE THAT APPLIES:
* CASE1(LINE RECORD)
* MAKE ENTRY IN LINE RECORD INDEX.
* WRITE LINE RECORD TO NCF.
* CASE 2(ALL TABLES EXCEPT NCF INDEX AND LINE RECORDS):
* MAKE ENTRY IN NCF INDEX.
* WRITE TABLE/RECORD TO NCF.
* CASE 3(NCF INDEX):
* WRITE INDEX TO NCF WITH EOF.
*
#
*ENDIF
ITEM TABLE$ID; # TABLE/RECORD I.D. #
ITEM WSA; # FIRST WORD ADDRESS OF TABLE/RECORD #
# IF A BASED ARRAY, WSA IS THE ACTUAL #
# POINTER WORD #
ITEM LENGTH; # LENGTH IN CP WORDS OF TABLE/RECORD #
#
**** PROC NDLWNCF - XREF LIST BEGINS.
#
XREF
BEGIN
PROC SSTATS; # ALLOCATES MORE TABLE SPACE ON REQUEST #
PROC RECALL; # RETURNS CONTROL WHEN RECALL BIT CLEARED #
PROC WRITEF; # FLUSH BUFFER, WRITE EOF MARKER #
PROC WRITER; # FLUSH BUFFER, WRITE EOR MARKER #
END
#
****
#
DEF MAXRT # 12 #; # NUMBER OF ENTRIES IN RECORD-TYPE TABLE #
ARRAY RECORD$TYPE [0:MAXRT] S(1);
BEGIN
ITEM REC$TYPE (0,0,60) = [ , # UNKNOWN #
O"7700", # FILE HEADER RECORD #
, # LINE RECORD #
O"1603", # NCB #
O"1630", # NPU XREF TABLE #
O"2010", # PHYSICAL LINK XREF #
O"1414", # LOGICAL LINK XREF #
O"1430", # LINE XREF TABLE #
O"0430", # DEVICE XREF TABLE #
O"1411", # LINE RECORD INDEX #
, # NCF INDEX #
];
END
SWITCH TBLJUMP , # UNKNOWN #
NCF$ENTRY, # FILE HEADER RECORD #
LI$ENTRY , # LINE RECORD #
, # NCB #
NCF$ENTRY, # NPU XREF TABLE #
NCF$ENTRY, # PHYSICAL LINK XREF TABLE #
NCF$ENTRY, # LOGICAL LINK XREF TABLE #
NCF$ENTRY, # LINE XREF TABLE #
NCF$ENTRY, # DEVICE XREF TABLE #
NCF$ENTRY, # LINE RECORD INDEX #
WRITE$EOF; # NCF INDEX #
CONTROL EJECT;
# #
# CODE BEGINS HERE #
# #
GOTO TBLJUMP[TABLE$ID];
# #
LI$ENTRY:
LIWC[1] = LIWC[1] + 1; # INCREMENT INDEX WORD COUNT #
IF LIWC[1] GQ LI$LENG
THEN # IF NEED MORE TABLE SPACE FOR ENTRY #
BEGIN
SSTATS(P<LIN$REC$INDX>,20); # ALLOCATE MORE SPACE #
END
LIWORD[LIWC[1]] = 0; # CLEAR ENTRY WORD #
LINID[LIWC[1]] = LRNID[2]; # PUT NPU NODE I.D. IN KEY #
LIPORT[LIWC[1]] = LRPORT[2]; # PUT PORT NUMBER VALUE IN KEY #
LIGC[LIWC[1]] = LRGC[1]; # PUT GROUP COUNT IN KEY #
LIRPA[LIWC[1]] = NCFCRI[0]; # PUT SECTOR ADDRESS IN ENTRY #
GOTO WRITE$EOR;
NCF$ENTRY:
NCFWC[0] = NCFWC[0] + 1; # INCREMENT INDEX WORD COUNT #
IF NCF$LENG LS (NCFWC[0] * NCFENTSZ) + 1
THEN # IF NEED MORE TABLE SPACE FOR ENTRY #
BEGIN
SSTATS(P<NCF$INDEX>,20); # ALLOCATE MORE SPACE #
END
NCFWORD[NCFWC[0]] = 0; # FIRST WORD IN ENTRY #
NCFRT[NCFWC[0]] = REC$TYPE[TABLE$ID]; # PUT RECORD TYPE IN KEY #
NCFRL[NCFWC[0]] = LENGTH; # PUT RECORD LENGTH IN ENTRY #
NCFRANINDX[NCFWC[0]] = NCFCRI[0];# PUT SECTOR ADDRESS IN ENTRY #
GOTO WRITE$EOR;
WRITE$EOR:
NCFFIRST[0] = WSA; # POINT FET TO TABLE/RECORD #
NCFIN[0] = WSA + LENGTH;
NCFOUT[0] = WSA;
NCFLIMIT[0] = NCFIN[0] + 1;
WRITER(NCFFET,0); # WRITE TABLE/RECORD TO NCF FILE#
RECALL(NCFFET);
GOTO EXIT;
WRITE$EOF:
NCFFIRST[0] = WSA; # POINT FET TO TABLE #
NCFIN[0] = WSA + LENGTH;
NCFOUT[0] = WSA;
NCFLIMIT[0] = NCFIN[0] + 1;
WRITEF(NCFFET); # WRITE TABLE TO FILE WITH EOF #
RECALL(NCFFET);
EXIT:
RETURN; # **** RETURN **** #
END # NDLWNCF #
TERM