/* HomeBank -- Free, easy, personal accounting for everyone. * Copyright (C) 1995-2016 Maxime DOYEN * * This file is part of HomeBank. * * HomeBank is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * HomeBank is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "homebank.h" #include "hb-transaction.h" #include "hb-split.h" /****************************************************************************/ /* Debug macros */ /****************************************************************************/ #define MYDEBUG 0 #if MYDEBUG #define DB(x) (x); #else #define DB(x); #endif /* our global datas */ extern struct HomeBank *GLOBALS; extern struct Preferences *PREFS; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ static void da_split_free(Split *item) { if(item != NULL) { if(item->memo != NULL) g_free(item->memo); g_free(item); } } static Split *da_split_malloc(void) { return g_malloc0(sizeof(Split)); } Split *da_split_new(guint32 kcat, gdouble amount, gchar *memo) { Split *split = da_split_malloc(); split->kcat = kcat; split->amount = amount; split->memo = g_strdup(memo); return split; } static Split *da_split_record_clone(Split *src_split) { Split *new_split = g_memdup(src_split, sizeof(Split)); 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; } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ guint da_splits_count(Split *txn_splits[]) { guint i, count = 0; for(i=0;i 0) dtxn->flags |= OF_SPLIT;*/ DB( g_print(" clone %p -> %p, %d splits\n", stxn_splits, dtxn_splits, count) ); return count; } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ guint da_splits_parse(Split *ope_splits[], gchar *cats, gchar *amounts, gchar *memos) { gchar **cat_a, **amt_a, **mem_a; guint count, i; guint32 kcat; gdouble amount; Split *split; DB( g_print(" split parse %s :: %s :: %s\n", cats, amounts, memos) ); cat_a = g_strsplit (cats, "||", 0); amt_a = g_strsplit (amounts, "||", 0); mem_a = g_strsplit (memos, "||", 0); count = g_strv_length(amt_a); if( (count == g_strv_length(cat_a)) && (count == g_strv_length(mem_a)) ) { for(i=0;ikcat); g_string_append(amt_a, g_ascii_dtostr (buf, sizeof (buf), ope_splits[i]->amount) ); g_string_append(mem_a, ope_splits[i]->memo); if((i+1) < count) { g_string_append(cat_a, "||"); g_string_append(amt_a, "||"); g_string_append(mem_a, "||"); } } *cats = g_string_free(cat_a, FALSE); *amounts = g_string_free(amt_a, FALSE); *memos = g_string_free(mem_a, FALSE); return count; } void split_cat_consistency (Split *txn_splits[]) { guint i, nbsplit; // check split category #1340142 nbsplit = da_splits_count(txn_splits); for(i=0;ikcat) == NULL) { g_warning("split consistency: fixed invalid split cat %d", txn_splits[i]->kcat); txn_splits[i]->kcat = 0; } } }