Merge commit 'origin/master' into gallium-0.2
[mesa.git] / src / gallium / auxiliary / util / u_string.h
index d7d925ee9b70b2837380bbb1a80f62fb5b4faee7..08c89bbf7708f976422811a75bad7b593fc6cafa 100644 (file)
 /**
  * @file
  * Platform independent functions for string manipulation.
- * 
+ *
  * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
  */
 
 #ifndef U_STRING_H_
 #define U_STRING_H_
 
-#ifndef WIN32
+#if !defined(WIN32) && !defined(XF86_LIBC_H)
 #include <stdio.h>
 #endif
 #include <stddef.h>
 extern "C" {
 #endif
 
-   
+
 #ifdef WIN32
-   
+
 int util_vsnprintf(char *, size_t, const char *, va_list);
 int util_snprintf(char *str, size_t size, const char *format, ...);
 
-static INLINE void 
+static INLINE void
+util_vsprintf(char *str, const char *format, va_list ap)
+{
+   util_vsnprintf(str, (size_t)-1, format, ap);
+}
+
+static INLINE void
 util_sprintf(char *str, const char *format, ...)
 {
    va_list ap;
@@ -158,6 +164,7 @@ util_memmove(void *dest, const void *src, size_t n)
 
 #define util_vsnprintf vsnprintf
 #define util_snprintf snprintf
+#define util_vsprintf vsprintf
 #define util_sprintf sprintf
 #define util_strchr strchr
 #define util_strcmp strcmp
@@ -169,6 +176,43 @@ util_memmove(void *dest, const void *src, size_t n)
 #endif
 
 
+/**
+ * Printable string buffer
+ */
+struct util_strbuf
+{
+   char *str;
+   char *ptr;
+   size_t left;
+};
+
+
+static INLINE void
+util_strbuf_init(struct util_strbuf *sbuf, char *str, size_t size) 
+{
+   sbuf->str = str;
+   sbuf->str[0] = 0;
+   sbuf->ptr = sbuf->str;
+   sbuf->left = size;
+}
+
+
+static INLINE void
+util_strbuf_printf(struct util_strbuf *sbuf, const char *format, ...)
+{
+   if(sbuf->left > 1) {
+      size_t written;
+      va_list ap;
+      va_start(ap, format);
+      written = util_vsnprintf(sbuf->ptr, sbuf->left, format, ap);
+      va_end(ap);
+      sbuf->ptr += written;
+      sbuf->left -= written;
+   }
+}
+
+
+
 #ifdef __cplusplus
 }
 #endif