Mercurial > dovecot > core-2.2
comparison src/lib/strescape.c @ 9484:5a6fe52a0cfc HEAD
Added str_append_tabunescaped(). str_tabescape*() now escapes also CR. Added unit tests.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 16 Jun 2009 13:49:18 -0400 |
parents | 464116e1d0ae |
children | aad42b172e1a |
comparison
equal
deleted
inserted
replaced
9483:464116e1d0ae | 9484:5a6fe52a0cfc |
---|---|
63 return start; | 63 return start; |
64 str++; | 64 str++; |
65 } | 65 } |
66 | 66 |
67 for (dest = str; *str != '\0'; str++) { | 67 for (dest = str; *str != '\0'; str++) { |
68 if (*str == '\\' && str[1] != '\0') | 68 if (*str == '\\') { |
69 str++; | 69 str++; |
70 if (*str == '\0') | |
71 break; | |
72 } | |
70 | 73 |
71 *dest++ = *str; | 74 *dest++ = *str; |
72 } | 75 } |
73 | 76 |
74 *dest = '\0'; | 77 *dest = '\0'; |
85 break; | 88 break; |
86 case '\t': | 89 case '\t': |
87 str_append_c(dest, '\001'); | 90 str_append_c(dest, '\001'); |
88 str_append_c(dest, 't'); | 91 str_append_c(dest, 't'); |
89 break; | 92 break; |
93 case '\r': | |
94 str_append_c(dest, '\001'); | |
95 str_append_c(dest, 'r'); | |
96 break; | |
90 case '\n': | 97 case '\n': |
91 str_append_c(dest, '\001'); | 98 str_append_c(dest, '\001'); |
92 str_append_c(dest, 'n'); | 99 str_append_c(dest, 'n'); |
93 break; | 100 break; |
94 default: | 101 default: |
102 { | 109 { |
103 string_t *tmp; | 110 string_t *tmp; |
104 const char *p; | 111 const char *p; |
105 | 112 |
106 for (p = str; *p != '\0'; p++) { | 113 for (p = str; *p != '\0'; p++) { |
107 if (*p <= '\n') { | 114 if (*p <= '\r') { |
108 tmp = t_str_new(128); | 115 tmp = t_str_new(128); |
109 str_append_n(tmp, str, p-str); | 116 str_append_n(tmp, str, p-str); |
110 str_tabescape_write(tmp, p); | 117 str_tabescape_write(tmp, p); |
111 return str_c(tmp); | 118 return str_c(tmp); |
112 } | 119 } |
113 } | 120 } |
114 return str; | 121 return str; |
115 } | 122 } |
123 | |
124 void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size) | |
125 { | |
126 const unsigned char *src_c = src; | |
127 size_t start = 0, i = 0; | |
128 | |
129 while (i < src_size) { | |
130 start = i; | |
131 for (; i < src_size; i++) { | |
132 if (src_c[i] == '\001') | |
133 break; | |
134 } | |
135 | |
136 str_append_n(dest, src_c + start, i-start); | |
137 | |
138 if (i < src_size) { | |
139 i++; | |
140 if (i < src_size) { | |
141 switch (src_c[i]) { | |
142 case '1': | |
143 str_append_c(dest, '\001'); | |
144 break; | |
145 case 't': | |
146 str_append_c(dest, '\t'); | |
147 break; | |
148 case 'r': | |
149 str_append_c(dest, '\r'); | |
150 break; | |
151 case 'n': | |
152 str_append_c(dest, '\n'); | |
153 break; | |
154 default: | |
155 str_append_c(dest, src_c[i]); | |
156 break; | |
157 } | |
158 i++; | |
159 } | |
160 } | |
161 start = i; | |
162 } | |
163 } |