Example #1
0
int unify_variable2(wam_t *wam, var_t *v1, var_t *v2)
{
	if (v1 == NULL || v2 == NULL) return 0;
	v1 = deref(v1);
	v2 = deref(v2);
	if (v1 == v2) return 1;

	if (v1->tag == REF) {
		trail_add(wam->trail, v1);
		var_copy(v1, v2);
		return 1;
	}

	if (v2->tag == REF) {
		trail_add(wam->trail, v2);
		var_copy(v2, v1);
		return 1;
	}

	if (v1->tag == CON && v2->tag == CON) {
		if (strcmp(v1->value, v2->value) == 0)
			return 1;
		else
			return 0;
	}

	if ((v1->tag == LIS && v2->tag == LIS) ||
			(v1->tag == STR && v2->tag == STR)) {
		if (unify_variable2(wam, v1->head, v2->head) &&
				unify_variable2(wam, v1->tail, v2->tail))
			return 1;
	}
   	return 0;
}
Example #2
0
int
libcall_arr_min_max(id_item_t **args, int *rettypes, void **retvals)
{
	arr_item_t *aitem;
	arr_iterate_t *iter;
	arr_t *arr;
	id_item_t *arg1;
	struct variable *tmp;
	struct variable *min, *max;

	assert(args != NULL && args[0] != NULL);

	DEBUG(LOG_DEFAULT, "arr_min_max executed\n");

	arg1 = args[0];

	CHECK_TYPE(arg1, ID_ARR);

	arr = arg1->arr;

	if (arr->nitems == 0) {
		print_warn("array is empty\n");
		return 1;
	}

	min = xmalloc(sizeof(*min));
	max = xmalloc(sizeof(*max));
	var_initv(min, max, NULL);

	iter = array_iterate_new(arr);

	array_iterate(iter, &aitem);
	var_copy(min, aitem->var);
	var_copy(max, aitem->var);

	while (array_iterate(iter, &aitem)) {
		tmp = aitem->var;
		if (varop_cmp(min, tmp) == -1)
			var_copy(min, tmp);
		if (varop_cmp(max, tmp) == 1)
			var_copy(max, tmp);
	}

	array_iterate_free(iter);

	rettypes[0] = ID_VAR;
	rettypes[1] = ID_VAR;
	retvals[0] = min;
	retvals[1] = max;

	return 0;
}
Example #3
0
// int put_list(wam_t *wam, char *headname, char *tailname, char *argname) { return 0; }
int put_value(wam_t *wam, char *varname, char *argname)
{
	var_t *Vi = wam_get_ref(wam, varname);
	var_t *An = wam_get_ref(wam, argname);
	var_copy(An, Vi);
	wam->pc += 1;
	return 0;
}
Example #4
0
int get_variable(wam_t *wam, char *regname1, char *regname2)
{
	var_t *vn = wam_get_ref(wam, regname1);
	var_t *Ai = wam_get_ref(wam, regname2);
	var_copy(vn, Ai);

	wam->pc += 1;
	return 0;
}
Example #5
0
/** Deep copy another var into one. The new structure will share no memory
  * with the original.
  * \param self The destination var
  * \param orig The original var
  */
void var_copy (var *self, var *orig) {
    if (self->type == VAR_STR) {
        free (self->value.sval);
        self->value.sval = NULL;
    }
    
    if (self->type == VAR_ARRAY || self->type == VAR_DICT) {
        var *c = self->value.arr.first;
        var *nc;
        
        while (c) {
            nc = c->next;
            var_free (c);
            c = nc;
        }
        self->value.arr.first = self->value.arr.last = NULL;
        self->value.arr.cachepos = -1;
        self->value.arr.cachenode = NULL;
        self->value.arr.count = 0;
    }

    self->type = VAR_NULL;
    var *crsr;
    
    switch (orig->type) {
        case VAR_NULL:
            break;
        
        case VAR_INT:
            var_set_int (self, var_get_int (orig));
            break;
        
        case VAR_DOUBLE:
            var_set_double (self, var_get_double (orig));
            break;
        
        case VAR_STR:
            var_set_str (self, var_get_str (orig));
            break;
        
        case VAR_ARRAY:
            self->type = VAR_ARRAY;
            self->value.arr.first = self->value.arr.last = NULL;
            self->value.arr.cachepos = -1;
            self->value.arr.cachenode = NULL;
            self->value.arr.count = 0;
            crsr = orig->value.arr.first;
            while (crsr) {
                var *nvar = var_alloc();
                nvar->id[0] = 0;
                nvar->hashcode = 0;
                var_copy (nvar, crsr);
                var_link (nvar, self);
                crsr = crsr->next;
            }
            break;
        
        case VAR_DICT:
            self->type = VAR_DICT;
            self->value.arr.first = self->value.arr.last = NULL;
            self->value.arr.cachepos = -1;
            self->value.arr.cachenode = NULL;
            self->value.arr.count = 0;
            crsr = orig->value.arr.first;
            while (crsr) {
                var *nvar = var_alloc();
                strcpy (nvar->id, crsr->id);
                nvar->hashcode = crsr->hashcode;
                var_copy (nvar, crsr);
                var_link (nvar, self);
                crsr = crsr->next;
            }
            break;
    }
}