Like asprintf() but using XtMalloc() to tie into the Xt memory allocation and error handling subsystems.
Signed-off-by: Alan Coopersmith <[email protected]> --- COPYING | 2 +- include/X11/Intrinsic.h | 9 +++++++++ src/Alloc.c | 37 ++++++++++++++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 2 deletions(-) Will use _X_RESTRICT_KYWD from patch 1/4 if present, but does not require it to avoid a hard dependency on a new x11proto release. diff --git a/COPYING b/COPYING index 5507aa4..1c8683e 100644 --- a/COPYING +++ b/COPYING @@ -19,7 +19,7 @@ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/include/X11/Intrinsic.h b/include/X11/Intrinsic.h index 5111537..06f60c2 100644 --- a/include/X11/Intrinsic.h +++ b/include/X11/Intrinsic.h @@ -1855,6 +1855,15 @@ extern void XtFree( char* /* ptr */ ); +#ifndef _X_RESTRICT_KYWD +# define _X_RESTRICT_KYWD +#endif +extern int XtAsprintf( + char **ret, + _Xconst char * _X_RESTRICT_KYWD format, + ... +) _X_ATTRIBUTE_PRINTF(2,3); + #ifdef XTTRACEMEMORY extern char *_XtMalloc( /* implementation-private */ diff --git a/src/Alloc.c b/src/Alloc.c index 94cb90a..caf641e 100644 --- a/src/Alloc.c +++ b/src/Alloc.c @@ -1,5 +1,5 @@ /*********************************************************** -Copyright (c) 1993, Oracle and/or its affiliates. All rights reserved. +Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -82,6 +82,8 @@ in this Software without prior written authorization from The Open Group. #undef _XBCOPYFUNC #include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> #define Xmalloc(size) malloc((size)) #define Xrealloc(ptr, size) realloc((ptr), (size)) @@ -121,6 +123,39 @@ void _XtHeapInit( heap->bytes_remaining = 0; } +/* Version of asprintf() using XtMalloc + * Not currently available in XTTRACEMEMORY version, since that would + * require varargs macros everywhere, which are only standard in C99 & later. + */ +int XtAsprintf( + char **ret, + _Xconst char * _X_RESTRICT_KYWD format, + ...) +{ + char buf[256]; + int len; + va_list ap; + + va_start(ap, format); + len = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + len += 1; /* snprintf doesn't count trailing '\0' */ + *ret = XtMalloc(len); + if (len <= sizeof(buf)) + { + strncpy(*ret, buf, len); + } + else + { + va_start(ap, format); + vsnprintf(*ret, len, format, ap); + va_end(ap); + } + return len; +} + + #ifndef XTTRACEMEMORY char *XtMalloc( -- 1.7.3.2 _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
