?? encoding.c.svn-base
字號:
int i; if (xmlCharEncodingAliases == NULL) return; for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (xmlCharEncodingAliases[i].name != NULL) xmlFree((char *) xmlCharEncodingAliases[i].name); if (xmlCharEncodingAliases[i].alias != NULL) xmlFree((char *) xmlCharEncodingAliases[i].alias); } xmlCharEncodingAliasesNb = 0; xmlCharEncodingAliasesMax = 0; xmlFree(xmlCharEncodingAliases); xmlCharEncodingAliases = NULL;}/** * xmlGetEncodingAlias: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Lookup an encoding name for the given alias. * * Returns NULL if not found, otherwise the original name */const char *xmlGetEncodingAlias(const char *alias) { int i; char upper[100]; if (alias == NULL) return(NULL); if (xmlCharEncodingAliases == NULL) return(NULL); for (i = 0;i < 99;i++) { upper[i] = toupper(alias[i]); if (upper[i] == 0) break; } upper[i] = 0; /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { return(xmlCharEncodingAliases[i].name); } } return(NULL);}/** * xmlAddEncodingAlias: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Registers an alias @alias for an encoding named @name. Existing alias * will be overwritten. * * Returns 0 in case of success, -1 in case of error */intxmlAddEncodingAlias(const char *name, const char *alias) { int i; char upper[100]; if ((name == NULL) || (alias == NULL)) return(-1); for (i = 0;i < 99;i++) { upper[i] = toupper(alias[i]); if (upper[i] == 0) break; } upper[i] = 0; if (xmlCharEncodingAliases == NULL) { xmlCharEncodingAliasesNb = 0; xmlCharEncodingAliasesMax = 20; xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlMalloc(xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); if (xmlCharEncodingAliases == NULL) return(-1); } else if (xmlCharEncodingAliasesNb >= xmlCharEncodingAliasesMax) { xmlCharEncodingAliasesMax *= 2; xmlCharEncodingAliases = (xmlCharEncodingAliasPtr) xmlRealloc(xmlCharEncodingAliases, xmlCharEncodingAliasesMax * sizeof(xmlCharEncodingAlias)); } /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, upper)) { /* * Replace the definition. */ xmlFree((char *) xmlCharEncodingAliases[i].name); xmlCharEncodingAliases[i].name = xmlMemStrdup(name); return(0); } } /* * Add the definition */ xmlCharEncodingAliases[xmlCharEncodingAliasesNb].name = xmlMemStrdup(name); xmlCharEncodingAliases[xmlCharEncodingAliasesNb].alias = xmlMemStrdup(upper); xmlCharEncodingAliasesNb++; return(0);}/** * xmlDelEncodingAlias: * @alias: the alias name as parsed, in UTF-8 format (ASCII actually) * * Unregisters an encoding alias @alias * * Returns 0 in case of success, -1 in case of error */intxmlDelEncodingAlias(const char *alias) { int i; if (alias == NULL) return(-1); if (xmlCharEncodingAliases == NULL) return(-1); /* * Walk down the list looking for a definition of the alias */ for (i = 0;i < xmlCharEncodingAliasesNb;i++) { if (!strcmp(xmlCharEncodingAliases[i].alias, alias)) { xmlFree((char *) xmlCharEncodingAliases[i].name); xmlFree((char *) xmlCharEncodingAliases[i].alias); xmlCharEncodingAliasesNb--; memmove(&xmlCharEncodingAliases[i], &xmlCharEncodingAliases[i + 1], sizeof(xmlCharEncodingAlias) * (xmlCharEncodingAliasesNb - i)); return(0); } } return(-1);}/** * xmlParseCharEncoding: * @name: the encoding name as parsed, in UTF-8 format (ASCII actually) * * Compare the string to the encoding schemes already known. Note * that the comparison is case insensitive accordingly to the section * [XML] 4.3.3 Character Encoding in Entities. * * Returns one of the XML_CHAR_ENCODING_... values or XML_CHAR_ENCODING_NONE * if not recognized. */xmlCharEncodingxmlParseCharEncoding(const char* name){ const char *alias; char upper[500]; int i; if (name == NULL) return(XML_CHAR_ENCODING_NONE); /* * Do the alias resolution */ alias = xmlGetEncodingAlias(name); if (alias != NULL) name = alias; for (i = 0;i < 499;i++) { upper[i] = toupper(name[i]); if (upper[i] == 0) break; } upper[i] = 0; if (!strcmp(upper, "")) return(XML_CHAR_ENCODING_NONE); if (!strcmp(upper, "UTF-8")) return(XML_CHAR_ENCODING_UTF8); if (!strcmp(upper, "UTF8")) return(XML_CHAR_ENCODING_UTF8); /* * NOTE: if we were able to parse this, the endianness of UTF16 is * already found and in use */ if (!strcmp(upper, "UTF-16")) return(XML_CHAR_ENCODING_UTF16LE); if (!strcmp(upper, "UTF16")) return(XML_CHAR_ENCODING_UTF16LE); if (!strcmp(upper, "ISO-10646-UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS-2")) return(XML_CHAR_ENCODING_UCS2); if (!strcmp(upper, "UCS2")) return(XML_CHAR_ENCODING_UCS2); /* * NOTE: if we were able to parse this, the endianness of UCS4 is * already found and in use */ if (!strcmp(upper, "ISO-10646-UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "UCS-4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "UCS4")) return(XML_CHAR_ENCODING_UCS4LE); if (!strcmp(upper, "ISO-8859-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO-LATIN-1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO LATIN 1")) return(XML_CHAR_ENCODING_8859_1); if (!strcmp(upper, "ISO-8859-2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO-LATIN-2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO LATIN 2")) return(XML_CHAR_ENCODING_8859_2); if (!strcmp(upper, "ISO-8859-3")) return(XML_CHAR_ENCODING_8859_3); if (!strcmp(upper, "ISO-8859-4")) return(XML_CHAR_ENCODING_8859_4); if (!strcmp(upper, "ISO-8859-5")) return(XML_CHAR_ENCODING_8859_5); if (!strcmp(upper, "ISO-8859-6")) return(XML_CHAR_ENCODING_8859_6); if (!strcmp(upper, "ISO-8859-7")) return(XML_CHAR_ENCODING_8859_7); if (!strcmp(upper, "ISO-8859-8")) return(XML_CHAR_ENCODING_8859_8); if (!strcmp(upper, "ISO-8859-9")) return(XML_CHAR_ENCODING_8859_9); if (!strcmp(upper, "ISO-2022-JP")) return(XML_CHAR_ENCODING_2022_JP); if (!strcmp(upper, "SHIFT_JIS")) return(XML_CHAR_ENCODING_SHIFT_JIS); if (!strcmp(upper, "EUC-JP")) return(XML_CHAR_ENCODING_EUC_JP);#ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Unknown encoding %s\n", name);#endif return(XML_CHAR_ENCODING_ERROR);}/** * xmlGetCharEncodingName: * @enc: the encoding * * The "canonical" name for XML encoding. * C.f. http://www.w3.org/TR/REC-xml#charencoding * Section 4.3.3 Character Encoding in Entities * * Returns the canonical name for the given encoding */const char*xmlGetCharEncodingName(xmlCharEncoding enc) { switch (enc) { case XML_CHAR_ENCODING_ERROR: return(NULL); case XML_CHAR_ENCODING_NONE: return(NULL); case XML_CHAR_ENCODING_UTF8: return("UTF-8"); case XML_CHAR_ENCODING_UTF16LE: return("UTF-16"); case XML_CHAR_ENCODING_UTF16BE: return("UTF-16"); case XML_CHAR_ENCODING_EBCDIC: return("EBCDIC"); case XML_CHAR_ENCODING_UCS4LE: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4BE: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4_2143: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS4_3412: return("ISO-10646-UCS-4"); case XML_CHAR_ENCODING_UCS2: return("ISO-10646-UCS-2"); case XML_CHAR_ENCODING_8859_1: return("ISO-8859-1"); case XML_CHAR_ENCODING_8859_2: return("ISO-8859-2"); case XML_CHAR_ENCODING_8859_3: return("ISO-8859-3"); case XML_CHAR_ENCODING_8859_4: return("ISO-8859-4"); case XML_CHAR_ENCODING_8859_5: return("ISO-8859-5"); case XML_CHAR_ENCODING_8859_6: return("ISO-8859-6"); case XML_CHAR_ENCODING_8859_7: return("ISO-8859-7"); case XML_CHAR_ENCODING_8859_8: return("ISO-8859-8"); case XML_CHAR_ENCODING_8859_9: return("ISO-8859-9"); case XML_CHAR_ENCODING_2022_JP: return("ISO-2022-JP"); case XML_CHAR_ENCODING_SHIFT_JIS: return("Shift-JIS"); case XML_CHAR_ENCODING_EUC_JP: return("EUC-JP"); case XML_CHAR_ENCODING_ASCII: return(NULL); } return(NULL);}/************************************************************************ * * * Char encoding handlers * * * ************************************************************************//* the size should be growable, but it's not a big deal ... */#define MAX_ENCODING_HANDLERS 50static xmlCharEncodingHandlerPtr *handlers = NULL;static int nbCharEncodingHandler = 0;/* * The default is UTF-8 for XML, that's also the default used for the * parser internals, so the default encoding handler is NULL */static xmlCharEncodingHandlerPtr xmlDefaultCharEncodingHandler = NULL;/** * xmlNewCharEncodingHandler: * @name: the encoding name, in UTF-8 format (ASCII actually) * @input: the xmlCharEncodingInputFunc to read that encoding * @output: the xmlCharEncodingOutputFunc to write that encoding * * Create and registers an xmlCharEncodingHandler. * * Returns the xmlCharEncodingHandlerPtr created (or NULL in case of error). */xmlCharEncodingHandlerPtrxmlNewCharEncodingHandler(const char *name, xmlCharEncodingInputFunc input, xmlCharEncodingOutputFunc output) { xmlCharEncodingHandlerPtr handler; const char *alias; char upper[500]; int i; char *up = 0; /* * Do the alias resolution */ alias = xmlGetEncodingAlias(name); if (alias != NULL) name = alias; /* * Keep only the uppercase version of the encoding. */ if (name == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlNewCharEncodingHandler : no name !\n"); return(NULL); } for (i = 0;i < 499;i++) { upper[i] = toupper(name[i]); if (upper[i] == 0) break; } upper[i] = 0; up = xmlMemStrdup(upper); if (up == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlNewCharEncodingHandler : out of memory !\n"); return(NULL); } /* * allocate and fill-up an handler block. */ handler = (xmlCharEncodingHandlerPtr) xmlMalloc(sizeof(xmlCharEncodingHandler)); if (handler == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlNewCharEncodingHandler : out of memory !\n"); return(NULL); } handler->input = input; handler->output = output; handler->name = up;#ifdef LIBXML_ICONV_ENABLED handler->iconv_in = NULL; handler->iconv_out = NULL;#endif /* LIBXML_ICONV_ENABLED */ /* * registers and returns the handler. */ xmlRegisterCharEncodingHandler(handler);#ifdef DEBUG_ENCODING xmlGenericError(xmlGenericErrorContext, "Registered encoding handler for %s\n", name);#endif return(handler);}/** * xmlInitCharEncodingHandlers: * * Initialize the char encoding support, it registers the default * encoding supported. * NOTE: while public, this function usually doesn't need to be called * in normal processing. */voidxmlInitCharEncodingHandlers(void) { unsigned short int tst = 0x1234; unsigned char *ptr = (unsigned char *) &tst; if (handlers != NULL) return; handlers = (xmlCharEncodingHandlerPtr *) xmlMalloc(MAX_ENCODING_HANDLERS * sizeof(xmlCharEncodingHandlerPtr)); if (*ptr == 0x12) xmlLittleEndian = 0; else if (*ptr == 0x34) xmlLittleEndian = 1; else xmlGenericError(xmlGenericErrorContext, "Odd problem at endianness detection\n"); if (handlers == NULL) { xmlGenericError(xmlGenericErrorContext, "xmlInitCharEncodingHandlers : out of memory !\n"); return; } xmlNewCharEncodingHandler("UTF-8", UTF8ToUTF8, UTF8ToUTF8);#ifdef LIBXML_OUTPUT_ENABLED xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, UTF8ToUTF16LE); xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, UTF8ToUTF16BE); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, UTF8ToUTF16); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, UTF8Toisolat1); xmlNewCharEncodingHandler("ASCII", asciiToUTF8, UTF8Toascii); xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, UTF8Toascii);#ifdef LIBXML_HTML_ENABLED xmlNewCharEncodingHandler("HTML", NULL, UTF8ToHtml);#endif#else xmlUTF16LEHandler = xmlNewCharEncodingHandler("UTF-16LE", UTF16LEToUTF8, NULL); xmlUTF16BEHandler = xmlNewCharEncodingHandler("UTF-16BE", UTF16BEToUTF8, NULL); xmlNewCharEncodingHandler("UTF-16", UTF16LEToUTF8, NULL); xmlNewCharEncodingHandler("ISO-8859-1", isolat1ToUTF8, NULL); xmlNewCharEncodingHandler("ASCII", asciiToUTF8, NULL); xmlNewCharEncodingHandler("US-ASCII", asciiToUTF8, NULL);#endif /* LIBXML_OUTPUT_ENABLED */#ifndef LIBXML_ICONV_ENABLED#ifdef LIBXML_ISO8859X_ENABLED xmlRegisterCharEncodingHandlersISO8859x ();#endif#endif}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -