xref: /aosp_15_r20/external/deqp/framework/delibs/debase/deString.c (revision 35238bce31c2a825756842865a792f8cf7f89930)
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