| 738 | static char xo_xml_quot[] = """; |
| 739 | |
| 740 | static ssize_t |
| 741 | xo_escape_xml (xo_buffer_t *xbp, ssize_t len, xo_xff_flags_t flags) |
| 742 | { |
| 743 | ssize_t slen; |
| 744 | ssize_t delta = 0; |
| 745 | char *cp, *ep, *ip; |
| 746 | const char *sp; |
| 747 | int attr = XOF_BIT_ISSET(flags, XFF_ATTR); |
| 748 | |
| 749 | for (cp = xbp->xb_curp, ep = cp + len; cp < ep; cp++) { |
| 750 | /* We're subtracting 2: 1 for the NUL, 1 for the char we replace */ |
| 751 | if (*cp == '<') |
| 752 | delta += sizeof(xo_xml_lt) - 2; |
| 753 | else if (*cp == '>') |
| 754 | delta += sizeof(xo_xml_gt) - 2; |
| 755 | else if (*cp == '&') |
| 756 | delta += sizeof(xo_xml_amp) - 2; |
| 757 | else if (attr && *cp == '"') |
| 758 | delta += sizeof(xo_xml_quot) - 2; |
| 759 | } |
| 760 | |
| 761 | if (delta == 0) /* Nothing to escape; bail */ |
| 762 | return len; |
| 763 | |
| 764 | if (!xo_buf_has_room(xbp, delta)) /* No room; bail, but don't append */ |
| 765 | return 0; |
| 766 | |
| 767 | ep = xbp->xb_curp; |
| 768 | cp = ep + len; |
| 769 | ip = cp + delta; |
| 770 | do { |
| 771 | cp -= 1; |
| 772 | ip -= 1; |
| 773 | |
| 774 | if (*cp == '<') |
| 775 | sp = xo_xml_lt; |
| 776 | else if (*cp == '>') |
| 777 | sp = xo_xml_gt; |
| 778 | else if (*cp == '&') |
| 779 | sp = xo_xml_amp; |
| 780 | else if (attr && *cp == '"') |
| 781 | sp = xo_xml_quot; |
| 782 | else { |
| 783 | *ip = *cp; |
| 784 | continue; |
| 785 | } |
| 786 | |
| 787 | slen = strlen(sp); |
| 788 | ip -= slen - 1; |
| 789 | memcpy(ip, sp, slen); |
| 790 | |
| 791 | } while (cp > ep && cp != ip); |
| 792 | |
| 793 | return len + delta; |
| 794 | } |
| 795 | |
| 796 | static ssize_t |
| 797 | xo_escape_json (xo_buffer_t *xbp, ssize_t len, xo_xff_flags_t flags UNUSED) |
no test coverage detected