#include <ctype.h>
#include <sys/types.h>
#include <regex.h>
+#include <libpspp/cast.h>
#include <libpspp/message.h>
#include <gtk/gtk.h>
/* Pops up the Find dialog box
*/
void
-find_dialog (GObject *o, gpointer data)
+find_dialog (PsppireDataWindow *de)
{
- PsppireDataWindow *de = PSPPIRE_DATA_WINDOW (data);
-
struct find_dialog fd;
GtkWidget *dialog ;
buttonbox = get_widget_assert (fd.xml, "find-buttonbox");
- gtk_box_pack_start_defaults (GTK_BOX (buttonbox), find_button);
+ psppire_box_pack_start_defaults (GTK_BOX (buttonbox), find_button);
gtk_box_reorder_child (GTK_BOX (buttonbox), find_button, 0);
dialog = get_widget_assert (fd.xml, "find-dialog");
"data-store", &ds,
NULL);
- fd.dict = vs->dict;
+ g_object_get (vs, "dictionary", &fd.dict, NULL);
+
fd.data = ds->datasheet;
fd.variable_entry = get_widget_assert (fd.xml, "find-variable-entry");
gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (de));
- g_object_set (source, "dictionary", fd.dict,
+ g_object_set (source, "model", fd.dict,
"selection-mode", GTK_SELECTION_SINGLE,
NULL);
- psppire_selector_set_subjects (PSPPIRE_SELECTOR (selector),
- source,
- fd.variable_entry,
- insert_source_row_into_entry,
- is_currently_in_entry,
- NULL
- );
+
+ psppire_selector_set_filter_func (PSPPIRE_SELECTOR (selector),
+ is_currently_in_entry);
g_signal_connect (dialog, "refresh", G_CALLBACK (refresh), &fd);
{
const struct variable *var;
enum string_cmp_flags flags;
+ const PsppireDict *dict;
bool (*compare) (const struct comparator *,
const union value *);
string_value_compare (const struct comparator *cmptr,
const union value *val)
{
+ bool found;
+ char *text;
const struct string_comparator *ssc =
(const struct string_comparator *) cmptr;
int width = var_get_width (cmptr->var);
- const char *text = value_str (val, width);
-
+ g_return_val_if_fail (width > 0, false);
assert ( ! (cmptr->flags & STR_CMP_LABELS));
- g_return_val_if_fail (width > 0, false);
+ text = value_to_text (*val, cmptr->dict, *var_get_write_format (cmptr->var));
if ( cmptr->flags & STR_CMP_SUBSTR)
- return (NULL != g_strstr_len (text, width, ssc->pattern));
+ found = (NULL != g_strstr_len (text, width, ssc->pattern));
else
- return (0 == strncmp (text, ssc->pattern, width));
+ found = (0 == strncmp (text, ssc->pattern, width));
+
+ free (text);
+ return found;
}
g_return_val_if_fail (width > 0, false);
+ text = value_to_text (*val, cmptr->dict, *var_get_write_format (cmptr->var));
/* We must remove trailing whitespace, otherwise $ will not match where
one would expect */
- text = g_strndup (value_str (val, width), width);
g_strchomp (text);
retval = (0 == regexec (&rec->re, text, 0, 0, 0));
static void
regexp_destroy (struct comparator *cmptr)
{
- struct regexp_comparator *rec = (struct regexp_comparator *) cmptr;
+ struct regexp_comparator *rec
+ = UP_CAST (cmptr, struct regexp_comparator, parent);
regfree (&rec->re);
}
static void
cmptr_value_destroy (struct comparator *cmptr)
{
- struct value_comparator *vc = (struct value_comparator *) cmptr;
+ struct value_comparator *vc
+ = UP_CAST (cmptr, struct value_comparator, parent);
value_destroy (&vc->pattern, var_get_width (cmptr->var));
}
static struct comparator *
-value_comparator_create (const struct variable *var, const char *target)
+value_comparator_create (const struct variable *var, const PsppireDict *dict, const char *target)
{
- const struct fmt_spec *fmt;
- int width ;
struct value_comparator *vc = xzalloc (sizeof (*vc));
- struct comparator *cmptr = (struct comparator *) vc;
+ struct comparator *cmptr = &vc->parent;
cmptr->flags = 0;
cmptr->var = var;
cmptr->compare = value_compare ;
cmptr->destroy = cmptr_value_destroy;
+ cmptr->dict = dict;
- width = var_get_width (var);
- fmt = var_get_write_format (var);
-
- value_init (&vc->pattern, width);
-
- if ( ! data_in (ss_cstr (target),
- LEGACY_NATIVE,
- fmt->type,
- 0, 0, 0,
- &vc->pattern, width) )
- {
- value_destroy (&vc->pattern, width);
- free (vc);
- return NULL;
- }
+ text_to_value (target, dict, var, &vc->pattern);
return cmptr;
}
static struct comparator *
-string_comparator_create (const struct variable *var, const char *target,
+string_comparator_create (const struct variable *var, const PsppireDict *dict,
+ const char *target,
enum string_cmp_flags flags)
{
struct string_comparator *ssc = xzalloc (sizeof (*ssc));
- struct comparator *cmptr = (struct comparator *) ssc;
+ struct comparator *cmptr = &ssc->parent;
cmptr->flags = flags;
cmptr->var = var;
+ cmptr->dict = dict;
if ( flags & STR_CMP_LABELS)
cmptr->compare = string_label_compare;
static struct comparator *
-regexp_comparator_create (const struct variable *var, const char *target,
+regexp_comparator_create (const struct variable *var, const PsppireDict *dict, const char *target,
enum string_cmp_flags flags)
{
int code;
struct regexp_comparator *rec = xzalloc (sizeof (*rec));
- struct comparator *cmptr = (struct comparator *) rec;
+ struct comparator *cmptr = &rec->parent;
cmptr->flags = flags;
cmptr->var = var;
+ cmptr->dict = dict;
cmptr->compare = (flags & STR_CMP_LABELS)
? regexp_label_compare : regexp_value_compare ;
static struct comparator *
-comparator_factory (const struct variable *var, const char *str,
+comparator_factory (const struct variable *var, const PsppireDict *dict, const char *str,
enum string_cmp_flags flags)
{
if ( flags & STR_CMP_REGEXP )
- return regexp_comparator_create (var, str, flags);
+ return regexp_comparator_create (var, dict, str, flags);
if ( flags & (STR_CMP_SUBSTR | STR_CMP_LABELS) )
- return string_comparator_create (var, str, flags);
+ return string_comparator_create (var, dict, str, flags);
- return value_comparator_create (var, str);
+ return value_comparator_create (var, dict, str);
}
casenumber i;
const struct casenum_iterator *ip = get_iteration_params (fd);
struct comparator *cmptr =
- comparator_factory (var, target_string, flags);
+ comparator_factory (var, fd->dict, target_string, flags);
value_init (&val, width);
if ( ! cmptr)