u_string.h revision 54777e124c38812e5e80319048b6c71009bcf9dd
15b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca/**************************************************************************
25b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
35b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
45b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * All Rights Reserved.
55b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
65b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
75b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * copy of this software and associated documentation files (the
85b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * "Software"), to deal in the Software without restriction, including
95b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
105b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
115b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
125b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * the following conditions:
135b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
145b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * The above copyright notice and this permission notice (including the
155b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
165b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * of the Software.
175b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
185b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
195b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
215b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
225b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
235b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
265b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca **************************************************************************/
275b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
285b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca/**
295b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * @file
305b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * Platform independent functions for string manipulation.
315b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca *
325b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
335b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca */
345b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
355b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifndef U_STRING_H_
365b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#define U_STRING_H_
375b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
385b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifndef WIN32
395b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include <stdio.h>
405b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif
415b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include <stddef.h>
425b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include <stdarg.h>
435b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
44131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#include "pipe/p_compiler.h"
45131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
465b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
475b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifdef __cplusplus
485b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonsecaextern "C" {
495b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif
505b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
515b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
525b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifdef WIN32
53131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
545b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonsecaint util_vsnprintf(char *, size_t, const char *, va_list);
555b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonsecaint util_snprintf(char *str, size_t size, const char *format, ...);
56131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
57131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE void
5854777e124c38812e5e80319048b6c71009bcf9ddJosé Fonsecautil_vsprintf(char *str, const char *format, va_list ap)
5954777e124c38812e5e80319048b6c71009bcf9ddJosé Fonseca{
6054777e124c38812e5e80319048b6c71009bcf9ddJosé Fonseca   util_vsnprintf(str, (size_t)-1, format, ap);
6154777e124c38812e5e80319048b6c71009bcf9ddJosé Fonseca}
6254777e124c38812e5e80319048b6c71009bcf9ddJosé Fonseca
6354777e124c38812e5e80319048b6c71009bcf9ddJosé Fonsecastatic INLINE void
64131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_sprintf(char *str, const char *format, ...)
65131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
66131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   va_list ap;
67131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   va_start(ap, format);
68131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   util_vsnprintf(str, (size_t)-1, format, ap);
69131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   va_end(ap);
70131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
71131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
72131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE char *
73131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_strchr(const char *s, char c)
74131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
75131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   while(*s) {
76131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if(*s == c)
77131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return (char *)s;
78131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      ++s;
79131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
80131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return NULL;
81131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
82131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
83131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE char*
84131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_strncat(char *dst, const char *src, size_t n)
85131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
86131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   char *p = dst + strlen(dst);
87131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   const char *q = src;
88131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   size_t i;
89131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
90131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   for (i = 0; i < n && *q != '\0'; ++i)
91131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca       *p++ = *q++;
92131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   *p = '\0';
93131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
94131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return dst;
95131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
96131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
97131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE int
98131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_strcmp(const char *s1, const char *s2)
99131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
100131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   unsigned char u1, u2;
101131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
102131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   while (1) {
103131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      u1 = (unsigned char) *s1++;
104131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      u2 = (unsigned char) *s2++;
105131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if (u1 != u2)
106131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return u1 - u2;
107131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if (u1 == '\0')
108131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return 0;
109131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
110131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return 0;
111131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
112131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
113131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE int
114131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_strncmp(const char *s1, const char *s2, size_t n)
115131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
116131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   unsigned char u1, u2;
117131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
118131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   while (n-- > 0) {
119131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      u1 = (unsigned char) *s1++;
120131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      u2 = (unsigned char) *s2++;
121131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if (u1 != u2)
122131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return u1 - u2;
123131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if (u1 == '\0')
124131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return 0;
125131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
126131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return 0;
127131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
128131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
129131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE char *
130131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_strstr(const char *haystack, const char *needle)
131131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
132131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   const char *p = haystack;
133131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   int len = strlen(needle);
134131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
135131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   for (; (p = util_strchr(p, *needle)) != 0; p++) {
136131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      if (util_strncmp(p, needle, len) == 0) {
137131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 return (char *)p;
138131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      }
139131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
140131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return NULL;
141131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
142131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
143131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecastatic INLINE void *
144131a1fbc91725c11e4822b82e58b94ec3a711476José Fonsecautil_memmove(void *dest, const void *src, size_t n)
145131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca{
146131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   char *p = (char *)dest;
147131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   const char *q = (const char *)src;
148131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   if (dest < src) {
149131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      while (n--)
150131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 *p++ = *q++;
151131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
152131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   else
153131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   {
154131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      p += n;
155131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      q += n;
156131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca      while (n--)
157131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca	 *--p = *--q;
158131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   }
159131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca   return dest;
160131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca}
161131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
162131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
1635b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#else
164131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
1655b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#define util_vsnprintf vsnprintf
1665b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#define util_snprintf snprintf
16754777e124c38812e5e80319048b6c71009bcf9ddJosé Fonseca#define util_vsprintf vsprintf
1684c6c073f993e13da0b68f897a4221e6bb7875fbeMichel Dänzer#define util_sprintf sprintf
169131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_strchr strchr
170131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_strcmp strcmp
171131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_strncmp strncmp
172131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_strncat strncat
173131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_strstr strstr
174131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca#define util_memmove memmove
175131a1fbc91725c11e4822b82e58b94ec3a711476José Fonseca
1765b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif
1775b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
1785b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
1795b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifdef __cplusplus
1805b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca}
1815b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif
1825b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
1835b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif /* U_STRING_H_ */
184