* htmlParseCharRef: * @ctxt: an HTML parser context * * parse Reference declarations * * [66] CharRef ::= '&#' [0-9]+ ';' | * '&#x' [0-9a-fA-F]+ ';' * * Returns the value parsed (as an int) */
| 3094 | * Returns the value parsed (as an int) |
| 3095 | */ |
| 3096 | int |
| 3097 | htmlParseCharRef(htmlParserCtxtPtr ctxt) { |
| 3098 | int val = 0; |
| 3099 | |
| 3100 | if ((ctxt == NULL) || (ctxt->input == NULL)) { |
| 3101 | htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR, |
| 3102 | "htmlParseCharRef: context error\n", |
| 3103 | NULL, NULL); |
| 3104 | return(0); |
| 3105 | } |
| 3106 | if ((CUR == '&') && (NXT(1) == '#') && |
| 3107 | ((NXT(2) == 'x') || NXT(2) == 'X')) { |
| 3108 | SKIP(3); |
| 3109 | while (CUR != ';') { |
| 3110 | if ((CUR >= '0') && (CUR <= '9')) |
| 3111 | val = val * 16 + (CUR - '0'); |
| 3112 | else if ((CUR >= 'a') && (CUR <= 'f')) |
| 3113 | val = val * 16 + (CUR - 'a') + 10; |
| 3114 | else if ((CUR >= 'A') && (CUR <= 'F')) |
| 3115 | val = val * 16 + (CUR - 'A') + 10; |
| 3116 | else { |
| 3117 | htmlParseErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, |
| 3118 | "htmlParseCharRef: missing semicolumn\n", |
| 3119 | NULL, NULL); |
| 3120 | break; |
| 3121 | } |
| 3122 | NEXT; |
| 3123 | } |
| 3124 | if (CUR == ';') |
| 3125 | NEXT; |
| 3126 | } else if ((CUR == '&') && (NXT(1) == '#')) { |
| 3127 | SKIP(2); |
| 3128 | while (CUR != ';') { |
| 3129 | if ((CUR >= '0') && (CUR <= '9')) |
| 3130 | val = val * 10 + (CUR - '0'); |
| 3131 | else { |
| 3132 | htmlParseErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, |
| 3133 | "htmlParseCharRef: missing semicolumn\n", |
| 3134 | NULL, NULL); |
| 3135 | break; |
| 3136 | } |
| 3137 | NEXT; |
| 3138 | } |
| 3139 | if (CUR == ';') |
| 3140 | NEXT; |
| 3141 | } else { |
| 3142 | htmlParseErr(ctxt, XML_ERR_INVALID_CHARREF, |
| 3143 | "htmlParseCharRef: invalid value\n", NULL, NULL); |
| 3144 | } |
| 3145 | /* |
| 3146 | * Check the value IS_CHAR ... |
| 3147 | */ |
| 3148 | if (IS_CHAR(val)) { |
| 3149 | return(val); |
| 3150 | } else { |
| 3151 | htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR, |
| 3152 | "htmlParseCharRef: invalid xmlChar value %d\n", |
| 3153 | val); |