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; }
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; }
// 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; }
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; }
/** 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; } }