* xmlParseStringCharRef: * @ctxt: an XML parser context * @str: a pointer to an index in the string * * parse Reference declarations, variant parsing from a string rather * than an an input flow. * * [66] CharRef ::= '&#' [0-9]+ ';' | * '&#x' [0-9a-fA-F]+ ';' * * [ WFC: Legal Character ] * Characters referred to using character references must match the * production
| 2700 | * updated to the current value of the index |
| 2701 | */ |
| 2702 | static int |
| 2703 | xmlParseStringCharRef(xmlParserCtxtPtr ctxt, const xmlChar **str) { |
| 2704 | const xmlChar *ptr; |
| 2705 | xmlChar cur; |
| 2706 | int val = 0; |
| 2707 | |
| 2708 | if ((str == NULL) || (*str == NULL)) return(0); |
| 2709 | ptr = *str; |
| 2710 | cur = *ptr; |
| 2711 | if ((cur == '&') && (ptr[1] == '#') && (ptr[2] == 'x')) { |
| 2712 | ptr += 3; |
| 2713 | cur = *ptr; |
| 2714 | while (cur != ';') { /* Non input consuming loop */ |
| 2715 | if ((cur >= '0') && (cur <= '9')) |
| 2716 | val = val * 16 + (cur - '0'); |
| 2717 | else if ((cur >= 'a') && (cur <= 'f')) |
| 2718 | val = val * 16 + (cur - 'a') + 10; |
| 2719 | else if ((cur >= 'A') && (cur <= 'F')) |
| 2720 | val = val * 16 + (cur - 'A') + 10; |
| 2721 | else { |
| 2722 | xmlFatalErr(ctxt, XML_ERR_INVALID_HEX_CHARREF, NULL); |
| 2723 | val = 0; |
| 2724 | break; |
| 2725 | } |
| 2726 | if (val > 0x110000) |
| 2727 | val = 0x110000; |
| 2728 | |
| 2729 | ptr++; |
| 2730 | cur = *ptr; |
| 2731 | } |
| 2732 | if (cur == ';') |
| 2733 | ptr++; |
| 2734 | } else if ((cur == '&') && (ptr[1] == '#')){ |
| 2735 | ptr += 2; |
| 2736 | cur = *ptr; |
| 2737 | while (cur != ';') { /* Non input consuming loops */ |
| 2738 | if ((cur >= '0') && (cur <= '9')) |
| 2739 | val = val * 10 + (cur - '0'); |
| 2740 | else { |
| 2741 | xmlFatalErr(ctxt, XML_ERR_INVALID_DEC_CHARREF, NULL); |
| 2742 | val = 0; |
| 2743 | break; |
| 2744 | } |
| 2745 | if (val > 0x110000) |
| 2746 | val = 0x110000; |
| 2747 | |
| 2748 | ptr++; |
| 2749 | cur = *ptr; |
| 2750 | } |
| 2751 | if (cur == ';') |
| 2752 | ptr++; |
| 2753 | } else { |
| 2754 | xmlFatalErr(ctxt, XML_ERR_INVALID_CHARREF, NULL); |
| 2755 | return(0); |
| 2756 | } |
| 2757 | *str = ptr; |
| 2758 | |
| 2759 | /* |
no test coverage detected