MCPcopy Create free account
hub / github.com/F-Stack/f-stack / xo_escape_xml

Function xo_escape_xml

tools/libxo/libxo/libxo.c:740–794  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

738static char xo_xml_quot[] = """;
739
740static ssize_t
741xo_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
796static ssize_t
797xo_escape_json (xo_buffer_t *xbp, ssize_t len, xo_xff_flags_t flags UNUSED)

Callers 6

xo_buf_escapeFunction · 0.85
xo_warn_hcvFunction · 0.85
xo_message_hcvFunction · 0.85
xo_do_format_fieldFunction · 0.85
xo_format_titleFunction · 0.85
xo_attr_hvFunction · 0.85

Calls 2

xo_buf_has_roomFunction · 0.85
memcpyFunction · 0.50

Tested by

no test coverage detected