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