}
/**
+ */
+static size_t xmlstrlen(const char * s)
+ /*@*/
+{
+ size_t len = 0;
+ int c;
+
+ while ((c = *s++) != '\0') {
+ switch (c) {
+ case '<': case '>': len += 4; /*@switchbreak@*/ break;
+ case '&': len += 5; /*@switchbreak@*/ break;
+ default: len += 1; /*@switchbreak@*/ break;
+ }
+ }
+ return len;
+}
+
+/**
+ */
+static char * xmlstrcpy(/*@returned@*/ char * t, const char * s)
+ /*@modifies t @*/
+{
+ char * te = t;
+ int c;
+
+ while ((c = *s++) != '\0') {
+ switch (c) {
+ case '<': te = stpcpy(te, "<"); /*@switchbreak@*/ break;
+ case '>': te = stpcpy(te, ">"); /*@switchbreak@*/ break;
+ case '&': te = stpcpy(te, "&"); /*@switchbreak@*/ break;
+ default: *te++ = c; /*@switchbreak@*/ break;
+ }
+ }
+ *te = '\0';
+ return t;
+}
+
+/**
* Wrap tag data in simple header xml markup.
* @param type tag type
* @param data tag value
xtag = "integer";
}
- nb = 2 * strlen(xtag) + sizeof("\t<></>") + strlen(s);
+ nb = 2 * strlen(xtag) + sizeof("\t<></>") + xmlstrlen(s);
te = t = alloca(nb);
te = stpcpy( stpcpy( stpcpy(te, "\t<"), xtag), ">");
- te = stpcpy(te, s);
+ te = xmlstrcpy(te, s);
+ te += strlen(te);
te = stpcpy( stpcpy( stpcpy(te, "</"), xtag), ">");
/* XXX s was malloc'd */
if (isxml) {
const char * tagN = tagName(spft->u.tag.tag);
- need = strlen(tagN) + sizeof(" <rpmTag name=\"\">\n") - 1;
+ need = strlen(tagN) + sizeof(" <rpmTag name=\"\">\n") - 1;
t = hsaReserve(hsa, need);
/*@-boundswrite@*/
- te = stpcpy(t, " <rpmTag name=\"");
+ te = stpcpy(t, " <rpmTag name=\"");
te = stpcpy(te, tagN);
te = stpcpy(te, "\">\n");
/*@=boundswrite@*/
}
if (isxml) {
- need = sizeof(" </rpmTag>\n") - 1;
+ need = sizeof(" </rpmTag>\n") - 1;
t = hsaReserve(hsa, need);
/*@-boundswrite@*/
- te = stpcpy(t, " </rpmTag>\n");
+ te = stpcpy(t, " </rpmTag>\n");
/*@=boundswrite@*/
hsa->vallen += (te - t);
}