X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fhb-split.c;fp=src%2Fhb-split.c;h=676ef34c469c9520ec5792fa87a715b24438a35e;hp=6e596267780bfd2b9fd39555098ad511492fdd75;hb=a6c6b0df5492c2160ed97e3a376bdb2fe7c5ebc4;hpb=cd13d9691c46c2b2d6d459e9e6a76bed1c21b7a6 diff --git a/src/hb-split.c b/src/hb-split.c index 6e59626..676ef34 100644 --- a/src/hb-split.c +++ b/src/hb-split.c @@ -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;ilen; +} + - 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 0) - dtxn->flags |= OF_SPLIT;*/ + new_splits = da_split_new_full (src_splits->len); + for(i=0;ilen;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;ikcat = 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;ilen;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;ilen;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; }