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