diff options
Diffstat (limited to 'common/dconf-paths.c')
-rw-r--r-- | common/dconf-paths.c | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/common/dconf-paths.c b/common/dconf-paths.c new file mode 100644 index 0000000..047429d --- /dev/null +++ b/common/dconf-paths.c @@ -0,0 +1,253 @@ +/* + * Copyright © 2008-2009 Ryan Lortie + * Copyright © 2010 Codethink Limited + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the licence, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Ryan Lortie <desrt@desrt.ca> + */ + +#include "config.h" + +#include "dconf-paths.h" + +#include "dconf-enums.h" + +/** + * SECTION:paths + * @title: dconf Paths + * @short_description: utility functions to validate dconf paths + * + * Various places in the dconf API speak of "paths", "keys", "dirs" and + * relative versions of each of these. This file contains functions to + * check if a given string is a valid member of each of these classes + * and to report errors when a string is not. + * + * See each function in this section for a precise description of what + * makes a string a valid member of a given class. + **/ + +#define vars gchar c, l + +#define nonnull \ + if (string == NULL) { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "%s not specified", type); \ + return FALSE; \ + } + + +#define absolute \ + if ((l = *string++) != '/') \ + { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "dconf %s must begin with a slash", type); \ + return FALSE; \ + } + +#define relative \ + if (*string == '/') \ + { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "dconf %s must not begin with a slash", type); \ + return FALSE; \ + } \ + l = '/' + +#define no_double_slash \ + while ((c = *string++)) \ + { \ + if (c == '/' && l == '/') \ + { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "dconf %s must not contain two " \ + "consecutive slashes", type); \ + return FALSE; \ + } \ + l = c; \ + } \ + +#define path \ + return TRUE + +#define key \ + if (l == '/') \ + { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "dconf %s must not end with a slash", type); \ + return FALSE; \ + } \ + return TRUE + +#define dir \ + if (l != '/') \ + { \ + g_set_error (error, DCONF_ERROR, DCONF_ERROR_PATH, \ + "dconf %s must end with a slash", type); \ + return FALSE; \ + } \ + return TRUE + + + +/** + * dconf_is_path: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf path. dconf keys must start with + * '/' and not contain '//'. + * + * A dconf path may be either a key or a dir. See dconf_is_key() and + * dconf_is_dir() for examples of each. + * + * Returns: %TRUE if @string is a path + **/ +gboolean +dconf_is_path (const gchar *string, + GError **error) +{ +#define type "path" + vars; nonnull; absolute; no_double_slash; path; +#undef type +} + +/** + * dconf_is_key: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf key. dconf keys must start with + * '/', not contain '//' and not end with '/'. + * + * A dconf key is the potential location of a single value within the + * database. + * + * "/a", "/a/b" and "/a/b/c" are examples of keys. "", "/", "a", "a/b", + * "//a/b", "/a//b", and "/a/" are examples of strings that are not + * keys. + * + * Returns: %TRUE if @string is a key + **/ +gboolean +dconf_is_key (const gchar *string, + GError **error) +{ +#define type "key" + vars; nonnull; absolute; no_double_slash; key; +#undef type +} + +/** + * dconf_is_dir: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf dir. dconf dirs must start and + * end with '/' and not contain '//'. + * + * A dconf dir refers to a subtree of the database that can contain + * other dirs or keys. If @string is a dir, then it will be a prefix of + * any key or dir contained within it. + * + * "/", "/a/" and "/a/b/" are examples of dirs. "", "a/", "a/b/", + * "//a/b/", "/a//b/" and "/a" are examples of strings that are not + * dirs. + * + * Returns: %TRUE if @string is a dir + **/ +gboolean +dconf_is_dir (const gchar *string, + GError **error) +{ +#define type "dir" + vars; nonnull; absolute; no_double_slash; dir; +#undef type +} + +/** + * dconf_is_rel_path: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf relative path. A relative path is + * a string that, when concatenated to a dir, forms a valid dconf path. + * This means that a rel must not start with a '/' or contain '//'. + * + * A dconf rel may be either a relative key or a relative dir. See + * dconf_is_rel_key() and dconf_is_rel_dir() for examples of each. + * + * Returns: %TRUE if @string is a relative path + **/ +gboolean +dconf_is_rel_path (const gchar *string, + GError **error) +{ +#define type "relative path" + vars; nonnull; relative; no_double_slash; path; +#undef type +} + + +/** + * dconf_is_rel_key: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf relative key. A relative key is a + * string that, when concatenated to a dir, forms a valid dconf key. + * This means that a relative key must not start or end with a '/' or + * contain '//'. + * + * "a", "a/b" and "a/b/c" are examples of relative keys. "", "/", "/a", + * "/a/b", "//a/b", "/a//b", and "a/" are examples of strings that are + * not relative keys. + * + * Returns: %TRUE if @string is a relative key + **/ +gboolean +dconf_is_rel_key (const gchar *string, + GError **error) +{ +#define type "relative key" + vars; nonnull; relative; no_double_slash; key; +#undef type +} + +/** + * dconf_is_rel_dir: + * @string: a string + * @error: a pointer to a #GError, or %NULL, set when %FALSE is returned + * + * Checks if @string is a valid dconf relative dir. A relative dir is a + * string that, when appended to a dir, forms a valid dconf dir. This + * means that a relative dir must not start with a '/' or contain '//' + * and must end with a '/' except in the case that it is the empty + * string (in which case the path specified by appending the rel to a + * directory is the original directory). + * + * "", "a/" and "a/b/" are examples of relative dirs. "/", "/a/", + * "/a/b/", "//a/b/", "a//b/" and "a" are examples of strings that are + * not relative dirs. + * + * Returns: %TRUE if @string is a relative dir + **/ +gboolean +dconf_is_rel_dir (const gchar *string, + GError **error) +{ +#define type "relative dir" + vars; nonnull; relative; no_double_slash; dir; +#undef type +} |