|
|
BSD 4.3
#include "../h/rt.h"
#include "../h/record.h"
/*
* x.y - access field y of record x.
*/
field(nargs, arg2, arg1, arg0)
int nargs;
struct descrip arg2, arg1, arg0;
{
register int fnum;
register struct b_record *rp;
register struct descrip *dp;
extern int *ftab, *records;
SetBound;
DeRef(arg1)
/*
* x must be a record and y must be a field number.
*/
if (QUAL(arg1) || TYPE(arg1) != T_RECORD)
runerr(107, &arg1);
if (QUAL(arg2) || TYPE(arg2) != T_INTEGER)
syserr("field: second operand not field number");
/*
* Map the field number into a field number for the record x.
*/
rp = (struct b_record *) BLKLOC(arg1);
fnum = ftab[INTVAL(arg2) * *records + rp->recptr->recnum - 1];
/*
* If fnum < 0, x doesn't contain the specified field.
*/
if (fnum < 0)
runerr(207, &arg1);
/*
* Return a pointer to the descriptor for the appropriate field.
*/
dp = &rp->fields[fnum];
arg0.type = D_VAR + ((int *)dp - (int *)rp);
BLKLOC(arg0) = (union block *) dp;
ClearBound;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.