source: mainline/boot/arch/ia64/loader/gefi/lib/str.c@ 86018c1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 86018c1 was 7208b6c, checked in by Jakub Vana <jakub.vana@…>, 17 years ago

Basic IA64 boot and kernel suport for real machines

  • Property mode set to 100644
File size: 6.0 KB
Line 
1/*++
2
3Copyright (c) 1998 Intel Corporation
4
5Module Name:
6
7 str.c
8
9Abstract:
10
11
12
13
14Revision History
15
16--*/
17
18#include "lib.h"
19
20
21INTN
22StrCmp (
23 IN CHAR16 *s1,
24 IN CHAR16 *s2
25 )
26// compare strings
27{
28 return RtStrCmp(s1, s2);
29}
30
31INTN
32StrnCmp (
33 IN CHAR16 *s1,
34 IN CHAR16 *s2,
35 IN UINTN len
36 )
37// compare strings
38{
39 while (*s1 && len) {
40 if (*s1 != *s2) {
41 break;
42 }
43
44 s1 += 1;
45 s2 += 1;
46 len -= 1;
47 }
48
49 return len ? *s1 - *s2 : 0;
50}
51
52
53INTN
54LibStubStriCmp (
55 IN EFI_UNICODE_COLLATION_INTERFACE *This,
56 IN CHAR16 *s1,
57 IN CHAR16 *s2
58 )
59{
60 return StrCmp (s1, s2);
61}
62
63VOID
64LibStubStrLwrUpr (
65 IN EFI_UNICODE_COLLATION_INTERFACE *This,
66 IN CHAR16 *Str
67 )
68{
69}
70
71INTN
72StriCmp (
73 IN CHAR16 *s1,
74 IN CHAR16 *s2
75 )
76// compare strings
77{
78 return UnicodeInterface->StriColl(UnicodeInterface, s1, s2);
79}
80
81VOID
82StrLwr (
83 IN CHAR16 *Str
84 )
85// lwoer case string
86{
87 UnicodeInterface->StrLwr(UnicodeInterface, Str);
88}
89
90VOID
91StrUpr (
92 IN CHAR16 *Str
93 )
94// upper case string
95{
96 UnicodeInterface->StrUpr(UnicodeInterface, Str);
97}
98
99VOID
100StrCpy (
101 IN CHAR16 *Dest,
102 IN CHAR16 *Src
103 )
104// copy strings
105{
106 RtStrCpy (Dest, Src);
107}
108
109VOID
110StrCat (
111 IN CHAR16 *Dest,
112 IN CHAR16 *Src
113 )
114{
115 RtStrCat(Dest, Src);
116}
117
118UINTN
119StrLen (
120 IN CHAR16 *s1
121 )
122// string length
123{
124 return RtStrLen(s1);
125}
126
127UINTN
128StrSize (
129 IN CHAR16 *s1
130 )
131// string size
132{
133 return RtStrSize(s1);
134}
135
136CHAR16 *
137StrDuplicate (
138 IN CHAR16 *Src
139 )
140// duplicate a string
141{
142 CHAR16 *Dest;
143 UINTN Size;
144
145 Size = StrSize(Src);
146 Dest = AllocatePool (Size);
147 if (Dest) {
148 CopyMem (Dest, Src, Size);
149 }
150 return Dest;
151}
152
153UINTN
154strlena (
155 IN CHAR8 *s1
156 )
157// string length
158{
159 UINTN len;
160
161 for (len=0; *s1; s1+=1, len+=1) ;
162 return len;
163}
164
165UINTN
166strcmpa (
167 IN CHAR8 *s1,
168 IN CHAR8 *s2
169 )
170// compare strings
171{
172 while (*s1) {
173 if (*s1 != *s2) {
174 break;
175 }
176
177 s1 += 1;
178 s2 += 1;
179 }
180
181 return *s1 - *s2;
182}
183
184UINTN
185strncmpa (
186 IN CHAR8 *s1,
187 IN CHAR8 *s2,
188 IN UINTN len
189 )
190// compare strings
191{
192 while (*s1 && len) {
193 if (*s1 != *s2) {
194 break;
195 }
196
197 s1 += 1;
198 s2 += 1;
199 len -= 1;
200 }
201
202 return len ? *s1 - *s2 : 0;
203}
204
205
206
207UINTN
208xtoi (
209 CHAR16 *str
210 )
211// convert hex string to uint
212{
213 UINTN u;
214 CHAR16 c;
215
216 // skip preceeding white space
217 while (*str && *str == ' ') {
218 str += 1;
219 }
220
221 // convert hex digits
222 u = 0;
223 while ((c = *(str++))) {
224 if (c >= 'a' && c <= 'f') {
225 c -= 'a' - 'A';
226 }
227
228 if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
229 u = (u << 4) | (c - (c >= 'A' ? 'A'-10 : '0'));
230 } else {
231 break;
232 }
233 }
234
235 return u;
236}
237
238UINTN
239Atoi (
240 CHAR16 *str
241 )
242// convert hex string to uint
243{
244 UINTN u;
245 CHAR16 c;
246
247 // skip preceeding white space
248 while (*str && *str == ' ') {
249 str += 1;
250 }
251
252 // convert digits
253 u = 0;
254 while ((c = *(str++))) {
255 if (c >= '0' && c <= '9') {
256 u = (u * 10) + c - '0';
257 } else {
258 break;
259 }
260 }
261
262 return u;
263}
264
265BOOLEAN
266MetaMatch (
267 IN CHAR16 *String,
268 IN CHAR16 *Pattern
269 )
270{
271 CHAR16 c, p, l;
272
273 for (; ;) {
274 p = *Pattern;
275 Pattern += 1;
276
277 switch (p) {
278 case 0:
279 // End of pattern. If end of string, TRUE match
280 return *String ? FALSE : TRUE;
281
282 case '*':
283 // Match zero or more chars
284 while (*String) {
285 if (MetaMatch (String, Pattern)) {
286 return TRUE;
287 }
288 String += 1;
289 }
290 return MetaMatch (String, Pattern);
291
292 case '?':
293 // Match any one char
294 if (!*String) {
295 return FALSE;
296 }
297 String += 1;
298 break;
299
300 case '[':
301 // Match char set
302 c = *String;
303 if (!c) {
304 return FALSE; // syntax problem
305 }
306
307 l = 0;
308 while ((p = *Pattern++)) {
309 if (p == ']') {
310 return FALSE;
311 }
312
313 if (p == '-') { // if range of chars,
314 p = *Pattern; // get high range
315 if (p == 0 || p == ']') {
316 return FALSE; // syntax problem
317 }
318
319 if (c >= l && c <= p) { // if in range,
320 break; // it's a match
321 }
322 }
323
324 l = p;
325 if (c == p) { // if char matches
326 break; // move on
327 }
328 }
329
330 // skip to end of match char set
331 while (p && p != ']') {
332 p = *Pattern;
333 Pattern += 1;
334 }
335
336 String += 1;
337 break;
338
339 default:
340 c = *String;
341 if (c != p) {
342 return FALSE;
343 }
344
345 String += 1;
346 break;
347 }
348 }
349}
350
351
352BOOLEAN
353LibStubMetaiMatch (
354 IN EFI_UNICODE_COLLATION_INTERFACE *This,
355 IN CHAR16 *String,
356 IN CHAR16 *Pattern
357 )
358{
359 return MetaMatch (String, Pattern);
360}
361
362
363BOOLEAN
364MetaiMatch (
365 IN CHAR16 *String,
366 IN CHAR16 *Pattern
367 )
368{
369 return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern);
370}
Note: See TracBrowser for help on using the repository browser.