Пример #1
0
Файл: set.c Проект: shihyu/cii
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;
    }
}
Пример #2
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 = 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;
}
Пример #4
0
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;
	}
}
Пример #5
0
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;
        }
}
Пример #6
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);
			}
		}
	}
}
Пример #7
0
int Oec_IdSet_member(T _this_, oe_id mid) {
    ID_ITEM item;
    item.mid = mid;
    int ret = Set_member(_this_->members, &item);
    return ret;
}