Fossil SCM

Performance optimization in the htmlize() utility routine.

drh 2020-11-21 21:04 trunk
Commit 4c1d38f97b4ecf18ae95f36c42936dd5ad6bf276e31176fac3f9afd1d26be9f0
1 file changed +23 -17
+23 -17
--- src/encode.c
+++ src/encode.c
@@ -26,31 +26,38 @@
2626
** to a new string obtained from malloc().
2727
**
2828
** We also encode " as " and ' as ' so they can appear as an argument
2929
** to markup.
3030
*/
31
-char *htmlize(const char *zIn, int n){
32
- int c;
31
+char *htmlize(const char *z, int n){
32
+ unsigned char c;
3333
int i = 0;
3434
int count = 0;
35
- char *zOut;
36
-
37
- if( n<0 ) n = strlen(zIn);
38
- while( i<n && (c = zIn[i])!=0 ){
39
- switch( c ){
40
- case '<': count += 4; break;
41
- case '>': count += 4; break;
42
- case '&': count += 5; break;
43
- case '"': count += 6; break;
44
- case '\'': count += 5; break;
45
- default: count++; break;
35
+ unsigned char *zOut;
36
+ const unsigned char *zIn = (const unsigned char*)z;
37
+
38
+ if( n<0 ) n = strlen(z);
39
+ while( i<n ){
40
+ switch( zIn[i] ){
41
+ case '<': count += 3; break;
42
+ case '>': count += 3; break;
43
+ case '&': count += 4; break;
44
+ case '"': count += 5; break;
45
+ case '\'': count += 4; break;
46
+ case 0: n = i; break;
4647
}
4748
i++;
4849
}
4950
i = 0;
50
- zOut = fossil_malloc( count+1 );
51
- while( n-->0 && (c = *zIn)!=0 ){
51
+ zOut = fossil_malloc( count+n+1 );
52
+ if( count==0 ){
53
+ memcpy(zOut, zIn, n);
54
+ zOut[n] = 0;
55
+ return (char*)zOut;
56
+ }
57
+ while( n-->0 ){
58
+ c = *(zIn++);
5259
switch( c ){
5360
case '<':
5461
zOut[i++] = '&';
5562
zOut[i++] = 'l';
5663
zOut[i++] = 't';
@@ -86,14 +93,13 @@
8693
break;
8794
default:
8895
zOut[i++] = c;
8996
break;
9097
}
91
- zIn++;
9298
}
9399
zOut[i] = 0;
94
- return zOut;
100
+ return (char*)zOut;
95101
}
96102
97103
/*
98104
** Append HTML-escaped text to a Blob.
99105
*/
100106
--- src/encode.c
+++ src/encode.c
@@ -26,31 +26,38 @@
26 ** to a new string obtained from malloc().
27 **
28 ** We also encode " as &quot; and ' as &#39; so they can appear as an argument
29 ** to markup.
30 */
31 char *htmlize(const char *zIn, int n){
32 int c;
33 int i = 0;
34 int count = 0;
35 char *zOut;
36
37 if( n<0 ) n = strlen(zIn);
38 while( i<n && (c = zIn[i])!=0 ){
39 switch( c ){
40 case '<': count += 4; break;
41 case '>': count += 4; break;
42 case '&': count += 5; break;
43 case '"': count += 6; break;
44 case '\'': count += 5; break;
45 default: count++; break;
 
46 }
47 i++;
48 }
49 i = 0;
50 zOut = fossil_malloc( count+1 );
51 while( n-->0 && (c = *zIn)!=0 ){
 
 
 
 
 
 
52 switch( c ){
53 case '<':
54 zOut[i++] = '&';
55 zOut[i++] = 'l';
56 zOut[i++] = 't';
@@ -86,14 +93,13 @@
86 break;
87 default:
88 zOut[i++] = c;
89 break;
90 }
91 zIn++;
92 }
93 zOut[i] = 0;
94 return zOut;
95 }
96
97 /*
98 ** Append HTML-escaped text to a Blob.
99 */
100
--- src/encode.c
+++ src/encode.c
@@ -26,31 +26,38 @@
26 ** to a new string obtained from malloc().
27 **
28 ** We also encode " as &quot; and ' as &#39; so they can appear as an argument
29 ** to markup.
30 */
31 char *htmlize(const char *z, int n){
32 unsigned char c;
33 int i = 0;
34 int count = 0;
35 unsigned char *zOut;
36 const unsigned char *zIn = (const unsigned char*)z;
37
38 if( n<0 ) n = strlen(z);
39 while( i<n ){
40 switch( zIn[i] ){
41 case '<': count += 3; break;
42 case '>': count += 3; break;
43 case '&': count += 4; break;
44 case '"': count += 5; break;
45 case '\'': count += 4; break;
46 case 0: n = i; break;
47 }
48 i++;
49 }
50 i = 0;
51 zOut = fossil_malloc( count+n+1 );
52 if( count==0 ){
53 memcpy(zOut, zIn, n);
54 zOut[n] = 0;
55 return (char*)zOut;
56 }
57 while( n-->0 ){
58 c = *(zIn++);
59 switch( c ){
60 case '<':
61 zOut[i++] = '&';
62 zOut[i++] = 'l';
63 zOut[i++] = 't';
@@ -86,14 +93,13 @@
93 break;
94 default:
95 zOut[i++] = c;
96 break;
97 }
 
98 }
99 zOut[i] = 0;
100 return (char*)zOut;
101 }
102
103 /*
104 ** Append HTML-escaped text to a Blob.
105 */
106

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button