|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: #ifdef SETS ! 3: ! 4: /* ! 5: * insert(S,x) - insert element x into set S if not already there ! 6: * (always succeeds and returns S). ! 7: */ ! 8: ! 9: Xinsert(nargs,arg2,arg1,arg0) ! 10: int nargs; ! 11: struct descrip arg0, arg1, arg2; ! 12: { ! 13: register struct descrip *pd; ! 14: register int hn; ! 15: int res; ! 16: extern struct b_selem *alcselem(); ! 17: extern struct descrip *memb(); ! 18: ! 19: DeRef(arg1) ! 20: DeRef(arg2) ! 21: arg0 = arg1; ! 22: ! 23: if (QUAL(arg1) || TYPE(arg1) != T_SET) ! 24: runerr(119,&arg1); ! 25: ! 26: /* ! 27: * We may need at most one new element. ! 28: */ ! 29: hneed(sizeof(struct b_selem)); ! 30: hn = hash(&arg2); ! 31: /* ! 32: * If arg2 is a member of set arg1 then res will have the ! 33: * value 1 and pd will have a pointer to the descriptor ! 34: * that points to that member. ! 35: * If arg2 is not a member of the set then res will have ! 36: * the value 0 and pd will point to the descriptor ! 37: * which should point to the member - thus we know where ! 38: * to link in the new element without having to do any ! 39: * repetitive looking. ! 40: */ ! 41: pd = memb(BLKLOC(arg1),&arg2,hn,&res); ! 42: if (res == 0) ! 43: /* ! 44: * The element is not in the set - insert it. ! 45: */ ! 46: addmem(BLKLOC(arg1),alcselem(&arg2,hn),pd); ! 47: } ! 48: ! 49: Procblock(insert,2) ! 50: ! 51: #else SETS ! 52: char junk; /* prevent null object file */ ! 53: #endif SETS
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.