[gnumeric] ssdiff: fix checks for validations also.



commit be1811aacd928b7438579e25222739a47ca3426a
Author: Morten Welinder <terra gnome org>
Date:   Fri Mar 17 12:40:01 2017 -0400

    ssdiff: fix checks for validations also.

 ChangeLog        |    2 ++
 NEWS             |    2 +-
 src/hlink.c      |    3 +++
 src/mstyle.c     |   16 +++++++++++-----
 src/validation.c |   37 ++++++++++++++++++++++++++++++++++++-
 src/validation.h |    5 ++++-
 6 files changed, 57 insertions(+), 8 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d5c6cde..f3371aa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2017-03-17  Morten Welinder  <terra gnome org>
 
+       * src/validation.c (gnm_validation_equal): New function.
+
        * src/mstyle.c (gnm_style_find_differences): New function.
 
        * src/ssdiff.c (xml_style_changed): Use
diff --git a/NEWS b/NEWS
index dc494f2..9fd9032 100644
--- a/NEWS
+++ b/NEWS
@@ -16,7 +16,7 @@ Morten:
        * Hyperlinks improvements.  [#706671]
        * Plug leaks.
        * Fix issues with sheet-local names.
-       * ssdiff improvements with hyperlinks.
+       * ssdiff improvements with hyperlinks and validations.
 
 --------------------------------------------------------------------------
 Gnumeric 1.12.33
diff --git a/src/hlink.c b/src/hlink.c
index 1d512a0..6d6bdee 100644
--- a/src/hlink.c
+++ b/src/hlink.c
@@ -241,6 +241,9 @@ gnm_hlink_equal (GnmHLink const *a, GnmHLink const *b, gboolean relax_sheet)
        g_return_val_if_fail (GNM_IS_HLINK (a), NULL);
        g_return_val_if_fail (GNM_IS_HLINK (b), NULL);
 
+       if (a == b)
+               return TRUE;
+
        if (!relax_sheet && a->sheet != b->sheet)
                return FALSE;
 
diff --git a/src/mstyle.c b/src/mstyle.c
index 1ca5455..2b93442 100644
--- a/src/mstyle.c
+++ b/src/mstyle.c
@@ -540,6 +540,14 @@ gnm_style_find_conflicts (GnmStyle *accum, GnmStyle const *overlay,
        return conflicts;
 }
 
+#define RELAX_CHECK(op_,field_,checker_) do {                          \
+       if (diffs & (1u << (op_)) &&                            \
+           elem_is_set (a, (op_)) &&                           \
+           elem_is_set (b, (op_)) &&                           \
+           (checker_) (a->field_, b->field_, relax_sheet))     \
+               diffs &= ~(1u << (op_));                        \
+       } while (0)
+
 /**
  * gnm_style_find_differences:
  * @a: A #GnmStyle
@@ -566,11 +574,8 @@ gnm_style_find_differences (GnmStyle const *a, GnmStyle const *b,
        }
 
        if (relax_sheet) {
-               if (a->hlink && b->hlink &&
-                   gnm_hlink_equal (a->hlink, b->hlink, relax_sheet))
-                       diffs &= ~(1u << MSTYLE_HLINK);
-
-               // FIXME: Validations
+               RELAX_CHECK (MSTYLE_HLINK, hlink, gnm_hlink_equal);
+               RELAX_CHECK (MSTYLE_VALIDATION, validation, gnm_validation_equal);
 
                // FIXME: Conditions
        }
@@ -578,6 +583,7 @@ gnm_style_find_differences (GnmStyle const *a, GnmStyle const *b,
        return diffs;
 }
 
+#undef RELAX_CHECK
 
 static inline void
 gnm_style_clear_pango (GnmStyle *style)
diff --git a/src/validation.c b/src/validation.c
index c091636..2a1d285 100644
--- a/src/validation.c
+++ b/src/validation.c
@@ -326,6 +326,41 @@ gnm_validation_dup (GnmValidation *v)
        return dst;
 }
 
+gboolean
+gnm_validation_equal (GnmValidation const *a, GnmValidation const *b,
+                     gboolean relax_sheet)
+{
+       int i;
+
+       g_return_val_if_fail (a != NULL, FALSE);
+       g_return_val_if_fail (b != NULL, FALSE);
+
+       if (a == b)
+               return TRUE;
+
+       if (!relax_sheet &&
+           gnm_validation_get_sheet (a) != gnm_validation_get_sheet (b))
+               return FALSE;
+
+       if (!(g_strcmp0 (a->title ? a->title->str : NULL,
+                        b->title ? b->title->str : NULL) == 0 &&
+             g_strcmp0 (a->msg ? a->msg->str : NULL,
+                        b->msg ? b->msg->str : NULL) == 0 &&
+             a->style == b->style &&
+             a->type == b->type &&
+             a->op == b->op &&
+             a->allow_blank == b->allow_blank &&
+             a->use_dropdown == b->use_dropdown))
+               return FALSE;
+
+       for (i = 0; i < 2; i++)
+               if (!gnm_expr_top_equal (a->deps[i].texpr, b->deps[i].texpr))
+                       return FALSE;
+
+       return TRUE;
+}
+
+
 void
 gnm_validation_ref (GnmValidation const *v)
 {
@@ -379,7 +414,7 @@ gnm_validation_get_type (void)
  * Returns: (transfer none): the sheet.
  **/
 Sheet *
-gnm_validation_get_sheet (GnmValidation *v)
+gnm_validation_get_sheet (GnmValidation const *v)
 {
        g_return_val_if_fail (v != NULL, NULL);
        return v->deps[0].sheet;
diff --git a/src/validation.h b/src/validation.h
index 9de7180..4ca58f5 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -75,6 +75,9 @@ GnmValidation *gnm_validation_new   (ValidationStyle style,
                                     gboolean allow_blank,
                                     gboolean use_dropdown);
 GnmValidation *gnm_validation_dup   (GnmValidation *v);
+gboolean    gnm_validation_equal    (GnmValidation const *a,
+                                    GnmValidation const *b,
+                                    gboolean relax_sheet);
 
 void        gnm_validation_ref      (GnmValidation const *v);
 void        gnm_validation_unref    (GnmValidation const *v);
@@ -83,7 +86,7 @@ void      gnm_validation_set_expr (GnmValidation *v,
                                     GnmExprTop const *texpr, unsigned indx);
 GError    *gnm_validation_is_ok    (GnmValidation const *v);
 
-Sheet      *gnm_validation_get_sheet (GnmValidation *v);
+Sheet      *gnm_validation_get_sheet (GnmValidation const *v);
 void        gnm_validation_set_sheet (GnmValidation *v, Sheet *sheet);
 
 ValidationStatus gnm_validation_eval (WorkbookControl *wbc,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]