static void
do_find (GObject *obj, const struct find_dialog *fd)
{
+ SswSheet *sheet = SSW_SHEET (fd->de->data_editor->data_sheet);
casenumber x = -1;
gint column = -1;
- glong row = -1;
+ gint unused;
+ gint row = 0;
+ ssw_sheet_get_active_cell (sheet, &unused, &row);
find_value (fd, row, &x, &column);
if (x != -1)
{
- SswSheet *sheet = SSW_SHEET (fd->de->data_editor->data_sheet);
gtk_notebook_set_current_page (GTK_NOTEBOOK (fd->de->data_editor),
PSPPIRE_DATA_EDITOR_DATA_VIEW);
static casenumber
cm1 (casenumber current, struct datasheet *data)
{
- if (current == -1)
- return datasheet_get_n_rows (data);
+ if (current == 0)
+ return datasheet_get_n_rows (data) - 1;
return current - 1;
}
{
casenumber next = current;
- if (current == -1)
- return datasheet_get_n_rows (data);
-
backward_wrap (&next, data);
return next;
static casenumber
minus1 (casenumber current, struct datasheet *data)
{
- if (current == -1)
- return 0;
-
return -1;
}
n_iterators
};
-static const struct casenum_iterator ip[n_iterators] =
+static const struct casenum_iterator case_iterator[n_iterators] =
{
+ /* Forward iterator (linear) */
{cp1, last, forward},
+
+ /* Forward iterator (circular) */
{cp1c, cm1, forward_wrap},
+
+ /* Reverse iterator (linear) */
{cm1, minus1, backward},
+
+ /* Reverse iterator (circular */
{cm1c, cp1, backward_wrap}
};
if (wrap)
{
if (reverse)
- return &ip[REVERSE_WRAP];
+ return &case_iterator[REVERSE_WRAP];
else
- return &ip[FORWARD_WRAP];
+ return &case_iterator[FORWARD_WRAP];
}
else
{
if (reverse)
- return &ip[REVERSE];
+ return &case_iterator[REVERSE];
else
- return &ip[FORWARD];
+ return &case_iterator[FORWARD];
}
}
regex_t re;
};
+/* Returns 10 raised to the power of X.
+ X must be a non-negative integer. */
+static inline int
+int_pow10 (int x)
+{
+ int ret = 1;
+ assert (x >= 0);
+ while (x--)
+ ret *= 10;
+
+ return ret;
+}
static bool
value_compare (const struct comparator *cmptr,
const struct numeric_comparator *nc = (const struct numeric_comparator *) cmptr;
const struct fmt_spec *fs = var_get_print_format (cmptr->var);
- double c = nearbyint (v->f * exp10 (fs->d));
+ double c = nearbyint (v->f * int_pow10 (fs->d));
return c == nc->rounded_ref;
}
static struct comparator *
numeric_comparator_create (const struct variable *var, const char *target)
{
- struct numeric_comparator *nc = xzalloc (sizeof (*nc));
+ struct numeric_comparator *nc = XZALLOC (struct numeric_comparator);
struct comparator *cmptr = &nc->parent;
cmptr->flags = 0;
union value val;
text_to_value (target, var, &val);
- nc->rounded_ref = nearbyint (val.f * exp10 (fs->d));
+ nc->rounded_ref = nearbyint (val.f * int_pow10 (fs->d));
value_destroy (&val, var_get_width (var));
return cmptr;
string_comparator_create (const struct variable *var, const char *target,
enum string_cmp_flags flags)
{
- struct string_comparator *ssc = xzalloc (sizeof (*ssc));
+ struct string_comparator *ssc = XZALLOC (struct string_comparator);
struct comparator *cmptr = &ssc->parent;
cmptr->flags = flags;
enum string_cmp_flags flags)
{
int code;
- struct regexp_comparator *rec = xzalloc (sizeof (*rec));
+ struct regexp_comparator *rec = XZALLOC (struct regexp_comparator);
struct comparator *cmptr = &rec->parent;
cmptr->flags = flags;