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 }