T Set_diff(T s, T t) { if (s == NULL) { assert(t); return copy(t, t->size); } else if (t == NULL) { return copy(s, s->size); } else { T set = Set_new(Arith_min(s->size, t->size), s->cmp, s->hash); assert(s->cmp == t->cmp && s->hash == t->hash); //<for each member q in t 112> int i; struct member *q; for (i = 0; i < t->size; i++) { for (q = t->buckets[i]; q; q = q->link) { if (!Set_member(s, q->member)) { //<add q->member to set 112> struct member *p; const void *member = q->member; int j = (*set->hash)(member) % set->size; //<add member to set 109> NEW(p); p->member = member; p->link = set->buckets[j]; set->buckets[j] = p; set->length++; } } } T u = t; t = s; s = u; //<for each member q in t 112> for (i = 0; i < t->size; i++) { for (q = t->buckets[i]; q; q = q->link) { if (!Set_member(s, q->member)) { //<add q->member to set 112> struct member *p; const void *member = q->member; int j = (*set->hash)(member) % set->size; //<add member to set 109> NEW(p); p->member = member; p->link = set->buckets[j]; set->buckets[j] = p; set->length++; } } } return set; } }
void xref(const char *name, FILE *fp, Table_T identifiers){ char buf[128]; if (name == NULL) name = ""; name = Atom_string(name); linenum = 1; while (getword(fp, buf, sizeof buf, first, rest)) { Set_T set; Table_T files; const char *id = Atom_string(buf); files = Table_get(identifiers, id); if (files == NULL) { files = Table_new(0, NULL, NULL); Table_put(identifiers, id, files); } set = Table_get(files, name); if (set == NULL) { set = Set_new(0, intcmp, inthash); Table_put(files, name, set); } { int *p = &linenum; if (!Set_member(set, p)) { NEW(p); *p = linenum; Set_put(set, p); } } } }
/*functions*/ T combine_if_match(T t, T s, int match) { T set = Set_new(Arith_min(s->m_size, t->m_size), s->m_compare, s->m_hash); /*for each member q in t*/ size_t i; struct element* q; for (i = 0; i < t->m_size; i++) { for (q = t->m_buckets[i]; q != NULL; q = q->m_next) { /*\for each member q in t*/ if (Set_member(s, q->m_value) == match) { /*add q->member to set*/ struct element* p; const void* member = q->m_value; size_t i = (*set->m_hash)(member) % set->m_size; /*add member to set*/ NEW(p); p->m_value = member; p->m_next = set->m_buckets[i]; set->m_buckets[i] = p; set->m_length++; /*\add member to set*/ /*\add q->member to set*/ } } } return set; }
T Set_minus(T t, T s) { if (t == NULL){ assert(s); return Set_new(s->size, s->cmp, s->hash); } else if (s == NULL) return copy(t, t->size); else { T set = Set_new(Arith_min(s->size, t->size), s->cmp, s->hash); assert(s->cmp == t->cmp && s->hash == t->hash); { int i; struct member *q; for (i = 0; i < t->size; i++) for (q = t->buckets[i]; q; q = q->link) if (!Set_member(s, q->member)) { struct member *p; const void *member = q->member; int i = (*set->hash)(member)%set->size; NEW(p); p->member = member; p->link = set->buckets[i]; set->buckets[i] = p; set->length++; } } return set; } }
int addToTable( Set_T nameSet, Table_T fpTable, fpPair pair) { const char * nameAtom = Atom_string(pair.name); if( !Set_member( nameSet, nameAtom) ) { Set_put( nameSet, nameAtom); addToTableHelp( fpTable, pair ); return 1; } else{ free (pair.name); free (pair.fp); return 0; } }
void xref(const char *name, FILE *fp, Table_T identifiers){ char buf[128]; if (name == NULL){ name = ""; } name = Atom_string(name); linenum = 1; while (getword(fp, buf, sizeof(buf), first, rest)){ Set_T set; Table_T files; const char *id = Atom_string(buf); // files <- file table in identifiers associated with id files = Table_get(identifiers, id); if (files == NULL){ files = Table_new(0, NULL, NULL); Table_put(identifiers, id, files); } // set <- set in files associated with name set = Table_get(files, name); if (set == NULL){ set = Set_new(0, intcmp, inthash); Table_put(files, name, set); } // add linenum to set, if necessary { int *p = &linenum; if (!Set_member(set, p)){ NEW(p); *p = linenum; Set_put(set, p); } } } }
int Oec_IdSet_member(T _this_, oe_id mid) { ID_ITEM item; item.mid = mid; int ret = Set_member(_this_->members, &item); return ret; }