[Gnucash-changes] Change all occurances of QofAccessFunc function pointers to QofParam, so

Linas Vepstas linas at cvs.gnucash.org
Sun Apr 18 02:25:11 EDT 2004


Log Message:
-----------
Change all occurances of QofAccessFunc function pointers
to QofParam, so that the access func can be passed a type.
Time like these, I wish the C programming language had 'lambda'.

Modified Files:
--------------
    gnucash/src/engine:
        qofclass.h
        qofquery.c
        qofquerycore-p.h
        qofquerycore.c
        qofquerycore.h

Revision Data
-------------
Index: qofquery.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofquery.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -Lsrc/engine/qofquery.c -Lsrc/engine/qofquery.c -u -r1.19 -r1.20
--- src/engine/qofquery.c
+++ src/engine/qofquery.c
@@ -72,9 +72,9 @@
    * convert types.
    */
   gboolean            use_default;
-  GSList *            param_fcns;
+  GSList *            param_fcns;     /* Chain of paramters to walk */
   QofSortFunc         obj_cmp;        /* In case you are comparing objects */
-  QofCompareFunc      comp_fcn;        /* When you are comparing core types */
+  QofCompareFunc      comp_fcn;       /* When you are comparing core types */
 };
 
 /* The QUERY structure */
@@ -280,9 +280,9 @@
 static int cmp_func (QofQuerySort *sort, QofSortFunc default_sort,
                      gconstpointer a, gconstpointer b)
 {
+  QofParam *param = NULL;
   GSList *node;
   gpointer conva, convb;
-  QofAccessFunc get_fcn = NULL;        /* to appease the compiler */
 
   g_return_val_if_fail (sort, 0);
 
@@ -304,7 +304,7 @@
   convb = (gpointer)b;
   for (node = sort->param_fcns; node; node = node->next) 
   {
-    get_fcn = node->data;
+    param = node->data;
 
     /* The last term is really the "parameter getter",
      * unless we're comparing objects ;) */
@@ -312,13 +312,14 @@
       break;
 
     /* Do the converstions */
-    conva = get_fcn (conva);
-    convb = get_fcn (convb);
+    conva = (param->param_getfcn) (conva, param);
+    convb = (param->param_getfcn) (convb, param);
   }
+
   /* And now return the (appropriate) compare */
   if (sort->comp_fcn)
   {
-    int rc = sort->comp_fcn (conva, convb, sort->options, get_fcn);
+    int rc = sort->comp_fcn (conva, convb, sort->options, param);
     return rc;
   }
 
@@ -381,21 +382,21 @@
       if (qt->param_fcns && qt->pred_fcn) 
       {
         GSList *node;
-        QofAccessFunc get_fcn;
+        QofParam *param = NULL;
         gpointer conv_obj = object;
 
         /* iterate through the conversions */
-        for (node = qt->param_fcns; node; node = node->next) {
-          get_fcn = node->data;
+        for (node = qt->param_fcns; node; node = node->next) 
+        {
+          param = node->data;
 
           /* The last term is the actual parameter getter */
-          if (!node->next)
-            break;
+          if (!node->next) break;
 
-          conv_obj = get_fcn (conv_obj);
+          conv_obj = param->param_getfcn (conv_obj, param);
         }
 
-        if (((qt->pred_fcn)(conv_obj, get_fcn, qt->pdata)) == qt->invert) 
+        if (((qt->pred_fcn)(conv_obj, param, qt->pdata)) == qt->invert) 
         {
           and_terms_ok = 0;
           break;
@@ -428,8 +429,9 @@
  *
  * returns NULL if the first parameter is bad (and final is unchanged).
  */
-static GSList * compile_params (GSList *param_list, QofIdType start_obj,
-                                QofParam const **final)
+static GSList * 
+compile_params (GSList *param_list, QofIdType start_obj, 
+                QofParam const **final)
 {
   const QofParam *objDef = NULL;
   GSList *fcns = NULL;
@@ -447,8 +449,8 @@
     /* If it doesn't exist, then we've reached the end */
     if (!objDef) break;
 
-    /* Save off this function */
-    fcns = g_slist_prepend (fcns, objDef->param_getfcn);
+    /* Save off this parameter */
+    fcns = g_slist_prepend (fcns, (gpointer) objDef);
 
     /* Save this off, just in case */
     *final = objDef;
Index: qofclass.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofclass.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lsrc/engine/qofclass.h -Lsrc/engine/qofclass.h -u -r1.1 -r1.2
--- src/engine/qofclass.h
+++ src/engine/qofclass.h
@@ -56,14 +56,19 @@
 /** Type of Paramters (String, Date, Numeric, GUID, etc.) */
 typedef const char * QofType;
 
+typedef struct _QofParam QofParam;
+
 /** The QofAccessFunc defines an arbitrary function pointer
  *  for access functions.  This is needed because C doesn't have
  *  templates, so we just cast a lot.  Real functions must be of
  *  the form:
  *
  * param_type getter_func (object_type *self);
+ *
+ * XXX document the additional two args, and how/why they are 
+ * optional.
  */
-typedef gpointer (*QofAccessFunc)(gpointer);
+typedef gpointer (*QofAccessFunc)(gpointer object, QofParam *param);
 
 /** The QofSetterFunc defines an function pointer for parameter
  *  setters. Real functions must be of the form:
@@ -82,13 +87,13 @@
  *
  * Either the getter or the setter may be NULL.
  */
-typedef struct _QofParam 
+struct _QofParam 
 {
   const char       * param_name;
   QofType            param_type;
   QofAccessFunc      param_getfcn;
   QofSetterFunc      param_setfcn;
-} QofParam;
+};
 
 /** This function is the default sort function for a particular object type */
 typedef int (*QofSortFunc)(gpointer, gpointer);
Index: qofquerycore.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofquerycore.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -Lsrc/engine/qofquerycore.h -Lsrc/engine/qofquerycore.h -u -r1.9 -r1.10
--- src/engine/qofquerycore.h
+++ src/engine/qofquerycore.h
@@ -146,7 +146,6 @@
 /** Return a printable string for a core data object.  Caller needs
  *  to g_free() the returned string.
  */
-char * qof_query_core_to_string (char const *type, gpointer object,
-			     QofAccessFunc fcn);
+char * qof_query_core_to_string (QofType, gpointer object, QofParam *getter);
 
 #endif /* QOF_QUERYCORE_H */
Index: qofquerycore.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofquerycore.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -Lsrc/engine/qofquerycore.c -Lsrc/engine/qofquerycore.c -u -r1.10 -r1.11
--- src/engine/qofquerycore.c
+++ src/engine/qofquerycore.c
@@ -39,69 +39,51 @@
 /* A function to copy a query's predicate data */
 typedef QofQueryPredData *(*QueryPredicateCopyFunc) (QofQueryPredData *pdata);
 
-/* A function to take the object, apply the get_fcn, and return
- * a printable string.  Note that this QofAccessFunc function should
- * be returning a type equal to this core object type.
+/* A function to take the object, apply the getter->param_getfcn, 
+ * and return a printable string.  Note that this QofParam->getfnc
+ * function should be returning a type equal to this core object type.
  *
  * Note that this string MUST be freed by the caller.
  */
-typedef char * (*QueryToString) (gpointer object, QofAccessFunc get_fcn);
+typedef char * (*QueryToString) (gpointer object, QofParam *getter);
 
 /* A function to test for equality of predicate data */
 typedef gboolean (*QueryPredicateEqual) (QofQueryPredData *p1, 
                                          QofQueryPredData *p2);
 
-/* This function registers a new Core Object with the QofQuery
- * subsystem.  It maps the "core_name" object to the given
- * query_predicate, predicate_copy, and predicate_data_free functions.
- */
-static void qof_query_register_core_object (char const *type_name,
-                                 QofQueryPredicateFunc pred,
-                                 QofCompareFunc comp,
-                                 QueryPredicateCopyFunc copy,
-                                 QueryPredDataFree pd_free,
-                                 QueryToString to_string,
-                                 QueryPredicateEqual pred_equal);
-/* An example:
- *
- * qof_query_register_core_object (QOF_TYPE_STRING, string_match_predicate,
- *                               string_compare_fcn, string_free_pdata,
- *                               string_print_fcn, pred_equal_fcn);
- */
-
-static QueryPredicateCopyFunc gncQueryCoreGetCopy (char const *type);
-static QueryPredDataFree gncQueryCoreGetPredFree (char const *type);
+static QueryPredicateCopyFunc qof_query_copy_predicate (QofType type);
+static QueryPredDataFree qof_query_predicate_free (QofType type);
 
 /* Core Type Predicate helpers */
-typedef const char * (*query_string_getter) (gpointer);
+typedef const char * (*query_string_getter) (gpointer, QofParam *);
 static const char * query_string_type = QOF_TYPE_STRING;
 
-typedef Timespec (*query_date_getter) (gpointer);
+typedef Timespec (*query_date_getter) (gpointer, QofParam *);
 static const char * query_date_type = QOF_TYPE_DATE;
 
-typedef gnc_numeric (*query_numeric_getter) (gpointer);
+typedef gnc_numeric (*query_numeric_getter) (gpointer, QofParam *);
 static const char * query_numeric_type = QOF_TYPE_NUMERIC;
 
-typedef GList * (*query_glist_getter) (gpointer);
-typedef const GUID * (*query_guid_getter) (gpointer);
+typedef GList * (*query_glist_getter) (gpointer, QofParam *);
+typedef const GUID * (*query_guid_getter) (gpointer, QofParam *);
 static const char * query_guid_type = QOF_TYPE_GUID;
 
-typedef gint32 (*query_int32_getter) (gpointer);
+typedef gint32 (*query_int32_getter) (gpointer, QofParam *);
 static const char * query_int32_type = QOF_TYPE_INT32;
 
-typedef gint64 (*query_int64_getter) (gpointer);
+typedef gint64 (*query_int64_getter) (gpointer, QofParam *);
 static const char * query_int64_type = QOF_TYPE_INT64;
 
-typedef double (*query_double_getter) (gpointer);
+typedef double (*query_double_getter) (gpointer, QofParam *);
 static const char * query_double_type = QOF_TYPE_DOUBLE;
 
-typedef gboolean (*query_boolean_getter) (gpointer);
+typedef gboolean (*query_boolean_getter) (gpointer, QofParam *);
 static const char * query_boolean_type = QOF_TYPE_BOOLEAN;
 
-typedef char (*query_char_getter) (gpointer);
+typedef char (*query_char_getter) (gpointer, QofParam *);
 static const char * query_char_type = QOF_TYPE_CHAR;
 
-typedef KvpFrame * (*query_kvp_getter) (gpointer);
+typedef KvpFrame * (*query_kvp_getter) (gpointer, QofParam *);
 static const char * query_kvp_type = QOF_TYPE_KVP;
 
 /* Tables for predicate storage and lookup */
@@ -128,7 +110,8 @@
                                 NULL); \
 }
 #define VERIFY_PREDICATE(str) { \
-        g_return_val_if_fail (get_fcn != NULL, PREDICATE_ERROR); \
+        g_return_val_if_fail (getter != NULL, PREDICATE_ERROR); \
+        g_return_val_if_fail (getter->param_getfcn != NULL, PREDICATE_ERROR); \
         g_return_val_if_fail (pd != NULL, PREDICATE_ERROR); \
         g_return_val_if_fail (pd->type_name == str || \
                                 !safe_strcmp (str, pd->type_name), \
@@ -140,8 +123,10 @@
 
 /* QOF_TYPE_STRING */
 
-static int string_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                   QofQueryPredData *pd)
+static int 
+string_match_predicate (gpointer object, 
+                        QofParam *getter,
+                        QofQueryPredData *pd)
 {
   query_string_t pdata = (query_string_t) pd;
   const char *s;
@@ -149,7 +134,7 @@
 
   VERIFY_PREDICATE (query_string_type);
 
-  s = ((query_string_getter)get_fcn) (object);
+  s = ((query_string_getter)getter->param_getfcn) (object, getter);
 
   if (!s) s = "";
 
@@ -178,14 +163,15 @@
   }
 }
 
-static int string_compare_func (gpointer a, gpointer b, gint options,
-                                QofAccessFunc get_fcn)
+static int 
+string_compare_func (gpointer a, gpointer b, gint options,
+                     QofParam *getter)
 {
   const char *s1, *s2;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter &&getter->param_getfcn, COMPARE_ERROR);
 
-  s1 = ((query_string_getter)get_fcn) (a);
-  s2 = ((query_string_getter)get_fcn) (b);
+  s1 = ((query_string_getter)getter->param_getfcn) (a, getter);
+  s2 = ((query_string_getter)getter->param_getfcn) (b, getter);
 
   if (options == QOF_STRING_MATCH_CASEINSENSITIVE)
     return safe_strcasecmp (s1, s2);
@@ -193,7 +179,8 @@
   return safe_strcmp (s1, s2);
 }
 
