Index: src/OFXMLFactory.m ================================================================== --- src/OFXMLFactory.m +++ src/OFXMLFactory.m @@ -28,11 +28,11 @@ * can prealloc and only resize when really necessary - OFString would always * resize when we append, which would be slow here. */ static inline void -xf_resize_chars(char **str, size_t *len, size_t add, Class class) +resize(char **str, size_t *len, size_t add, Class class) { char *str2; size_t len2; if (add > SIZE_MAX - *len) @@ -50,61 +50,61 @@ *str = str2; *len = len2; } static inline void -xf_add2chars(char **str, size_t *len, size_t *pos, const char *add, Class class) +append(char **str, size_t *len, size_t *pos, const char *add, Class class) { size_t add_len; add_len = strlen(add); - xf_resize_chars(str, len, add_len, class); + resize(str, len, add_len, class); memcpy(*str + *pos, add, add_len); *pos += add_len; } @implementation OFXMLFactory + (char*)escapeCString: (const char*)s { char *ret; - size_t i, j, len, nlen; - - len = nlen = strlen(s); - if (SIZE_MAX - len < 1) - @throw [OFOutOfRangeException newWithClass: self]; - nlen++; - - if ((ret = malloc(nlen)) == NULL) - @throw [OFNoMemException newWithClass: self - andSize: nlen]; - - for (i = j = 0; i < len; i++) { - switch (s[i]) { - case '<': - xf_add2chars(&ret, &nlen, &j, "<", self); - break; - case '>': - xf_add2chars(&ret, &nlen, &j, ">", self); - break; - case '"': - xf_add2chars(&ret, &nlen, &j, """, self); - break; - case '\'': - xf_add2chars(&ret, &nlen, &j, "'", self); - break; - case '&': - xf_add2chars(&ret, &nlen, &j, "&", self); - break; - default: - ret[j++] = s[i]; - break; - } - } - - ret[j] = 0; + size_t i, len; + + len = strlen(s); + if (SIZE_MAX - len < 1) + @throw [OFOutOfRangeException newWithClass: self]; + + len++; + if ((ret = malloc(len)) == NULL) + @throw [OFNoMemException newWithClass: self + andSize: len]; + + for (i = 0; *s; s++) { + switch (*s) { + case '<': + append(&ret, &len, &i, "<", self); + break; + case '>': + append(&ret, &len, &i, ">", self); + break; + case '"': + append(&ret, &len, &i, """, self); + break; + case '\'': + append(&ret, &len, &i, "'", self); + break; + case '&': + append(&ret, &len, &i, "&", self); + break; + default: + ret[i++] = *s; + break; + } + } + + ret[i] = 0; return ret; } + (char*)createStanza: (const char*)name withCloseTag: (BOOL)close @@ -141,11 +141,11 @@ while ((arg = va_arg(args, char*)) != NULL && (val = va_arg(args, char*)) != NULL) { esc_val = NULL; /* Needed for our @catch */ esc_val = [self escapeCString: val]; - xf_resize_chars(&xml, &len, 1 + strlen(arg) + 2 + + resize(&xml, &len, 1 + strlen(arg) + 2 + strlen(esc_val) + 1, self); xml[i++] = ' '; memcpy(xml + i, arg, strlen(arg)); i += strlen(arg); @@ -169,17 +169,17 @@ } /* End of tag */ if (close) { if (data == NULL) { - xf_resize_chars(&xml, &len, 2 - 1, self); + resize(&xml, &len, 2 - 1, self); xml[i++] = '/'; xml[i++] = '>'; } else { - xf_resize_chars(&xml, &len, 1 + strlen(data) + 2 + - strlen(name) + 1 - 1, self); + resize(&xml, &len, 1 + strlen(data) + 2 + strlen(name) + + 1 - 1, self); xml[i++] = '>'; memcpy(xml + i, data, strlen(data)); i += strlen(data); xml[i++] = '<'; @@ -214,14 +214,14 @@ memcpy(ret, strs[0], len - 1); pos = len - 1; for (i = 1; strs[i] != NULL; i++) - xf_add2chars(&ret, &len, &pos, strs[i], self); + append(&ret, &len, &pos, strs[i], self); for (i = 0; strs[i] != NULL; i++) free(strs[i]); ret[pos] = 0; return ret; } @end