⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlschemastypes.c.svn-base

📁 这是一个用于解析xml文件的类库。使用这个类库
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
}/** * xmlSchemaFreeValue: * @value:  the value to free * * Cleanup the default XML Schemas type library */void	xmlSchemaFreeValue(xmlSchemaValPtr value) {    if (value == NULL)	return;    switch (value->type) {        case XML_SCHEMAS_STRING:        case XML_SCHEMAS_NORMSTRING:        case XML_SCHEMAS_TOKEN:        case XML_SCHEMAS_LANGUAGE:        case XML_SCHEMAS_NMTOKEN:        case XML_SCHEMAS_NMTOKENS:        case XML_SCHEMAS_NAME:        case XML_SCHEMAS_NCNAME:        case XML_SCHEMAS_ID:        case XML_SCHEMAS_IDREF:        case XML_SCHEMAS_IDREFS:        case XML_SCHEMAS_ENTITY:        case XML_SCHEMAS_ENTITIES:        case XML_SCHEMAS_NOTATION:        case XML_SCHEMAS_ANYURI:	    if (value->value.str != NULL)		xmlFree(value->value.str);	    break;        case XML_SCHEMAS_QNAME:	    if (value->value.qname.uri != NULL)		xmlFree(value->value.qname.uri);	    if (value->value.qname.name != NULL)		xmlFree(value->value.qname.name);	    break;        case XML_SCHEMAS_HEXBINARY:	    if (value->value.hex.str != NULL)		xmlFree(value->value.hex.str);	    break;        case XML_SCHEMAS_BASE64BINARY:	    if (value->value.base64.str != NULL)		xmlFree(value->value.base64.str);	    break;	default:	    break;    }    xmlFree(value);}/** * xmlSchemaGetPredefinedType: * @name: the type name * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" * * Lookup a type in the default XML Schemas type library * * Returns the type if found, NULL otherwise */xmlSchemaTypePtrxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {    if (xmlSchemaTypesInitialized == 0)	xmlSchemaInitTypes();    if (name == NULL)	return(NULL);    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));}/**************************************************************** *								* *		Convenience macros and functions		* *								* ****************************************************************/#define IS_TZO_CHAR(c)						\	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))#define VALID_YEAR(yr)          (yr != 0)#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))/* VALID_DAY should only be used when month is unknown */#define VALID_DAY(day)          ((day >= 1) && (day <= 31))#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))#define VALID_MIN(min)          ((min >= 0) && (min <= 59))#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))#define VALID_TZO(tzo)          ((tzo > -1440) && (tzo < 1440))#define IS_LEAP(y)						\	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))static const unsigned int daysInMonth[12] =	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };static const unsigned int daysInMonthLeap[12] =	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };#define MAX_DAYINMONTH(yr,mon)                                  \        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])#define VALID_MDAY(dt)						\	(IS_LEAP(dt->year) ?				        \	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \	    (dt->day <= daysInMonth[dt->mon - 1]))#define VALID_DATE(dt)						\	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))#define VALID_TIME(dt)						\	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))#define VALID_DATETIME(dt)					\	(VALID_DATE(dt) && VALID_TIME(dt))#define SECS_PER_MIN            (60)#define SECS_PER_HOUR           (60 * SECS_PER_MIN)#define SECS_PER_DAY            (24 * SECS_PER_HOUR)static const long dayInYearByMonth[12] =	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };static const long dayInLeapYearByMonth[12] =	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };#define DAY_IN_YEAR(day, month, year)				\        ((IS_LEAP(year) ?					\                dayInLeapYearByMonth[month - 1] :		\                dayInYearByMonth[month - 1]) + day)#ifdef DEBUG#define DEBUG_DATE(dt)                                                  \    xmlGenericError(xmlGenericErrorContext,                             \        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \        dt->type,dt->value.date.year,dt->value.date.mon,                \        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \        dt->value.date.sec);                                            \    if (dt->value.date.tz_flag)                                         \        if (dt->value.date.tzo != 0)                                    \            xmlGenericError(xmlGenericErrorContext,                     \                "%+05d\n",dt->value.date.tzo);                          \        else                                                            \            xmlGenericError(xmlGenericErrorContext, "Z\n");             \    else                                                                \        xmlGenericError(xmlGenericErrorContext,"\n")#else#define DEBUG_DATE(dt)#endif/** * _xmlSchemaParseGYear: * @dt:  pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gYear without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gYear. It is supposed that @dt->year is big enough to contain * the year. * * Returns 0 or the error code */static int_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {    const xmlChar *cur = *str, *firstChar;    int isneg = 0, digcnt = 0;    if (((*cur < '0') || (*cur > '9')) &&	(*cur != '-') && (*cur != '+'))	return -1;    if (*cur == '-') {	isneg = 1;	cur++;    }    firstChar = cur;    while ((*cur >= '0') && (*cur <= '9')) {	dt->year = dt->year * 10 + (*cur - '0');	cur++;	digcnt++;    }    /* year must be at least 4 digits (CCYY); over 4     * digits cannot have a leading zero. */    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))	return 1;    if (isneg)	dt->year = - dt->year;    if (!VALID_YEAR(dt->year))	return 2;    *str = cur;    return 0;}/** * PARSE_2_DIGITS: * @num:  the integer to fill in * @cur:  an #xmlChar * * @invalid: an integer * * Parses a 2-digits integer and updates @num with the value. @cur is * updated to point just after the integer. * In case of error, @invalid is set to %TRUE, values of @num and * @cur are undefined. */#define PARSE_2_DIGITS(num, cur, invalid)			\	if ((cur[0] < '0') || (cur[0] > '9') ||			\	    (cur[1] < '0') || (cur[1] > '9'))			\	    invalid = 1;					\	else							\	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\	cur += 2;/** * PARSE_FLOAT: * @num:  the double to fill in * @cur:  an #xmlChar * * @invalid: an integer * * Parses a float and updates @num with the value. @cur is * updated to point just after the float. The float must have a * 2-digits integer part and may or may not have a decimal part. * In case of error, @invalid is set to %TRUE, values of @num and * @cur are undefined. */#define PARSE_FLOAT(num, cur, invalid)				\	PARSE_2_DIGITS(num, cur, invalid);			\	if (!invalid && (*cur == '.')) {			\	    double mult = 1;				        \	    cur++;						\	    if ((*cur < '0') || (*cur > '9'))			\		invalid = 1;					\	    while ((*cur >= '0') && (*cur <= '9')) {		\		mult /= 10;					\		num += (*cur - '0') * mult;			\		cur++;						\	    }							\	}/** * _xmlSchemaParseGMonth: * @dt:  pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gMonth without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gMonth. * * Returns 0 or the error code */static int_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {    const xmlChar *cur = *str;    int ret = 0;    PARSE_2_DIGITS(dt->mon, cur, ret);    if (ret != 0)	return ret;    if (!VALID_MONTH(dt->mon))	return 2;    *str = cur;    return 0;}/** * _xmlSchemaParseGDay: * @dt:  pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:gDay without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * xs:gDay. * * Returns 0 or the error code */static int_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {    const xmlChar *cur = *str;    int ret = 0;    PARSE_2_DIGITS(dt->day, cur, ret);    if (ret != 0)	return ret;    if (!VALID_DAY(dt->day))	return 2;    *str = cur;    return 0;}/** * _xmlSchemaParseTime: * @dt:  pointer to a date structure * @str: pointer to the string to analyze * * Parses a xs:time without time zone and fills in the appropriate * fields of the @dt structure. @str is updated to point just after the * xs:time. * In case of error, values of @dt fields are undefined. * * Returns 0 or the error code */static int_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {    const xmlChar *cur = *str;    unsigned int hour = 0; /* use temp var in case str is not xs:time */    int ret = 0;    PARSE_2_DIGITS(hour, cur, ret);    if (ret != 0)	return ret;    if (*cur != ':')	return 1;    cur++;    /* the ':' insures this string is xs:time */    dt->hour = hour;    PARSE_2_DIGITS(dt->min, cur, ret);    if (ret != 0)	return ret;    if (*cur != ':')	return 1;    cur++;    PARSE_FLOAT(dt->sec, cur, ret);    if (ret != 0)	return ret;    if (!VALID_TIME(dt))	return 2;    *str = cur;    return 0;}/** * _xmlSchemaParseTimeZone: * @dt:  pointer to a date structure * @str: pointer to the string to analyze * * Parses a time zone without time zone and fills in the appropriate * field of the @dt structure. @str is updated to point just after the * time zone. * * Returns 0 or the error code */static int_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {    const xmlChar *cur = *str;    int ret = 0;    if (str == NULL)	return -1;    switch (*cur) {    case 0:	dt->tz_flag = 0;	dt->tzo = 0;	break;    case 'Z':	dt->tz_flag = 1;	dt->tzo = 0;	cur++;	break;    case '+':    case '-': {	int isneg = 0, tmp = 0;	isneg = (*cur == '-');	cur++;	PARSE_2_DIGITS(tmp, cur, ret);	if (ret != 0)	    return ret;	if (!VALID_HOUR(tmp))	    return 2;	if (*cur != ':')	    return 1;	cur++;	dt->tzo = tmp * 60;	PARSE_2_DIGITS(tmp, cur, ret);	if (ret != 0)	    return ret;	if (!VALID_MIN(tmp))	    return 2;	dt->tzo += tmp;	if (isneg)	    dt->tzo = - dt->tzo;	if (!VALID_TZO(dt->tzo))	    return 2;	dt->tz_flag = 1;	break;      }    default:	return 1;    }    *str = cur;    return 0;}/** * _xmlSchemaBase64Decode: * @ch: a character *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -