X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dict.c;h=312220f9de3ac23263d0e242c10bc46bef00cf5f;hb=7e152a7394dd2325e9040dd59cc5bba6d4b9dde5;hp=e731b185eaa6e8f6d702788b0393dc1f9b0f3fd8;hpb=a3aefad79476b553bedc7d55c0009da0212ef76e;p=pspp diff --git a/src/ui/gui/psppire-dict.c b/src/ui/gui/psppire-dict.c index e731b185ea..312220f9de 100644 --- a/src/ui/gui/psppire-dict.c +++ b/src/ui/gui/psppire-dict.c @@ -1,5 +1,5 @@ /* PSPPIRE - a graphical user interface for PSPP. - Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011 Free Software Foundation + Copyright (C) 2004, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -129,7 +129,7 @@ psppire_dict_class_init (PsppireDictClass *class) signals [VARIABLE_CHANGED] = - g_signal_new ("variable_changed", + g_signal_new ("variable-changed", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, @@ -142,7 +142,7 @@ psppire_dict_class_init (PsppireDictClass *class) signals [VARIABLE_INSERTED] = - g_signal_new ("variable_inserted", + g_signal_new ("variable-inserted", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, @@ -159,10 +159,10 @@ psppire_dict_class_init (PsppireDictClass *class) G_SIGNAL_RUN_FIRST, 0, NULL, NULL, - psppire_marshal_VOID__INT_INT_INT, + psppire_marshal_VOID__POINTER_INT_INT, G_TYPE_NONE, 3, - G_TYPE_INT, + G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT); @@ -248,10 +248,11 @@ addcb (struct dictionary *d, int idx, void *pd) } static void -delcb (struct dictionary *d, int dict_idx, int case_idx, int width, void *pd) +delcb (struct dictionary *d, const struct variable *var, + int dict_idx, int case_idx, void *pd) { g_signal_emit (pd, signals [VARIABLE_DELETED], 0, - dict_idx, case_idx, width ); + var, dict_idx, case_idx); } static void @@ -349,41 +350,56 @@ psppire_dict_replace_dictionary (PsppireDict *dict, struct dictionary *d) } -/* Returns a valid name for a new variable in DICT. - The return value is statically allocated */ -static gchar * -auto_generate_var_name (PsppireDict *dict) +/* Stores a valid name for a new variable in DICT into the SIZE bytes in NAME. + Returns true if successful, false if SIZE is insufficient. */ +bool +psppire_dict_generate_name (const PsppireDict *dict, char *name, size_t size) { - gint d = 0; - static gchar name[10]; + gint d; - /* TRANSLATORS: This string must be a valid variable name. That means: - - The string must be at most 64 bytes (not characters) long. - - The string may not contain whitespace. - - The first character may not be '$' - - The first character may not be a digit - - The final charactor may not be '.' or '_' - */ - while (g_snprintf (name, 10, _("VAR%05d"), d++), - psppire_dict_lookup_var (dict, name)) - ; + for (d = 1; ; d++) + { + int len; + + /* TRANSLATORS: This string must be a valid variable name. That means: + - The string must be at most 64 bytes (not characters) long. + - The string may not contain whitespace. + - The first character may not be '$' + - The first character may not be a digit + - The final charactor may not be '.' or '_' + */ + len = snprintf (name, size, _("Var%04d"), d); + if (len + 1 >= size) + return false; + + if (psppire_dict_lookup_var (dict, name) == NULL) + return true; + } return name; } -/* Insert a new variable at posn IDX, with the name NAME. +/* Insert a new variable at posn IDX, with the name NAME, and return the + new variable. If NAME is null, then a name will be automatically assigned. */ -void +struct variable * psppire_dict_insert_variable (PsppireDict *d, gint idx, const gchar *name) { - struct variable *var ; - g_return_if_fail (idx >= 0); - g_return_if_fail (d); - g_return_if_fail (PSPPIRE_IS_DICT (d)); + struct variable *var; + char tmpname[64]; + + g_return_val_if_fail (idx >= 0, NULL); + g_return_val_if_fail (d, NULL); + g_return_val_if_fail (PSPPIRE_IS_DICT (d), NULL); - if ( ! name ) - name = auto_generate_var_name (d); + if (name == NULL) + { + if (!psppire_dict_generate_name (d, tmpname, sizeof tmpname)) + g_return_val_if_reached (NULL); + + name = tmpname; + } d->disable_insert_signal = TRUE; @@ -394,6 +410,8 @@ psppire_dict_insert_variable (PsppireDict *d, gint idx, const gchar *name) d->disable_insert_signal = FALSE; g_signal_emit (d, signals[VARIABLE_INSERTED], 0, idx); + + return var; } /* Delete N variables beginning at FIRST */