/* Search the list of link title for a match */ static void find_page(const char *search_title, void *data) { size_t i; /* find matches where the search string is a substring of the title */ num_found_links = 0; for (i=0; i<num_page_links && num_found_links<MAX_FOUND_LINKS; ++i) if(xmlStrcasestr((xmlChar*)page_links[i].title,(xmlChar*)search_title)!=NULL) found_links[num_found_links++] = i; /* ignore if no matches, open if one match, or display a list of the first few matches */ if (num_found_links < 1) return; else if (num_found_links == 1) open_page(found_links[0]); else { if (cm_valid(cm_encycl_res)) cm_destroy(cm_encycl_res); cm_encycl_res = cm_create(page_links[found_links[0]].title, cm_encycl_res_handler); cm_set_pre_show_handler(cm_encycl_res, cm_encycl_res_pre_show_handler); for (i=1; i<num_found_links; i++) cm_add(cm_encycl_res, page_links[found_links[i]].title, NULL); cm_show_direct(cm_encycl_res, -1, -1); } }
/** * Output document */ static void edOutput(const char* filename, const XmlEdAction* ops, int ops_count, const edOptions* g_ops) { xmlDocPtr doc; int save_options = #if LIBXML_VERSION >= 20708 (g_ops->noblanks? 0 : XML_SAVE_WSNONSIG) | #endif (g_ops->preserveFormat? 0 : XML_SAVE_FORMAT) | (g_ops->omit_decl? XML_SAVE_NO_DECL : 0); int read_options = (g_ops->nonet? XML_PARSE_NONET : 0); xmlSaveCtxtPtr save; doc = xmlReadFile(filename, NULL, read_options); if (!doc) { cleanupNSArr(ns_arr); xmlCleanupParser(); xmlCleanupGlobals(); exit(EXIT_BAD_FILE); } edProcess(doc, ops, ops_count); /* avoid getting ASCII CRs in UTF-16/UCS-(2,4) text */ if ((xmlStrcasestr(doc->encoding, BAD_CAST "UTF") == 0 && xmlStrcasestr(doc->encoding, BAD_CAST "16") == 0) || (xmlStrcasestr(doc->encoding, BAD_CAST "UCS") == 0 && (xmlStrcasestr(doc->encoding, BAD_CAST "2") == 0 || xmlStrcasestr(doc->encoding, BAD_CAST "4") == 0))) { set_stdout_binary(); } save = xmlSaveToFilename(g_ops->inplace? filename : "-", NULL, save_options); xmlSaveDoc(save, doc); xmlSaveClose(save); xmlFreeDoc(doc); }
static int get_xml_double( xmlTextReaderPtr reader, double *value) { xmlChar *text; double temp; if ((text = get_xml_text(reader))!= NULL){ if (xmlStrcasestr(text,(xmlChar *)"nan")){ *value = DNAN; xmlFree(text); return 0; } else if (xmlStrcasestr(text,(xmlChar *)"-inf")){ *value = -DINF; xmlFree(text); return 0; } else if (xmlStrcasestr(text,(xmlChar *)"+inf") || xmlStrcasestr(text,(xmlChar *)"inf")){ *value = DINF; xmlFree(text); return 0; } if ( rrd_strtodbl((char *)text,NULL, &temp, NULL) != 2 ){ rrd_set_error("ling %d: get_xml_double from '%s' %s", xmlTextReaderGetParserLineNumber(reader), text,rrd_strerror(errno)); xmlFree(text); return -1; } xmlFree(text); *value = temp; return 0; } return -1; } /* get_xml_double */
/** * htmlSetMetaEncoding: * @doc: the document * @encoding: the encoding string * * Sets the current encoding in the Meta tags * NOTE: this will not change the document content encoding, just * the META flag associated. * * Returns 0 in case of success and -1 in case of error */ int htmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) { htmlNodePtr cur, meta = KD_NULL, head = KD_NULL; const xmlChar *content = KD_NULL; char newcontent[100]; if (doc == KD_NULL) return(-1); /* html isn't a real encoding it's just libxml2 way to get entities */ if (!xmlStrcasecmp(encoding, BAD_CAST "html")) return(-1); if (encoding != KD_NULL) { kdSnprintfKHR (newcontent, sizeof(newcontent), "text/html; charset=%s", (char *)encoding); newcontent[sizeof(newcontent) - 1] = 0; } cur = doc->children; /* * Search the html */ while (cur != KD_NULL) { if ((cur->type == XML_ELEMENT_NODE) && (cur->name != KD_NULL)) { if (xmlStrcasecmp(cur->name, BAD_CAST"html") == 0) break; if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) goto found_head; if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) goto found_meta; } cur = cur->next; } if (cur == KD_NULL) return(-1); cur = cur->children; /* * Search the head */ while (cur != KD_NULL) { if ((cur->type == XML_ELEMENT_NODE) && (cur->name != KD_NULL)) { if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0) break; if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { head = cur->parent; goto found_meta; } } cur = cur->next; } if (cur == KD_NULL) return(-1); found_head: head = cur; if (cur->children == KD_NULL) goto create; cur = cur->children; found_meta: /* * Search and update all the remaining the meta elements carrying * encoding informations */ while (cur != KD_NULL) { if ((cur->type == XML_ELEMENT_NODE) && (cur->name != KD_NULL)) { if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) { xmlAttrPtr attr = cur->properties; int http; const xmlChar *value; content = KD_NULL; http = 0; while (attr != KD_NULL) { if ((attr->children != KD_NULL) && (attr->children->type == XML_TEXT_NODE) && (attr->children->next == KD_NULL)) { value = attr->children->content; if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv")) && (!xmlStrcasecmp(value, BAD_CAST"Content-Type"))) http = 1; else { if ((value != KD_NULL) && (!xmlStrcasecmp(attr->name, BAD_CAST"content"))) content = value; } if ((http != 0) && (content != KD_NULL)) break; } attr = attr->next; } if ((http != 0) && (content != KD_NULL)) { meta = cur; break; } } } cur = cur->next; } create: if (meta == KD_NULL) { if ((encoding != KD_NULL) && (head != KD_NULL)) { /* * Create a new Meta element with the right attributes */ meta = xmlNewDocNode(doc, KD_NULL, BAD_CAST"meta", KD_NULL); if (head->children == KD_NULL) xmlAddChild(head, meta); else xmlAddPrevSibling(head->children, meta); xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type"); xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent); } } else { /* change the document only if there is a real encoding change */ if (xmlStrcasestr(content, encoding) == KD_NULL) { xmlSetProp(meta, BAD_CAST"content", BAD_CAST newcontent); } } return(0); }