bool DataObject_hasFCData(DataObject* dataObject, FunctionalConstraint fc) { ModelNode* modelNode = dataObject->firstChild; while (modelNode != NULL) { if (modelNode->modelType == DataAttributeModelType) { DataAttribute* dataAttribute = (DataAttribute*) modelNode; if (dataAttribute->fc == fc) return true; } else if (modelNode->modelType == DataObjectModelType) { DataObject* dataObject = (DataObject*) modelNode; if (DataObject_hasFCData(dataObject, fc)) return true; } modelNode = modelNode->sibling; } return false; }
static MmsTypeSpecification* createFCNamedVariableFromDataObject(DataObject* dataObject, FunctionalConstraint fc) { /* Determine size of components TODO determine minimum count */ int elementCount = 0; int i = 0; MmsTypeSpecification* namedVariable = calloc(1, sizeof(MmsTypeSpecification)); namedVariable->name = dataObject->name; namedVariable->type = MMS_STRUCTURE; if (dataObject->dataAttributes != NULL) { elementCount += ArrayList_listSize((void**) (dataObject->dataAttributes)); } if (dataObject->subDataObjects != NULL) { elementCount += ArrayList_listSize((void**) (dataObject->subDataObjects)); } /* Allocate memory for components */ namedVariable->typeSpec.structure.elements = calloc(elementCount, sizeof(MmsTypeSpecification*)); elementCount = 0; /* Create components from data attributes */ if (dataObject->dataAttributes != NULL) { i = 0; while (dataObject->dataAttributes[i] != NULL) { if (dataObject->dataAttributes[i]->fc == fc) { namedVariable->typeSpec.structure.elements[elementCount] = createNamedVariableFromDataAttribute(dataObject->dataAttributes[i]); elementCount++; } i++; } } /* Create components from sub data objects */ if (dataObject->subDataObjects != NULL) { i = 0; while (dataObject->subDataObjects[i] != NULL) { if (DataObject_hasFCData(dataObject->subDataObjects[i], fc)) { namedVariable->typeSpec.structure.elements[elementCount] = createFCNamedVariableFromDataObject(dataObject->subDataObjects[i], fc); elementCount++; } i++; } } namedVariable->typeSpec.structure.elementCount = elementCount; return namedVariable; }
bool LogicalNode_hasFCData(LogicalNode* node, FunctionalConstraint fc) { DataObject* dataObject = (DataObject*) node->firstChild; while (dataObject != NULL) { if (DataObject_hasFCData(dataObject, fc)) return true; dataObject = (DataObject*) dataObject->sibling; } return false; }
static MmsTypeSpecification* createFCNamedVariable(LogicalNode* logicalNode, FunctionalConstraint fc) { int dataObjectCount = 0; int i = 0; MmsTypeSpecification* namedVariable = calloc(1, sizeof(MmsTypeSpecification)); namedVariable->name = FunctionalConstrained_toString(fc); namedVariable->type = MMS_STRUCTURE; while (logicalNode->dataObjects[i] != NULL) { if (DataObject_hasFCData(logicalNode->dataObjects[i], fc)) { dataObjectCount++; } i++; } namedVariable->typeSpec.structure.elementCount = dataObjectCount; namedVariable->typeSpec.structure.elements = calloc(dataObjectCount, sizeof(MmsTypeSpecification*)); i = 0; dataObjectCount = 0; while (logicalNode->dataObjects[i] != NULL) { if (DataObject_hasFCData(logicalNode->dataObjects[i], fc)) { namedVariable->typeSpec.structure.elements[dataObjectCount] = createFCNamedVariableFromDataObject(logicalNode->dataObjects[i], fc); dataObjectCount++; } i++; } return namedVariable; }