Annotation of 43BSD/contrib/icon/operators/lconcat.c, revision 1.1

1.1     ! root        1: #include "../h/rt.h"
        !             2: 
        !             3: /*
        !             4:  * x ||| y - concatenate lists x and y.
        !             5:  */
        !             6: 
        !             7: lconcat(nargs, arg2, arg1, arg0)
        !             8: int nargs;
        !             9: struct descrip arg2, arg1, arg0;
        !            10:    {
        !            11:    register struct b_list *bp1, *bp2;
        !            12:    register struct b_lelem *lp1, *lp2;
        !            13:    int size1, size2;
        !            14: 
        !            15:    SetBound;
        !            16:    /*
        !            17:     * x and y must be lists.
        !            18:     */
        !            19:    DeRef(arg1)
        !            20:    DeRef(arg2)
        !            21:    if (QUAL(arg1) || TYPE(arg1) != T_LIST)
        !            22:       runerr(108, &arg1);
        !            23:    if (QUAL(arg2) || TYPE(arg2) != T_LIST)
        !            24:       runerr(108, &arg2);
        !            25: 
        !            26:    /*
        !            27:     * Get the size of both lists.
        !            28:     */
        !            29:    size1 = BLKLOC(arg1)->list.cursize;
        !            30:    size2 = BLKLOC(arg2)->list.cursize;
        !            31: 
        !            32:    /*
        !            33:     * Make a copy of both lists.
        !            34:     */
        !            35:    cplist(&arg1, &arg1, 1, size1 + 1);
        !            36:    cplist(&arg2, &arg2, 1, size2 + 1);
        !            37: 
        !            38:    /*
        !            39:     * Get a pointer to both lists.  bp1 points to the copy of x and is
        !            40:     *  the list that will be returned.
        !            41:     */
        !            42:    bp1 = (struct b_list *) BLKLOC(arg1);
        !            43:    bp2 = (struct b_list *) BLKLOC(arg2);
        !            44: 
        !            45:    /*
        !            46:     * Perform the concatenation by hooking the lists together so
        !            47:     *  that the next list of x is y and the previous list of y is x.
        !            48:     */
        !            49:    lp1 = (struct b_lelem *) BLKLOC(bp1->listtail);
        !            50:    lp2 = (struct b_lelem *) BLKLOC(bp2->listhead);
        !            51: 
        !            52:    lp1->listnext.type = D_LELEM;
        !            53:    BLKLOC(lp1->listnext) = (union block *) lp2;
        !            54: 
        !            55:    lp2->listprev.type = D_LELEM;
        !            56:    BLKLOC(lp2->listprev) = (union block *) lp1;
        !            57: 
        !            58:    /*
        !            59:     * Adjust the size field to reflect the length of the concatenated lists.
        !            60:     */
        !            61:    bp1->cursize = size1 + size2;
        !            62:    BLKLOC(bp1->listtail) = BLKLOC(bp2->listtail);
        !            63: 
        !            64:    arg0 = arg1;
        !            65:    ClearBound;
        !            66:    }
        !            67: 
        !            68: Opblock(lconcat,2,"|||")

unix.superglobalmegacorp.com

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