Source code of Windows XP (NT5)
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.
|
|
/*++
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; }
|