Annotation of 43BSD/contrib/icon/functions/set.c, revision 1.1.1.1

1.1       root        1: #include "../h/rt.h"
                      2: #ifdef SETS
                      3: 
                      4: /*
                      5:  * set(list) - create a set with members in list.
                      6:  *  The members are linked into hash chains which are
                      7:  *  arranged in increasing order by hash number.
                      8:  */
                      9: Xset(nargs,arg1,arg0)
                     10: int nargs;
                     11: struct descrip arg1, arg0;
                     12:    {
                     13:    register int hn;
                     14:    register struct descrip *pd;
                     15:    register struct b_set *ps;
                     16:    union block *pb;
                     17:    struct b_selem *ne;
                     18:    struct descrip *pe;
                     19:    int res, i, j;
                     20:    extern struct descrip *memb();
                     21:    extern struct b_set *alcset();
                     22:    extern struct b_selem *alcselem();
                     23: 
                     24:    DeRef(arg1)
                     25:    if (QUAL(arg1) || TYPE(arg1) != T_LIST)
                     26:       runerr(108,&arg1);
                     27: 
                     28:    hneed(sizeof(struct b_set) + (BLKLOC(arg1)->list.cursize *
                     29:       sizeof(struct b_selem)));
                     30: 
                     31:    pb = BLKLOC(arg1);
                     32:    arg0.type = D_SET;
                     33:    ps = alcset();
                     34:    BLKLOC(arg0) = (union block *) ps;
                     35:    /*
                     36:     * Chain through each list block and for
                     37:     *  each element contained in the block
                     38:     *  insert the element into the set if not there.
                     39:     */
                     40:    for (arg1 = pb->list.listhead; arg1.type == D_LELEM;
                     41:       arg1 = BLKLOC(arg1)->lelem.listnext) {
                     42:          pb = BLKLOC(arg1);
                     43:          for (i = 0; i < pb->lelem.nused; i++) {
                     44:             j = pb->lelem.first + i;
                     45:             if (j >= pb->lelem.nelem)
                     46:                j -= pb->lelem.nelem;
                     47:             pd = &pb->lelem.lslots[j];
                     48:             pe = memb(ps, pd, hn = hash(pd), &res);
                     49:             if (res == 0) {
                     50:                ne = alcselem(pd,hn);
                     51:                 addmem(ps,ne,pe);
                     52:                 }
                     53:             }
                     54:       }
                     55:    }
                     56: 
                     57: Procblock(set,1)
                     58: #else SETS
                     59: char junk;                     /* prevent null object file  */
                     60: #endif SETS

unix.superglobalmegacorp.com

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