rtstr.c revision 1.1.1.2 1 1.1 jakllsch /* $NetBSD: rtstr.c,v 1.1.1.2 2018/08/16 18:17:47 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 jakllsch #pragma RUNTIME_CODE(RtAcquireLock)
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.2 jmcneill RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
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.2 jmcneill #pragma RUNTIME_CODE(RtStrCpy)
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.2 jmcneill #pragma RUNTIME_CODE(RtStrnCpy)
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.2 jmcneill RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
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 jakllsch RtStrCpy(Dest+StrLen(Dest), Src);
128 1.1 jakllsch }
129 1.1 jakllsch
130 1.1 jakllsch #ifndef __GNUC__
131 1.1.1.2 jmcneill #pragma RUNTIME_CODE(RtStrCat)
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.2 jmcneill RtStrnCpy(Dest+StrLen(Dest), Src, Len);
142 1.1.1.2 jmcneill }
143 1.1.1.2 jmcneill
144 1.1.1.2 jmcneill #ifndef __GNUC__
145 1.1 jakllsch #pragma RUNTIME_CODE(RtStrLen)
146 1.1 jakllsch #endif
147 1.1 jakllsch UINTN
148 1.1 jakllsch RUNTIMEFUNCTION
149 1.1 jakllsch RtStrLen (
150 1.1.1.2 jmcneill IN CONST CHAR16 *s1
151 1.1 jakllsch )
152 1.1 jakllsch // string length
153 1.1 jakllsch {
154 1.1 jakllsch UINTN len;
155 1.1.1.2 jmcneill
156 1.1 jakllsch for (len=0; *s1; s1+=1, len+=1) ;
157 1.1 jakllsch return len;
158 1.1 jakllsch }
159 1.1 jakllsch
160 1.1 jakllsch #ifndef __GNUC__
161 1.1.1.2 jmcneill #pragma RUNTIME_CODE(RtStrnLen)
162 1.1.1.2 jmcneill #endif
163 1.1.1.2 jmcneill UINTN
164 1.1.1.2 jmcneill RUNTIMEFUNCTION
165 1.1.1.2 jmcneill RtStrnLen (
166 1.1.1.2 jmcneill IN CONST CHAR16 *s1,
167 1.1.1.2 jmcneill IN UINTN Len
168 1.1.1.2 jmcneill )
169 1.1.1.2 jmcneill // copy strings
170 1.1.1.2 jmcneill {
171 1.1.1.2 jmcneill UINTN i;
172 1.1.1.2 jmcneill for (i = 0; *s1 && i < Len; i++)
173 1.1.1.2 jmcneill s1++;
174 1.1.1.2 jmcneill return i;
175 1.1.1.2 jmcneill }
176 1.1.1.2 jmcneill
177 1.1.1.2 jmcneill #ifndef __GNUC__
178 1.1 jakllsch #pragma RUNTIME_CODE(RtStrSize)
179 1.1 jakllsch #endif
180 1.1 jakllsch UINTN
181 1.1 jakllsch RUNTIMEFUNCTION
182 1.1 jakllsch RtStrSize (
183 1.1.1.2 jmcneill IN CONST CHAR16 *s1
184 1.1 jakllsch )
185 1.1 jakllsch // string size
186 1.1 jakllsch {
187 1.1 jakllsch UINTN len;
188 1.1.1.2 jmcneill
189 1.1 jakllsch for (len=0; *s1; s1+=1, len+=1) ;
190 1.1 jakllsch return (len + 1) * sizeof(CHAR16);
191 1.1 jakllsch }
192 1.1 jakllsch
193 1.1 jakllsch #ifndef __GNUC__
194 1.1 jakllsch #pragma RUNTIME_CODE(RtBCDtoDecimal)
195 1.1 jakllsch #endif
196 1.1 jakllsch UINT8
197 1.1 jakllsch RUNTIMEFUNCTION
198 1.1 jakllsch RtBCDtoDecimal(
199 1.1 jakllsch IN UINT8 BcdValue
200 1.1 jakllsch )
201 1.1 jakllsch {
202 1.1 jakllsch UINTN High, Low;
203 1.1 jakllsch
204 1.1 jakllsch High = BcdValue >> 4;
205 1.1 jakllsch Low = BcdValue - (High << 4);
206 1.1 jakllsch
207 1.1 jakllsch return ((UINT8)(Low + (High * 10)));
208 1.1 jakllsch }
209 1.1 jakllsch
210 1.1 jakllsch
211 1.1 jakllsch #ifndef __GNUC__
212 1.1 jakllsch #pragma RUNTIME_CODE(RtDecimaltoBCD)
213 1.1 jakllsch #endif
214 1.1 jakllsch UINT8
215 1.1 jakllsch RUNTIMEFUNCTION
216 1.1 jakllsch RtDecimaltoBCD (
217 1.1 jakllsch IN UINT8 DecValue
218 1.1 jakllsch )
219 1.1 jakllsch {
220 1.1 jakllsch UINTN High, Low;
221 1.1 jakllsch
222 1.1 jakllsch High = DecValue / 10;
223 1.1 jakllsch Low = DecValue - (High * 10);
224 1.1 jakllsch
225 1.1 jakllsch return ((UINT8)(Low + (High << 4)));
226 1.1 jakllsch }
227 1.1 jakllsch
228 1.1 jakllsch
229