/* Frees memory allocated to NP */ void node_free(Node *np) { char c; for (c = 'a'; c <= 'z'; c++) { if (node_child(np, c) != NULL) node_free(node_child(np, c)); } free(np); }
/* Returns the last node of TRIE traversed when scanning the string S. If SI is * not NULL, it will store the address of some suffix of S not found. */ Node *trie_lookup(Trie *trie, char *s, char **si) { Node *np, *child; for (np = trie->root; *s != '\0'; s++) { child = node_child(np, *s); if (child == NULL) break; np = child; } /* Scribble down the address where search failed */ if (si != NULL) *si = s; return np; }
Boolean_t tgt_node_process(xmlTextReaderPtr r, tgt_node_t **node) { const xmlChar *name; const xmlChar *value; char **ap; xmlElementType node_type; tgt_node_t *n; tgt_node_t *an; n = *node; if (n == NULL) { n = node_alloc(); if (n == NULL) return (False); *node = n; } name = (xmlChar *)xmlTextReaderConstName(r); if (name == NULL) { node_free(n); *node = NULL; return (False); } node_type = (xmlElementType)xmlTextReaderNodeType(r); value = (xmlChar *)xmlTextReaderConstValue(r); if (node_type == XML_ELEMENT_NODE) { if (n->x_state != NodeAlloc) { n = node_child(n); *node = n; if (n == NULL) return (False); } if (xmlTextReaderAttributeCount(r) > 0) { for (ap = common_attr_list; *ap; ap++) { value = xmlTextReaderGetAttribute(r, (xmlChar *)*ap); if (value != NULL) { if ((an = node_alloc_attr(n)) == NULL) return (False); if (node_name(an, (xmlChar *)*ap) == False) { node_free(an); return (False); } if (node_value(an, value, True) == False) { node_free(an); return (False); } free((char *)value); } } } if (node_name(n, name) == False) { node_free(n); *node = NULL; return (False); } } else if ((value != NULL) && (node_type == XML_TEXT_NODE)) { if (node_value(n, value, True) == False) { node_free(n); *node = NULL; return (False); } } else if (node_type == XML_ELEMENT_DECL) { n = node_parent(n); if (n == NULL) return (False); *node = n; } else if (node_type == XML_COMMENT_NODE) { n = node_child(n); if (node_name(n, (xmlChar *)XML_COMMENT_STR) == False) { node_free(n); *node = NULL; return (False); } if (node_value(n, (xmlChar *)value, False) == False) { node_free(n); *node = NULL; return (False); } } else if (node_type != XML_DTD_NODE) { node_free(n); *node = NULL; return (False); } return (True); }