On 21 Jun 2006 08:53:37 +0200, Andreas Hauser <[EMAIL PROTECTED]> wrote:
dillon wrote @ Tue, 20 Jun 2006 23:27:14 -0700 (PDT): > > :andy wrote @ 20 Jun 2006 21:44:17 +0200: > : > :Fixed the off-by-one: > :http://ftp.fortunaty.net/DragonFly/inofficial/patches/strndup.patch > > Umm. That code is broken. len is only the maximum allowed length, > the actual string may be smaller. > > so e.g. someone might do: strndup("fubar", 16384). The returned > string should only be 'fubar\0', and only 6 bytes should be allocated, > not 16384. But when it works like that, one does not save the strlen. Hence i see the dislike for the function. I would like to have one, that does not work like that. Is there already a name for it?
Why not call it memdup instead and drop the termination? String functions for standard C, as broken as they are, are all based around having a null terminator, and in your case you're actually basing entirely off a length (but allocating for length + 1 which is very counter-intuitive). Not that this function really achieves anything to begin with... I never cared for C-style strings. To set a length for them you have to modify them, and this means you have to re-allocate if doing read-only tokenizing or regex extraction. In my own code I define a structure containing a length and a pointer, and when extracting sub-strings, simply set up such a structure defining the scope of the sub-string. If it needs to be copied out for safe writing, it's trivial to do, and at no point is there a need to check through for a null terminator. If the structure itself is on the stack you don't even need to malloc. The whole thing translates nicely into any kind of memory usage, and works naturally with buffering data blocks since you already know the length. Additional plus to being able to store 0 as a valid byte, which apparently matters for some encodings. http://members.optusnet.com.au/dnikulin/ppk-mem.h Proof of concept implemented as a header of static inline functions. BSD license, C99, should be WARNS6 clean too. This will probably solve your problem a lot better than yet another broken string function. -- Dmitri Nikulin
