EFI_FILE_PROTOCOL wrappers for other items (Like Environment Variables,\r
StdIn, StdOut, StdErr, etc...).\r
\r
+ Copyright 2016 Dell Inc.\r
Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR>\r
This program and the accompanying materials\r
IN VOID *Buffer\r
)\r
{\r
- CHAR8 *AsciiBuffer;\r
- if (((EFI_FILE_PROTOCOL_MEM*)This)->Unicode) {\r
+ CHAR8 *AsciiBuffer;\r
+ EFI_FILE_PROTOCOL_MEM *MemFile;\r
+\r
+ MemFile = (EFI_FILE_PROTOCOL_MEM *) This;\r
+ if (MemFile->Unicode) {\r
//\r
// Unicode\r
//\r
- if ((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position + (*BufferSize)) > (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize)) {\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer = ReallocatePool((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize), (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) + (*BufferSize) + 10, ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize += (*BufferSize) + 10;\r
+ if ((UINTN)(MemFile->Position + (*BufferSize)) > (UINTN)(MemFile->BufferSize)) {\r
+ MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + (*BufferSize) + 10, MemFile->Buffer);\r
+ MemFile->BufferSize += (*BufferSize) + 10;\r
}\r
- CopyMem(((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, Buffer, *BufferSize);\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->Position += (*BufferSize);\r
+ CopyMem(((UINT8*)MemFile->Buffer) + MemFile->Position, Buffer, *BufferSize);\r
+ MemFile->Position += (*BufferSize);\r
return (EFI_SUCCESS);\r
} else {\r
//\r
return (EFI_OUT_OF_RESOURCES);\r
}\r
AsciiSPrint(AsciiBuffer, *BufferSize, "%S", Buffer);\r
- if ((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position + AsciiStrSize(AsciiBuffer)) > (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize)) {\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer = ReallocatePool((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize), (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) + AsciiStrSize(AsciiBuffer) + 10, ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize += AsciiStrSize(AsciiBuffer) + 10;\r
+ if ((UINTN)(MemFile->Position + AsciiStrSize(AsciiBuffer)) > (UINTN)(MemFile->BufferSize)) {\r
+ MemFile->Buffer = ReallocatePool((UINTN)(MemFile->BufferSize), (UINTN)(MemFile->BufferSize) + AsciiStrSize(AsciiBuffer) + 10, MemFile->Buffer);\r
+ MemFile->BufferSize += AsciiStrSize(AsciiBuffer) + 10;\r
}\r
- CopyMem(((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, AsciiBuffer, AsciiStrSize(AsciiBuffer));\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->Position += AsciiStrSize(AsciiBuffer);\r
+ CopyMem(((UINT8*)MemFile->Buffer) + MemFile->Position, AsciiBuffer, AsciiStrSize(AsciiBuffer));\r
+ MemFile->Position += (*BufferSize / sizeof(CHAR16));\r
FreePool(AsciiBuffer);\r
return (EFI_SUCCESS);\r
}\r
IN VOID *Buffer\r
)\r
{\r
- if (*BufferSize > (UINTN)((((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) - (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position))) {\r
- (*BufferSize) = (UINTN)((((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) - (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position));\r
+ EFI_FILE_PROTOCOL_MEM *MemFile;\r
+\r
+ MemFile = (EFI_FILE_PROTOCOL_MEM *) This;\r
+ if (*BufferSize > (UINTN)((MemFile->BufferSize) - (UINTN)(MemFile->Position))) {\r
+ (*BufferSize) = (UINTN)((MemFile->BufferSize) - (UINTN)(MemFile->Position));\r
}\r
- CopyMem(Buffer, ((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, (*BufferSize));\r
- ((EFI_FILE_PROTOCOL_MEM*)This)->Position = ((EFI_FILE_PROTOCOL_MEM*)This)->Position + (*BufferSize);\r
+ CopyMem(Buffer, ((UINT8*)MemFile->Buffer) + MemFile->Position, (*BufferSize));\r
+ MemFile->Position = MemFile->Position + (*BufferSize);\r
return (EFI_SUCCESS);\r
}\r
\r
ASSERT(FileInterface->BufferSize == 0);\r
ASSERT(FileInterface->Position == 0);\r
\r
+ if (Unicode) {\r
+ FileInterface->Buffer = AllocateZeroPool(sizeof(gUnicodeFileTag));\r
+ *((CHAR16 *) (FileInterface->Buffer)) = EFI_UNICODE_BYTE_ORDER_MARK;\r
+ FileInterface->BufferSize = 2;\r
+ FileInterface->Position = 2;\r
+ }\r
+\r
return ((EFI_FILE_PROTOCOL *)FileInterface);\r
}\r
\r
/** @file\r
Provides interface to shell functionality for shell commands and applications.\r
\r
+ Copyright 2016 Dell Inc.\r
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
\r
@retval EFI_SUCCESS The operation was successful. The line is stored in\r
Buffer.\r
+ @retval EFI_END_OF_FILE There are no more lines in the file.\r
@retval EFI_INVALID_PARAMETER Handle was NULL.\r
@retval EFI_INVALID_PARAMETER Size was NULL.\r
@retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.\r
}\r
}\r
\r
+ if (*Ascii) {\r
+ CharSize = sizeof(CHAR8);\r
+ } else {\r
+ CharSize = sizeof(CHAR16);\r
+ }\r
for (CountSoFar = 0;;CountSoFar++){\r
CharBuffer = 0;\r
- if (*Ascii) {\r
- CharSize = sizeof(CHAR8);\r
- } else {\r
- CharSize = sizeof(CHAR16);\r
- }\r
Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);\r
if ( EFI_ERROR(Status)\r
|| CharSize == 0\r
|| (CharBuffer == L'\n' && !(*Ascii))\r
|| (CharBuffer == '\n' && *Ascii)\r
){\r
+ if (CharSize == 0) {\r
+ Status = EFI_END_OF_FILE;\r
+ }\r
break;\r
}\r
//\r
// if we have space save it...\r
//\r
- if ((CountSoFar+1)*sizeof(CHAR16) < *Size){\r
+ if ((CountSoFar + 1) * CharSize < *Size){\r
ASSERT(Buffer != NULL);\r
- ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;\r
- ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;\r
+ if (*Ascii) {\r
+ ((CHAR8*)Buffer)[CountSoFar] = (CHAR8) CharBuffer;\r
+ ((CHAR8*)Buffer)[CountSoFar+1] = '\0';\r
+ }\r
+ else {\r
+ ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;\r
+ ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;\r
+ }\r
}\r
}\r
\r
//\r
// if we ran out of space tell when...\r
//\r
- if ((CountSoFar+1)*sizeof(CHAR16) > *Size){\r
- *Size = (CountSoFar+1)*sizeof(CHAR16);\r
- if (!Truncate) {\r
- gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
- } else {\r
- DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));\r
+ if (Status != EFI_END_OF_FILE){\r
+ if ((CountSoFar + 1) * CharSize > *Size){\r
+ *Size = (CountSoFar + 1) * CharSize;\r
+ if (!Truncate) {\r
+ gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
+ } else {\r
+ DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));\r
+ }\r
+ return (EFI_BUFFER_TOO_SMALL);\r
+ }\r
+\r
+ if (*Ascii) {\r
+ if (CountSoFar && ((CHAR8*)Buffer)[CountSoFar - 1] == '\r') {\r
+ ((CHAR8*)Buffer)[CountSoFar - 1] = '\0';\r
+ }\r
+ }\r
+ else {\r
+ if (CountSoFar && Buffer[CountSoFar - 1] == L'\r') {\r
+ Buffer[CountSoFar - 1] = CHAR_NULL;\r
+ }\r
}\r
- return (EFI_BUFFER_TOO_SMALL);\r
- }\r
- while(Buffer[StrLen(Buffer)-1] == L'\r') {\r
- Buffer[StrLen(Buffer)-1] = CHAR_NULL;\r
}\r
\r
return (Status);\r