Trailing-Edge
-
PDP-10 Archives
-
BB-H138F-BM_1988
-
7-sources/tbl.req
There are 7 other files named tbl.req in the archive. Click here to see a list.
!++
! The following macro initializes a tbluk table. It may be
! used in the following manner:
!
! STACKLOCAL !or OWN
! tbl: tbluk_table(100);
!
! This case allocates space for a tbluk_table capable of
! holding 100 elements.
!
! STACKLOCAL
! tbl: tbluk_table(0, !Size is 0 (minimum size)
! 'Abort',0,(), !key='Abort', Data=0, No flags
! 'Bomb',1,(INV), !Key='Bomb', Data=1, INVisible
! 'Cr',-1,(NOR,INV), !Key='Cr', Invisible,Norec
! 'Crash,2,() !key='Crash', Data=2, No flags
! );
! This form reserves a table with only those four entries.
! INV, NOR, and ABR are defined as flags which set the
! appropriate bits in the argument block. If the size field had
! been greater than 0, then the table would have been allocated
! to hold that many entries instead of the minimum size. This
! allows tbluk_tables to have room for expansion if desired.
!
!--
COMPILETIME
args_ = 0,
siz_ = 0;
MACRO
tbluk_table(siz)[] =
%ASSIGN(args_,(%LENGTH - 1) / 3)
%IF siz LEQ 0
%THEN
%ASSIGN(siz_,args_)
%ELSE
%ASSIGN(siz_,siz) %FI
tbl[siz_] INITIAL(args_ ^ 18 + siz_,
%IF NOT %NULL(%REMAINING)
%THEN tblent(%REMAINING) , %FI
REP (siz_ - args_) OF (0)) %;
MACRO
tblent(key,val,flgs)[] = !Used by TBLUK_TABLE macro
UPLIT(tblflg(%remove(flgs))
%ASCIZ key) ^ 18 + val
%IF NOT %NULL(%REMAINING) %THEN ,tblent(%REMAINING) %FI %;
MACRO
tblflg(flg)[] = !Used by TBLENT macro
%IF NOT %NULL(flg)
%THEN
%IF %COUNT EQL 0 %THEN cm_fw %FI
%IF %IDENTICAL(flg,INV) %THEN OR cm_inv %ELSE
%IF %IDENTICAL(flg,NOR) %THEN OR cm_nor %ELSE
%IF %IDENTICAL(flg,ABR) %THEN OR cm_abr %ELSE
OR flg %FI %FI %FI
%IF %NULL(%REMAINING) %THEN , %FI
tblflg(%REMAINING)
%FI %;
!++
! The following fields and macros describe the bits and
! fields in a TBLUK table ENTry, and in the ARGument block.
!--
FIELD
arg_fields =
SET
ARG_INV = [0,0,1,0], !cm%inv
ARG_NOREC= [0,1,1,0], !cm%nor
ARG_ABR = [0,2,1,0], !cm%abr
ARG_FLAG = [0,28,8,0] !cm%fw
TES,
ent_fields =
SET
ENT_WORD = [0,0,36,0], !The whole word
ENT_KEY = [0,18,18,0], !The key address
ENT_DATA = [0,0,18,0] !The data field
TES;
MACRO
tbl_arg_block =
BLOCK[1] FIELD(arg_fields) %,
tbl_entry =
BLOCK[1] FIELD(ent_fields) %;
!++
! The following macro describes the fields used in the TBL
! data structure.
!--
MACRO
tbl_maximum_entries = 0,0,18 %,
tbl_actual_entries = 0,18,18 %,
tbl_word = 0,36 %,
tbl_key = 18,18 %,
tbl_data = 0,18 %;
!++
! The following structure defines a tbluk table
!--
LITERAL
def_tbl_siz = 50;
STRUCTURE
tbl [i,j,k; tbl_siz=def_tbl_siz] =
[tbl_siz + 1]
(tbl + i)<j,k,0>;
!++
! Return codes for TBL_LOOKUP, TBL_ADD, and TBL_DELETE
!--
LITERAL
tbl_nomatch = 0, !Tbl_lookup
tbl_exactmatch = 1,
tbl_ambiguous = 2,
tbl_abreviation = 3,
tbl_full = 0, !Tbl_add
tbl_entry_exists = 2,
tbl_empty = 0, !Tbl_delete
tbl_invalid_index = 2,
tbl_ok = 1, !Tbl_ok can be returned by both
!TBL_ADD and TBL_DELETE
tbl_lessthan = -1, !Only used internally
tbl_equalto = 0,
tbl_greaterthan = 1;
!++
! KEY$ returns the address of the ASCIZ key string from the
! tbluk_table. It knows about the ARG_FLAG and the two
! different formats for the argument block.
!
! TT: The address of the tbluk table.
! II: The value of the index.
! FLG: The address to return the flags in (May be omitted)
!--
MACRO
key$(tt,ii,flg) =
BEGIN
LOCAL
argument: REF tbl_arg_block;
argument = .tt[ii, TBL_KEY];
IF .argument[ARG_FLAG] EQL 1
THEN
BEGIN
%IF NOT %NULL(flg) %THEN flg = .argument[ARG_NOREC]; %FI
.argument + 1
END
ELSE
BEGIN
%IF NOT %NULL(flg) %THEN flg = 0; %FI
.argument
END
END %;
!++
! CH$LEN finds the length of an ASCIZ string
!--
MACRO
ch$len(zptr) =
CH$DIFF(CH$FIND_CH(132,zptr,%O'0'), zptr) %;
!++
! SEQ generates a sequence of integers
!
! min, min+1, min+2, ... max
!
! It is used to generate the UpperCase translation TABle.
!--
MACRO
seq(min,max)[] =
min
%IF min LSS max %THEN , seq(min + 1, max) %FI %;