/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2016 Maxime DOYEN
+ * Copyright (C) 1995-2019 Maxime DOYEN
*
* This file is part of HomeBank.
*
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
-static void da_split_free(Split *item)
+void da_split_free(Split *item)
{
if(item != NULL)
{
}
-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);
{
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
{
}
-
-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, "||");
*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;
}