|
|
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.