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