-static void string_free_pdata (QofQueryPredData *pd)
+static void 
+string_free_pdata (QofQueryPredData *pd)
 {
   query_string_t pdata = (query_string_t) pd;
 
@@ -207,18 +194,20 @@
   g_free (pdata);
 }
 
-static QofQueryPredData *string_copy_predicate (QofQueryPredData *pd)
+static QofQueryPredData *
+string_copy_predicate (QofQueryPredData *pd)
 {
   query_string_t pdata = (query_string_t) pd;
 
   VERIFY_PDATA_R (query_string_type);
 
-  return qof_query_string_predicate (pd->how, pdata->matchstring, pdata->options,
-                                  pdata->is_regex);
+  return qof_query_string_predicate (pd->how, pdata->matchstring, 
+                                     pdata->options,
+                                     pdata->is_regex);
 }
 
-static gboolean string_predicate_equal (QofQueryPredData *p1,
-QofQueryPredData *p2)
+static gboolean 
+string_predicate_equal (QofQueryPredData *p1, QofQueryPredData *p2)
 {
   query_string_t pd1 = (query_string_t) p1;
   query_string_t pd2 = (query_string_t) p2;
@@ -228,9 +217,10 @@
   return (safe_strcmp (pd1->matchstring, pd2->matchstring) == 0);
 }
 
