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 694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 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; 4394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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; 8894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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 * 17394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 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; 34394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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; 37194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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; 39994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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); 52294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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 */ 54094442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint 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; 54494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((buf == NULL) || (msg == NULL)) { 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 54894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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 ! */ 55394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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 */ 56894442ad4107000e6d49f9b85a46a591495a57632Selim Gurunint 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlStrVPrintf(xmlChar *buf, int len, const xmlChar *msg, va_list ap) { 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 57194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if((buf == NULL) || (msg == NULL)) { 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 57594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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 ! */ 57894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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; 86194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 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