[PATCH:libXt 2/4] Add XtAsprintf() to Alloc.c & Intrinsic.h
Alan Coopersmith
alan.coopersmith at oracle.com
Mon Dec 13 16:40:26 PST 2010
Like asprintf() but using XtMalloc() to tie into the Xt memory allocation
and error handling subsystems.
Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
---
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
More information about the xorg-devel
mailing list