ObjFW  Check-in [571eb6c222]

Overview
Comment:Some optimizations and a few renames of internal vars in OFXMLFactory.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 571eb6c2229d0914359aebf2c5a4c0136ed90fd44e170a32780f429d8bb44686
User & Date: js on 2009-04-20 01:04:52
Other Links: manifest | tags
Context
2009-04-20
01:06
Sometimes it might be desirable not to run configure.
For exampe if you want to package.
check-in: 6043638dee user: js tags: trunk
01:04
Some optimizations and a few renames of internal vars in OFXMLFactory. check-in: 571eb6c222 user: js tags: trunk
2009-04-19
23:33
Update TODO. check-in: b258d80203 user: js tags: trunk
Changes

Modified src/OFXMLFactory.m from [88fdb05c43] to [b53cd466b1].

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 *
 * We already have a clue about how big the resulting string will get, so we
 * 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)
{
	char *str2;
	size_t len2;

	if (add > SIZE_MAX - *len)
		@throw [OFOutOfRangeException newWithClass: class];
	len2 = *len + add;







|







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 *
 * We already have a clue about how big the resulting string will get, so we
 * can prealloc and only resize when really necessary - OFString would always
 * resize when we append, which would be slow here.
 */

static inline void
resize(char **str, size_t *len, size_t add, Class class)
{
	char *str2;
	size_t len2;

	if (add > SIZE_MAX - *len)
		@throw [OFOutOfRangeException newWithClass: class];
	len2 = *len + add;
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
	}

	*str = str2;
	*len = len2;
}

static inline void
xf_add2chars(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);

	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, "&lt;", self);
			break;
		case '>':
			xf_add2chars(&ret, &nlen, &j, "&gt;", self);
			break;
		case '"':
			xf_add2chars(&ret, &nlen, &j, "&quot;", self);
			break;
		case '\'':
			xf_add2chars(&ret, &nlen, &j, "&apos;", self);
			break;
		case '&':
			xf_add2chars(&ret, &nlen, &j, "&amp;", self);
			break;
		default:
			ret[j++] = s[i];
			break;
		}
	}

	ret[j] = 0;
	return ret;
}

+ (char*)createStanza: (const char*)name
	 withCloseTag: (BOOL)close
	      andData: (const char*)data, ...
{







|





|









|

|


<

>
|

|

|
|

|


|


|


|


|


|




|







48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
	}

	*str = str2;
	*len = len2;
}

static inline void
append(char **str, size_t *len, size_t *pos, const char *add, Class class)
{
	size_t add_len;

	add_len = strlen(add);

	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, 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, "&lt;", self);
			break;
		case '>':
			append(&ret, &len, &i, "&gt;", self);
			break;
		case '"':
			append(&ret, &len, &i, "&quot;", self);
			break;
		case '\'':
			append(&ret, &len, &i, "&apos;", self);
			break;
		case '&':
			append(&ret, &len, &i, "&amp;", self);
			break;
		default:
			ret[i++] = *s;
			break;
		}
	}

	ret[i] = 0;
	return ret;
}

+ (char*)createStanza: (const char*)name
	 withCloseTag: (BOOL)close
	      andData: (const char*)data, ...
{
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
		va_start(args, data);

		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 +
			    strlen(esc_val) + 1, self);

			xml[i++] = ' ';
			memcpy(xml + i, arg, strlen(arg));
			i += strlen(arg);
			xml[i++] = '=';
			xml[i++] = '\'';







|







139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
		va_start(args, data);

		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];

			resize(&xml, &len, 1 + strlen(arg) + 2 +
			    strlen(esc_val) + 1, self);

			xml[i++] = ' ';
			memcpy(xml + i, arg, strlen(arg));
			i += strlen(arg);
			xml[i++] = '=';
			xml[i++] = '\'';
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

		@throw e;
	}

	/* End of tag */
	if (close) {
		if (data == NULL) {
			xf_resize_chars(&xml, &len, 2 - 1, self);

			xml[i++] = '/';
			xml[i++] = '>';
		} else {
			xf_resize_chars(&xml, &len, 1 + strlen(data) + 2 +
			    strlen(name) + 1 - 1, self);

			xml[i++] = '>';
			memcpy(xml + i, data, strlen(data));
			i += strlen(data);
			xml[i++] = '<';
			xml[i++] = '/';
			memcpy(xml + i, name, strlen(name));







|




|
|







167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

		@throw e;
	}

	/* End of tag */
	if (close) {
		if (data == NULL) {
			resize(&xml, &len, 2 - 1, self);

			xml[i++] = '/';
			xml[i++] = '>';
		} else {
			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++] = '<';
			xml[i++] = '/';
			memcpy(xml + i, name, strlen(name));
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
		@throw [OFNoMemException newWithClass: self
					      andSize: len];

	memcpy(ret, strs[0], len - 1);
	pos = len - 1;

	for (i = 1; strs[i] != NULL; i++)
		xf_add2chars(&ret, &len, &pos, strs[i], self);

	for (i = 0; strs[i] != NULL; i++)
		free(strs[i]);

	ret[pos] = 0;
	return ret;
}
@end







|








212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
		@throw [OFNoMemException newWithClass: self
					      andSize: len];

	memcpy(ret, strs[0], len - 1);
	pos = len - 1;

	for (i = 1; strs[i] != NULL; i++)
		append(&ret, &len, &pos, strs[i], self);

	for (i = 0; strs[i] != NULL; i++)
		free(strs[i]);

	ret[pos] = 0;
	return ret;
}
@end