gnu-efi/lib/str.c
Heinrich Schuchardt 1771b6e779 lisb/str.c: simplify xtoi()
If str == ' ', str has to be non-zero. No extra check is needed.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
2021-04-04 10:51:08 +02:00

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 += 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);
}