Hi Jérémie,

Thanks for your comments!
I'll have a look a it later this week but I've already learnt something:
I'm a very bad developer! ^_^'
The good news is: it can only get better! :-D

Don't spend time trying to test it. I'll first fix this horrible mess!

Cheers,
Tanguy

2012/1/22 Jérémie Koenig <[email protected]>

> Hi, thanks for working on this.
>
> A couple of issues I found in your patch:
>
> > 3) Fix...
> >  a) "piece of cake" (TM), but include <math.h> (for log10() function) to
> get
> > an accurate length for the buffer... which may be an overhead!
>
> It is indeed much trouble for very few bytes saved :-)
>
> The usual trick for "%d" is to use the constant "sizeof (int) * 3 +
> 1". I included + 1 for the sign, but it's not really necessary if we
> exepect sizeof(int) >= 2, which we probably should.
>
> On the other hand, don't forget to include the byte for the
> terminating '\0' in your buffer length calculations!
>
> >  b) read file lines in a dynamically re-sized buffer
>
> The usual approach is to reallocate the buffer geometrically, for instance:
>
>    size = size ? size * 2 : BUFSIZ;
>
> This way the number of reallocations grows logarithmically rather than
> linearily with the actual size we need.
>
> Also, I think there are some problems with your pointer arithmetic.
> For instance,
>
>    if (fgets(buf+last,size,f) == NULL)
>
> will overwrite the last character read from the previous iteration (if
> there was one).
>
> In fact,
>  - at entry, "last" points to the first unused byte in your buffer (0),
>  - on subsequent iterations, it points the last used byte (strlen(buf) -
> 1).
>
> I would say the "first unused byte" convention is more common and
> straightforward.
>
> Also, in:
>
>    if (buf[last+1] != '\n') { return buf; }
>
> buf[last+1] will always be '\0' (the terminating null character of the
> string). I also think you mean to return when the last character _is_
> a newline (fortunately the two mistakes cancel each other out in the
> usual case of no reallocation needed :-).
>
> >  c) use lstat as described in readlink man page
>
> In the error case ("Cannot read link information"),
>  - "filename" is used after it has been freed
>  - the two if() blocks could be merged as :
>        if (len < 0 || len > sb.st_size) { ... }
>
> > 5) But...
> >  - memstat uses /proc/XYZ/exe and /proc/XYZ/maps... and the output of
> > memstat on Hurd is different than the one on Linux
>
> I can't test your patch right now but I'd say this is to be expected.
>
> >  - implement (copy/paste mostly) a get_line function. Might have been
> better
> > to use the GNU get_line()... or not?!
>
> The getline() function has only recently been added to POSIX, so
> portability might be a problem in the short term. What you can use
> generally depends on the intended target platforms for the original
> code.
>
> Last, but not least, you should be careful with whitespace. Your patch
> mixes tabs and spaces for indentation, and gratuitously removes an
> empty line (line 181 in the new version). This may seem trivial at
> first, but it's very important for source code to be uniformly
> indented, and upstream will rightfully insist that the patches you
> submit respect the conventions of the original code.
>
> > Feel free to make comments on everything (code, decisions, style), I know
> > that I still have a lot to learn!
>
> Don't we all? :-)
>
> Happy hacking,
> --
> Jérémie Koenig <[email protected]>
> http://jk.fr.eu.org/
>

Reply via email to