void read_vertices (char filename [255]) /* reads the vertices from the specified file to the global variable G_Vertices and */ /* sets G_n and G_d */ /* The file must contain the vertices in the following polyhedra format of Avis and */ /* Fukuda: */ /* comments */ /* begin */ /* number of vertices n dimension + 1 type of coordinates */ /* 1 v1 */ /* ... */ /* 1 vn */ /* end or any other text (is ignored) */ { FILE *f; int i, j; T_Vertex *v; char data_type_string [255]; int data_type; G_Vertices = create_empty_set (); f = open_read (filename); fscanf (f, "%i %i %s ", &G_n, &G_d, data_type_string); G_d --; data_type = determine_data_type (data_type_string); if (data_type == RATIONAL_T) { fprintf (stderr, "\n***** WARNING: The vertex file is of rational type; the "); fprintf (stderr, "vertex coordinates\nwill be transformed to floating point "); fprintf (stderr, "values.\n"); } for (i = 0; i < G_n; i++) { v = create_vertex (); fscanf (f, "%*i "); /* skips the entry one */ v -> no = i; /* this assures v to be added at the end of the list */ if (data_type == REAL_T) for (j = 0; j < G_d; j++) fscanf (f, "%lg ", &(v -> coords [j])); else for (j = 0; j < G_d; j++) fread_rational_value (f, &(v -> coords [j])); add_element (&G_Vertices, v); }; fclose (f); }
int mxf_create_set(MXFHeaderMetadata* headerMetadata, const mxfKey* key, MXFMetadataSet** set) { MXFMetadataSet* newSet; mxfUUID uuid; CHK_ORET(create_empty_set(key, &newSet)); mxf_generate_uuid(&uuid); newSet->instanceUID = uuid; CHK_OFAIL(mxf_add_set(headerMetadata, newSet)); CHK_OFAIL(mxf_set_uuid_item(newSet, &MXF_ITEM_K(InterchangeObject, InstanceUID), &uuid)); *set = newSet; return 1; fail: mxf_free_set(&newSet); return 0; }
int mxf_read_and_return_set(MXFFile* mxfFile, const mxfKey* key, uint64_t len, MXFHeaderMetadata* headerMetadata, int addToHeaderMetadata, MXFMetadataSet** set) { MXFMetadataSet* newSet = NULL; MXFSetDef* setDef = NULL; uint64_t totalLen = 0; mxfLocalTag itemTag; uint16_t itemLen; int haveInstanceUID = 0; mxfKey itemKey; MXFItemDef* itemDef = NULL; MXFMetadataItem* newItem; assert(headerMetadata->primerPack != NULL); /* only read sets with known definitions */ if (mxf_find_set_def(headerMetadata->dataModel, key, &setDef)) { CHK_ORET(create_empty_set(key, &newSet)); /* read each item in the set*/ haveInstanceUID = 0; do { CHK_OFAIL(mxf_read_item_tl(mxfFile, &itemTag, &itemLen)); /* check the item tag is registered in the primer */ if (mxf_get_item_key(headerMetadata->primerPack, itemTag, &itemKey)) { /* only read items with known definition */ if (mxf_find_item_def_in_set_def(&itemKey, setDef, &itemDef)) { CHK_OFAIL(mxf_create_item(newSet, &itemKey, itemTag, &newItem)); newItem->isPersistent = 1; CHK_OFAIL(mxf_read_item(mxfFile, newItem, itemLen)); if (mxf_equals_key(&MXF_ITEM_K(InterchangeObject, InstanceUID), &itemKey)) { mxf_get_uuid(newItem->value, &newSet->instanceUID); haveInstanceUID = 1; } } /* skip items with unknown definition */ else { CHK_OFAIL(mxf_skip(mxfFile, (int64_t)itemLen)); } } /* skip items not registered in the primer. Log warning because the file is invalid */ else { mxf_log_warn("Encountered item with tag %d not registered in the primer" LOG_LOC_FORMAT, itemTag, LOG_LOC_PARAMS); CHK_OFAIL(mxf_skip(mxfFile, (int64_t)itemLen)); } totalLen += 4 + itemLen; } while (totalLen < len); if (totalLen != len) { mxf_log_error("Incorrect metadata set length encountered" LOG_LOC_FORMAT, LOG_LOC_PARAMS); goto fail; } if (!haveInstanceUID) { mxf_log_error("Metadata set does not have InstanceUID item" LOG_LOC_FORMAT, LOG_LOC_PARAMS); goto fail; } /* ok to add set */ if (addToHeaderMetadata) { CHK_OFAIL(mxf_add_set(headerMetadata, newSet)); } *set = newSet; return 1; } /* skip the set if the def is unknown */ CHK_ORET(mxf_skip(mxfFile, (int64_t)len)); *set = NULL; return 2; fail: mxf_free_set(&newSet); return 0; }