u_string.h revision 3b5ee3d6de2c08faf69c701bf05d8f33ccd01502
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. 313b5ee3d6de2c08faf69c701bf05d8f33ccd01502José 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 383b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca#if !defined(WIN32) && !defined(XF86_LIBC_H) 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 513b5ee3d6de2c08faf69c701bf05d8f33ccd01502José Fonseca 525b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifdef WIN32 533b5ee3d6de2c08faf69c701bf05d8f33ccd01502José 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 573b5ee3d6de2c08faf69c701bf05d8f33ccd01502José 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 633b5ee3d6de2c08faf69c701bf05d8f33ccd01502José 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 1793e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca/** 1803e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca * Printable string buffer 1813e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca */ 1823e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonsecastruct util_strbuf 1833e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca{ 1843e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca char *str; 1853e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca char *ptr; 1863e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca size_t left; 1873e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca}; 1883e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 1893e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 1903e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonsecastatic INLINE void 1913e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonsecautil_strbuf_init(struct util_strbuf *sbuf, char *str, size_t size) 1923e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca{ 1933e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->str = str; 1943e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->str[0] = 0; 1953e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->ptr = sbuf->str; 1963e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->left = size; 1973e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca} 1983e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 1993e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 2003e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonsecastatic INLINE void 2013e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonsecautil_strbuf_printf(struct util_strbuf *sbuf, const char *format, ...) 2023e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca{ 2033e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca if(sbuf->left > 1) { 2043e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca size_t written; 2053e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca va_list ap; 2063e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca va_start(ap, format); 2073e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca written = util_vsnprintf(sbuf->ptr, sbuf->left, format, ap); 2083e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca va_end(ap); 2093e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->ptr += written; 2103e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca sbuf->left -= written; 2113e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca } 2123e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca} 2133e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 2143e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 2153e1974f94ef8796a5ac9e750d47ccb63c677a85bJosé Fonseca 2165b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#ifdef __cplusplus 2175b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca} 2185b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif 2195b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca 2205b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#endif /* U_STRING_H_ */ 221