Annotation of researchv10dc/cmd/icon/src/iconx/lrec.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * File: lrec.c
        !             3:  *  Contents: field, mkrec
        !             4:  */
        !             5: 
        !             6: #include "../h/rt.h"
        !             7: 
        !             8: /*
        !             9:  * x.y - access field y of record x.
        !            10:  */
        !            11: 
        !            12: LibDcl(field,2,".")
        !            13:    {
        !            14:    register word fnum;
        !            15:    register struct b_record *rp;
        !            16:    register struct descrip *dp;
        !            17:    extern word *ftab, *records;
        !            18: 
        !            19:    DeRef(Arg1);
        !            20:    /*
        !            21:     * x must be a record and y must be a field number.
        !            22:     */
        !            23:    if (Qual(Arg1) || Arg1.dword != D_Record)
        !            24:       runerr(107, &Arg1);
        !            25: 
        !            26:    /*
        !            27:     * Map the field number into a field number for the record x.
        !            28:     */
        !            29:    rp = (struct b_record *) BlkLoc(Arg1);
        !            30:    fnum = ftab[IntVal(Arg2) * *records + BlkLoc(rp->recdesc)->proc.recnum - 1];
        !            31:    /*
        !            32:     * If fnum < 0, x doesn't contain the specified field.
        !            33:     */
        !            34:    if (fnum < 0)
        !            35:       runerr(207, &Arg1);
        !            36: 
        !            37:    /*
        !            38:     * Return a pointer to the descriptor for the appropriate field.
        !            39:     */
        !            40:    dp = &rp->fields[fnum];
        !            41:    Arg0.dword = D_Var + ((word *)dp - (word *)rp);
        !            42:    BlkLoc(Arg0) = (union block *) dp;
        !            43:    Return;
        !            44:    }
        !            45: 
        !            46: 
        !            47: /*
        !            48:  * mkrec - create a record.
        !            49:  */
        !            50: 
        !            51: LibDcl(mkrec,-1,"mkrec")
        !            52:    {
        !            53:    register int i;
        !            54:    register struct b_proc *bp;
        !            55:    register struct b_record *rp;
        !            56:    extern struct b_record *alcrecd();
        !            57: 
        !            58:    /*
        !            59:     * Be sure that call is from a procedure.
        !            60:     */
        !            61: 
        !            62:    /*
        !            63:     * Ensure space for the record to be created.
        !            64:     */
        !            65:    blkreq((uword)sizeof(struct b_record) +
        !            66:          BlkLoc(Arg(0))->proc.nfields*sizeof(struct descrip));
        !            67: 
        !            68:    /*
        !            69:     * Get a pointer to the record constructor procedure and allocate
        !            70:     *  a record with the appropriate number of fields.
        !            71:     */
        !            72:    bp = (struct b_proc *) BlkLoc(Arg(0));
        !            73:    rp = alcrecd((int)bp->nfields, (struct descrip *)bp);
        !            74: 
        !            75:    /*
        !            76:     * Set all fields in the new record to null value.
        !            77:     */
        !            78:    for (i = bp->nfields; i > nargs; i--)
        !            79:       rp->fields[i-1] = nulldesc;
        !            80: 
        !            81:    /*
        !            82:     * Assign each argument value to a record element and dereference it.
        !            83:     */
        !            84:    for ( ; i > 0; i--) {
        !            85:       rp->fields[i-1] = Arg(i);
        !            86:       DeRef(rp->fields[i-1]);
        !            87:       }
        !            88: 
        !            89:    ArgType(0) = D_Record;
        !            90:    Arg(0).vword.bptr = (union block *)rp;
        !            91:    Return;
        !            92:    }

unix.superglobalmegacorp.com

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