{$M-,X+}
program rdata_info;

{	The IRDATA routines are designed to include the description of
	the RDATA fields for RRs of various types and classes.

	IRINIT should be called to initialize internal tables.

	IRDATA(class) returns a pointer to a table describing all
	RRs for the particular class

}

include {NOLIST} 'domain:mdep.def';
include {NOLIST} 'domain:master.def';

var	rptr:array[dclass] of rdata_table_pointer;

procedure irinit;

var	myclass:dclass;

begin
for myclass:=internet to csnet
do	rptr[myclass]:=nil
end;

function new_table:rdata_table_pointer;

var	rptr:rdata_table_pointer;
	i:integer;
	mytype:dtype;

begin
new(rptr);
for mytype:=dtype_l_bound to dtype_h_bound
do	for i:=1 to 8
	do	begin
		rptr^[mytype].rdata_item[i]:=no_more_field;
		rptr^[mytype].rdata_asp[i]:=ord(dtype_l_bound)
		end;

new_table:=rptr;

end; { new table }

procedure classinsensitive(rptr:rdata_table_pointer);

begin
with rptr^[cname]
do	begin
	rdata_item[1]:=dname_field
	end;

with rptr^[hinfo]
do	begin
	rdata_item[1]:=cstring_field;
	rdata_item[2]:=cstring_field
	end;

with rptr^[mb]
do	begin
	rdata_item[1]:=dname_field;
	rdata_asp[1]:=ord(A)
	end;

with rptr^[md]
do	begin
	rdata_item[1]:=dname_field;
	rdata_asp[1]:=ord(A)
	end;

with rptr^[mf]
do	begin
	rdata_item[1]:=dname_field;
	rdata_asp[1]:=ord(A)
	end;

with rptr^[mx]
do	begin
	rdata_item[1]:=int16_field;
	rdata_item[2]:=dname_field;
	rdata_asp[2]:=ord(A)
        end;

with rptr^[mg]
do	begin
	rdata_item[1]:=dname_field
	end;

with rptr^[minfo]
do	begin
	rdata_item[1]:=dname_field;
	rdata_item[2]:=dname_field
	end;

with rptr^[mr]
do	begin
	rdata_item[1]:=dname_field
	end;

with rptr^[null]
do	begin
	rdata_item[1]:=vbinary_field
	end;

with rptr^[ns]
do	begin
	rdata_item[1]:=dname_field;
	rdata_asp[1]:=ord(A)
	end;

with rptr^[ptr]
do	begin
	rdata_item[1]:=dname_field
	end;

with rptr^[soa]
do	begin
	rdata_item[1]:=dname_field; 	{ MNAME }
	rdata_item[2]:=dname_field;	{ RNAME }
	rdata_item[3]:=int32_field;	{ SERIAL }
	rdata_item[4]:=time_field;	{ REFRESH }
	rdata_item[5]:=time_field;	{ RETRY }
	rdata_item[6]:=time_field;	{ EXPIRE }
	rdata_item[7]:=time_field	{ MINIMUM }
	end;

end; { classinsensitive }

procedure classunknown(rptr:rdata_table_pointer);

var	mytype:dtype;

begin
for mytype:=succ(dtype_l_bound) to pred(dtype_h_bound)
do	with rptr^[mytype]
	do 	rdata_item[1]:=vbinary_field
end;

function IRDATA(myclass:dclass):rdata_table_pointer;

begin
if rptr[myclass]=nil
then	{ set up table }
	case myclass of

	internet:	begin
			rptr[myclass]:=new_table;
			classinsensitive(rptr[myclass]); { class insensitive }
			with rptr[myclass]^[a]
			do	rdata_item[1]:=inet_a_field;

			with rptr[myclass]^[wks]
			do	begin
				    rdata_item[1]:=inet_a_field;
				    rdata_item[2]:=inet_p_field;
				    rdata_item[3]:=inet_s_field
				end
			end;

	others:		begin
			    rptr[myclass]:=new_table;
			    classunknown(rptr[myclass]);
			end
	
	end; { set up table }

irdata:=rptr[myclass]

end { IRDATA }
.
