windows-nt/Source/XPSP1/NT/base/efiutil/efintldr/utils.c

263 lines
4.6 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
utils.c
Abstract:
Revision History:
Jeff Sigman 05/01/00 Created
Jeff Sigman 05/10/00 Version 1.5 released
Jeff Sigman 10/18/00 Fix for Soft81 bug(s)
--*/
#include "precomp.h"
//
// Conditionally free's a pointer if it is non-null
//
VOID*
RutlFree(
IN VOID* pvData
)
{
if (pvData)
{
FreePool(pvData);
}
return NULL;
}
//
// Uses AllocateZeroPool to copy a string
//
char*
RutlStrDup(
IN char* pszSrc
)
{
char* pszRet = NULL;
UINTN dwLen = 0;
if ((pszSrc == NULL) ||
((dwLen = strlena(pszSrc)) == 0)
)
{
return NULL;
}
pszRet = AllocateZeroPool(dwLen + 1);
if (pszRet)
{
CopyMem(pszRet, pszSrc, dwLen);
}
return pszRet;
}
//
// Uses AllocateZeroPool to copy an ASCII string to unicode
//
CHAR16*
RutlUniStrDup(
IN char* pszSrc
)
{
UINTN i,
dwLen = 0;
char* t = NULL;
CHAR16* pszRet = NULL;
if ((pszSrc == NULL) ||
((dwLen = strlena(pszSrc)) == 0)
)
{
return NULL;
}
pszRet = AllocateZeroPool((dwLen + 1) * sizeof(CHAR16));
if (pszRet != NULL)
{
t = (char*) pszRet;
//
// Convert the buffer to a hacked unicode.
//
for (i = 0; i < dwLen; i++)
{
*(t + i * 2) = *(pszSrc + i);
}
}
return pszRet;
}
//
// Find next token in string
// Stolen from: ..\base\crts\crtw32\string\strtok.c
//
char* __cdecl
strtok(
IN char* string,
IN const char* control
)
{
unsigned char* str;
const unsigned char* ctrl = control;
unsigned char map[32];
int count;
static char* nextoken;
/* Clear control map */
for (count = 0; count < 32; count++)
{
map[count] = 0;
}
/* Set bits in delimiter table */
do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
/* Initialize str. If string is NULL, set str to the saved
* pointer (i.e., continue breaking tokens out of the string
* from the last strtok call) */
if (string)
{
str = string;
}
else
{
str = nextoken;
}
/* Find beginning of token (skip over leading delimiters). Note that
* there is no token iff this loop sets str to point to the terminal
* null (*str == '\0') */
while ((map[*str >> 3] & (1 << (*str & 7))) && *str)
{
str++;
}
string = str;
/* Find the end of the token. If it is not the end of the string,
* put a null there. */
for (; *str; str++)
{
if (map[*str >> 3] & (1 << (*str & 7)))
{
*str++ = '\0';
break;
}
}
/* Update nextoken (or the corresponding field in the per-thread data
* structure */
nextoken = str;
/* Determine if a token has been found. */
if (string == str)
{
return NULL;
}
else
{
return string;
}
}
//
// Find a substring
// Stolen from: ..\base\crts\crtw32\string\strstr.c
//
char* __cdecl
strstr(
IN const char* str1,
IN const char* str2
)
{
char* cp = (char*) str1;
char* s1, *s2;
if (!*str2)
{
return((char*)str1);
}
while (*cp)
{
s1 = cp;
s2 = (char*) str2;
while (*s1 && *s2 && !(*s1-*s2))
{
s1++, s2++;
}
if (!*s2)
{
return(cp);
}
cp++;
}
return(NULL);
}
//
// Open a file, return a handle
//
EFI_FILE_HANDLE
OpenFile(
IN UINT64 OCFlags,
IN EFI_LOADED_IMAGE* LoadedImage,
IN EFI_FILE_HANDLE* CurDir,
IN CHAR16* String
)
{
UINTN i;
CHAR16 FileName[128];
CHAR16* DevicePathAsString = NULL;
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle = NULL;
DevicePathAsString = DevicePathToStr(LoadedImage->FilePath);
if (!DevicePathAsString)
{
return NULL;
}
StrCpy(FileName, DevicePathAsString);
DevicePathAsString = RutlFree(DevicePathAsString);
for(i = StrLen(FileName); i > 0 && FileName[i] != wackc; i--)
;
FileName[i] = 0;
StrCat(FileName, String);
Status = (*CurDir)->Open(
*CurDir,
&FileHandle,
FileName,
OCFlags,
0);
if (EFI_ERROR(Status))
{
return NULL;
}
return FileHandle;
}