1 /*------------------------------------------------------------------------- 2 * drawElements Base Portability Library 3 * ------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Basic string operations. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "deString.h" 25 26 #include <string.h> 27 #include <stdlib.h> 28 29 #include <stdio.h> 30 #include <stdarg.h> 31 32 DE_BEGIN_EXTERN_C 33 34 /*--------------------------------------------------------------------*//*! 35 * \brief Compute hash from string. 36 * \param str String to compute hash value for. 37 * \return Computed hash value. 38 *//*--------------------------------------------------------------------*/ 39 deUint32 deStringHash (const char* str) 40 { 41 /* \note [pyry] This hash is used in DT_GNU_HASH and is proven 42 to be robust for symbol hashing. */ 43 /* \see http://sources.redhat.com/ml/binutils/2006-06/msg00418.html */ 44 deUint32 hash = 5381; 45 unsigned int c; 46 47 DE_ASSERT(str); 48 while ((c = (unsigned int)*str++) != 0) 49 hash = (hash << 5) + hash + c; 50 51 return hash; 52 } 53 54 deUint32 deStringHashLeading (const char* str, int numLeadingChars) 55 { 56 deUint32 hash = 5381; 57 unsigned int c; 58 59 DE_ASSERT(str); 60 while (numLeadingChars-- && (c = (unsigned int)*str++) != 0) 61 hash = (hash << 5) + hash + c; 62 63 return hash; 64 } 65 66 deUint32 deMemoryHash (const void* ptr, size_t numBytes) 67 { 68 /* \todo [2010-05-10 pyry] Better generic hash function? */ 69 const deUint8* input = (const deUint8*)ptr; 70 deUint32 hash = 5381; 71 72 DE_ASSERT(ptr); 73 while (numBytes--) 74 hash = (hash << 5) + hash + *input++; 75 76 return hash; 77 } 78 79 deBool deMemoryEqual (const void* ptr, const void* cmp, size_t numBytes) 80 { 81 return memcmp(ptr, cmp, numBytes) == 0; 82 } 83 84 /*--------------------------------------------------------------------*//*! 85 * \brief Compare two strings for equality. 86 * \param a First string. 87 * \param b Second string. 88 * \return True if strings equal, false otherwise. 89 *//*--------------------------------------------------------------------*/ 90 deBool deStringEqual (const char* a, const char* b) 91 { 92 DE_ASSERT(a && b); 93 return (strcmp(a, b) == 0); 94 } 95 96 deBool deStringBeginsWith (const char* str, const char* lead) 97 { 98 const char* a = str; 99 const char* b = lead; 100 101 while (*b) 102 { 103 if (*a++ != *b++) 104 return DE_FALSE; 105 } 106 107 return DE_TRUE; 108 } 109 110 int deVsprintf (char* string, size_t size, const char* format, va_list list) 111 { 112 int res; 113 114 DE_ASSERT(string && format); 115 116 #if (DE_COMPILER == DE_COMPILER_MSC) 117 # if (DE_OS == DE_OS_WINCE) 118 res = _vsnprintf(string, size, format, list); 119 # else 120 res = vsnprintf_s(string, size, _TRUNCATE, format, list); 121 # endif 122 #else 123 res = vsnprintf(string, size, format, list); 124 #endif 125 126 return res; 127 } 128 129 /*--------------------------------------------------------------------*//*! 130 * \brief Safe string print 131 * \note This has the new safe signature, i.e., string length is a 132 * required parameter. 133 *//*--------------------------------------------------------------------*/ 134 int deSprintf (char* string, size_t size, const char* format, ...) 135 { 136 va_list list; 137 int res; 138 139 DE_ASSERT(string && format); 140 141 va_start(list, format); 142 143 res = deVsprintf(string, size, format, list); 144 145 va_end(list); 146 147 return res; 148 } 149 150 /*--------------------------------------------------------------------*//*! 151 * \note This has the new safe signature, i.e., string length is a 152 * required parameter. 153 *//*--------------------------------------------------------------------*/ 154 char* deStrcpy (char* dst, size_t size, const char* src) 155 { 156 #if (DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE) 157 (void)strcpy_s(dst, size, src); 158 return dst; 159 #else 160 return strncpy(dst, src, size); 161 #endif 162 } 163 164 /*--------------------------------------------------------------------*//*! 165 * \note This has the new safe signature, i.e., string length is a 166 * required parameter. 167 *//*--------------------------------------------------------------------*/ 168 char* deStrcat (char* s1, size_t size, const char* s2) 169 { 170 #if (DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE) 171 (void)strcat_s(s1, size, s2); 172 return s1; 173 #else 174 return strncat(s1, s2, size); 175 #endif 176 } 177 178 size_t deStrnlen (const char* string, size_t maxSize) 179 { 180 #if ((DE_COMPILER == DE_COMPILER_MSC) && (DE_OS != DE_OS_WINCE)) 181 return strnlen_s(string, maxSize); 182 #else 183 size_t len = 0; 184 while (len < maxSize && string[len] != 0) 185 ++len; 186 return len; 187 #endif 188 } 189 190 DE_END_EXTERN_C 191