/* * 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 . * * Author: Ryan Lortie */ #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 }