gretl_array *gretl_arrays_join (gretl_array *A, gretl_array *B, int *err) { gretl_array *C = NULL; if (A == NULL || B == NULL) { *err = E_DATA; } else if (A->type != B->type) { *err = E_TYPES; } else { int n = A->n + B->n; C = gretl_array_new(A->type, n, err); } if (!*err) { *err = gretl_array_copy_content(C, A, 0); } if (!*err) { *err = gretl_array_copy_content(C, B, A->n); } if (*err && C != NULL) { gretl_array_destroy(C); C = NULL; } return C; }
gretl_array *gretl_array_new (GretlType type, int n, int *err) { gretl_array *A; if (type != GRETL_TYPE_STRINGS && type != GRETL_TYPE_MATRICES && type != GRETL_TYPE_BUNDLES && type != GRETL_TYPE_LISTS) { *err = E_TYPES; return NULL; } else if (n < 0) { *err = E_DATA; return NULL; } A = malloc(sizeof *A); if (A == NULL) { *err = E_ALLOC; } else { A->type = type; A->n = n; A->data = NULL; if (n > 0) { *err = array_allocate_content(A); if (*err) { gretl_array_destroy(A); A = NULL; } } } return A; }
static int model_add_minfo_array (MODEL *pmod, midas_info *minfo, int nmidas) { gretl_array *A; int err = 0; A = gretl_array_new(GRETL_TYPE_BUNDLES, nmidas, &err); if (A != NULL) { midas_info *m; gretl_bundle *b; int i; for (i=0; i<nmidas && !err; i++) { b = gretl_bundle_new(); if (b == NULL) { err = E_ALLOC; } else { m = &minfo[i]; gretl_bundle_set_string(b, "lname", m->lnam0); gretl_bundle_set_string(b, "mname", m->mname); gretl_bundle_set_int(b, "prelag", m->prelag); gretl_bundle_set_int(b, "minlag", m->minlag); gretl_bundle_set_int(b, "maxlag", m->maxlag); gretl_bundle_set_int(b, "type", m->type); gretl_bundle_set_int(b, "nparm", m->nparm); err = gretl_array_set_bundle(A, i, b, 0); } } if (err) { gretl_array_destroy(A); } else { gretl_model_set_array_as_data(pmod, "midas_info", A); } } return err; }
gretl_array *gretl_array_deserialize (void *p1, void *p2, int *err) { xmlNodePtr node = p1; xmlDocPtr doc = p2; GretlType type = 0; int n = 0; gretl_array *A = NULL; if (xmlStrcmp(node->name, (XUC) "gretl-array")) { fprintf(stderr, "deserialize array: node is not gretl-array!\n"); *err = E_DATA; } else { type = gretl_xml_get_type_property(node); if (type == 0) { fprintf(stderr, "deserialize array: couldn't get array type\n"); *err = E_DATA; } } if (!*err && !gretl_xml_get_prop_as_int(node, "length", &n)) { fprintf(stderr, "deserialize array: couldn't get length\n"); *err = E_DATA; } if (!*err) { A = gretl_array_new(type, n, err); } if (A != NULL && n > 0) { *err = deserialize_array_elements(A, node->xmlChildrenNode, doc); if (*err) { gretl_array_destroy(A); A = NULL; } } return A; }
static void bundled_item_destroy (gpointer data) { bundled_item *item = data; #if BDEBUG fprintf(stderr, "bundled_item_destroy: type %d\n", item->type); if (item->type == GRETL_TYPE_STRING) { fprintf(stderr, " string: '%s'\n", (char *) item->data); } #endif switch (item->type) { case GRETL_TYPE_DOUBLE: case GRETL_TYPE_STRING: case GRETL_TYPE_SERIES: free(item->data); break; case GRETL_TYPE_MATRIX: gretl_matrix_free((gretl_matrix *) item->data); break; case GRETL_TYPE_MATRIX_REF: release_matrix_pointer((gretl_matrix **) &item->data); break; case GRETL_TYPE_BUNDLE: gretl_bundle_destroy((gretl_bundle *) item->data); break; case GRETL_TYPE_ARRAY: gretl_array_destroy((gretl_array*) item->data); break; default: break; } free(item->note); free(item); }
static int bundled_item_replace_data (bundled_item *item, GretlType type, void *ptr, int size, int copy) { int err = 0; if (ptr == item->data) { return 0; } if (item->type == GRETL_TYPE_DOUBLE) { double *dp = item->data; *dp = *(double *) ptr; } else if (item->type == GRETL_TYPE_STRING) { free(item->data); if (copy) { item->data = gretl_strdup((char *) ptr); } else { item->data = ptr; } } else if (item->type == GRETL_TYPE_MATRIX) { gretl_matrix_free(item->data); if (copy) { item->data = gretl_matrix_copy((gretl_matrix *) ptr); } else { item->data = ptr; } } else if (item->type == GRETL_TYPE_MATRIX_REF) { release_matrix_pointer((gretl_matrix **) &item->data); item->data = ptr; } else if (item->type == GRETL_TYPE_SERIES) { free(item->data); if (copy) { item->data = copyvec((const double *) ptr, size); } else { item->data = ptr; } item->size = size; } else if (item->type == GRETL_TYPE_BUNDLE) { gretl_bundle_destroy((gretl_bundle *) item->data); if (copy) { item->data = gretl_bundle_copy((gretl_bundle *) ptr, &err); } else { item->data = ptr; } } else if (item->type == GRETL_TYPE_ARRAY) { gretl_array_destroy((gretl_array*) item->data); if (copy) { item->data = gretl_array_copy((gretl_array *) ptr, &err); } else { item->data = ptr; } } else { return E_DATA; } if (!err && item->data == NULL) { err = E_ALLOC; } if (item->note != NULL) { free(item->note); item->note = NULL; } return err; }