Like asprintf() but using XtMalloc() to tie into the Xt memory allocation and error handling subsystems.
Bumps libXt version to 1.0.99.1 so that modules can set their pkg-config dependency to libXt >= 1.0.99.1 to require XtAsprintf(). Signed-off-by: Alan Coopersmith <alan.coopersm...@oracle.com> --- Changes since v1 (patch 2/4 in the Dec 13 series): - bump libXt version in configure.ac - add man pages - update error checks similar to those put in xrdb version during review COPYING | 2 +- configure.ac | 2 +- include/X11/Intrinsic.h | 9 +++++++++ man/Makefile.am | 3 ++- man/XtAsprintf.man | 1 + man/XtMalloc.man | 18 ++++++++++++++++++ src/Alloc.c | 41 ++++++++++++++++++++++++++++++++++++++++- 7 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 man/XtAsprintf.man diff --git a/COPYING b/COPYING index 5507aa4..9e121b1 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, 2011, 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/configure.ac b/configure.ac index ed295e0..f429f12 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ dnl Process this file with autoconf to create configure. # Initialize Autoconf AC_PREREQ([2.60]) -AC_INIT([libXt], [1.0.9], +AC_INIT([libXt], [1.0.99.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXt]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([Makefile.am]) diff --git a/include/X11/Intrinsic.h b/include/X11/Intrinsic.h index 5111537..d09acad 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 Cardinal XtAsprintf( + String *new_string, + _Xconst char * _X_RESTRICT_KYWD format, + ... +) _X_ATTRIBUTE_PRINTF(2,3); + #ifdef XTTRACEMEMORY extern char *_XtMalloc( /* implementation-private */ diff --git a/man/Makefile.am b/man/Makefile.am index 005c2d5..305598d 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -330,7 +330,8 @@ XtMalloc_shadows = \ XtRealloc \ XtFree \ XtNew \ - XtNewString + XtNewString \ + XtAsprintf XtManageChildren_shadows = \ XtManageChild \ diff --git a/man/XtAsprintf.man b/man/XtAsprintf.man new file mode 100644 index 0000000..50eaf76 --- /dev/null +++ b/man/XtAsprintf.man @@ -0,0 +1 @@ +.so man__libmansuffix__/XtMalloc.__libmansuffix__ diff --git a/man/XtMalloc.man b/man/XtMalloc.man index 396218b..70183ec 100644 --- a/man/XtMalloc.man +++ b/man/XtMalloc.man @@ -139,6 +139,8 @@ void XtFree(char *\fIptr\fP); \fItype\fP *XtNew(\fItype\fP); .HP String XtNewString(String \fIstring\fP); +.HP +Cardinal XtAsprintf(String *\fInew_string\fP, const char *\fIformat\fP, ...); .SH ARGUMENTS .IP \fInum\fP 1i Specifies the number of bytes or array elements. @@ -152,6 +154,10 @@ desired. Specifies a previously declared string. .IP \fItype\fP 1i Specifies a previously declared data type. +.IP \fInew_string\fP 1i +Specifies a pointer to write a newly allocated string to. +.IP \fIformat\fP 1i +Specifies a formatting string as defined by sprintf(3c) .SH DESCRIPTION The .ZN XtMalloc @@ -226,6 +232,18 @@ with the following arguments specified: .ta .5i (strcpy(XtMalloc((unsigned) strlen(str) + 1), str)) .De +.LP +The +.ZN XtAsprintf +function allocates space for a string large enough to hold the string +specified by the sprintf(3c) format pattern when used with the remaining +arguments, and fills it with the formatted results. +The address of the allocated string is placed into the pointer passed as ret. +The length of the string (not including the terminating null byte) is returned. +If there is insufficient memory to allocate the new block, +.ZN XtAsprintf +calls +.ZN XtErrorMsg . .SH "SEE ALSO" .br \fI\*(xT\fP diff --git a/src/Alloc.c b/src/Alloc.c index 94cb90a..67413ab 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, 2011, 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,43 @@ 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. + */ +Cardinal XtAsprintf( + String *new_string, + _Xconst char * _X_RESTRICT_KYWD format, + ...) +{ + char buf[256]; + Cardinal len; + va_list ap; + + va_start(ap, format); + len = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + if (len < 0) + _XtAllocError("vsnprintf"); + + *new_string = XtMalloc(len + 1); /* snprintf doesn't count trailing '\0' */ + if (len < sizeof(buf)) + { + strncpy(*new_string, buf, len); + new_string[len] = '\0'; + } + else + { + va_start(ap, format); + if (vsnprintf(*new_string, len + 1, format, ap) < 0) + _XtAllocError("vsnprintf"); + va_end(ap); + } + return len; +} + + #ifndef XTTRACEMEMORY char *XtMalloc( -- 1.7.3.2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel