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