escape.c revision c932fb71cc90461b88ecdffe47c071d001d78fb4
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen This file is part of systemd.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen Copyright 2010 Lennart Poettering
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen systemd is free software; you can redistribute it and/or modify it
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen under the terms of the GNU Lesser General Public License as published by
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen the Free Software Foundation; either version 2.1 of the License, or
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen (at your option) any later version.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen systemd is distributed in the hope that it will be useful, but
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen Lesser General Public License for more details.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen You should have received a copy of the GNU Lesser General Public License
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen /* For special chars we prefer octal over
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * hexadecimal encoding, simply because glib's
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * g_strescape() does the same */
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersenchar *cescape_length(const char *s, size_t n) {
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen const char *f;
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen assert(s || n == 0);
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen /* Does C style string escaping. May be reversed with
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * cunescape(). */
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen for (f = s, t = r; f < s + n; f++)
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersenchar *cescape(const char *s) {
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersenint cunescape_one(const char *p, size_t length, char32_t *ret, bool *eight_bit) {
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen /* Unescapes C style. Returns the unescaped character in ret.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * Sets *eight_bit to true if the escaped sequence either fits in
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * one byte in UTF-8 or is a non-unicode literal byte and should
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen * instead be copied directly.
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen switch (p[0]) {
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
*eight_bit = true;
uint32_t c;
return -EINVAL;
return -EINVAL;
*ret = c;
char32_t c;
return -EINVAL;
c = ((uint32_t) a[0] << 28U) | ((uint32_t) a[1] << 24U) | ((uint32_t) a[2] << 20U) | ((uint32_t) a[3] << 16U) |
return -EINVAL;
if (!unichar_is_valid(c))
return -EINVAL;
*ret = c;
char32_t m;
return -EINVAL;
a = unoctchar(p[0]);
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
*ret = m;
*eight_bit = true;
return -EINVAL;
int cunescape_length_with_prefix(const char *s, size_t length, const char *prefix, UnescapeFlags flags, char **ret) {
assert(s);
return -ENOMEM;
if (prefix)
bool eight_bit = false;
char32_t u;
free(r);
return -EINVAL;
free(r);
if (eight_bit)
t += utf8_encode_unichar(t, u);
*ret = r;
return NULL;
*(t++) = hexchar(*f);
return NULL;
char *shell_maybe_quote(const char *s) {
assert(s);
return strdup(s);
return NULL;
t = mempcpy(t, s, p - s);