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