diff options
-rw-r--r-- | COPYING | 2 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | include/X11/Intrinsic.h | 9 | ||||
-rw-r--r-- | man/Makefile.am | 3 | ||||
-rw-r--r-- | man/XtAsprintf.man | 1 | ||||
-rw-r--r-- | man/XtMalloc.man | 18 | ||||
-rw-r--r-- | src/Alloc.c | 41 |
7 files changed, 72 insertions, 4 deletions
@@ -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( |