Mercurial > dovecot > core-2.2
diff src/lib/strescape.c @ 896:21ffcce83c70 HEAD
Rewrote rfc822-tokenize.c to work one token at a time so it won't uselessly
take memory, maybe also a bit faster. This caused pretty large changes all
around.
Also moved all string (un)escaping code to lib/strescape.c.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 03 Jan 2003 17:57:12 +0200 |
parents | |
children | 0d5be52d7131 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/strescape.c Fri Jan 03 17:57:12 2003 +0200 @@ -0,0 +1,90 @@ +/* + Copyright (c) 2003 Timo Sirainen + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "lib.h" +#include "str.h" +#include "strescape.h" + +const char *str_escape(const char *str) +{ + char *ret, *p; + size_t i, esc; + + /* get length of string and number of chars to escape */ + esc = 0; + for (i = 0; str[i] != '\0'; i++) { + if (IS_ESCAPED_CHAR(str[i])) + esc++; + } + + if (esc == 0) + return str; + + /* @UNSAFE: escape them */ + p = ret = t_malloc(i + esc + 1); + for (; *str != '\0'; str++) { + if (IS_ESCAPED_CHAR(*str)) + *p++ = '\\'; + *p++ = *str; + } + *p = '\0'; + return ret; +} + +void str_append_unescaped(String *dest, const char *src, size_t src_size) +{ + size_t start = 0, i = 0; + + while (i < src_size) { + start = i; + for (; i < src_size; i++) { + if (src[i] == '\\') + break; + } + + str_append_n(dest, src + start, i-start); + + if (src[i] == '\\') + i++; + start = i; + } +} + +void str_unescape(char *str) +{ + /* @UNSAFE */ + char *dest; + + while (*str != '\\') { + if (*str == '\0') + return; + str++; + } + + for (dest = str; *str != '\0'; str++) { + if (*str != '\\' || str[1] == '\0') + *dest++ = *str; + } + + *dest = '\0'; +}