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

📄 xmlschemastypes.c

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 * * Converts a base64 encoded character to its base 64 value. * * Returns 0-63 (value), 64 (pad), or -1 (not recognized) */static int_xmlSchemaBase64Decode (const xmlChar ch) {    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;    if ('+' == ch) return 62;    if ('/' == ch) return 63;    if ('=' == ch) return 64;    return -1;}/**************************************************************** *								* *	XML Schema Dates/Times Datatypes Handling		* *								* ****************************************************************//** * PARSE_DIGITS: * @num:  the integer to fill in * @cur:  an #xmlChar * * @num_type: an integer flag * * Parses a digits integer and updates @num with the value. @cur is * updated to point just after the integer. * In case of error, @num_type is set to -1, values of @num and * @cur are undefined. */#define PARSE_DIGITS(num, cur, num_type)	                \	if ((*cur < '0') || (*cur > '9'))			\	    num_type = -1;					\        else                                                    \	    while ((*cur >= '0') && (*cur <= '9')) {		\	        num = num * 10 + (*cur - '0');		        \	        cur++;                                          \            }/** * PARSE_NUM: * @num:  the double to fill in * @cur:  an #xmlChar * * @num_type: an integer flag * * Parses a float or integer and updates @num with the value. @cur is * updated to point just after the number. If the number is a float, * then it must have an integer part and a decimal part; @num_type will * be set to 1. If there is no decimal part, @num_type is set to zero. * In case of error, @num_type is set to -1, values of @num and * @cur are undefined. */#define PARSE_NUM(num, cur, num_type)				\        num = 0;                                                \	PARSE_DIGITS(num, cur, num_type);	                \	if (!num_type && (*cur == '.')) {			\	    double mult = 1;				        \	    cur++;						\	    if ((*cur < '0') || (*cur > '9'))			\		num_type = -1;					\            else                                                \                num_type = 1;                                   \	    while ((*cur >= '0') && (*cur <= '9')) {		\		mult /= 10;					\		num += (*cur - '0') * mult;			\		cur++;						\	    }							\	}/** * xmlSchemaValidateDates: * @type: the expected type or XML_SCHEMAS_UNKNOWN * @dateTime:  string to analyze * @val:  the return computed value * * Check that @dateTime conforms to the lexical space of one of the date types. * if true a value is computed and returned in @val. * * Returns 0 if this validates, a positive error code number otherwise *         and -1 in case of internal or API error. */static intxmlSchemaValidateDates (xmlSchemaValType type,	                const xmlChar *dateTime, xmlSchemaValPtr *val) {    xmlSchemaValPtr dt;    int ret;    const xmlChar *cur = dateTime;#define RETURN_TYPE_IF_VALID(t)					\    if (IS_TZO_CHAR(*cur)) {					\	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\	if (ret == 0) {						\	    if (*cur != 0)					\		goto error;					\	    dt->type = t;					\	    goto done;						\	}							\    }    if (dateTime == NULL)	return -1;    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))	return 1;    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);    if (dt == NULL)	return -1;    if ((cur[0] == '-') && (cur[1] == '-')) {	/*	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or	 * xs:gDay)	 */	cur += 2;	/* is it an xs:gDay? */	if (*cur == '-') {	    if (type == XML_SCHEMAS_GMONTH)		goto error;	  ++cur;	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);	    if (ret != 0)		goto error;	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);

⌨️ 快捷键说明

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