78 lines
2.8 KiB
C
78 lines
2.8 KiB
C
/************************************************************************
|
|
** **
|
|
** The YapTab/YapOr/OPTYap systems **
|
|
** **
|
|
** YapTab extends the Yap Prolog engine to support sequential tabling **
|
|
** YapOr extends the Yap Prolog engine to support or-parallelism **
|
|
** OPTYap extends the Yap Prolog engine to support or-parallel tabling **
|
|
** **
|
|
** **
|
|
** Yap Prolog was developed at University of Porto, Portugal **
|
|
** **
|
|
************************************************************************/
|
|
|
|
#define RationalMark 7 //0m0...111
|
|
#define IsRationalTerm(TERM) ((int) TERM == 7)
|
|
|
|
typedef struct term_array {
|
|
void* *terms;
|
|
void* *nodes;
|
|
size_t length;
|
|
size_t capacity;
|
|
} term_array;
|
|
|
|
void term_array_init(term_array *array, int capacity);
|
|
void term_array_free(term_array *array);
|
|
void term_array_push(term_array *array, void* t, void* n);
|
|
void* term_array_member(term_array array, void* t);
|
|
|
|
void term_array_init(term_array *array, int capacity) {
|
|
array->length = 0;
|
|
array->terms = malloc(capacity * sizeof(void*));
|
|
if (array->terms != NULL) {
|
|
array->capacity = capacity;
|
|
} else
|
|
Yap_Error(RESOURCE_ERROR_MEMORY, TermNil, "Out of memory."); // Handle out-of-memory
|
|
array->capacity = capacity;
|
|
array->nodes = malloc(capacity * sizeof(void*));
|
|
if (array->nodes == NULL)
|
|
Yap_Error(RESOURCE_ERROR_MEMORY, TermNil, "Out of memory."); // Handle out-of-memory
|
|
}
|
|
|
|
void term_array_free(term_array *array) {
|
|
free(array->terms);
|
|
free(array->nodes);
|
|
array->terms = NULL;
|
|
array->nodes = NULL;
|
|
array->length = 0;
|
|
array->capacity = 0;
|
|
}
|
|
|
|
void term_array_push(term_array *array, void* t, void* n) {
|
|
if (array->length == array->capacity) {
|
|
int new_capacity = array->capacity * 2;
|
|
void *new_terms = realloc(array->terms, new_capacity * sizeof(void*));
|
|
if (new_terms != NULL) {
|
|
array->terms = new_terms;
|
|
} else
|
|
Yap_Error(RESOURCE_ERROR_MEMORY, TermNil, "Out of memory."); // Handle out-of-memory
|
|
void *new_nodes = realloc(array->nodes, new_capacity * sizeof(void *));
|
|
if (new_nodes != NULL) {
|
|
array->nodes = new_nodes;
|
|
} else
|
|
Yap_Error(RESOURCE_ERROR_MEMORY, TermNil, "Out of memory."); // Handle out-of-memory
|
|
array->capacity = new_capacity;
|
|
}
|
|
array->terms[array->length] = t;
|
|
array->nodes[array->length] = n;
|
|
array->length++;
|
|
}
|
|
|
|
void* term_array_member(term_array array, void* t) {
|
|
int i;
|
|
for (i = 0; i < array.length; i++)
|
|
if (array.terms[i] == t) return array.nodes[i];
|
|
return NULL;
|
|
}
|
|
|