15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2010 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTF_StringExtras_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_StringExtras_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(POSIX) 303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#define HAVE_STRINGS_H 1 313c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#endif 323c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 333c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#if !defined(HAVE_STRNSTR) 348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX) || (OS(FREEBSD) && !defined(__GLIBC__)) 353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#define HAVE_STRNSTR 1 363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#endif 373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#endif 383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdarg.h> 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdio.h> 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string.h> 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#if HAVE(STRINGS_H) 4402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include <strings.h> 4502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#endif 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if COMPILER(MSVC) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: why a COMPILER check instead of OS? also, these should be HAVE checks 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochinline int snprintf(char* buffer, size_t count, const char* format, ...) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int result; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) va_list args; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) va_start(args, format); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result = _vsnprintf(buffer, count, format, args); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) va_end(args); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the case where the string entirely filled the buffer, _vsnprintf will not 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // null-terminate it, but snprintf must. 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (count > 0) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) buffer[count - 1] = '\0'; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double wtf_vsnprintf(char* buffer, size_t count, const char* format, va_list args) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int result = _vsnprintf(buffer, count, format, args); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In the case where the string entirely filled the buffer, _vsnprintf will not 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // null-terminate it, but vsnprintf must. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (count > 0) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) buffer[count - 1] = '\0'; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Work around a difference in Microsoft's implementation of vsnprintf, where 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// vsnprintf does not null terminate the buffer. WebKit can rely on the null termination. 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define vsnprintf(buffer, count, format, args) wtf_vsnprintf(buffer, count, format, args) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int strncasecmp(const char* s1, const char* s2, size_t len) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _strnicmp(s1, s2, len); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int strcasecmp(const char* s1, const char* s2) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return _stricmp(s1, s2); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !HAVE(STRNSTR) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline char* strnstr(const char* buffer, const char* target, size_t bufferLength) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t targetLength = strlen(target); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (targetLength == 0) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<char*>(buffer); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (const char* start = buffer; *start && start + targetLength <= buffer + bufferLength; start++) { 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (*start == *target && strncmp(start + 1, target + 1, targetLength - 1) == 0) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return const_cast<char*>(start); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_StringExtras_h 111