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