You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
6.4 KiB
370 lines
6.4 KiB
/*++
|
|
|
|
Copyright (c) 1998 Intel Corporation
|
|
|
|
Module Name:
|
|
|
|
str.c
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
--*/
|
|
|
|
#include "lib.h"
|
|
|
|
|
|
INTN
|
|
StrCmp (
|
|
IN CHAR16 *s1,
|
|
IN CHAR16 *s2
|
|
)
|
|
/* compare strings */
|
|
{
|
|
return RtStrCmp(s1, s2);
|
|
}
|
|
|
|
INTN
|
|
StrnCmp (
|
|
IN CHAR16 *s1,
|
|
IN 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
|
|
LibStubStriCmp (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This,
|
|
IN CHAR16 *s1,
|
|
IN CHAR16 *s2
|
|
)
|
|
{
|
|
return StrCmp (s1, s2);
|
|
}
|
|
|
|
VOID
|
|
LibStubStrLwrUpr (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This,
|
|
IN CHAR16 *Str
|
|
)
|
|
{
|
|
}
|
|
|
|
INTN
|
|
StriCmp (
|
|
IN CHAR16 *s1,
|
|
IN CHAR16 *s2
|
|
)
|
|
/* compare strings */
|
|
{
|
|
return UnicodeInterface->StriColl(UnicodeInterface, s1, s2);
|
|
}
|
|
|
|
VOID
|
|
StrLwr (
|
|
IN CHAR16 *Str
|
|
)
|
|
/* lwoer case string */
|
|
{
|
|
UnicodeInterface->StrLwr(UnicodeInterface, Str);
|
|
}
|
|
|
|
VOID
|
|
StrUpr (
|
|
IN CHAR16 *Str
|
|
)
|
|
/* upper case string */
|
|
{
|
|
UnicodeInterface->StrUpr(UnicodeInterface, Str);
|
|
}
|
|
|
|
VOID
|
|
StrCpy (
|
|
IN CHAR16 *Dest,
|
|
IN CHAR16 *Src
|
|
)
|
|
/* copy strings */
|
|
{
|
|
RtStrCpy (Dest, Src);
|
|
}
|
|
|
|
VOID
|
|
StrCat (
|
|
IN CHAR16 *Dest,
|
|
IN CHAR16 *Src
|
|
)
|
|
{
|
|
RtStrCat(Dest, Src);
|
|
}
|
|
|
|
UINTN
|
|
StrLen (
|
|
IN CHAR16 *s1
|
|
)
|
|
/* string length */
|
|
{
|
|
return RtStrLen(s1);
|
|
}
|
|
|
|
UINTN
|
|
StrSize (
|
|
IN CHAR16 *s1
|
|
)
|
|
/* string size */
|
|
{
|
|
return RtStrSize(s1);
|
|
}
|
|
|
|
CHAR16 *
|
|
StrDuplicate (
|
|
IN 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 CHAR8 *s1
|
|
)
|
|
/* string length */
|
|
{
|
|
UINTN len;
|
|
|
|
for (len=0; *s1; s1+=1, len+=1) ;
|
|
return len;
|
|
}
|
|
|
|
UINTN
|
|
strcmpa (
|
|
IN CHAR8 *s1,
|
|
IN CHAR8 *s2
|
|
)
|
|
/* compare strings */
|
|
{
|
|
while (*s1) {
|
|
if (*s1 != *s2) {
|
|
break;
|
|
}
|
|
|
|
s1 += 1;
|
|
s2 += 1;
|
|
}
|
|
|
|
return *s1 - *s2;
|
|
}
|
|
|
|
UINTN
|
|
strncmpa (
|
|
IN CHAR8 *s1,
|
|
IN 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 (
|
|
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 (
|
|
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
|
|
LibStubMetaiMatch (
|
|
IN EFI_UNICODE_COLLATION_INTERFACE *This,
|
|
IN CHAR16 *String,
|
|
IN CHAR16 *Pattern
|
|
)
|
|
{
|
|
return MetaMatch (String, Pattern);
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
MetaiMatch (
|
|
IN CHAR16 *String,
|
|
IN CHAR16 *Pattern
|
|
)
|
|
{
|
|
return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern);
|
|
}
|