Curle
d588e232c4
This branch has been dedicated to purely the UEFI bootloader. As such, all other code has been removed. This code can be compiled with Visual Studio, gcc or llvm.
433 lines
7.3 KiB
C
433 lines
7.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
Module Name:
|
|
|
|
str.c
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
--*/
|
|
|
|
#include "lib.h"
|
|
|
|
|
|
INTN
|
|
StrCmp (
|
|
IN CONST CHAR16 *s1,
|
|
IN CONST CHAR16 *s2
|
|
)
|
|
// compare strings
|
|
{
|
|
return RtStrCmp(s1, s2);
|
|
}
|
|
|
|
INTN
|
|
StrnCmp (
|
|
IN CONST CHAR16 *s1,
|
|
IN CONST CHAR16 *s2,
|
|
IN UINTN len
|
|
)
|
|
// compare strings
|
|
{
|
|
while (*s1 && len) {
|
|
if (*s1 != *s2) {
|
|
break;
|
|
}
|
|
|
|
s1 += 1;
|
|
s2 += 1;
|
|
len -= 1;
|
|
}
|
|
|
|
return len ? *s1 - *s2 : 0;
|
|
}
|
|
|
|
|
|
INTN EFIAPI
|
|
LibStubStriCmp (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED,
|
|
IN CHAR16 *s1,
|
|
IN CHAR16 *s2
|
|
)
|
|
{
|
|
return StrCmp (s1, s2);
|
|
}
|
|
|
|
VOID EFIAPI
|
|
LibStubStrLwrUpr (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED,
|
|
IN CHAR16 *Str EFI_UNUSED
|
|
)
|
|
{
|
|
}
|
|
|
|
INTN
|
|
StriCmp (
|
|
IN CONST CHAR16 *s1,
|
|
IN CONST CHAR16 *s2
|
|
)
|
|
// compare strings
|
|
{
|
|
if (UnicodeInterface == &LibStubUnicodeInterface)
|
|
return UnicodeInterface->StriColl(UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2);
|
|
else
|
|
return uefi_call_wrapper(UnicodeInterface->StriColl, 3, UnicodeInterface, (CHAR16 *)s1, (CHAR16 *)s2);
|
|
}
|
|
|
|
VOID
|
|
StrLwr (
|
|
IN CHAR16 *Str
|
|
)
|
|
// lwoer case string
|
|
{
|
|
if (UnicodeInterface == &LibStubUnicodeInterface)
|
|
UnicodeInterface->StrLwr(UnicodeInterface, Str);
|
|
else uefi_call_wrapper(UnicodeInterface->StrLwr, 2, UnicodeInterface, Str);
|
|
}
|
|
|
|
VOID
|
|
StrUpr (
|
|
IN CHAR16 *Str
|
|
)
|
|
// upper case string
|
|
{
|
|
if (UnicodeInterface == &LibStubUnicodeInterface)
|
|
UnicodeInterface->StrUpr(UnicodeInterface, Str);
|
|
else uefi_call_wrapper(UnicodeInterface->StrUpr, 2, UnicodeInterface, Str);
|
|
}
|
|
|
|
VOID
|
|
StrCpy (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src
|
|
)
|
|
// copy strings
|
|
{
|
|
RtStrCpy (Dest, Src);
|
|
}
|
|
|
|
VOID
|
|
StrnCpy (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src,
|
|
IN UINTN Len
|
|
)
|
|
// copy strings
|
|
{
|
|
RtStrnCpy (Dest, Src, Len);
|
|
}
|
|
|
|
CHAR16 *
|
|
StpCpy (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src
|
|
)
|
|
// copy strings
|
|
{
|
|
return RtStpCpy (Dest, Src);
|
|
}
|
|
|
|
CHAR16 *
|
|
StpnCpy (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src,
|
|
IN UINTN Len
|
|
)
|
|
// copy strings
|
|
{
|
|
return RtStpnCpy (Dest, Src, Len);
|
|
}
|
|
|
|
VOID
|
|
StrCat (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src
|
|
)
|
|
{
|
|
RtStrCat(Dest, Src);
|
|
}
|
|
|
|
VOID
|
|
StrnCat (
|
|
IN CHAR16 *Dest,
|
|
IN CONST CHAR16 *Src,
|
|
IN UINTN Len
|
|
)
|
|
{
|
|
RtStrnCat(Dest, Src, Len);
|
|
}
|
|
|
|
|
|
UINTN
|
|
StrnLen (
|
|
IN CONST CHAR16 *s1,
|
|
IN UINTN Len
|
|
)
|
|
// string length
|
|
{
|
|
return RtStrnLen(s1, Len);
|
|
}
|
|
|
|
UINTN
|
|
StrLen (
|
|
IN CONST CHAR16 *s1
|
|
)
|
|
// string length
|
|
{
|
|
return RtStrLen(s1);
|
|
}
|
|
|
|
UINTN
|
|
StrSize (
|
|
IN CONST CHAR16 *s1
|
|
)
|
|
// string size
|
|
{
|
|
return RtStrSize(s1);
|
|
}
|
|
|
|
CHAR16 *
|
|
StrDuplicate (
|
|
IN CONST CHAR16 *Src
|
|
)
|
|
// duplicate a string
|
|
{
|
|
CHAR16 *Dest;
|
|
UINTN Size;
|
|
|
|
Size = StrSize(Src);
|
|
Dest = AllocatePool (Size);
|
|
if (Dest) {
|
|
CopyMem (Dest, Src, Size);
|
|
}
|
|
return Dest;
|
|
}
|
|
|
|
UINTN
|
|
strlena (
|
|
IN CONST CHAR8 *s1
|
|
)
|
|
// string length
|
|
{
|
|
UINTN len;
|
|
|
|
for (len=0; *s1; s1+=1, len+=1) ;
|
|
return len;
|
|
}
|
|
|
|
UINTN
|
|
strcmpa (
|
|
IN CONST CHAR8 *s1,
|
|
IN CONST CHAR8 *s2
|
|
)
|
|
// compare strings
|
|
{
|
|
while (*s1) {
|
|
if (*s1 != *s2) {
|
|
break;
|
|
}
|
|
|
|
s1 += 1;
|
|
s2 += 1;
|
|
}
|
|
|
|
return *s1 - *s2;
|
|
}
|
|
|
|
UINTN
|
|
strncmpa (
|
|
IN CONST CHAR8 *s1,
|
|
IN CONST CHAR8 *s2,
|
|
IN UINTN len
|
|
)
|
|
// compare strings
|
|
{
|
|
while (*s1 && len) {
|
|
if (*s1 != *s2) {
|
|
break;
|
|
}
|
|
|
|
s1 += 1;
|
|
s2 += 1;
|
|
len -= 1;
|
|
}
|
|
|
|
return len ? *s1 - *s2 : 0;
|
|
}
|
|
|
|
|
|
|
|
UINTN
|
|
xtoi (
|
|
CONST CHAR16 *str
|
|
)
|
|
// convert hex string to uint
|
|
{
|
|
UINTN u;
|
|
CHAR16 c;
|
|
|
|
// skip preceeding white space
|
|
while (*str && *str == ' ') {
|
|
str += 1;
|
|
}
|
|
|
|
// convert hex digits
|
|
u = 0;
|
|
while ((c = *(str++))) {
|
|
if (c >= 'a' && c <= 'f') {
|
|
c -= 'a' - 'A';
|
|
}
|
|
|
|
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) {
|
|
u = (u << 4) | (c - (c >= 'A' ? 'A'-10 : '0'));
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return u;
|
|
}
|
|
|
|
UINTN
|
|
Atoi (
|
|
CONST CHAR16 *str
|
|
)
|
|
// convert hex string to uint
|
|
{
|
|
UINTN u;
|
|
CHAR16 c;
|
|
|
|
// skip preceeding white space
|
|
while (*str && *str == ' ') {
|
|
str += 1;
|
|
}
|
|
|
|
// convert digits
|
|
u = 0;
|
|
while ((c = *(str++))) {
|
|
if (c >= '0' && c <= '9') {
|
|
u = (u * 10) + c - '0';
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return u;
|
|
}
|
|
|
|
BOOLEAN
|
|
MetaMatch (
|
|
IN CHAR16 *String,
|
|
IN CHAR16 *Pattern
|
|
)
|
|
{
|
|
CHAR16 c, p, l;
|
|
|
|
for (; ;) {
|
|
p = *Pattern;
|
|
Pattern += 1;
|
|
|
|
switch (p) {
|
|
case 0:
|
|
// End of pattern. If end of string, TRUE match
|
|
return *String ? FALSE : TRUE;
|
|
|
|
case '*':
|
|
// Match zero or more chars
|
|
while (*String) {
|
|
if (MetaMatch (String, Pattern)) {
|
|
return TRUE;
|
|
}
|
|
String += 1;
|
|
}
|
|
return MetaMatch (String, Pattern);
|
|
|
|
case '?':
|
|
// Match any one char
|
|
if (!*String) {
|
|
return FALSE;
|
|
}
|
|
String += 1;
|
|
break;
|
|
|
|
case '[':
|
|
// Match char set
|
|
c = *String;
|
|
if (!c) {
|
|
return FALSE; // syntax problem
|
|
}
|
|
|
|
l = 0;
|
|
while ((p = *Pattern++)) {
|
|
if (p == ']') {
|
|
return FALSE;
|
|
}
|
|
|
|
if (p == '-') { // if range of chars,
|
|
p = *Pattern; // get high range
|
|
if (p == 0 || p == ']') {
|
|
return FALSE; // syntax problem
|
|
}
|
|
|
|
if (c >= l && c <= p) { // if in range,
|
|
break; // it's a match
|
|
}
|
|
}
|
|
|
|
l = p;
|
|
if (c == p) { // if char matches
|
|
break; // move on
|
|
}
|
|
}
|
|
|
|
// skip to end of match char set
|
|
while (p && p != ']') {
|
|
p = *Pattern;
|
|
Pattern += 1;
|
|
}
|
|
|
|
String += 1;
|
|
break;
|
|
|
|
default:
|
|
c = *String;
|
|
if (c != p) {
|
|
return FALSE;
|
|
}
|
|
|
|
String += 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BOOLEAN EFIAPI
|
|
LibStubMetaiMatch (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This EFI_UNUSED,
|
|
IN CHAR16 *String,
|
|
IN CHAR16 *Pattern
|
|
)
|
|
{
|
|
return MetaMatch (String, Pattern);
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
MetaiMatch (
|
|
IN CHAR16 *String,
|
|
IN CHAR16 *Pattern
|
|
)
|
|
{
|
|
if (UnicodeInterface == &LibStubUnicodeInterface)
|
|
return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern);
|
|
else return uefi_call_wrapper(UnicodeInterface->MetaiMatch, 3, UnicodeInterface, String, Pattern);
|
|
}
|