[Toolserver-l] Alternative C function to vasprintf() on Toolserver
Andrew Dunbar
hippytrail at gmail.com
Sat Apr 9 10:17:22 UTC 2011
On 9 April 2011 19:28, Ilmari Karonen <nospam at vyznev.net> wrote:
> On 04/09/2011 10:29 AM, Andrew Dunbar wrote:
>> I've got a little program to index dump files that supports Windows
>> and Linux but it doesn't compile on the Toolserver with either cc or
>> gcc due to the lack of the function vasprintf(). It's a GNU extension
>> so I'm surprised it didn't work even with gcc.
>>
>> Why doesn't the Toolserver gcc have it, and does anybody know of a workaround?
>>
>> vasprintf() is a version of vsprintf() which writes to a memory buffer
>> of just the right size that it allocates and which the caller must
>> call free() on when done.
>
> You could try writing your own. Off the top of my head (untested):
>
> char *vasprintf (const char *format, va_list ap) {
> int len; char *buf;
> len = vsnprintf(NULL, 0, format, ap); /* get needed size */
> if (len < 0) return NULL;
> buf = malloc(len + 1); /* reserve 1 byte for trailing \0 */
> if (!len) return NULL;
> if (vsnprintf(buf, len + 1, format, ap) == len) return buf;
> free(buf); /* something went wrong in second vsnprintf() */
> return NULL;
> }
>
> I think the vsnprintf(NULL, 0, ...) trick should work, although I
> haven't tried it. If it complains about the NULL, just use some valid
> dummy pointer instead. You could probably trade some memory for speed
> in some cases by guessing and allocating some reasonable initial size
> for the buffer before the first vsnprintf() call and extending it only
> if the first guess wasn't long enough.
Aha thanks! I already use vsnprintf in the Windows version of the code
but since the gcc on my Ubuntu 10 doesn't have it I didn't expect it
to be on the Toolserver gcc.
Any ideas how I can set up the #ifdefs to detect that it's compiling
on the toolserver environment or that it has this function available?
Andrew Dunbar (hippietrail)
> --
> Ilmari Karonen
>
> _______________________________________________
> Toolserver-l mailing list (Toolserver-l at lists.wikimedia.org)
> https://lists.wikimedia.org/mailman/listinfo/toolserver-l
> Posting guidelines for this list: https://wiki.toolserver.org/view/Mailing_list_etiquette
>
More information about the Toolserver-l
mailing list