00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #ifndef U_STRING_H_
00036 #define U_STRING_H_
00037
00038 #if !defined(WIN32) && !defined(XF86_LIBC_H)
00039 #include <stdio.h>
00040 #endif
00041 #include <stddef.h>
00042 #include <stdarg.h>
00043
00044 #include "pipe/p_compiler.h"
00045
00046
00047 #ifdef __cplusplus
00048 extern "C" {
00049 #endif
00050
00051
00052 #ifdef WIN32
00053
00054 int util_vsnprintf(char *, size_t, const char *, va_list);
00055 int util_snprintf(char *str, size_t size, const char *format, ...);
00056
00057 static INLINE void
00058 util_vsprintf(char *str, const char *format, va_list ap)
00059 {
00060 util_vsnprintf(str, (size_t)-1, format, ap);
00061 }
00062
00063 static INLINE void
00064 util_sprintf(char *str, const char *format, ...)
00065 {
00066 va_list ap;
00067 va_start(ap, format);
00068 util_vsnprintf(str, (size_t)-1, format, ap);
00069 va_end(ap);
00070 }
00071
00072 static INLINE char *
00073 util_strchr(const char *s, char c)
00074 {
00075 while(*s) {
00076 if(*s == c)
00077 return (char *)s;
00078 ++s;
00079 }
00080 return NULL;
00081 }
00082
00083 static INLINE char*
00084 util_strncat(char *dst, const char *src, size_t n)
00085 {
00086 char *p = dst + strlen(dst);
00087 const char *q = src;
00088 size_t i;
00089
00090 for (i = 0; i < n && *q != '\0'; ++i)
00091 *p++ = *q++;
00092 *p = '\0';
00093
00094 return dst;
00095 }
00096
00097 static INLINE int
00098 util_strcmp(const char *s1, const char *s2)
00099 {
00100 unsigned char u1, u2;
00101
00102 while (1) {
00103 u1 = (unsigned char) *s1++;
00104 u2 = (unsigned char) *s2++;
00105 if (u1 != u2)
00106 return u1 - u2;
00107 if (u1 == '\0')
00108 return 0;
00109 }
00110 return 0;
00111 }
00112
00113 static INLINE int
00114 util_strncmp(const char *s1, const char *s2, size_t n)
00115 {
00116 unsigned char u1, u2;
00117
00118 while (n-- > 0) {
00119 u1 = (unsigned char) *s1++;
00120 u2 = (unsigned char) *s2++;
00121 if (u1 != u2)
00122 return u1 - u2;
00123 if (u1 == '\0')
00124 return 0;
00125 }
00126 return 0;
00127 }
00128
00129 static INLINE char *
00130 util_strstr(const char *haystack, const char *needle)
00131 {
00132 const char *p = haystack;
00133 int len = strlen(needle);
00134
00135 for (; (p = util_strchr(p, *needle)) != 0; p++) {
00136 if (util_strncmp(p, needle, len) == 0) {
00137 return (char *)p;
00138 }
00139 }
00140 return NULL;
00141 }
00142
00143 static INLINE void *
00144 util_memmove(void *dest, const void *src, size_t n)
00145 {
00146 char *p = (char *)dest;
00147 const char *q = (const char *)src;
00148 if (dest < src) {
00149 while (n--)
00150 *p++ = *q++;
00151 }
00152 else
00153 {
00154 p += n;
00155 q += n;
00156 while (n--)
00157 *--p = *--q;
00158 }
00159 return dest;
00160 }
00161
00162
00163 #else
00164
00165 #define util_vsnprintf vsnprintf
00166 #define util_snprintf snprintf
00167 #define util_vsprintf vsprintf
00168 #define util_sprintf sprintf
00169 #define util_strchr strchr
00170 #define util_strcmp strcmp
00171 #define util_strncmp strncmp
00172 #define util_strncat strncat
00173 #define util_strstr strstr
00174 #define util_memmove memmove
00175
00176 #endif
00177
00178
00182 struct util_strbuf
00183 {
00184 char *str;
00185 char *ptr;
00186 size_t left;
00187 };
00188
00189
00190 static INLINE void
00191 util_strbuf_init(struct util_strbuf *sbuf, char *str, size_t size)
00192 {
00193 sbuf->str = str;
00194 sbuf->str[0] = 0;
00195 sbuf->ptr = sbuf->str;
00196 sbuf->left = size;
00197 }
00198
00199
00200 static INLINE void
00201 util_strbuf_printf(struct util_strbuf *sbuf, const char *format, ...)
00202 {
00203 if(sbuf->left > 1) {
00204 size_t written;
00205 va_list ap;
00206 va_start(ap, format);
00207 written = util_vsnprintf(sbuf->ptr, sbuf->left, format, ap);
00208 va_end(ap);
00209 sbuf->ptr += written;
00210 sbuf->left -= written;
00211 }
00212 }
00213
00214
00215
00216 #ifdef __cplusplus
00217 }
00218 #endif
00219
00220 #endif