From: Gustavo S. B. <bar...@pr...> - 2011-01-04 23:48:21
|
On Tue, Jan 4, 2011 at 9:29 PM, Vincent Torri <vt...@un...> wrote: > > > On Tue, 4 Jan 2011, Gustavo Sverzut Barbieri wrote: > >> On Tue, Jan 4, 2011 at 9:06 PM, Mike Blumenkrantz <mi...@ze...> >> wrote: >>> >>> On Tue, 4 Jan 2011 20:03:47 -0200 >>> Gustavo Sverzut Barbieri <bar...@pr...> wrote: >>> >>>> On Tue, Jan 4, 2011 at 7:53 PM, Vincent Torri <vt...@un...> >>>> wrote: >>>>> >>>>> On Tue, 4 Jan 2011, Mike Blumenkrantz wrote: >>>>> >>>>>> In my efm hacking, I've found a number of snippets like this: >>>>>> >>>>>> size = strlen(v->udi) + 1; >>>>>> buf = alloca(size); >>>>>> strcpy(buf, v->udi); >>>>>> ecore_ipc_server_send(_e_fm_ipc_server, >>>>>> 6 /*E_IPC_DOMAIN_FM*/, >>>>>> E_FM_OP_EJECT_DONE, >>>>>> 0, 0, 0, buf, size); >>>>>> >>>>>> Is there a reason why we can't just use strdupa? It should be about >>>>>> as >>>>>> portable as alloca... >>>>> >>>>> strdupa is not portable at all. It is part of the glibc (it's a GNU >>>>> stuff). >>>> >>>> given that the above code does exactly what strdupa() would do, why >>>> not use it and save lines, defining a strdupa() macro where not >>>> available? >>>> >>>> something like this should do: >>>> >>>> #define stdupa(str) strcpy(alloca(strlen(str) + 1), str) >>>> >>>> >>> seems fairly reasonable, assuming it's portable? >> >> according to manpages it is portable given that alloca exists. > > no, it's not: > > http://linux.die.net/man/3/strdupa > > "strdupa() and strndupa() are similar, but use alloca(3) to allocate the > buffer. They are only available when using the GNU GCC suite, and suffer > from the same limitations described in alloca(3)." > > So strdupa() is defined only in glibc. It does not exist on Windows for > example. Vincent, read again. I said that this macro is a portable solution to the lack of strdupa(): #define stdupa(str) strcpy(alloca(strlen(str) + 1), str) -- Gustavo Sverzut Barbieri http://profusion.mobi embedded systems -------------------------------------- MSN: bar...@gm... Skype: gsbarbieri Mobile: +55 (19) 9225-2202 |