Psppire: On irrecoverable error display fatal error dialog
[pspp] / src / ui / gui / find-dialog.c
index 2ff619a60a25c0c974dcc62092a97a7a40d9f540..4dc9b70405cc050b25f66613fbc49b976550745c 100644 (file)
@@ -101,15 +101,17 @@ refresh (GObject *obj, const struct find_dialog *fd)
 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);
 
@@ -311,8 +313,8 @@ cp1c (casenumber current, struct datasheet *data)
 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;
 }
@@ -323,9 +325,6 @@ cm1c (casenumber current, struct datasheet *data)
 {
   casenumber next = current;
 
-  if (current == -1)
-    return datasheet_get_n_rows (data);
-
   backward_wrap (&next, data);
 
   return next;
@@ -341,9 +340,6 @@ last (casenumber current, struct datasheet *data)
 static casenumber
 minus1 (casenumber current, struct datasheet *data)
 {
-  if (current == -1)
-    return 0;
-
   return -1;
 }
 
@@ -370,9 +366,16 @@ enum iteration_type{
 
 static const struct casenum_iterator ip[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}
   };
 
@@ -452,6 +455,18 @@ struct regexp_comparator
   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,
@@ -460,7 +475,7 @@ 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;
 }
@@ -592,7 +607,7 @@ numeric_comparator_create (const struct variable *var, const char *target)
 
   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;