-QofQueryPredData *qof_query_string_predicate (QofQueryCompare how,
-                                         char *str, QofStringMatch options,
-                                         gboolean is_regex)
+QofQueryPredData *
+qof_query_string_predicate (QofQueryCompare how,
+                            char *str, QofStringMatch options,
+                            gboolean is_regex)
 {
   query_string_t pdata;
 
@@ -256,17 +246,20 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * string_to_string (gpointer object, QofAccessFunc get)
+static char * 
+string_to_string (gpointer object, QofParam *getter)
 {
-  const char *res = ((query_string_getter)get)(object);
+  const char *res;
+  res = ((query_string_getter)getter->param_getfcn)(object, getter);
   if (res)
     return g_strdup (res);
   return NULL;
 }
 
-/* QOF_TYPE_DATE */
+/* QOF_TYPE_DATE =================================================== */
 
-static int date_compare (Timespec ta, Timespec tb, QofDateMatch options)
+static int 
+date_compare (Timespec ta, Timespec tb, QofDateMatch options)
 {
   if (options == QOF_DATE_MATCH_ROUNDED) {
     ta = timespecCanonicalDayTime (ta);
@@ -286,7 +279,8 @@
   return 0;
 }
 
-static int date_match_predicate (gpointer object, QofAccessFunc get_fcn,
+static int 
+date_match_predicate (gpointer object, QofParam *getter,
                                  QofQueryPredData *pd)
 {
   query_date_t pdata = (query_date_t)pd;
@@ -295,7 +289,7 @@
 
   VERIFY_PREDICATE (query_date_type);
 
-  objtime = ((query_date_getter)get_fcn) (object);
+  objtime = ((query_date_getter)getter->param_getfcn) (object, getter);
   compare = date_compare (objtime, pdata->date, pdata->options);
 
   switch (pd->how) {
@@ -317,20 +311,21 @@
   }
 }
 
-static int date_compare_func (gpointer a, gpointer b, gint options,
-                              QofAccessFunc get_fcn)
+static int 
+date_compare_func (gpointer a, gpointer b, gint options, QofParam *getter)
 {
   Timespec ta, tb;
 
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
-  ta = ((query_date_getter)get_fcn) (a);
-  tb = ((query_date_getter)get_fcn) (b);
+  ta = ((query_date_getter)getter->param_getfcn) (a, getter);
+  tb = ((query_date_getter)getter->param_getfcn) (b, getter);
 
   return date_compare (ta, tb, options);
 }
 
-static void date_free_pdata (QofQueryPredData *pd)
+static void 
+date_free_pdata (QofQueryPredData *pd)
 {
   query_date_t pdata = (query_date_t)pd;
 
@@ -349,7 +344,8 @@
   return qof_query_date_predicate (pd->how, pdata->options, pdata->date);
 }
 
-static gboolean date_predicate_equal (QofQueryPredData *p1, QofQueryPredData *p2)
+static gboolean 
+date_predicate_equal (QofQueryPredData *p1, QofQueryPredData *p2)
 {
   query_date_t pd1 = (query_date_t) p1;
   query_date_t pd2 = (query_date_t) p2;
@@ -360,7 +356,7 @@
 
 QofQueryPredData *
 qof_query_date_predicate (QofQueryCompare how,
-                                       QofDateMatch options, Timespec date)
+                          QofDateMatch options, Timespec date)
 {
   query_date_t pdata;
 
@@ -372,9 +368,10 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * date_to_string (gpointer object, QofAccessFunc get)
+static char * 
+date_to_string (gpointer object, QofParam *getter)
 {
-  Timespec ts = ((query_date_getter)get)(object);
+  Timespec ts = ((query_date_getter)getter->param_getfcn)(object, getter);
 
   if (ts.tv_sec || ts.tv_nsec)
     return g_strdup (gnc_print_date (ts));
@@ -382,10 +379,11 @@
   return NULL;
 }
 
-/* QOF_TYPE_NUMERIC */
+/* QOF_TYPE_NUMERIC ================================================= */
 
-static int numeric_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                    QofQueryPredData* pd)
+static int 
+numeric_match_predicate (gpointer object, QofParam *getter,
+                         QofQueryPredData* pd)
 {
   query_numeric_t pdata = (query_numeric_t)pd;
   gnc_numeric obj_val;
@@ -393,7 +391,7 @@
 
   VERIFY_PREDICATE (query_numeric_type);
 
-  obj_val = ((query_numeric_getter)get_fcn) (object);
+  obj_val = ((query_numeric_getter)getter->param_getfcn) (object, getter);
 
   switch (pdata->options) {
   case QOF_NUMERIC_MATCH_CREDIT:
@@ -436,20 +434,21 @@
   }
 }
 
-static int numeric_compare_func (gpointer a, gpointer b, gint options,
-                                 QofAccessFunc get_fcn)
+static int 
+numeric_compare_func (gpointer a, gpointer b, gint options, QofParam *getter)
 {
   gnc_numeric va, vb;
 
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
-  va = ((query_numeric_getter)get_fcn) (a);
-  vb = ((query_numeric_getter)get_fcn) (b);
+  va = ((query_numeric_getter)getter->param_getfcn) (a, getter);
+  vb = ((query_numeric_getter)getter->param_getfcn) (b, getter);
 
   return gnc_numeric_compare (va, vb);  
 }
 
-static void numeric_free_pdata (QofQueryPredData* pd)
+static void 
+numeric_free_pdata (QofQueryPredData* pd)
 {
   query_numeric_t pdata = (query_numeric_t)pd;
   VERIFY_PDATA (query_numeric_type);
@@ -476,8 +475,8 @@
 
 QofQueryPredData *
 qof_query_numeric_predicate (QofQueryCompare how,
-                                          QofNumericMatch options,
-                                          gnc_numeric value)
+                             QofNumericMatch options,
+                             gnc_numeric value)
 {
   query_numeric_t pdata;
   pdata = g_new0 (query_numeric_def, 1);
@@ -488,24 +487,29 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * numeric_to_string (gpointer object, QofAccessFunc get)
+static char * 
+numeric_to_string (gpointer object, QofParam *getter)
 {
-  gnc_numeric num = ((query_numeric_getter)get)(object);
+  gnc_numeric num;
+  num = ((query_numeric_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup (gnc_numeric_to_string (num));
 }
 
-static char * debcred_to_string (gpointer object, QofAccessFunc get)
+static char * 
+debcred_to_string (gpointer object, QofParam *getter)
 {
-  gnc_numeric num = ((query_numeric_getter)get)(object);
+  gnc_numeric num;
+  num = ((query_numeric_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup (gnc_numeric_to_string (num));
 }
 
-/* QOF_TYPE_GUID */
+/* QOF_TYPE_GUID =================================================== */
 
-static int guid_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                 QofQueryPredData *pd)
+static int 
+guid_match_predicate (gpointer object, QofParam *getter,
+                      QofQueryPredData *pd)
 {
   query_guid_t pdata = (query_guid_t)pd;
   GList *node, *o_list;
@@ -516,17 +520,18 @@
   switch (pdata->options) {
 
   case QOF_GUID_MATCH_ALL:
-    /* object is a GList of objects; get_fcn must be called on each one.
+    /* object is a GList of objects; param_getfcn must be called on each one.
      * See if every guid in the predicate is accounted-for in the
      * object list
      */
 
-    for (node = pdata->guids; node; node = node->next) {
-
+    for (node = pdata->guids; node; node = node->next) 
+    {
       /* See if this GUID matches the object's guid */
-      for (o_list = object; o_list; o_list = o_list->next) {
-        guid = ((query_guid_getter)get_fcn) (o_list->data);
-        if (guid_equal (node->data, guid))
+      for (o_list = object; o_list; o_list = o_list->next) 
+      {
+        guid = ((query_guid_getter)getter->param_getfcn) (o_list->data, getter);
+        if (guid_equal (node->data, guid)) 
           break;
       }
 
@@ -549,17 +554,19 @@
   case QOF_GUID_MATCH_LIST_ANY:
     /* object is a single object, getter returns a GList* of GUID*
      *
-     * see if any GUID* in the returned list matches any guid in the
-     * predicate match list
+     * See if any GUID* in the returned list matches any guid in the
+     * predicate match list.
      */
 
-    o_list = ((query_glist_getter)get_fcn) (object);
+    o_list = ((query_glist_getter)getter->param_getfcn) (object, getter);
 
-    for (node = o_list; node; node = node->next) {
+    for (node = o_list; node; node = node->next) 
+    {
       GList *node2;
 
       /* Search the predicate data for a match */
-      for (node2 = pdata->guids; node2; node2 = node2->next) {
+      for (node2 = pdata->guids; node2; node2 = node2->next) 
+      {
         if (guid_equal (node->data, node2->data))
           break;
       }
@@ -583,8 +590,9 @@
      * See if the guid is in the list
      */
 
-    guid = ((query_guid_getter)get_fcn) (object);
-    for (node = pdata->guids; node; node = node->next) {
+    guid = ((query_guid_getter)getter->param_getfcn) (object, getter);
+    for (node = pdata->guids; node; node = node->next) 
+    {
       if (guid_equal (node->data, guid))
         break;
     }
@@ -608,13 +616,16 @@
   }
 }
 
-static void guid_free_pdata (QofQueryPredData *pd)
+static void 
+guid_free_pdata (QofQueryPredData *pd)
 {
   query_guid_t pdata = (query_guid_t)pd;
   GList *node;
   VERIFY_PDATA (query_guid_type);
   for (node = pdata->guids; node; node = node->next)
+  {
     guid_free (node->data);
+  }
   g_list_free (pdata->guids);
   g_free (pdata);
 }
@@ -637,8 +648,10 @@
   if (pd1->options != pd2->options) return FALSE;
   if (g_list_length (l1) != g_list_length (l2)) return FALSE;
   for ( ; l1 ; l1 = l1->next, l2 = l2->next) 
+  {
     if (!guid_equal (l1->data, l2->data))
       return FALSE;
+  }
   return TRUE;
 }
 
@@ -653,7 +666,8 @@
   pdata->pd.type_name = query_guid_type;
   pdata->options = options;
   pdata->guids = g_list_copy (guids);
-  for (node = pdata->guids; node; node = node->next) {
+  for (node = pdata->guids; node; node = node->next) 
+  {
     GUID *guid = guid_malloc ();
     *guid = *((GUID *)node->data);
     node->data = guid;
@@ -664,15 +678,16 @@
 /* ================================================================ */
 /* QOF_TYPE_INT32 */
 
-static int int32_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                 QofQueryPredData *pd)
+static int 
+int32_match_predicate (gpointer object, QofParam *getter,
+                       QofQueryPredData *pd)
 {
   gint32 val;
   query_int32_t pdata = (query_int32_t)pd;
 
   VERIFY_PREDICATE (query_int32_type);
 
-  val = ((query_int32_getter)get_fcn) (object);
+  val = ((query_int32_getter)getter->param_getfcn) (object, getter);
 
   switch (pd->how) {
   case QOF_COMPARE_LT:
@@ -693,21 +708,23 @@
   }
 }
 
-static int int32_compare_func (gpointer a, gpointer b, gint options,
-                              QofAccessFunc get_fcn)
+static int 
+int32_compare_func (gpointer a, gpointer b, gint options,
+                    QofParam *getter)
 {
   gint32 v1, v2;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
-  v1 = ((query_int32_getter)get_fcn)(a);
-  v2 = ((query_int32_getter)get_fcn)(b);
+  v1 = ((query_int32_getter)getter->param_getfcn)(a, getter);
+  v2 = ((query_int32_getter)getter->param_getfcn)(b, getter);
 
   if (v1 < v2) return -1;
   if (v1 > v2) return 1;
   return 0;
 }
 
-static void int32_free_pdata (QofQueryPredData *pd)
+static void 
+int32_free_pdata (QofQueryPredData *pd)
 {
   query_int32_t pdata = (query_int32_t)pd;
   VERIFY_PDATA (query_int32_type);
@@ -741,9 +758,10 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * int32_to_string (gpointer object, QofAccessFunc get)
+static char * 
+int32_to_string (gpointer object, QofParam *getter)
 {
-  gint32 num = ((query_int32_getter)get)(object);
+  gint32 num = ((query_int32_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup_printf ("%d", num);
 }
@@ -751,15 +769,16 @@
 /* ================================================================ */
 /* QOF_TYPE_INT64 */
 
-static int int64_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                 QofQueryPredData *pd)
+static int 
+int64_match_predicate (gpointer object, QofParam *getter,
+                       QofQueryPredData *pd)
 {
   gint64 val;
   query_int64_t pdata = (query_int64_t)pd;
 
   VERIFY_PREDICATE (query_int64_type);
 
-  val = ((query_int64_getter)get_fcn) (object);
+  val = ((query_int64_getter)getter->param_getfcn) (object, getter);
 
   switch (pd->how) {
   case QOF_COMPARE_LT:
@@ -780,21 +799,23 @@
   }
 }
 
-static int int64_compare_func (gpointer a, gpointer b, gint options,
-                              QofAccessFunc get_fcn)
+static int 
+int64_compare_func (gpointer a, gpointer b, gint options,
+                              QofParam *getter)
 {
   gint64 v1, v2;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
-  v1 = ((query_int64_getter)get_fcn)(a);
-  v2 = ((query_int64_getter)get_fcn)(b);
+  v1 = ((query_int64_getter)getter->param_getfcn)(a, getter);
+  v2 = ((query_int64_getter)getter->param_getfcn)(b, getter);
 
   if (v1 < v2) return -1;
   if (v1 > v2) return 1;
   return 0;
 }
 
-static void int64_free_pdata (QofQueryPredData *pd)
+static void 
+int64_free_pdata (QofQueryPredData *pd)
 {
   query_int64_t pdata = (query_int64_t)pd;
   VERIFY_PDATA (query_int64_type);
@@ -828,9 +849,10 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * int64_to_string (gpointer object, QofAccessFunc get)
+static char * 
+int64_to_string (gpointer object, QofParam *getter)
 {
-  gint64 num = ((query_int64_getter)get)(object);
+  gint64 num = ((query_int64_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup_printf (GNC_SCANF_LLD, num);
 }
@@ -838,15 +860,16 @@
 /* ================================================================ */
 /* QOF_TYPE_DOUBLE */
 
-static int double_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                 QofQueryPredData *pd)
+static int 
+double_match_predicate (gpointer object, QofParam *getter,
+                        QofQueryPredData *pd)
 {
   double val;
   query_double_t pdata = (query_double_t)pd;
 
   VERIFY_PREDICATE (query_double_type);
 
-  val = ((query_double_getter)get_fcn) (object);
+  val = ((query_double_getter)getter->param_getfcn) (object, getter);
 
   switch (pd->how) {
   case QOF_COMPARE_LT:
@@ -867,21 +890,23 @@
   }
 }
 
-static int double_compare_func (gpointer a, gpointer b, gint options,
-                              QofAccessFunc get_fcn)
+static int 
+double_compare_func (gpointer a, gpointer b, gint options,
+                     QofParam *getter)
 {
   double v1, v2;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
 
-  v1 = ((query_double_getter)get_fcn) (a);
-  v2 = ((query_double_getter)get_fcn) (b);
+  v1 = ((query_double_getter)getter->param_getfcn) (a, getter);
+  v2 = ((query_double_getter)getter->param_getfcn) (b, getter);
 
   if (v1 < v2) return -1;
   if (v1 > v2) return 1;
   return 0;
 }
 
-static void double_free_pdata (QofQueryPredData *pd)
+static void 
+double_free_pdata (QofQueryPredData *pd)
 {
   query_double_t pdata = (query_double_t)pd;
   VERIFY_PDATA (query_double_type);
@@ -915,24 +940,26 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * double_to_string (gpointer object, QofAccessFunc get)
+static char * 
+double_to_string (gpointer object, QofParam *getter)
 {
-  double num = ((query_double_getter)get)(object);
+  double num = ((query_double_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup_printf ("%f", num);
 }
 
-/* QOF_TYPE_BOOLEAN */
+/* QOF_TYPE_BOOLEAN =================================================== */
 
-static int boolean_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                 QofQueryPredData *pd)
+static int 
+boolean_match_predicate (gpointer object, QofParam *getter,
+                         QofQueryPredData *pd)
 {
   gboolean val;
   query_boolean_t pdata = (query_boolean_t)pd;
 
   VERIFY_PREDICATE (query_boolean_type);
 
-  val = ((query_boolean_getter)get_fcn) (object);
+  val = ((query_boolean_getter)getter->param_getfcn) (object, getter);
 
   switch (pd->how) {
   case QOF_COMPARE_EQUAL:
@@ -945,19 +972,21 @@
   }
 }
 
-static int boolean_compare_func (gpointer a, gpointer b, gint options,
-                                 QofAccessFunc get_fcn)
+static int 
+boolean_compare_func (gpointer a, gpointer b, gint options,
+                      QofParam *getter)
 {
   gboolean va, vb;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
-  va = ((query_boolean_getter)get_fcn) (a);
-  vb = ((query_boolean_getter)get_fcn) (b);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
+  va = ((query_boolean_getter)getter->param_getfcn) (a, getter);
+  vb = ((query_boolean_getter)getter->param_getfcn) (b, getter);
   if (!va && vb) return -1;
   if (va && !vb) return 1;
   return 0;
 }
 
-static void boolean_free_pdata (QofQueryPredData *pd)
+static void 
+boolean_free_pdata (QofQueryPredData *pd)
 {
   query_boolean_t pdata = (query_boolean_t)pd;
   VERIFY_PDATA (query_boolean_type);
@@ -994,16 +1023,18 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * boolean_to_string (gpointer object, QofAccessFunc get)
+static char * 
+boolean_to_string (gpointer object, QofParam *getter)
 {
-  gboolean num = ((query_boolean_getter)get)(object);
+  gboolean num = ((query_boolean_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup_printf ("%s", (num ? "X" : ""));
 }
 
-/* QOF_TYPE_CHAR */
+/* QOF_TYPE_CHAR =================================================== */
 
-static int char_match_predicate (gpointer object, QofAccessFunc get_fcn,
+static int 
+char_match_predicate (gpointer object, QofParam *getter,
                                  QofQueryPredData *pd)
 {
   char c;
@@ -1011,7 +1042,7 @@
 
   VERIFY_PREDICATE (query_char_type);
 
-  c = ((query_char_getter)get_fcn) (object);
+  c = ((query_char_getter)getter->param_getfcn) (object, getter);
 
   switch (pdata->options) {
   case QOF_CHAR_MATCH_ANY:
@@ -1026,17 +1057,18 @@
   }
 }
 
-static int char_compare_func (gpointer a, gpointer b, gint options,
-                              QofAccessFunc get_fcn)
+static int 
+char_compare_func (gpointer a, gpointer b, gint options, QofParam *getter)
 {
   char va, vb;
-  g_return_val_if_fail (a && b && get_fcn, COMPARE_ERROR);
-  va = ((query_char_getter)get_fcn)(a);
-  vb = ((query_char_getter)get_fcn)(b);
+  g_return_val_if_fail (a && b && getter && getter->param_getfcn, COMPARE_ERROR);
+  va = ((query_char_getter)getter->param_getfcn)(a, getter);
+  vb = ((query_char_getter)getter->param_getfcn)(b, getter);
   return (va-vb);
 }
 
-static void char_free_pdata (QofQueryPredData *pd)
+static void 
+char_free_pdata (QofQueryPredData *pd)
 {
   query_char_t pdata = (query_char_t)pd;
   VERIFY_PDATA (query_char_type);
@@ -1075,17 +1107,19 @@
   return ((QofQueryPredData*)pdata);
 }
 
-static char * char_to_string (gpointer object, QofAccessFunc get)
+static char * 
+char_to_string (gpointer object, QofParam *getter)
 {
-  char num = ((query_char_getter)get)(object);
+  char num = ((query_char_getter)getter->param_getfcn)(object, getter);
 
   return g_strdup_printf ("%c", num);
 }
 
-/* QOF_TYPE_KVP */
+/* QOF_TYPE_KVP ================================================ */
 
-static int kvp_match_predicate (gpointer object, QofAccessFunc get_fcn,
-                                QofQueryPredData *pd)
+static int 
+kvp_match_predicate (gpointer object, QofParam *getter,
+                     QofQueryPredData *pd)
 {
   int compare;
   KvpFrame *kvp;
@@ -1094,7 +1128,7 @@
 
   VERIFY_PREDICATE (query_kvp_type);
 
-  kvp = ((query_kvp_getter)get_fcn) (object);
+  kvp = ((query_kvp_getter)getter->param_getfcn) (object, getter);
   if (!kvp)
     return 0;
 
@@ -1127,14 +1161,16 @@
   }
 }
 
-static void kvp_free_pdata (QofQueryPredData *pd)
+static void 
+kvp_free_pdata (QofQueryPredData *pd)
 {
   query_kvp_t pdata = (query_kvp_t)pd;
   GSList *node;
 
   VERIFY_PDATA (query_kvp_type);
   kvp_value_delete (pdata->value);
-  for (node = pdata->path; node; node = node->next) {
+  for (node = pdata->path; node; node = node->next) 
+  {
     g_free (node->data);
     node->data = NULL;
   }
@@ -1161,8 +1197,10 @@
   n2 = pd2->path;
 
   for ( ; n1 && n2; n1 = n1->next, n2 = n2->next)
+  {
     if (safe_strcmp (n1->data, n2->data) != 0)
       return FALSE;
+  }
 
   if (n1 || n2)
     return FALSE;
@@ -1172,7 +1210,7 @@
 
 QofQueryPredData *
 qof_query_kvp_predicate (QofQueryCompare how,
-                                      GSList *path, const KvpValue *value)
+                         GSList *path, const KvpValue *value)
 {
   query_kvp_t pdata;
   GSList *node;
@@ -1190,20 +1228,63 @@
   return ((QofQueryPredData*)pdata);
 }
 
-/* initialization */
+/* initialization ================================================== */
+/** This function registers a new Core Object with the QofQuery
+ * subsystem.  It maps the "core_name" object to the given
+ * query_predicate, predicate_copy, and predicate_data_free functions.
+ *
+ * An example:
+ * qof_query_register_core_object (QOF_TYPE_STRING, string_match_predicate,
+ *                               string_compare_fcn, string_free_pdata,
+ *                               string_print_fcn, pred_equal_fcn);
+ */
+
+
+static void 
+qof_query_register_core_object (QofType core_name,
+                                QofQueryPredicateFunc pred,
+                                QofCompareFunc comp,
+                                QueryPredicateCopyFunc copy,
+                                QueryPredDataFree pd_free,
+                                QueryToString toString,
+                                QueryPredicateEqual pred_equal)
+{
+  g_return_if_fail (core_name);
+  g_return_if_fail (*core_name != '\0');
+
+  if (pred)
+    g_hash_table_insert (predTable, (char *)core_name, pred);
+
+  if (comp)
+    g_hash_table_insert (cmpTable, (char *)core_name, comp);
+
+  if (copy)
+    g_hash_table_insert (copyTable, (char *)core_name, copy);
+
+  if (pd_free)
+    g_hash_table_insert (freeTable, (char *)core_name, pd_free);
+
+  if (toString)
+    g_hash_table_insert (toStringTable, (char *)core_name, toString);
+
+  if (pred_equal)
+    g_hash_table_insert (predEqualTable, (char *)core_name, pred_equal);
+}
 
 static void init_tables (void)
 {
   unsigned int i;
-  struct {
-    char const *name;
-    QofQueryPredicateFunc pred;
-    QofCompareFunc comp;
+  struct 
+  {
+    QofType                name;
+    QofQueryPredicateFunc  pred;
+    QofCompareFunc         comp;
     QueryPredicateCopyFunc copy;
-    QueryPredDataFree pd_free;
-    QueryToString toString;
-    QueryPredicateEqual pred_equal;
-  } knownTypes[] = {
+    QueryPredDataFree      pd_free;
+    QueryToString          toString;
+    QueryPredicateEqual    pred_equal;
+  } knownTypes[] = 
+  {
     { QOF_TYPE_STRING, string_match_predicate, string_compare_func,
       string_copy_predicate, string_free_pdata, string_to_string, 
       string_predicate_equal },
@@ -1239,7 +1320,8 @@
   };
 
   /* Register the known data types */
-  for (i = 0; i < (sizeof(knownTypes)/sizeof(*knownTypes)); i++) {
+  for (i = 0; i < (sizeof(knownTypes)/sizeof(*knownTypes)); i++) 
+  {
     qof_query_register_core_object (knownTypes[i].name,
                                 knownTypes[i].pred,
                                 knownTypes[i].comp,
@@ -1250,7 +1332,8 @@
   }
 }
 
-static QueryPredicateCopyFunc gncQueryCoreGetCopy (char const *type)
+static QueryPredicateCopyFunc 
+qof_query_copy_predicate (QofType type)
 {
   QueryPredicateCopyFunc rc;
   g_return_val_if_fail (type, NULL);
@@ -1258,43 +1341,13 @@
   return rc;
 }
 
-static QueryPredDataFree gncQueryCoreGetPredFree (char const *type)
+static QueryPredDataFree 
+qof_query_predicate_free (QofType type)
 {
   g_return_val_if_fail (type, NULL);
   return g_hash_table_lookup (freeTable, type);
 }
 
-static void 
-qof_query_register_core_object (char const *core_name,
-                                QofQueryPredicateFunc pred,
-                                QofCompareFunc comp,
-                                QueryPredicateCopyFunc copy,
-                                QueryPredDataFree pd_free,
-                                QueryToString toString,
-                                QueryPredicateEqual pred_equal)
-{
-  g_return_if_fail (core_name);
-  g_return_if_fail (*core_name != '\0');
-
-  if (pred)
-    g_hash_table_insert (predTable, (char *)core_name, pred);
-
-  if (comp)
-    g_hash_table_insert (cmpTable, (char *)core_name, comp);
-
-  if (copy)
-    g_hash_table_insert (copyTable, (char *)core_name, copy);
-
-  if (pd_free)
-    g_hash_table_insert (freeTable, (char *)core_name, pd_free);
-
-  if (toString)
-    g_hash_table_insert (toStringTable, (char *)core_name, toString);
-
-  if (pred_equal)
-    g_hash_table_insert (predEqualTable, (char *)core_name, pred_equal);
-}
-
 /********************************************************************/
 /* PUBLISHED API FUNCTIONS */
 
@@ -1329,14 +1382,14 @@
 }
 
 QofQueryPredicateFunc
-qof_query_core_get_predicate (char const *type)
+qof_query_core_get_predicate (QofType type)
 {
   g_return_val_if_fail (type, NULL);
   return g_hash_table_lookup (predTable, type);
 }
 
 QofCompareFunc
-qof_query_core_get_compare (char const *type)
+qof_query_core_get_compare (QofType type)
 {
   g_return_val_if_fail (type, NULL);
   return g_hash_table_lookup (cmpTable, type);
@@ -1350,7 +1403,7 @@
   g_return_if_fail (pdata);
   g_return_if_fail (pdata->type_name);
 
-  free_fcn = gncQueryCoreGetPredFree (pdata->type_name);
+  free_fcn = qof_query_predicate_free (pdata->type_name);
   free_fcn (pdata);
 }
 
@@ -1362,24 +1415,24 @@
   g_return_val_if_fail (pdata, NULL);
   g_return_val_if_fail (pdata->type_name, NULL);
 
-  copy = gncQueryCoreGetCopy (pdata->type_name);
+  copy = qof_query_copy_predicate (pdata->type_name);
   return (copy (pdata));
 }
 
 char * 
-qof_query_core_to_string (char const *type, gpointer object,
-                          QofAccessFunc get)
+qof_query_core_to_string (QofType type, gpointer object,
+                          QofParam *getter)
 {
   QueryToString toString;
 
   g_return_val_if_fail (type, NULL);
   g_return_val_if_fail (object, NULL);
-  g_return_val_if_fail (get, NULL);
+  g_return_val_if_fail (getter, NULL);
 
   toString = g_hash_table_lookup (toStringTable, type);
   g_return_val_if_fail (toString, NULL);
 
-  return toString (object, get);
+  return toString (object, getter);
 }
 
 gboolean 
Index: qofquerycore-p.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofquerycore-p.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -Lsrc/engine/qofquerycore-p.h -Lsrc/engine/qofquerycore-p.h -u -r1.4 -r1.5
--- src/engine/qofquerycore-p.h
+++ src/engine/qofquerycore-p.h
@@ -37,22 +37,22 @@
 void qof_query_core_shutdown (void);
 
 /* 
- * An arbitrary Query Predicate.  Given the gnucash object and the
+ * An arbitrary Query Predicate.  Given the object and the
  * particular parameter get-function (obtained from the registry by
  * the Query internals), compare the object's parameter to the
- * predicate data
+ * predicate data.
  */
 typedef int (*QofQueryPredicateFunc) (gpointer object,
-			       QofAccessFunc get_fcn,
+			       QofParam *getter,
 			       QofQueryPredData *pdata);
 
 /* A callback for how to compare two (same-type) objects based on a
- * common get_fcn (parameter member), using the provided comparrison
+ * common getter (parameter member), using the provided comparison
  * options (which are the type-specific options).
  */
 typedef int (*QofCompareFunc) (gpointer a, gpointer b,
                               gint compare_options,
-                              QofAccessFunc get_fcn);
+                              QofParam *getter);
 
 /* Lookup functions */
 QofQueryPredicateFunc qof_query_core_get_predicate (char const *type);


More information about the Gnucash-changes mailing list