1 /*++
2
3 Copyright (c) 1998 Intel Corporation
4
5 Module Name:
6
7 str.c
8
9 Abstract:
10
11 String runtime functions
12
13
14 Revision History
15
16 --*/
17
18 #include "lib.h"
19
20 #ifndef __GNUC__
21 #pragma RUNTIME_CODE(RtStrCmp)
22 #endif
23 INTN
24 RUNTIMEFUNCTION
RtStrCmp(IN CONST CHAR16 * s1,IN CONST CHAR16 * s2)25 RtStrCmp (
26 IN CONST CHAR16 *s1,
27 IN CONST CHAR16 *s2
28 )
29 // compare strings
30 {
31 while (*s1) {
32 if (*s1 != *s2) {
33 break;
34 }
35
36 s1 += 1;
37 s2 += 1;
38 }
39
40 return *s1 - *s2;
41 }
42
43 #ifndef __GNUC__
44 #pragma RUNTIME_CODE(RtStrCpy)
45 #endif
46 VOID
47 RUNTIMEFUNCTION
RtStrCpy(IN CHAR16 * Dest,IN CONST CHAR16 * Src)48 RtStrCpy (
49 IN CHAR16 *Dest,
50 IN CONST CHAR16 *Src
51 )
52 // copy strings
53 {
54 while (*Src) {
55 *(Dest++) = *(Src++);
56 }
57 *Dest = 0;
58 }
59
60 #ifndef __GNUC__
61 #pragma RUNTIME_CODE(RtStrnCpy)
62 #endif
63 VOID
64 RUNTIMEFUNCTION
RtStrnCpy(IN CHAR16 * Dest,IN CONST CHAR16 * Src,IN UINTN Len)65 RtStrnCpy (
66 IN CHAR16 *Dest,
67 IN CONST CHAR16 *Src,
68 IN UINTN Len
69 )
70 // copy strings
71 {
72 UINTN Size = RtStrnLen(Src, Len);
73 if (Size != Len)
74 RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
75 RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
76 }
77
78 #ifndef __GNUC__
79 #pragma RUNTIME_CODE(RtStpCpy)
80 #endif
81 CHAR16 *
82 RUNTIMEFUNCTION
RtStpCpy(IN CHAR16 * Dest,IN CONST CHAR16 * Src)83 RtStpCpy (
84 IN CHAR16 *Dest,
85 IN CONST CHAR16 *Src
86 )
87 // copy strings
88 {
89 while (*Src) {
90 *(Dest++) = *(Src++);
91 }
92 *Dest = 0;
93 return Dest;
94 }
95
96 #ifndef __GNUC__
97 #pragma RUNTIME_CODE(RtStpnCpy)
98 #endif
99 CHAR16 *
100 RUNTIMEFUNCTION
RtStpnCpy(IN CHAR16 * Dest,IN CONST CHAR16 * Src,IN UINTN Len)101 RtStpnCpy (
102 IN CHAR16 *Dest,
103 IN CONST CHAR16 *Src,
104 IN UINTN Len
105 )
106 // copy strings
107 {
108 UINTN Size = RtStrnLen(Src, Len);
109 if (Size != Len)
110 RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
111 RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
112 return Dest + Size;
113 }
114
115 #ifndef __GNUC__
116 #pragma RUNTIME_CODE(RtStrCat)
117 #endif
118 VOID
119 RUNTIMEFUNCTION
RtStrCat(IN CHAR16 * Dest,IN CONST CHAR16 * Src)120 RtStrCat (
121 IN CHAR16 *Dest,
122 IN CONST CHAR16 *Src
123 )
124 {
125 RtStrCpy(Dest+RtStrLen(Dest), Src);
126 }
127
128 #ifndef __GNUC__
129 #pragma RUNTIME_CODE(RtStrnCat)
130 #endif
131 VOID
132 RUNTIMEFUNCTION
RtStrnCat(IN CHAR16 * Dest,IN CONST CHAR16 * Src,IN UINTN Len)133 RtStrnCat (
134 IN CHAR16 *Dest,
135 IN CONST CHAR16 *Src,
136 IN UINTN Len
137 )
138 {
139 UINTN DestSize, Size;
140
141 DestSize = RtStrLen(Dest);
142 Size = RtStrnLen(Src, Len);
143 RtCopyMem(Dest + DestSize, Src, Size * sizeof(CHAR16));
144 Dest[DestSize + Size] = '\0';
145 }
146
147 #ifndef __GNUC__
148 #pragma RUNTIME_CODE(RtStrLen)
149 #endif
150 UINTN
151 RUNTIMEFUNCTION
RtStrLen(IN CONST CHAR16 * s1)152 RtStrLen (
153 IN CONST CHAR16 *s1
154 )
155 // string length
156 {
157 UINTN len;
158
159 for (len=0; *s1; s1+=1, len+=1) ;
160 return len;
161 }
162
163 #ifndef __GNUC__
164 #pragma RUNTIME_CODE(RtStrnLen)
165 #endif
166 UINTN
167 RUNTIMEFUNCTION
RtStrnLen(IN CONST CHAR16 * s1,IN UINTN Len)168 RtStrnLen (
169 IN CONST CHAR16 *s1,
170 IN UINTN Len
171 )
172 // string length
173 {
174 UINTN i;
175 for (i = 0; *s1 && i < Len; i++)
176 s1++;
177 return i;
178 }
179
180 #ifndef __GNUC__
181 #pragma RUNTIME_CODE(RtStrSize)
182 #endif
183 UINTN
184 RUNTIMEFUNCTION
RtStrSize(IN CONST CHAR16 * s1)185 RtStrSize (
186 IN CONST CHAR16 *s1
187 )
188 // string size
189 {
190 UINTN len;
191
192 for (len=0; *s1; s1+=1, len+=1) ;
193 return (len + 1) * sizeof(CHAR16);
194 }
195
196 #ifndef __GNUC__
197 #pragma RUNTIME_CODE(RtBCDtoDecimal)
198 #endif
199 UINT8
200 RUNTIMEFUNCTION
RtBCDtoDecimal(IN UINT8 BcdValue)201 RtBCDtoDecimal(
202 IN UINT8 BcdValue
203 )
204 {
205 UINTN High, Low;
206
207 High = BcdValue >> 4;
208 Low = BcdValue - (High << 4);
209
210 return ((UINT8)(Low + (High * 10)));
211 }
212
213
214 #ifndef __GNUC__
215 #pragma RUNTIME_CODE(RtDecimaltoBCD)
216 #endif
217 UINT8
218 RUNTIMEFUNCTION
RtDecimaltoBCD(IN UINT8 DecValue)219 RtDecimaltoBCD (
220 IN UINT8 DecValue
221 )
222 {
223 UINTN High, Low;
224
225 High = DecValue / 10;
226 Low = DecValue - (High * 10);
227
228 return ((UINT8)(Low + (High << 4)));
229 }
230
231
232