Annotation of 43BSD/contrib/icon/lib/field.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: #include "../h/record.h"
                      3: 
                      4: /*
                      5:  * x.y - access field y of record x.
                      6:  */
                      7: 
                      8: field(nargs, arg2, arg1, arg0)
                      9: int nargs;
                     10: struct descrip arg2, arg1, arg0;
                     11:    {
                     12:    register int fnum;
                     13:    register struct b_record *rp;
                     14:    register struct descrip *dp;
                     15:    extern int *ftab, *records;
                     16: 
                     17:    SetBound;
                     18: 
                     19:    DeRef(arg1)
                     20:    /*
                     21:     * x must be a record and y must be a field number.
                     22:     */
                     23:    if (QUAL(arg1) || TYPE(arg1) != T_RECORD)
                     24:       runerr(107, &arg1);
                     25:    if (QUAL(arg2) || TYPE(arg2) != T_INTEGER)
                     26:       syserr("field: second operand not field number");
                     27: 
                     28:    /*
                     29:     * Map the field number into a field number for the record x.
                     30:     */
                     31:    rp = (struct b_record *) BLKLOC(arg1);
                     32:    fnum = ftab[INTVAL(arg2) * *records + rp->recptr->recnum - 1];
                     33:    /*
                     34:     * If fnum < 0, x doesn't contain the specified field.
                     35:     */
                     36:    if (fnum < 0)
                     37:       runerr(207, &arg1);
                     38: 
                     39:    /*
                     40:     * Return a pointer to the descriptor for the appropriate field.
                     41:     */
                     42:    dp = &rp->fields[fnum];
                     43:    arg0.type = D_VAR + ((int *)dp - (int *)rp);
                     44:    BLKLOC(arg0) = (union block *) dp;
                     45:    ClearBound;
                     46:    }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.