From ac07da253415ccb8b6322feedf7969967357050e Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Wed, 12 Jan 2011 23:09:29 -0800 Subject: Add XtAsprintf() as a new exported API 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 --- 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 +#include +#include #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( -- cgit v1.2.3