Added few more stubs so that control reaches to DestroyDevice().
[mesa.git] / src / util / u_string.h
index e88e13f42c6617817888c1175dee95b77b2507bb..88df2cceda66681d02e6b8c2f9752bce7f845080 100644 (file)
 #if !defined(XF86_LIBC_H)
 #include <stdio.h>
 #endif
+#include <stdlib.h>
 #include <stddef.h>
 #include <stdarg.h>
+#include <string.h>
 
 #include "util/macros.h" // PRINTFLIKE
 
 extern "C" {
 #endif
 
-#ifdef _GNU_SOURCE
-
-#define util_strchrnul strchrnul
-
-#else
+#if !defined(_GNU_SOURCE) || defined(__APPLE__)
 
+#define strchrnul util_strchrnul
 static inline char *
 util_strchrnul(const char *s, char c)
 {
@@ -66,133 +65,60 @@ util_strchrnul(const char *s, char c)
 
 #ifdef _WIN32
 
-static inline int
-util_vsnprintf(char *str, size_t size, const char *format, va_list ap)
-{
-   /* We need to use _vscprintf to calculate the length as vsnprintf returns -1
-    * if the number of characters to write is greater than count.
-    */
-   va_list ap_copy;
-   int ret;
-   va_copy(ap_copy, ap);
-   ret = _vsnprintf(str, size, format, ap);
-   if (ret < 0) {
-      ret = _vscprintf(format, ap_copy);
-   }
-   return ret;
-}
-
-static inline int
-   PRINTFLIKE(3, 4)
-util_snprintf(char *str, size_t size, const char *format, ...)
-{
-   va_list ap;
-   int ret;
-   va_start(ap, format);
-   ret = util_vsnprintf(str, size, format, ap);
-   va_end(ap);
-   return ret;
-}
-
-static inline void
-util_vsprintf(char *str, const char *format, va_list ap)
-{
-   util_vsnprintf(str, (size_t)-1, format, ap);
-}
-
+#define sprintf util_sprintf
 static inline void
    PRINTFLIKE(2, 3)
 util_sprintf(char *str, const char *format, ...)
 {
    va_list ap;
    va_start(ap, format);
-   util_vsnprintf(str, (size_t)-1, format, ap);
+   vsnprintf(str, (size_t)-1, format, ap);
    va_end(ap);
 }
 
-static inline char *
-util_strchr(const char *s, char c)
+#define vasprintf util_vasprintf
+static inline int
+util_vasprintf(char **ret, const char *format, va_list ap)
 {
-   char *p = util_strchrnul(s, c);
+   va_list ap_copy;
 
-   return *p ? p : NULL;
-}
+   /* Compute length of output string first */
+   va_copy(ap_copy, ap);
+   int r = vsnprintf(NULL, 0, format, ap_copy);
+   va_end(ap_copy);
 
-static inline char*
-util_strncat(char *dst, const char *src, size_t n)
-{
-   char *p = dst + strlen(dst);
-   const char *q = src;
-   size_t i;
+   if (r < 0)
+      return -1;
 
-   for (i = 0; i < n && *q != '\0'; ++i)
-       *p++ = *q++;
-   *p = '\0';
+   *ret = (char *) malloc(r + 1);
+   if (!*ret)
+      return -1;
 
-   return dst;
+   /* Print to buffer */
+   return vsnprintf(*ret, r + 1, format, ap);
 }
 
+#define asprintf util_asprintf
 static inline int
-util_strcmp(const char *s1, const char *s2)
+util_asprintf(char **str, const char *fmt, ...)
 {
-   unsigned char u1, u2;
-
-   while (1) {
-      u1 = (unsigned char) *s1++;
-      u2 = (unsigned char) *s2++;
-      if (u1 != u2)
-        return u1 - u2;
-      if (u1 == '\0')
-        return 0;
-   }
-   return 0;
-}
-
-static inline int
-util_strncmp(const char *s1, const char *s2, size_t n)
-{
-   unsigned char u1, u2;
-
-   while (n-- > 0) {
-      u1 = (unsigned char) *s1++;
-      u2 = (unsigned char) *s2++;
-      if (u1 != u2)
-        return u1 - u2;
-      if (u1 == '\0')
-        return 0;
-   }
-   return 0;
-}
-
-static inline char *
-util_strstr(const char *haystack, const char *needle)
-{
-   const char *p = haystack;
-   size_t len = strlen(needle);
-
-   for (; (p = util_strchr(p, *needle)) != 0; p++) {
-      if (util_strncmp(p, needle, len) == 0) {
-        return (char *)p;
-      }
-   }
-   return NULL;
+   int ret;
+   va_list args;
+   va_start(args, fmt);
+   ret = vasprintf(str, fmt, args);
+   va_end(args);
+   return ret;
 }
 
+#ifndef strcasecmp
+#define strcasecmp stricmp
+#endif
 
-#define util_strcasecmp stricmp
-
-#else
+#define strdup _strdup
 
-#define util_vsnprintf vsnprintf
-#define util_snprintf snprintf
-#define util_vsprintf vsprintf
-#define util_sprintf sprintf
-#define util_strchr strchr
-#define util_strcmp strcmp
-#define util_strncmp strncmp
-#define util_strncat strncat
-#define util_strstr strstr
-#define util_strcasecmp strcasecmp
+#if defined(_WIN32) && !defined(HAVE_STRTOK_R)
+#define strtok_r strtok_s
+#endif
 
 #endif