1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * HTMLtree.c : implementation of access function for an HTML tree.
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_HTML_ENABLED
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> /* for memset() only ! */
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_CTYPE_H
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <ctype.h>
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef HAVE_STDLIB_H
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h>
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLparser.h>
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/HTMLtree.h>
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/entities.h>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/valid.h>
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlerror.h>
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/globals.h>
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#include "buf.h"
3494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
3794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Getting/Setting encoding meta tags			*
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlGetMetaEncoding:
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Encoding definition lookup in the Meta tags
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the current encoding as flagged in the HTML source
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlGetMetaEncoding(htmlDocPtr doc) {
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlNodePtr cur;
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *content;
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *encoding;
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = doc->children;
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Search the html
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"html"))
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"head"))
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_head;
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"meta"))
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_meta;
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Search the head
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"head"))
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"meta"))
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_meta;
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_head:
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Search the meta elements
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_meta:
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrEqual(cur->name, BAD_CAST"meta")) {
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr attr = cur->properties;
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int http;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *value;
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		content = NULL;
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		http = 0;
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (attr != NULL) {
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((attr->children != NULL) &&
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        (attr->children->type == XML_TEXT_NODE) &&
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        (attr->children->next == NULL)) {
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = attr->children->content;
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv"))
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 && (!xmlStrcasecmp(value, BAD_CAST"Content-Type")))
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    http = 1;
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			else if ((value != NULL)
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 && (!xmlStrcasecmp(attr->name, BAD_CAST"content")))
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    content = value;
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((http != 0) && (content != NULL))
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    goto found_content;
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_content:
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    encoding = xmlStrstr(content, BAD_CAST"charset=");
13194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (encoding == NULL)
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	encoding = xmlStrstr(content, BAD_CAST"Charset=");
13394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (encoding == NULL)
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	encoding = xmlStrstr(content, BAD_CAST"CHARSET=");
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	encoding += 8;
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	encoding = xmlStrstr(content, BAD_CAST"charset =");
13994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	if (encoding == NULL)
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    encoding = xmlStrstr(content, BAD_CAST"Charset =");
14194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	if (encoding == NULL)
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    encoding = xmlStrstr(content, BAD_CAST"CHARSET =");
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (encoding != NULL)
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    encoding += 9;
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	while ((*encoding == ' ') || (*encoding == '\t')) encoding++;
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(encoding);
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSetMetaEncoding:
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
15694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sets the current encoding in the Meta tags
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NOTE: this will not change the document content encoding, just
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the META flag associated.
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSetMetaEncoding(htmlDocPtr doc, const xmlChar *encoding) {
165df143a5041f03a22808b59c76698770b74692815Selim Gurun    htmlNodePtr cur, meta = NULL, head = NULL;
166df143a5041f03a22808b59c76698770b74692815Selim Gurun    const xmlChar *content = NULL;
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char newcontent[100];
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    newcontent[0] = 0;
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
174df143a5041f03a22808b59c76698770b74692815Selim Gurun    /* html isn't a real encoding it's just libxml2 way to get entities */
175df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (!xmlStrcasecmp(encoding, BAD_CAST "html"))
176df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(-1);
177df143a5041f03a22808b59c76698770b74692815Selim Gurun
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	snprintf(newcontent, sizeof(newcontent), "text/html; charset=%s",
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (char *)encoding);
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	newcontent[sizeof(newcontent) - 1] = 0;
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = doc->children;
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Search the html
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrcasecmp(cur->name, BAD_CAST"html") == 0)
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0)
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_head;
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0)
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_meta;
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Search the head
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrcasecmp(cur->name, BAD_CAST"head") == 0)
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		break;
211df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) {
212df143a5041f03a22808b59c76698770b74692815Selim Gurun                head = cur->parent;
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		goto found_meta;
214df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_head:
221df143a5041f03a22808b59c76698770b74692815Selim Gurun    head = cur;
222df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (cur->children == NULL)
223df143a5041f03a22808b59c76698770b74692815Selim Gurun        goto create;
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = cur->children;
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectfound_meta:
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
228df143a5041f03a22808b59c76698770b74692815Selim Gurun     * Search and update all the remaining the meta elements carrying
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * encoding informations
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((cur->type == XML_ELEMENT_NODE) && (cur->name != NULL)) {
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (xmlStrcasecmp(cur->name, BAD_CAST"meta") == 0) {
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlAttrPtr attr = cur->properties;
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		int http;
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		const xmlChar *value;
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		content = NULL;
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		http = 0;
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (attr != NULL) {
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if ((attr->children != NULL) &&
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        (attr->children->type == XML_TEXT_NODE) &&
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        (attr->children->next == NULL)) {
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			value = attr->children->content;
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			if ((!xmlStrcasecmp(attr->name, BAD_CAST"http-equiv"))
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			 && (!xmlStrcasecmp(value, BAD_CAST"Content-Type")))
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    http = 1;
248df143a5041f03a22808b59c76698770b74692815Selim Gurun			else
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        {
25094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                           if ((value != NULL) &&
251df143a5041f03a22808b59c76698770b74692815Selim Gurun                               (!xmlStrcasecmp(attr->name, BAD_CAST"content")))
252df143a5041f03a22808b59c76698770b74692815Selim Gurun			       content = value;
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        if ((http != 0) && (content != NULL))
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    break;
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    attr = attr->next;
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if ((http != 0) && (content != NULL)) {
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    meta = cur;
261df143a5041f03a22808b59c76698770b74692815Selim Gurun		    break;
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
268df143a5041f03a22808b59c76698770b74692815Selim Guruncreate:
269df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (meta == NULL) {
270df143a5041f03a22808b59c76698770b74692815Selim Gurun        if ((encoding != NULL) && (head != NULL)) {
271df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
272df143a5041f03a22808b59c76698770b74692815Selim Gurun             * Create a new Meta element with the right attributes
273df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
274df143a5041f03a22808b59c76698770b74692815Selim Gurun
275df143a5041f03a22808b59c76698770b74692815Selim Gurun            meta = xmlNewDocNode(doc, NULL, BAD_CAST"meta", NULL);
276df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (head->children == NULL)
277df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAddChild(head, meta);
278df143a5041f03a22808b59c76698770b74692815Selim Gurun            else
279df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAddPrevSibling(head->children, meta);
280df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlNewProp(meta, BAD_CAST"http-equiv", BAD_CAST"Content-Type");
281df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlNewProp(meta, BAD_CAST"content", BAD_CAST newcontent);
282df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
283df143a5041f03a22808b59c76698770b74692815Selim Gurun    } else {
28494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        /* remove the meta tag if NULL is passed */
28594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        if (encoding == NULL) {
28694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            xmlUnlinkNode(meta);
28794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun            xmlFreeNode(meta);
28894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        }
289df143a5041f03a22808b59c76698770b74692815Selim Gurun        /* change the document only if there is a real encoding change */
29094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        else if (xmlStrcasestr(content, encoding) == NULL) {
291df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlSetProp(meta, BAD_CAST"content", BAD_CAST newcontent);
292df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
293df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
294df143a5041f03a22808b59c76698770b74692815Selim Gurun
295df143a5041f03a22808b59c76698770b74692815Selim Gurun
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * booleanHTMLAttrs:
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * These are the HTML attributes which will be output
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * in minimized form, i.e. <option selected="selected"> will be
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * output as <option selected>, as per XSLT 1.0 16.2 "HTML Output Method"
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char* htmlBooleanAttrs[] = {
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  "checked", "compact", "declare", "defer", "disabled", "ismap",
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  "multiple", "nohref", "noresize", "noshade", "nowrap", "readonly",
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  "selected", NULL
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlIsBooleanAttr:
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name of the attribute to check
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Determine if a given attribute is a boolean attribute.
31994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: false if the attribute is not boolean, true otherwise.
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlIsBooleanAttr(const xmlChar *name)
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i = 0;
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (htmlBooleanAttrs[i] != NULL) {
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrcasecmp((const xmlChar *)htmlBooleanAttrs[i], name) == 0)
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 1;
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
33660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/*
33760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * private routine exported from xmlIO.c
33860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */
33960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlOutputBufferPtr
34060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder);
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
34394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Output error handlers				*
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveErrMemory:
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveErrMemory(const char *extra)
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_OUTPUT, XML_ERR_NO_MEMORY, NULL, NULL, extra);
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveErr:
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @code:  the error number
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the location of the error.
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveErr(int code, xmlNodePtr node, const char *extra)
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *msg = NULL;
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch(code) {
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_SAVE_NOT_UTF8:
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = "string is not in UTF-8\n";
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SAVE_CHAR_INVALID:
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = "invalid character value\n";
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SAVE_UNKNOWN_ENCODING:
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = "unknown encoding %s\n";
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	case XML_SAVE_NO_DOCTYPE:
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = "HTML has no DOCTYPE\n";
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    break;
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	default:
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    msg = "unexpected error number\n";
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlSimpleError(XML_FROM_OUTPUT, code, node, msg, extra);
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
39294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Dumping HTML tree content to a simple buffer		*
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
39794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * htmlBufNodeDumpFormat:
39894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @buf:  the xmlBufPtr output
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too.
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
40794442ad4107000e6d49f9b85a46a591495a57632Selim Gurunstatic size_t
40894442ad4107000e6d49f9b85a46a591495a57632Selim GurunhtmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur,
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           int format) {
41094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    size_t use;
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr outbuf;
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) {
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (outbuf == NULL) {
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlSaveErrMemory("allocating HTML output buffer");
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return (-1);
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(outbuf, 0, (size_t) sizeof(xmlOutputBuffer));
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->buffer = buf;
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->encoder = NULL;
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->writecallback = NULL;
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->closecallback = NULL;
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->context = NULL;
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    outbuf->written = 0;
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
43394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    use = xmlBufUse(buf);
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlNodeDumpFormatOutput(outbuf, doc, cur, NULL, format);
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(outbuf);
43694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    ret = xmlBufUse(buf) - use;
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDump:
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too,
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns are added.
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of byte written or -1 in case of error
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDump(xmlBufferPtr buf, xmlDocPtr doc, xmlNodePtr cur) {
45394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlBufPtr buffer;
45494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    size_t ret;
45594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
45694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if ((buf == NULL) || (cur == NULL))
45794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return(-1);
45894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
46094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    buffer = xmlBufFromBuffer(buf);
46194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (buffer == NULL)
46294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return(-1);
46394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
46494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    ret = htmlBufNodeDumpFormat(buffer, doc, cur, 1);
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
46694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    xmlBufBackToBuffer(buffer);
46794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
46894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    if (ret > INT_MAX)
46994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun        return(-1);
47094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    return((int) ret);
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFileFormat:
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  the FILE pointer
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too.
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: if encoding == NULL try to save in the doc encoding
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure.
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFileFormat(FILE *out, xmlDocPtr doc,
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	               xmlNodePtr cur, const char *encoding, int format) {
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr buf;
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncodingHandlerPtr handler = NULL;
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlCharEncoding enc;
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	enc = xmlParseCharEncoding(encoding);
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (enc != XML_CHAR_ENCODING_UTF8) {
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (handler == NULL)
503df143a5041f03a22808b59c76698770b74692815Selim Gurun		htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Fallback to HTML or ASCII when the encoding is unspecified
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("HTML");
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("ascii");
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
51594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /*
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * save the content to a temp buffer.
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf = xmlOutputBufferCreateFile(out, handler);
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) return(0);
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlOutputBufferClose(buf);
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFile:
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @out:  the FILE pointer
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too,
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns are added.
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFile(FILE *out, xmlDocPtr doc, xmlNodePtr cur) {
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlNodeDumpFileFormat(out, doc, cur, NULL, 1);
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDumpMemoryFormat:
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem:  OUT: the memory pointer
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  OUT: the memory length
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document in memory and return the xmlChar * and it's size.
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It's up to the caller to free the memory.
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDumpMemoryFormat(xmlDocPtr cur, xmlChar**mem, int *size, int format) {
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr buf;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncodingHandlerPtr handler = NULL;
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *encoding;
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((mem == NULL) || (size == NULL))
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*mem = NULL;
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*size = 0;
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    encoding = (const char *) htmlGetMetaEncoding(cur);
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlCharEncoding enc;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	enc = xmlParseCharEncoding(encoding);
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (enc != cur->charset) {
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->charset != XML_CHAR_ENCODING_UTF8) {
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Not supported yet
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*mem = NULL;
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		*size = 0;
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return;
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
584df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (handler == NULL)
585df143a5041f03a22808b59c76698770b74692815Selim Gurun                htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
586df143a5041f03a22808b59c76698770b74692815Selim Gurun
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Fallback to HTML or ASCII when the encoding is unspecified
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("HTML");
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("ascii");
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
60060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    buf = xmlAllocOutputBufferInternal(handler);
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) {
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*mem = NULL;
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*size = 0;
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
607df143a5041f03a22808b59c76698770b74692815Selim Gurun    htmlDocContentDumpFormatOutput(buf, cur, NULL, format);
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferFlush(buf);
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf->conv != NULL) {
61194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	*size = xmlBufUse(buf->conv);
61294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	*mem = xmlStrndup(xmlBufContent(buf->conv), *size);
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
61494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	*size = xmlBufUse(buf->buffer);
61594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	*mem = xmlStrndup(xmlBufContent(buf->buffer), *size);
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (void)xmlOutputBufferClose(buf);
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDumpMemory:
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @mem:  OUT: the memory pointer
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  OUT: the memory length
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document in memory and return the xmlChar * and it's size.
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * It's up to the caller to free the memory.
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDumpMemory(xmlDocPtr cur, xmlChar**mem, int *size) {
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	htmlDocDumpMemoryFormat(cur, mem, size, 1);
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
63794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Dumping HTML tree content to an I/O output buffer	*
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid xmlNsListDumpOutput(xmlOutputBufferPtr buf, xmlNsPtr cur);
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDtdDumpOutput:
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
64894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: check whether encoding is needed
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the HTML document DTD, if any.
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	          const char *encoding ATTRIBUTE_UNUSED) {
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDtdPtr cur = doc->intSubset;
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	htmlSaveErr(XML_SAVE_NO_DOCTYPE, (xmlNodePtr) doc, NULL);
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, "<!DOCTYPE ");
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, (const char *)cur->name);
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->ExternalID != NULL) {
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, " PUBLIC ");
66694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlBufWriteQuotedString(buf->buffer, cur->ExternalID);
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->SystemID != NULL) {
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, " ");
66994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	    xmlBufWriteQuotedString(buf->buffer, cur->SystemID);
67094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	}
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }  else if (cur->SystemID != NULL) {
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, " SYSTEM ");
67394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	xmlBufWriteQuotedString(buf->buffer, cur->SystemID);
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, ">\n");
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAttrDumpOutput:
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the attribute pointer
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML attribute
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAttrDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur,
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           const char *encoding ATTRIBUTE_UNUSED) {
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
69394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun     * The html output method should not escape a & character
69494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun     * occurring in an attribute value immediately followed by
69594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun     * a { character (see Section B.7.1 of the HTML 4.0 Recommendation).
69694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun     * This is implemented in xmlEncodeEntitiesReentrant
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, " ");
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, ":");
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, (const char *)cur->name);
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->children != NULL) && (!htmlIsBooleanAttr(cur->name))) {
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	value = xmlNodeListGetString(doc, cur->children, 0);
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (value) {
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "=");
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->ns == NULL) && (cur->parent != NULL) &&
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent->ns == NULL) &&
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((!xmlStrcasecmp(cur->name, BAD_CAST "href")) ||
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	         (!xmlStrcasecmp(cur->name, BAD_CAST "action")) ||
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (!xmlStrcasecmp(cur->name, BAD_CAST "src")) ||
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((!xmlStrcasecmp(cur->name, BAD_CAST "name")) &&
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (!xmlStrcasecmp(cur->parent->name, BAD_CAST "a"))))) {
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *escaped;
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *tmp = value;
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		while (IS_BLANK_CH(*tmp)) tmp++;
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
72494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		/*
72594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		 * the < and > have already been escaped at the entity level
72694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		 * And doing so here breaks server side includes
72794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		 */
72894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		escaped = xmlURIEscapeStr(tmp, BAD_CAST"@/:=?;#%&,+<>");
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (escaped != NULL) {
73094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    xmlBufWriteQuotedString(buf->buffer, escaped);
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(escaped);
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
73394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		    xmlBufWriteQuotedString(buf->buffer, value);
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
73694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun		xmlBufWriteQuotedString(buf->buffer, value);
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlFree(value);
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else  {
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "=\"\"");
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlAttrListDumpOutput:
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the first attribute pointer
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a list of HTML attributes
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlAttrListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, xmlAttrPtr cur, const char *encoding) {
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlAttrDumpOutput(buf, doc, cur, encoding);
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeListDumpOutput:
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the first node
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node list, recursive behaviour,children are printed too.
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeListDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	               xmlNodePtr cur, const char *encoding, int format) {
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) {
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlNodeDumpFormatOutput(buf, doc, cur, encoding, format);
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	cur = cur->next;
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpFormatOutput:
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too.
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 xmlNodePtr cur, const char *encoding, int format) {
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const htmlElemDesc * info;
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (buf == NULL)) {
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Special cases.
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == XML_DTD_NODE)
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type == XML_HTML_DOCUMENT_NODE) ||
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (cur->type == XML_DOCUMENT_NODE)){
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	htmlDocContentDumpOutput(buf, (xmlDocPtr) cur, encoding);
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == XML_ATTRIBUTE_NODE) {
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlAttrDumpOutput(buf, doc, (xmlAttrPtr) cur, encoding);
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == HTML_TEXT_NODE) {
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->content != NULL) {
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((cur->name == (const xmlChar *)xmlStringText) ||
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 (cur->name != (const xmlChar *)xmlStringTextNoenc)) &&
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((cur->parent == NULL) ||
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 ((xmlStrcasecmp(cur->parent->name, BAD_CAST "script")) &&
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		  (xmlStrcasecmp(cur->parent->name, BAD_CAST "style"))))) {
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlChar *buffer;
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		buffer = xmlEncodeEntitiesReentrant(doc, cur->content);
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (buffer != NULL) {
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlOutputBufferWriteString(buf, (const char *)buffer);
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(buffer);
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    } else {
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlOutputBufferWriteString(buf, (const char *)cur->content);
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == HTML_COMMENT_NODE) {
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->content != NULL) {
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "<!--");
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, (const char *)cur->content);
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "-->");
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == HTML_PI_NODE) {
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->name == NULL)
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return;
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, "<?");
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, (const char *)cur->name);
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->content != NULL) {
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, " ");
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, (const char *)cur->content);
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, ">");
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == HTML_ENTITY_REF_NODE) {
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, "&");
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, (const char *)cur->name);
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, ";");
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->type == HTML_PRESERVE_NODE) {
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (cur->content != NULL) {
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, (const char *)cur->content);
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Get specific HTML info for that node.
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->ns == NULL)
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = htmlTagLookup(cur->name);
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	info = NULL;
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, "<");
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, ":");
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, (const char *)cur->name);
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->nsDef)
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlNsListDumpOutput(buf, cur->nsDef);
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->properties != NULL)
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlAttrListDumpOutput(buf, doc, cur->properties, encoding);
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((info != NULL) && (info->empty)) {
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, ">");
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((format) && (!info->isinline) && (cur->next != NULL)) {
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->next->type != HTML_TEXT_NODE) &&
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->next->type != HTML_ENTITY_REF_NODE) &&
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent != NULL) &&
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent->name != NULL) &&
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent->name[0] != 'p')) /* p, pre, param */
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlOutputBufferWriteString(buf, "\n");
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((cur->type == XML_ELEMENT_NODE) || (cur->content == NULL)) &&
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->children == NULL)) {
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((info != NULL) && (info->saveEndTag != 0) &&
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrcmp(BAD_CAST info->name, BAD_CAST "html")) &&
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (xmlStrcmp(BAD_CAST info->name, BAD_CAST "body"))) {
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, ">");
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "></");
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlOutputBufferWriteString(buf, ":");
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, (const char *)cur->name);
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, ">");
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((format) && (cur->next != NULL) &&
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (info != NULL) && (!info->isinline)) {
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((cur->next->type != HTML_TEXT_NODE) &&
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->next->type != HTML_ENTITY_REF_NODE) &&
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent != NULL) &&
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent->name != NULL) &&
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		(cur->parent->name[0] != 'p')) /* p, pre, param */
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlOutputBufferWriteString(buf, "\n");
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return;
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, ">");
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->type != XML_ELEMENT_NODE) &&
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->content != NULL)) {
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * Uses the OutputBuffer property to automatically convert
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * invalids to charrefs
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlOutputBufferWriteString(buf, (const char *) cur->content);
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->children != NULL) {
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((format) && (info != NULL) && (!info->isinline) &&
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->children->type != HTML_TEXT_NODE) &&
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->children->type != HTML_ENTITY_REF_NODE) &&
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->children != cur->last) &&
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->name != NULL) &&
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->name[0] != 'p')) /* p, pre, param */
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "\n");
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	htmlNodeListDumpOutput(buf, doc, cur->children, encoding, format);
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((format) && (info != NULL) && (!info->isinline) &&
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->last->type != HTML_TEXT_NODE) &&
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->last->type != HTML_ENTITY_REF_NODE) &&
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->children != cur->last) &&
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->name != NULL) &&
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->name[0] != 'p')) /* p, pre, param */
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "\n");
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, "</");
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur->ns != NULL) && (cur->ns->prefix != NULL)) {
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlOutputBufferWriteString(buf, (const char *)cur->ns->prefix);
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlOutputBufferWriteString(buf, ":");
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, (const char *)cur->name);
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, ">");
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((format) && (info != NULL) && (!info->isinline) &&
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	(cur->next != NULL)) {
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->next->type != HTML_TEXT_NODE) &&
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->next->type != HTML_ENTITY_REF_NODE) &&
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->parent != NULL) &&
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->parent->name != NULL) &&
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (cur->parent->name[0] != 'p')) /* p, pre, param */
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlOutputBufferWriteString(buf, "\n");
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlNodeDumpOutput:
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current node
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML node, recursive behaviour,children are printed too,
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns/spaces are added.
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlNodeDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc,
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           xmlNodePtr cur, const char *encoding) {
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlNodeDumpFormatOutput(buf, doc, cur, encoding, 1);
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocContentDumpFormatOutput:
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document.
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocContentDumpFormatOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                       const char *encoding, int format) {
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int type;
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buf == NULL) || (cur == NULL))
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * force to output the stuff as HTML, especially for entities
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = cur->type;
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->type = XML_HTML_DOCUMENT_NODE;
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->intSubset != NULL) {
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlDtdDumpOutput(buf, cur, NULL);
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->children != NULL) {
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        htmlNodeListDumpOutput(buf, cur, cur->children, encoding, format);
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferWriteString(buf, "\n");
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->type = (xmlElementType) type;
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocContentDumpOutput:
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:  the HTML buffer output
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding:  the encoding string
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document. Formating return/spaces are added.
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocContentDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr cur,
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	                 const char *encoding) {
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlDocContentDumpFormatOutput(buf, cur, encoding, 1);
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *		Saving functions front-ends				*
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlDocDump:
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @f:  the FILE*
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to an open FILE.
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure.
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlDocDump(FILE *f, xmlDocPtr cur) {
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr buf;
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncodingHandlerPtr handler = NULL;
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *encoding;
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (f == NULL)) {
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(-1);
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    encoding = (const char *) htmlGetMetaEncoding(cur);
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlCharEncoding enc;
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	enc = xmlParseCharEncoding(encoding);
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (enc != cur->charset) {
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->charset != XML_CHAR_ENCODING_UTF8) {
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Not supported yet
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (handler == NULL)
1086df143a5041f03a22808b59c76698770b74692815Selim Gurun		htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else {
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Fallback to HTML or ASCII when the encoding is unspecified
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("HTML");
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("ascii");
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf = xmlOutputBufferCreateFile(f, handler);
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) return(-1);
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlDocContentDumpOutput(buf, cur, NULL);
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlOutputBufferClose(buf);
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFile:
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the filename (or URL)
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file. If @filename is "-" the stdout file is
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * used.
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure.
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFile(const char *filename, xmlDocPtr cur) {
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr buf;
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncodingHandlerPtr handler = NULL;
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *encoding;
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (filename == NULL))
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
112694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    encoding = (const char *) htmlGetMetaEncoding(cur);
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlCharEncoding enc;
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	enc = xmlParseCharEncoding(encoding);
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (enc != cur->charset) {
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->charset != XML_CHAR_ENCODING_UTF8) {
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Not supported yet
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (handler == NULL)
1145df143a5041f03a22808b59c76698770b74692815Selim Gurun		htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Fallback to HTML or ASCII when the encoding is unspecified
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("HTML");
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("ascii");
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
115794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /*
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * save the content to a temp buffer.
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf = xmlOutputBufferCreateFilename(filename, handler, cur->compression);
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) return(0);
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlDocContentDumpOutput(buf, cur, NULL);
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlOutputBufferClose(buf);
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFileFormat:
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the filename
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @format:  should formatting spaces been added
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file using a given encoding.
117794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure.
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFileFormat(const char *filename, xmlDocPtr cur,
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           const char *encoding, int format) {
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlOutputBufferPtr buf;
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlCharEncodingHandlerPtr handler = NULL;
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (filename == NULL))
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
1189df143a5041f03a22808b59c76698770b74692815Selim Gurun
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlInitParser();
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (encoding != NULL) {
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	xmlCharEncoding enc;
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	enc = xmlParseCharEncoding(encoding);
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if (enc != cur->charset) {
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (cur->charset != XML_CHAR_ENCODING_UTF8) {
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Not supported yet
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		return(-1);
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    handler = xmlFindCharEncodingHandler(encoding);
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (handler == NULL)
1206df143a5041f03a22808b59c76698770b74692815Selim Gurun		htmlSaveErr(XML_SAVE_UNKNOWN_ENCODING, NULL, encoding);
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	}
1208df143a5041f03a22808b59c76698770b74692815Selim Gurun        htmlSetMetaEncoding(cur, (const xmlChar *) encoding);
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	htmlSetMetaEncoding(cur, (const xmlChar *) "UTF-8");
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Fallback to HTML or ASCII when the encoding is unspecified
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("HTML");
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (handler == NULL)
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	handler = xmlFindCharEncodingHandler("ascii");
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
122194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    /*
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * save the content to a temp buffer.
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf = xmlOutputBufferCreateFilename(filename, handler, 0);
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (buf == NULL) return(0);
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    htmlDocContentDumpFormatOutput(buf, cur, encoding, format);
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlOutputBufferClose(buf);
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * htmlSaveFileEnc:
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @filename:  the filename
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the document
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @encoding: the document encoding
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump an HTML document to a file using a given encoding
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and formatting returns/spaces are added.
124194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns: the number of byte written or -1 in case of failure.
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjecthtmlSaveFileEnc(const char *filename, xmlDocPtr cur, const char *encoding) {
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(htmlSaveFileFormat(filename, cur, encoding, 1));
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_HTMLtree
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_HTML_ENABLED */
1254