static PointerArray *getNodesMatchingXPath(xmlNode *node, xmlChar *path) { if (!path) return NULL; xmlXPathObject *results_set; PointerArray *results_array; xmlNode *result_node; int n; // get results if (node) CONTEXT->node = node; results_set = xmlXPathEvalExpression(path, CONTEXT); if (!results_set) return NULL; // put them in the array results_array = createPointerArray(); if (results_set->nodesetval && results_set->nodesetval->nodeNr > 0) { for (n=0; n < results_set->nodesetval->nodeNr; n++) { result_node = results_set->nodesetval->nodeTab[n]; insertPointerIntoArray(results_array, result_node); } } // finish up xmlXPathFreeObject(results_set); CONTEXT->node = NULL; return results_array; }
SBOLObject* createSBOLObject(Document* doc, const char* uri) { if (!doc || !uri || isSBOLObjectURI(doc, uri)) return NULL; SBOLObject* obj = malloc(sizeof(SBOLObject)); obj->uri = createURIProperty(doc); obj->xml_annotations = createPointerArray(); setSBOLObjectURI(obj, uri); return obj; }
Collection* createCollection(Document* doc, const char* uri) { if (!doc || !uri || isSBOLObjectURI(doc, uri)) return NULL; Collection* col = malloc(sizeof(Collection)); col->doc = doc; col->base = createSBOLCompoundObject(doc, uri); col->components = createPointerArray(); registerCollection(col); return col; }
SequenceAnnotation* createSequenceAnnotation(Document* doc, const char* uri) { if (!doc || !uri || isSBOLObjectURI(doc, uri)) return NULL; SequenceAnnotation* ann = malloc(sizeof(SequenceAnnotation)); ann->doc = doc; ann->base = createSBOLObject(doc, uri); ann->genbankStart = createPositionProperty(); ann->genbankEnd = createPositionProperty(); //ann->strand = 1; ann->strand = createPolarityProperty(); ann->subComponent = NULL; ann->precedes = createPointerArray(); registerSequenceAnnotation(ann); return ann; }
SequenceAnnotation* copySequenceAnnotation(SequenceAnnotation* ann, char* id_modifier) { int i; char* copy_uri = augmentURI(getSequenceAnnotationURI(ann), id_modifier); SequenceAnnotation* copy = createSequenceAnnotation(ann->doc, copy_uri); setSequenceAnnotationStart(copy, getSequenceAnnotationStart(ann)); setSequenceAnnotationEnd(copy, getSequenceAnnotationEnd(ann)); setSequenceAnnotationStrand(copy, getSequenceAnnotationStrand(ann)); // Copy precedes property copy->precedes = createPointerArray(); char *target_uri; for (i = 0; i < getNumPointersInArray(ann->precedes); i++) { target_uri = (char *)getNthPointerInArray(ann->precedes, i); insertPointerIntoArray(copy->precedes, augmentURI(target_uri, id_modifier)); } // Copy SubComponent tree recursively if (ann->subComponent) { char* sub_com_uri = augmentURI(getDNAComponentURI(ann->subComponent), id_modifier); DNAComponent* sub_com_copy = createDNAComponent(ann->doc, sub_com_uri); setSequenceAnnotationSubComponent(copy, sub_com_copy); } return (SequenceAnnotation *)copy; }
static void resetProcessed() { deletePointerArray(PROCESSED); PROCESSED = createPointerArray(); }