some csv feedback

Christian Stimming stimming at tuhh.de
Sun Jul 8 16:21:46 EDT 2007


Hi Benjamin,

I've just looked more closely into your code and I thought I'd give you some 
feedback.

First of all, all of your code looks very good! You really spent a lot of work 
into separating the different parts of the task into separate functions, and 
this makes it really easy to understand what you're doing. Very good!

Also, you document really a lot of places in between, but without overly 
distracting comments. That way, even from reading the code one can gather 
quite clearly the idea of what is going on. And I'm very sure this whole 
style of clearly structuring and documenting your code will already pay off 
for yourself once you have to look at code parts of yourself that are some 
months old. Also very good!

(I have to admit I haven't been able to compile your branch due to goffice 
issues in lib/stf, but I'm quite sure I'll figure these out soon.)

When looking into the glade dialog, I'm a bit surprised about the multitude of 
checkboxes for the possible field separators. I think this is probably an 
area where you might consider different widget(s) eventually (a list view 
with multiple selections possible?), but for now this should be fine.

I have some smaller suggestions on how you could improve your code even more. 
I encountered some compile warnings:

gnc-csv-model.c: In function 'gnc_parse_to_trans':
gnc-csv-model.c:485: warning: 'begin_error_lines' may be used uninitialized in 
this function
gnc-csv-model.c:485: warning: 'error_lines' may be used uninitialized in this 
function
gnc-csv-model.c:487: warning: 'last_transaction' may be used uninitialized in 
this function

Did you specify any particular options at ./configure time? I'd suggest to use 
the following:  --enable-error-on-warning --enable-compile-warnings
In my experience, even these "maybe used uninitialized" warnings provide quite 
a helpful hint on which variables should indeed get an initialization value. 
But apart from this particular case I'd suggest to compile with the 
error-on-warning and compile-warnings all the time, because it avoids quite 
some hassle once someone with a different compiler tries to use this.

Then, I have a conceptual addition with dates. Do you already have plans for 
different date separators? In the struct date_format_internal there is 
only '/'.  Eventually, the code needs to take several different date 
separators into account. I know of 2007/06/05 and 2007-06-05 and 05.06.2007, 
i.e. the separator is one of [/-.], but there might be others. Maybe 
http://en.wikipedia.org/wiki/Date_and_time_notation_by_country tells of some, 
but maybe that page is just a prime example of the wiki principle failing 
gloriously. Heh :-) 

Then, I have some suggestions from the MS Windows front. You are using some 
unix-specific file handling system calls. Although those are fine on Unix, 
they don't carry over well to MS Windows, and in almost any case the glib 
library has some more general function because of that.  In particular, I 
would suggest these replacements:
stat() -> g_file_test() for testing for existance.
mmap() -> g_mapped_file_new() ; use g_mapped_file_get_length() to get the 
length instead of stat(). See  
http://developer.gnome.org/doc/API/2.0/glib/glib-File-Utilities.html

And eventually I saw some instances of g_malloc(sizeof()) in your code... I 
think as we are now in glib time we shouldn't have to deal with the sizeof() 
anymore, and I'd suggest the following replacement:
Foo *x = g_malloc(sizeof(Foo))  ->  Foo *x = g_new(Foo, 1) // or even g_new0()

Nevertheless, these suggestions concern really only a very small portion of 
what you already contributed. I think your structure and your coding style 
will enable you to achieve a very good outcome and really implement a very 
cool feature. Way to go!

Regards,

Christian


More information about the gnucash-devel mailing list