| /*------------------------------------------------------------------------- |
| * drawElements Base Portability Library |
| * ------------------------------------- |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| *//*! |
| * \file |
| * \brief Basic string operations. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "deString.h" |
| |
| #include <string.h> |
| #include <stdlib.h> |
| |
| #include <stdio.h> |
| #include <stdarg.h> |
| |
| DE_BEGIN_EXTERN_C |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Compute hash from string. |
| * \param str String to compute hash value for. |
| * \return Computed hash value. |
| *//*--------------------------------------------------------------------*/ |
| deUint32 deStringHash (const char* str) |
| { |
| /* \note [pyry] This hash is used in DT_GNU_HASH and is proven |
| to be robust for symbol hashing. */ |
| /* \see http://sources.redhat.com/ml/binutils/2006-06/msg00418.html */ |
| deUint32 hash = 5381; |
| unsigned int c; |
| |
| DE_ASSERT(str); |
| while ((c = (unsigned int)*str++) != 0) |
| hash = (hash << 5) + hash + c; |
| |
| return hash; |
| } |
| |
| deUint32 deStringHashLeading (const char* str, int numLeadingChars) |
| { |
| deUint32 hash = 5381; |
| unsigned int c; |
| |
| DE_ASSERT(str); |
| while (numLeadingChars-- && (c = (unsigned int)*str++) != 0) |
| hash = (hash << 5) + hash + c; |
| |
| return hash; |
| } |
| |
| deUint32 deMemoryHash (const void* ptr, size_t numBytes) |
| { |
| /* \todo [2010-05-10 pyry] Better generic hash function? */ |
| const deUint8* input = (const deUint8*)ptr; |
| deUint32 hash = 5381; |
| |
| DE_ASSERT(ptr); |
| while (numBytes--) |
| hash = (hash << 5) + hash + *input++; |
| |
| return hash; |
| } |
| |
| deBool deMemoryEqual (const void* ptr, const void* cmp, size_t numBytes) |
| { |
| return memcmp(ptr, cmp, numBytes) == 0; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Compare two strings for equality. |
| * \param a First string. |
| * \param b Second string. |
| * \return True if strings equal, false otherwise. |
| *//*--------------------------------------------------------------------*/ |
| deBool deStringEqual (const char* a, const char* b) |
| { |
| DE_ASSERT(a && b); |
| return (strcmp(a, b) == 0); |
| } |
| |
| deBool deStringBeginsWith (const char* str, const char* lead) |
| { |
| const char* a = str; |
| const char* b = lead; |
| |
| while (*b) |
| { |
| if (*a++ != *b++) |
| return DE_FALSE; |
| } |
| |
| return DE_TRUE; |
| } |
| |
| int deVsprintf (char* string, size_t size, const char* format, va_list list) |
| { |
| int res; |
| |
| DE_ASSERT(string && format); |
| |
| #if (DE_COMPILER == DE_COMPILER_MSC) |
| # if (DE_OS == DE_OS_WINCE) |
| res = _vsnprintf(string, size, format, list); |
| # else |
| res = vsnprintf_s(string, size, _TRUNCATE, format, list); |
| # endif |
| #else |
| res = vsnprintf(string, size, format, list); |
| #endif |
| |
| return res; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Safe string print |
| * \note This has the new safe signature, i.e., string length is a |
| * required parameter. |
| *//*--------------------------------------------------------------------*/ |
| int deSprintf (char* string, size_t size, const char* format, ...) |
| { |
| va_list list; |
| int res; |
| |
| DE_ASSERT(string && format); |
| |
| va_start(list, format); |
| |
| res = deVsprintf(string, size, format, list); |
| |
| va_end(list); |
| |
| return res; |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \note This has the new safe signature, i.e., string length is a |
| * required parameter. |
| *//*--------------------------------------------------------------------*/ |
| char* deStrcpy (char* dst, size_t size, const char* src) |
| { |
| #if (DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE) |
| (void)strcpy_s(dst, size, src); |
| return dst; |
| #else |
| return strncpy(dst, src, size); |
| #endif |
| } |
| |
| /*--------------------------------------------------------------------*//*! |
| * \note This has the new safe signature, i.e., string length is a |
| * required parameter. |
| *//*--------------------------------------------------------------------*/ |
| char* deStrcat (char* s1, size_t size, const char* s2) |
| { |
| #if (DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE) |
| (void)strcat_s(s1, size, s2); |
| return s1; |
| #else |
| return strncat(s1, s2, size); |
| #endif |
| } |
| |
| size_t deStrnlen (const char* string, size_t maxSize) |
| { |
| #if ((DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE)) |
| return strnlen_s(string, maxSize); |
| #else |
| size_t len = 0; |
| while (len < maxSize && string[len] != 0) |
| ++len; |
| return len; |
| #endif |
| } |
| |
| DE_END_EXTERN_C |