1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * string.c : an XML string utilities module
3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This module provides various utility functions for manipulating
5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the xmlChar* type. All functions named xmlStr* have been moved here
6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * from the parser.c file (their original home).
7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software.
9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UTF8 string routines from:
11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * William Brack <wbrack@mmm.com.hk>
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * daniel@veillard.com
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdlib.h>
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlstring.h>
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                Commodity functions to handle xmlChars                *
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrndup:
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the input xmlChar *
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the len of @cur
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strndup for array of xmlChar's
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * or NULL
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrndup(const xmlChar *cur, int len) {
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (len < 0)) return(NULL);
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlErrMemory(NULL, NULL);
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, cur, len * sizeof(xmlChar));
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret[len] = 0;
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrdup:
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the input xmlChar *
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strdup for array of xmlChar's. Since they are supposed to be
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoded in UTF-8 or an encoding with 8bit based chars, we assume
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a termination mark of '0'.
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * or NULL
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrdup(const xmlChar *cur) {
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *p = cur;
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(NULL);
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*p != 0) p++; /* non input consuming */
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrndup(cur, p - cur));
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCharStrndup:
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the input char *
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the len of @cur
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strndup for char's to xmlChar's
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * or NULL
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCharStrndup(const char *cur, int len) {
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (len < 0)) return(NULL);
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlErrMemory(NULL, NULL);
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < len;i++) {
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret[i] = (xmlChar) cur[i];
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret[i] == 0) return(ret);
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret[len] = 0;
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCharStrdup:
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the input char *
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strdup for char's to xmlChar's
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * or NULL
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCharStrdup(const char *cur) {
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *p = cur;
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL) return(NULL);
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*p != '\0') p++; /* non input consuming */
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlCharStrndup(cur, p - cur));
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrcmp:
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  the first xmlChar *
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  the second xmlChar *
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strcmp for xmlChar's
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the integer result of the comparison
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrcmp(const xmlChar *str1, const xmlChar *str2) {
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    register int tmp;
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == str2) return(0);
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL) return(-1);
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str2 == NULL) return(1);
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = *str1++ - *str2;
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0) return(tmp);
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str2++ != 0);
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrEqual:
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  the first xmlChar *
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  the second xmlChar *
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if both strings are equal of have same content.
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Should be a bit more readable and faster than xmlStrcmp()
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if they are equal, 0 if they are different
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrEqual(const xmlChar *str1, const xmlChar *str2) {
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == str2) return(1);
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL) return(0);
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str2 == NULL) return(0);
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*str1++ != *str2) return(0);
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str2++);
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrQEqual:
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pref:  the prefix of the QName
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the localname of the QName
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the second xmlChar *
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a QName is Equal to a given string
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if they are equal, 0 if they are different
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrQEqual(const xmlChar *pref, const xmlChar *name, const xmlChar *str) {
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pref == NULL) return(xmlStrEqual(name, str));
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) return(0);
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(0);
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*pref++ != *str) return(0);
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while ((*str++) && (*pref));
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*str++ != ':') return(0);
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*name++ != *str) return(0);
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str++);
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(1);
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrncmp:
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  the first xmlChar *
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  the second xmlChar *
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the max comparison length
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strncmp for xmlChar's
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the integer result of the comparison
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrncmp(const xmlChar *str1, const xmlChar *str2, int len) {
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    register int tmp;
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len <= 0) return(0);
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == str2) return(0);
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL) return(-1);
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str2 == NULL) return(1);
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef __GNUC__
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = strncmp((const char *)str1, (const char *)str2, len);
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return tmp;
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#else
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = *str1++ - *str2;
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0 || --len == 0) return(tmp);
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str2++ != 0);
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar casemap[256] = {
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x78,0x79,0x7A,0x7B,0x5C,0x5D,0x5E,0x5F,
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrcasecmp:
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  the first xmlChar *
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  the second xmlChar *
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strcasecmp for xmlChar's
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the integer result of the comparison
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrcasecmp(const xmlChar *str1, const xmlChar *str2) {
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    register int tmp;
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == str2) return(0);
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL) return(-1);
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str2 == NULL) return(1);
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = casemap[*str1++] - casemap[*str2];
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0) return(tmp);
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str2++ != 0);
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrncasecmp:
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  the first xmlChar *
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  the second xmlChar *
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the max comparison length
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strncasecmp for xmlChar's
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the integer result of the comparison
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrncasecmp(const xmlChar *str1, const xmlChar *str2, int len) {
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    register int tmp;
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len <= 0) return(0);
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == str2) return(0);
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL) return(-1);
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str2 == NULL) return(1);
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    do {
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = casemap[*str1++] - casemap[*str2];
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0 || --len == 0) return(tmp);
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } while (*str2++ != 0);
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return 0;
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrchr:
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the xmlChar * array
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar to search
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strchr for xmlChar's
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlChar * for the first occurrence or NULL.
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrchr(const xmlChar *str, xmlChar val) {
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(NULL);
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) { /* non input consuming */
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*str == val) return((xmlChar *) str);
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrstr:
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the xmlChar * array (haystack)
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar to search (needle)
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strstr for xmlChar's
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlChar * for the first occurrence or NULL.
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrstr(const xmlChar *str, const xmlChar *val) {
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int n;
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(NULL);
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) return(NULL);
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    n = xmlStrlen(val);
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (n == 0) return(str);
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) { /* non input consuming */
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*str == *val) {
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!xmlStrncmp(str, val, n)) return((const xmlChar *) str);
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrcasestr:
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the xmlChar * array (haystack)
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the xmlChar to search (needle)
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a case-ignoring strstr for xmlChar's
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlChar * for the first occurrence or NULL.
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
369df143a5041f03a22808b59c76698770b74692815Selim GurunxmlStrcasestr(const xmlChar *str, const xmlChar *val) {
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int n;
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(NULL);
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (val == NULL) return(NULL);
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    n = xmlStrlen(val);
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (n == 0) return(str);
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) { /* non input consuming */
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (casemap[*str] == casemap[*val])
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!xmlStrncasecmp(str, val, n)) return(str);
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(NULL);
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrsub:
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the xmlChar * array (haystack)
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start:  the index of the first char (zero based)
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the length of the substring
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Extract a substring of a given string
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlChar * for the first occurrence or NULL.
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrsub(const xmlChar *str, int start, int len) {
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(NULL);
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start < 0) return(NULL);
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) return(NULL);
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < start;i++) {
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*str == 0) return(NULL);
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*str == 0) return(NULL);
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrndup(str, len));
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrlen:
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the xmlChar * array
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * length of a xmlChar's string
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of xmlChar contained in the ARRAY.
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrlen(const xmlChar *str) {
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0;
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL) return(0);
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) { /* non input consuming */
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len++;
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(len);
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrncat:
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the original xmlChar * array
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @add:  the xmlChar * array added
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the length of @add
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strncat for array of xmlChar's, it will extend @cur with the len
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * first bytes of @add. Note that if @len < 0 then this is an API error
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and NULL will be returned.
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar *, the original @cur is reallocated if needed
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and should not be freed
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrncat(xmlChar *cur, const xmlChar *add, int len) {
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((add == NULL) || (len == 0))
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(cur);
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0)
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	return(NULL);
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlStrndup(add, len));
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size = xmlStrlen(cur);
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlRealloc(cur, (size + len + 1) * sizeof(xmlChar));
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlErrMemory(NULL, NULL);
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(cur);
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(&ret[size], add, len * sizeof(xmlChar));
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret[size + len] = 0;
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrncatNew:
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  first xmlChar string
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  second xmlChar string
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the len of @str2 or < 0
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * same as xmlStrncat, but creates a new string.  The original
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * two strings are not freed. If @len is < 0 then the length
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * will be calculated automatically.
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * or NULL
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrncatNew(const xmlChar *str1, const xmlChar *str2, int len) {
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0)
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len = xmlStrlen(str2);
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((str2 == NULL) || (len == 0))
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlStrdup(str1));
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str1 == NULL)
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlStrndup(str2, len));
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size = xmlStrlen(str1);
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMalloc((size + len + 1) * sizeof(xmlChar));
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlErrMemory(NULL, NULL);
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlStrndup(str1, size));
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, str1, size * sizeof(xmlChar));
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(&ret[size], str2, len * sizeof(xmlChar));
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret[size + len] = 0;
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrcat:
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the original xmlChar * array
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @add:  the xmlChar * array added
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strcat for array of xmlChar's. Since they are supposed to be
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * encoded in UTF-8 or an encoding with 8bit based chars, we assume
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a termination mark of '0'.
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new xmlChar * containing the concatenated string.
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrcat(xmlChar *cur, const xmlChar *add) {
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *p = add;
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (add == NULL) return(cur);
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(xmlStrdup(add));
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*p != 0) p++; /* non input consuming */
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlStrncat(cur, add, p - add));
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrPrintf:
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:   the result buffer.
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:   the result buffer length.
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:   the message with printf formatting.
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @...:   extra parameters for the message.
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats @msg and places result into @buf.
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of characters written to @buf or -1 if an error occurs.
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint XMLCDECL
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrPrintf(xmlChar *buf, int len, const xmlChar *msg, ...) {
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    va_list args;
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if((buf == NULL) || (msg == NULL)) {
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    va_start(args, msg);
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = vsnprintf((char *) buf, len, (const char *) msg, args);
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    va_end(args);
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf[len - 1] = 0; /* be safe ! */
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlStrVPrintf:
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buf:   the result buffer.
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:   the result buffer length.
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:   the message with printf formatting.
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ap:    extra parameters for the message.
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Formats @msg and places result into @buf.
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of characters written to @buf or -1 if an error occurs.
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrVPrintf(xmlChar *buf, int len, const xmlChar *msg, va_list ap) {
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if((buf == NULL) || (msg == NULL)) {
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = vsnprintf((char *) buf, len, (const char *) msg, ap);
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    buf[len - 1] = 0; /* be safe ! */
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *              Generic UTF8 handling routines                          *
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * From rfc2044: encoding of the Unicode values on UTF-8:               *
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * UCS-4 range (hex.)           UTF-8 octet sequence (binary)           *
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0000-0000 007F   0xxxxxxx                                       *
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0080-0000 07FF   110xxxxx 10xxxxxx                              *
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx                     *
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * I hope we won't use values > 0xFFFF anytime soon !                   *
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *                                                                      *
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Size:
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf: pointer to the UTF8 character
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * calculates the internal size of a UTF8 character
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns the numbers of bytes in the character, -1 on format error
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Size(const xmlChar *utf) {
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar mask;
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL)
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -1;
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*utf < 0x80)
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return 1;
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* check valid UTF8 character */
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!(*utf & 0x40))
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -1;
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* determine number of bytes in char */
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = 2;
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (mask=0x20; mask != 0; mask>>=1) {
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!(*utf & mask))
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return len;
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        len++;
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return -1;
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Charcmp:
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf1: pointer to first UTF8 char
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf2: pointer to second UTF8 char
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compares the two UCS4 values
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns result of the compare as with xmlStrncmp
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Charcmp(const xmlChar *utf1, const xmlChar *utf2) {
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf1 == NULL ) {
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (utf2 == NULL)
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return 0;
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return -1;
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return xmlStrncmp(utf1, utf2, xmlUTF8Size(utf1));
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strlen:
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  a sequence of UTF-8 encoded bytes
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute the length of an UTF8 string, it doesn't do a full UTF8
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * checking of the content of the string.
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the number of characters in the string or -1 in case of error
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strlen(const xmlChar *utf) {
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL)
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(-1);
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*utf != 0) {
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (utf[0] & 0x80) {
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((utf[1] & 0xc0) != 0x80)
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(-1);
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((utf[0] & 0xe0) == 0xe0) {
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((utf[2] & 0xc0) != 0x80)
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(-1);
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((utf[0] & 0xf0) == 0xf0) {
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return(-1);
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    utf += 4;
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    utf += 3;
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                utf += 2;
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            utf++;
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret++;
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlGetUTF8Char:
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  a sequence of UTF-8 encoded bytes
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  a pointer to the minimum number of bytes present in
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        the sequence.  This is used to assure the next character
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        is completely contained within the sequence.
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Read the first UTF8 character from @utf
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the char value or -1 in case of error, and sets *len to
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *        the actual number of bytes consumed (0 in case of error)
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlGetUTF8Char(const unsigned char *utf, int *len) {
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int c;
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL)
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len == NULL)
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*len < 1)
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    c = utf[0];
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (c & 0x80) {
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (*len < 2)
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((utf[1] & 0xc0) != 0x80)
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((c & 0xe0) == 0xe0) {
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*len < 3)
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto error;
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((utf[2] & 0xc0) != 0x80)
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto error;
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((c & 0xf0) == 0xf0) {
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (*len < 4)
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((c & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto error;
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *len = 4;
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* 4-byte code */
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c = (utf[0] & 0x7) << 18;
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c |= (utf[1] & 0x3f) << 12;
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c |= (utf[2] & 0x3f) << 6;
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c |= utf[3] & 0x3f;
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              /* 3-byte code */
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *len = 3;
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c = (utf[0] & 0xf) << 12;
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c |= (utf[1] & 0x3f) << 6;
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                c |= utf[2] & 0x3f;
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project          /* 2-byte code */
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *len = 2;
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            c = (utf[0] & 0x1f) << 6;
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            c |= utf[1] & 0x3f;
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /* 1-byte code */
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *len = 1;
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(c);
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecterror:
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len != NULL)
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	*len = 0;
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlCheckUTF8:
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf: Pointer to putative UTF-8 encoded string.
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Checks @utf for being valid UTF-8. @utf is assumed to be
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * null-terminated. This function is not super-strict, as it will
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * allow longer UTF-8 sequences than necessary. Note that Java is
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * capable of producing these sequences if provoked. Also note, this
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * routine checks for the 4-byte maximum size, but does not check for
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0x10ffff maximum value.
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return value: true if @utf is valid.
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project **/
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlCheckUTF8(const unsigned char *utf)
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ix;
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned char c;
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL)
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * utf is a string of 1, 2, 3 or 4 bytes.  The valid strings
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * are as follows (in "bit format"):
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *    0xxxxxxx                                      valid 1-byte
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *    110xxxxx 10xxxxxx                             valid 2-byte
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *    1110xxxx 10xxxxxx 10xxxxxx                    valid 3-byte
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     *    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx           valid 4-byte
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (ix = 0; (c = utf[ix]);) {      /* string is 0-terminated */
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((c & 0x80) == 0x00) {	/* 1-byte code, starts with 10 */
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ix++;
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((c & 0xe0) == 0xc0) {/* 2-byte code, starts with 110 */
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if ((utf[ix+1] & 0xc0 ) != 0x80)
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        return 0;
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ix += 2;
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((c & 0xf0) == 0xe0) {/* 3-byte code, starts with 1110 */
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((utf[ix+1] & 0xc0) != 0x80) ||
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((utf[ix+2] & 0xc0) != 0x80))
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return 0;
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ix += 3;
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else if ((c & 0xf8) == 0xf0) {/* 4-byte code, starts with 11110 */
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (((utf[ix+1] & 0xc0) != 0x80) ||
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        ((utf[ix+2] & 0xc0) != 0x80) ||
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		((utf[ix+3] & 0xc0) != 0x80))
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    return 0;
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    ix += 4;
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	} else				/* unknown encoding */
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    return 0;
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      }
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      return(1);
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strsize:
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  a sequence of UTF-8 encoded bytes
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the number of characters in the array
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * storage size of an UTF8 string
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the behaviour is not garanteed if the input string is not UTF-8
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the storage size of
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the first 'len' characters of ARRAY
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strsize(const xmlChar *utf, int len) {
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar   *ptr=utf;
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar         ch;
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL)
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len <= 0)
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(0);
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ( len-- > 0) {
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ( !*ptr )
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ( (ch = *ptr++) & 0x80)
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((ch<<=1) & 0x80 ) {
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ptr++;
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (*ptr == 0) break;
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    }
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ptr - utf);
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strndup:
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  the input UTF8 *
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the len of @utf (in chars)
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a strndup for array of UTF8's
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a new UTF8 * or NULL
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strndup(const xmlChar *utf, int len) {
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret;
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((utf == NULL) || (len < 0)) return(NULL);
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = xmlUTF8Strsize(utf, len);
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMallocAtomic((i + 1) * sizeof(xmlChar));
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                "malloc of %ld byte failed\n",
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (len + 1) * (long)sizeof(xmlChar));
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, utf, i * sizeof(xmlChar));
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret[i] = 0;
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(ret);
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strpos:
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  the input UTF8 *
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pos:  the position of the desired UTF8 char (in chars)
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a function to provide the equivalent of fetching a
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * character from a string array
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to the UTF8 character or NULL
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectconst xmlChar *
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strpos(const xmlChar *utf, int pos) {
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar ch;
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL) return(NULL);
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (pos < 0)
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return(NULL);
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (pos--) {
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ch=*utf++) == 0) return(NULL);
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ( ch & 0x80 ) {
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* if not simple ascii, verify proper format */
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ( (ch & 0xc0) != 0xc0 )
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* then skip over remaining bytes for this char */
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ( (ch <<= 1) & 0x80 )
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ( (*utf++ & 0xc0) != 0x80 )
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(NULL);
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return((xmlChar *)utf);
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strloc:
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  the input UTF8 *
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utfchar:  the UTF8 character to be found
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * a function to provide the relative location of a UTF8 char
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the relative character position of the desired char
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or -1 if not found
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strloc(const xmlChar *utf, const xmlChar *utfchar) {
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, size;
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar ch;
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf==NULL || utfchar==NULL) return -1;
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    size = xmlUTF8Strsize(utfchar, 1);
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for(i=0; (ch=*utf) != 0; i++) {
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrncmp(utf, utfchar, size)==0)
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(i);
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            utf++;
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ( ch & 0x80 ) {
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* if not simple ascii, verify proper format */
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ( (ch & 0xc0) != 0xc0 )
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(-1);
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /* then skip over remaining bytes for this char */
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ( (ch <<= 1) & 0x80 )
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ( (*utf++ & 0xc0) != 0x80 )
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        return(-1);
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(-1);
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlUTF8Strsub:
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @utf:  a sequence of UTF-8 encoded bytes
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @start: relative pos of first char
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:   total number to copy
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create a substring from a given UTF-8 string
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note:  positions are given in units of UTF-8 chars
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a pointer to a newly created string
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or NULL if any problem
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlChar *
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlUTF8Strsub(const xmlChar *utf, int start, int len) {
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int            i;
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar ch;
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (utf == NULL) return(NULL);
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (start < 0) return(NULL);
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (len < 0) return(NULL);
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Skip over any leading chars
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0;i < start;i++) {
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ch=*utf++) == 0) return(NULL);
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ( ch & 0x80 ) {
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* if not simple ascii, verify proper format */
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ( (ch & 0xc0) != 0xc0 )
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return(NULL);
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* then skip over remaining bytes for this char */
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ( (ch <<= 1) & 0x80 )
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ( (*utf++ & 0xc0) != 0x80 )
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return(NULL);
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(xmlUTF8Strndup(utf, len));
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_xmlstring
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
985