]> Dogcows Code - chaz/homebank/blobdiff - src/hb-split.c
import homebank-5.2.4
[chaz/homebank] / src / hb-split.c
index 6e596267780bfd2b9fd39555098ad511492fdd75..676ef34c469c9520ec5792fa87a715b24438a35e 100644 (file)
@@ -1,5 +1,5 @@
 /*  HomeBank -- Free, easy, personal accounting for everyone.
- *  Copyright (C) 1995-2018 Maxime DOYEN
+ *  Copyright (C) 1995-2019 Maxime DOYEN
  *
  *  This file is part of HomeBank.
  *
@@ -41,7 +41,7 @@ extern struct Preferences *PREFS;
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
 
-static void da_split_free(Split *item)
+void da_split_free(Split *item)
 {
        if(item != NULL)
        {
@@ -53,123 +53,151 @@ static void da_split_free(Split *item)
 }
 
 
-static Split *da_split_malloc(void)
+Split *da_split_malloc(void)
 {
        return g_malloc0(sizeof(Split));
 }
 
 
-Split *da_split_new(guint32 kcat, gdouble amount, gchar        *memo)
+void da_split_destroy(GPtrArray *splits)
 {
-Split *split = da_split_malloc();
-
-       split->kcat = kcat;
-       split->amount = amount;
-       split->memo = g_strdup(memo);
-       return split;
+       DB( g_print("da_split_destroy\n") );
+       if(splits != NULL)
+               g_ptr_array_free(splits, TRUE);
 }
 
 
-
-static Split *da_split_record_clone(Split *src_split)
+GPtrArray *da_split_new(void)
 {
-Split *new_split = g_memdup(src_split, sizeof(Split));
+       DB( g_print("da_split_new\n") );
+       return g_ptr_array_new_with_free_func((GDestroyNotify)da_split_free);
+}
 
-       DB( g_print("da_split_record_clone\n") );
 
-       if(new_split)
-       {
-               //duplicate the string
-               new_split->memo = g_strdup(src_split->memo);
-               DB( g_print(" clone %p -> %p\n", src_split, new_split) );
-
-       }
-       return new_split;
+static GPtrArray *da_split_new_full(guint size)
+{
+       DB( g_print("da_split_new\n") );
+       return g_ptr_array_new_full(size, (GDestroyNotify)da_split_free);
 }
 
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
+static gint da_splits_compare_func(gpointer a, gpointer b)
+{
+Split *sa = *(Split **)a;
+Split *sb = *(Split **)b;      
+
+       DB( g_print(" sort %d %s - %d %s\n", sa->pos, sa->memo, sb->pos, sb->memo) );
 
-guint da_splits_count(Split *txn_splits[])
+       return sa->pos - sb->pos;
+}
+
+void da_splits_sort(GPtrArray *splits)
 {
-guint i, count = 0;
+       DB( g_print("da_splits_sort\n") );
 
-       for(i=0;i<TXN_MAX_SPLIT;i++)
+       if(splits == NULL)
        {
-               if(txn_splits[i] == NULL)
-                       break;
-               count++;
+               //g_warning("NULL splits");
+               return;
        }
-       return count;
+
+       g_ptr_array_sort(splits, (GCompareFunc) da_splits_compare_func);
 }
 
 
-void da_splits_free(Split *txn_splits[])
+guint da_splits_length(GPtrArray *splits)
 {
-guint count, i=0;
+       DB( g_print("da_splits_length\n") );
 
-       count = da_splits_count(txn_splits);
-       if(count == 0)
-               return;
+       if(splits == NULL)
+       {
+               //g_warning("NULL splits");
+               return 0;
+       }
        
-       DB( g_print("da_splits_free\n") );
+       return splits->len;
+}
+
 
-       for(;i<=count;i++)
+gboolean da_splits_remove(GPtrArray *splits, Split *item)
+{
+       DB( g_print("da_splits_remove\n") );
+
+       if(splits == NULL)
        {
-               DB( g_print("- freeing %d :: %p\n", i, txn_splits[i]) );
-               
-               da_split_free(txn_splits[i]);
-               txn_splits[i] = NULL;
+               g_warning("NULL splits");
+               return FALSE;
        }
+
+       return g_ptr_array_remove(splits, item);
 }
 
 
-void da_splits_append(Split *txn_splits[], Split *new_split)
+void da_splits_append(GPtrArray *splits, Split *item)
 {
-guint count = da_splits_count(txn_splits);
-
        DB( g_print("da_splits_append\n") );
 
-       DB( g_print("- split[%d] at %p for ope \n", count, new_split) );
+       if(splits == NULL)
+       {
+               g_warning("NULL splits");
+               return;
+       }
 
-       txn_splits[count] = new_split;
-       txn_splits[count + 1] = NULL;
-       
-       DB( g_print("- %d splits\n", da_splits_count(txn_splits)) );
+       if(splits->len <= TXN_MAX_SPLIT)
+               g_ptr_array_add (splits, item); 
 }
 
 
-guint da_splits_clone(Split *stxn_splits[], Split *dtxn_splits[])
+Split *da_splits_get(GPtrArray *splits, guint index)
 {
-gint i, count;
+       return g_ptr_array_index(splits, index);
+}
+
+
+GPtrArray *da_splits_clone(GPtrArray *src_splits)
+{
+GPtrArray *new_splits;
+guint i;
 
        DB( g_print("da_splits_clone\n") );
-       
-       count = da_splits_count(stxn_splits);
-       for(i=0;i<count;i++)
+
+       if(src_splits == NULL)
        {
-               dtxn_splits[i] = da_split_record_clone(stxn_splits[i]);
-       }       
+               //g_warning("NULL splits");
+               return NULL;
+       }
 
-/*     if(count > 0)
-               dtxn->flags |= OF_SPLIT;*/
+       new_splits = da_split_new_full (src_splits->len);
+       for(i=0;i<src_splits->len;i++)
+       {
+       Split *src, *new;
        
-       DB( g_print(" clone %p -> %p, %d splits\n", stxn_splits, dtxn_splits, count) );
-       return count;
-}
+               src = g_ptr_array_index(src_splits, i);
+               new = da_split_malloc ();
 
