* 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, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Author: Ryan Lortie <desrt@desrt.ca>
*/
/* Prologue {{{1 */
-#define _GNU_SOURCE
#include "config.h"
#include <gstdio.h>
-#include <locale.h>
+#include <gi18n.h>
+
#include <string.h>
-#include <unistd.h>
#include <stdio.h>
-
-#include <gi18n.h>
+#include <locale.h>
#include "gvdb/gvdb-builder.h"
#include "strinfo.c"
+#ifdef G_OS_WIN32
+#include "glib/glib-private.h"
+#endif
+
+static void
+strip_string (GString *string)
+{
+ gint i;
+
+ for (i = 0; g_ascii_isspace (string->str[i]); i++);
+ g_string_erase (string, 0, i);
+
+ if (string->len > 0)
+ {
+ /* len > 0, so there must be at least one non-whitespace character */
+ for (i = string->len - 1; g_ascii_isspace (string->str[i]); i--);
+ g_string_truncate (string, i + 1);
+ }
+}
+
/* Handling of <enum> {{{1 */
typedef struct
{
g_slice_free (EnumState, state);
}
-EnumState *
+static EnumState *
enum_state_new (gboolean is_flags)
{
EnumState *state;
{
g_set_error_literal (error, G_MARKUP_ERROR,
G_MARKUP_ERROR_INVALID_CONTENT,
- "<choices> can not be specified for keys "
+ "<choices> cannot be specified for keys "
"tagged as having an enumerated type");
return;
}
/* translation */
if (state->l10n)
{
+ /* We are going to store the untranslated default for
+ * runtime translation according to the current locale.
+ * We need to strip leading and trailing whitespace from
+ * the string so that it's exactly the same as the one
+ * that ended up in the .po file for translation.
+ *
+ * We want to do this so that
+ *
+ * <default l10n='messages'>
+ * ['a', 'b', 'c']
+ * </default>
+ *
+ * ends up in the .po file like "['a', 'b', 'c']",
+ * omitting the extra whitespace at the start and end.
+ */
+ strip_string (state->unparsed_default_value);
+
if (state->l10n_context)
{
gint len;
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
_("invalid name '%s': invalid character '%c'; "
- "only lowercase letters, numbers and dash ('-') "
+ "only lowercase letters, numbers and hyphen ('-') "
"are permitted."), key, key[i]);
return FALSE;
}
if (key[i] == '-' && key[i + 1] == '-')
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
- _("invalid name '%s': two successive dashes ('--') "
+ _("invalid name '%s': two successive hyphens ('--') "
"are not permitted."), key);
return FALSE;
}
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
_("invalid name '%s': the last character may not be a "
- "dash ('-')."), key);
+ "hyphen ('-')."), key);
return FALSE;
}
- if (i > 32)
+ if (i > 1024)
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
- _("invalid name '%s': maximum length is 32"), key);
+ _("invalid name '%s': maximum length is 1024"), key);
return FALSE;
}
{
g_set_error_literal (error, G_MARKUP_ERROR,
G_MARKUP_ERROR_INVALID_CONTENT,
- _("can not add keys to a 'list-of' schema"));
+ _("cannot add keys to a 'list-of' schema"));
return NULL;
}
{
g_set_error (error, G_MARKUP_ERROR,
G_MARKUP_ERROR_INVALID_CONTENT,
- _("<schema id='%s'> extends not yet "
- "existing schema '%s'"), id, extends_name);
+ _("<schema id='%s'> extends not yet existing "
+ "schema '%s'"), id, extends_name);
return;
}
}
{
g_set_error (error, G_MARKUP_ERROR,
G_MARKUP_ERROR_INVALID_CONTENT,
- _("<schema id='%s'> is list of not yet "
- "existing schema '%s'"), id, list_of);
+ _("<schema id='%s'> is list of not yet existing "
+ "schema '%s'"), id, list_of);
return;
}
return;
}
+ if (path && (g_str_has_prefix (path, "/apps/") ||
+ g_str_has_prefix (path, "/desktop/") ||
+ g_str_has_prefix (path, "/system/")))
+ g_printerr ("warning: Schema '%s' has path '%s'. Paths starting with "
+ "'/apps/', '/desktop/' or '/system/' are deprecated.\n", id, path);
+
state->schema_state = schema_state_new (path, gettext_domain,
extends, extends_name, list_of);
element_name, container);
else
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
- _("Element <%s> not allowed at toplevel"), element_name);
+ _("Element <%s> not allowed at the top level"), element_name);
}
/* 2}}} */
/* End element {{{2 */
GError **error)
{
ParseState *state = user_data;
- gsize i;
-
- for (i = 0; i < text_len; i++)
- if (!g_ascii_isspace (text[i]))
- {
- if (state->string)
- g_string_append_len (state->string, text, text_len);
- else
- g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
- _("text may not appear inside <%s>"),
- g_markup_parse_context_get_element (context));
+ if (state->string)
+ {
+ /* we are expecting a string, so store the text data.
+ *
+ * we store the data verbatim here and deal with whitespace
+ * later on. there are two reasons for that:
+ *
+ * 1) whitespace is handled differently depending on the tag
+ * type.
+ *
+ * 2) we could do leading whitespace removal by refusing to
+ * insert it into state->string if it's at the start, but for
+ * trailing whitespace, we have no idea if there is another
+ * text() call coming or not.
+ */
+ g_string_append_len (state->string, text, text_len);
+ }
+ else
+ {
+ /* string is not expected: accept (and ignore) pure whitespace */
+ gsize i;
- break;
- }
+ for (i = 0; i < text_len; i++)
+ if (!g_ascii_isspace (text[i]))
+ {
+ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ _("text may not appear inside <%s>"),
+ g_markup_parse_context_get_element (context));
+ break;
+ }
+ }
}
/* Write to GVDB {{{1 */
if (state->list_of)
gvdb_hash_table_insert_string (data.pair.table, ".list-of",
- state->extends_name);
+ state->list_of);
if (data.l10n)
gvdb_hash_table_insert_string (data.pair.table,
}
context = g_markup_parse_context_new (&parser,
- G_MARKUP_PREFIX_ERROR_POSITION,
+ G_MARKUP_TREAT_CDATA_AS_TEXT |
+ G_MARKUP_PREFIX_ERROR_POSITION |
+ G_MARKUP_IGNORE_QUALIFIED,
&state, NULL);
if (state == NULL)
{
- fprintf (stderr, _("No such key `%s' in schema `%s' as "
- "specified in override file `%s'"),
+ fprintf (stderr, _("No such key '%s' in schema '%s' as "
+ "specified in override file '%s'"),
key, group, filename);
if (!strict)
if (value == NULL)
{
- fprintf (stderr, _("error parsing key `%s' in schema `%s' "
- "as specified in override file `%s': "
- "%s. "),
+ fprintf (stderr, _("error parsing key '%s' in schema '%s' "
+ "as specified in override file '%s': "
+ "%s."),
key, group, filename, error->message);
g_clear_error (&error);
g_variant_compare (value, state->maximum) > 0)
{
fprintf (stderr,
- _("override for key `%s' in schema `%s' in "
- "override file `%s' is out of the range "
+ _("override for key '%s' in schema '%s' in "
+ "override file '%s' is outside the range "
"given in the schema"),
key, group, filename);
if (!is_valid_choices (value, state->strinfo))
{
fprintf (stderr,
- _("override for key `%s' in schema `%s' in "
- "override file `%s' is not in the list "
+ _("override for key '%s' in schema '%s' in "
+ "override file '%s' is not in the list "
"of valid choices"),
key, group, filename);
gchar *srcdir;
gchar *targetdir = NULL;
gchar *target;
- gboolean uninstall = FALSE;
gboolean dry_run = FALSE;
gboolean strict = FALSE;
gchar **schema_files = NULL;
{ "targetdir", 0, 0, G_OPTION_ARG_FILENAME, &targetdir, N_("where to store the gschemas.compiled file"), N_("DIRECTORY") },
{ "strict", 0, 0, G_OPTION_ARG_NONE, &strict, N_("Abort on any errors in schemas"), NULL },
{ "dry-run", 0, 0, G_OPTION_ARG_NONE, &dry_run, N_("Do not write the gschema.compiled file"), NULL },
- { "uninstall", 0, 0, G_OPTION_ARG_NONE, &uninstall, N_("This option will be removed soon.") },
{ "allow-any-name", 0, 0, G_OPTION_ARG_NONE, &allow_any_name, N_("Do not enforce key name restrictions") },
/* These options are only for use in the gschema-compile tests */
{ NULL }
};
+#ifdef G_OS_WIN32
+ gchar *tmp;
+#endif
+
setlocale (LC_ALL, "");
textdomain (GETTEXT_PACKAGE);
+
#ifdef G_OS_WIN32
- extern gchar *_glib_get_locale_dir (void);
- gchar *tmp = _glib_get_locale_dir ();
+ tmp = _glib_get_locale_dir ();
bindtextdomain (GETTEXT_PACKAGE, tmp);
g_free (tmp);
#else
if (files->len == 0)
{
- fprintf (stderr, _("No schema files found: "));
+ fprintf (stdout, _("No schema files found: "));
if (g_unlink (target))
- fprintf (stderr, _("doing nothing.\n"));
+ fprintf (stdout, _("doing nothing.\n"));
else
- fprintf (stderr, _("removed existing output file.\n"));
+ fprintf (stdout, _("removed existing output file.\n"));
return 0;
}