+               new->kcat = src->kcat;
+               new->memo = g_strdup(src->memo);                
+               new->amount = src->amount;
+               da_splits_append (new_splits, new);
+       }       
+       return new_splits;
+}
 
 
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
-guint da_splits_parse(Split *ope_splits[], gchar *cats, gchar *amounts, gchar *memos)
+
+guint da_splits_parse(GPtrArray *splits, gchar *cats, gchar *amounts, gchar *memos)
 {
 gchar **cat_a, **amt_a, **mem_a;
 guint count, i;
-guint32 kcat;
-gdouble amount;
 Split *split;
 
+       if(splits == NULL)
+               return 0;
+
        DB( g_print(" split parse %s :: %s :: %s\n", cats, amounts, memos) );
 
        cat_a = g_strsplit (cats, "||", 0);
@@ -181,12 +209,12 @@ Split *split;
        {
                for(i=0;i<count;i++)
                {
-                       kcat = atoi(cat_a[i]);
-                       amount = g_ascii_strtod(amt_a[i], NULL);
-                       split = da_split_new(kcat, amount, mem_a[i]);
-                       da_splits_append (ope_splits, split);
+                       split = da_split_malloc();
+                       split->kcat = atoi(cat_a[i]);
+                       split->memo = g_strdup(mem_a[i]);
+                       split->amount = g_ascii_strtod(amt_a[i], NULL);
+                       da_splits_append (splits, split);
                }
-               
        }
        else
        {
@@ -201,23 +229,30 @@ Split *split;
 }
 
 
-
-guint da_splits_tostring(Split *ope_splits[], gchar **cats, gchar **amounts, gchar **memos)
+guint da_splits_tostring(GPtrArray *splits, gchar **cats, gchar **amounts, gchar **memos)
 {
-guint count, i;
+guint i;
+Split *split;
 char buf[G_ASCII_DTOSTR_BUF_SIZE];
-GString *cat_a = g_string_new (NULL);
-GString *amt_a = g_string_new (NULL);
-GString *mem_a = g_string_new (NULL);
+GString *cat_a, *amt_a , *mem_a;
+
+       if(splits == NULL)
+               return 0;
 
-       count = da_splits_count(ope_splits);
-       for(i=0;i<count;i++)
+       DB( g_print(" splits tostring\n") );
+
+       cat_a = g_string_new (NULL);
+       amt_a = g_string_new (NULL);
+       mem_a = g_string_new (NULL);
+
+       for(i=0;i<splits->len;i++)
        {
-               g_string_append_printf (cat_a, "%d", ope_splits[i]->kcat);
-               g_string_append(amt_a, g_ascii_dtostr (buf, sizeof (buf), ope_splits[i]->amount) );
-               g_string_append(mem_a, ope_splits[i]->memo);
+               split = g_ptr_array_index(splits, i);
+               g_string_append_printf (cat_a, "%d", split->kcat);
+               g_string_append(amt_a, g_ascii_dtostr (buf, sizeof (buf), split->amount) );
+               g_string_append(mem_a, split->memo);
 
-               if((i+1) < count)
+               if((i+1) < splits->len)
                {
                        g_string_append(cat_a, "||");
                        g_string_append(amt_a, "||");
@@ -229,22 +264,28 @@ GString *mem_a = g_string_new (NULL);
        *amounts = g_string_free(amt_a, FALSE);
        *memos = g_string_free(mem_a, FALSE);
        
-       return count;
+       return i;
 }
 
-void split_cat_consistency (Split *txn_splits[])
+
+guint da_splits_consistency (GPtrArray *splits)
 {
-       guint i, nbsplit;
+Split *split;
+guint i;
        
+       if(splits == NULL)
+               return 0;
+
        // check split category #1340142
-       nbsplit = da_splits_count(txn_splits);
-       for(i=0;i<nbsplit;i++)
+       for(i=0;i<splits->len;i++)
        {
-               if(da_cat_get(txn_splits[i]->kcat) == NULL)
+               split = g_ptr_array_index(splits, i);
+               if(da_cat_get(split->kcat) == NULL)
                {
-                       g_warning("split consistency: fixed invalid split cat %d", txn_splits[i]->kcat);
-                       txn_splits[i]->kcat = 0;
+                       g_warning("split consistency: fixed invalid split cat %d", split->kcat);
+                       split->kcat = 0;
                }
        }
+       return splits->len;
 }
 
This page took 0.027563 seconds and 4 git commands to generate.