mirror of https://github.com/acidanthera/audk.git
Move the 2 functions associated with reading whole lines at a single time from the shell command (internal) library to the ShellLib (external) library.
signed-off-by: jcarsey reviewed-by: lgrosenb git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12000 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
da22bd6171
commit
4d0a4fcefe
|
@ -646,64 +646,6 @@ ShellFileHandleEof(
|
||||||
IN SHELL_FILE_HANDLE Handle
|
IN SHELL_FILE_HANDLE Handle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Function to read a single line from a SHELL_FILE_HANDLE. The \n is not included in the returned
|
|
||||||
buffer. The returned buffer must be callee freed.
|
|
||||||
|
|
||||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
|
||||||
maintained and not changed for all operations with the same file.
|
|
||||||
|
|
||||||
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
|
||||||
@param[in,out] Ascii Boolean value for indicating whether the file is
|
|
||||||
Ascii (TRUE) or UCS2 (FALSE).
|
|
||||||
|
|
||||||
@return The line of text from the file.
|
|
||||||
|
|
||||||
@sa ShellFileHandleReadLine
|
|
||||||
**/
|
|
||||||
CHAR16*
|
|
||||||
EFIAPI
|
|
||||||
ShellFileHandleReturnLine(
|
|
||||||
IN SHELL_FILE_HANDLE Handle,
|
|
||||||
IN OUT BOOLEAN *Ascii
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Function to read a single line (up to but not including the \n) from a SHELL_FILE_HANDLE.
|
|
||||||
|
|
||||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
|
||||||
maintained and not changed for all operations with the same file.
|
|
||||||
|
|
||||||
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
|
||||||
@param[in,out] Buffer The pointer to buffer to read into.
|
|
||||||
@param[in,out] Size The pointer to number of bytes in Buffer.
|
|
||||||
@param[in] Truncate If the buffer is large enough, this has no effect.
|
|
||||||
If the buffer is is too small and Truncate is TRUE,
|
|
||||||
the line will be truncated.
|
|
||||||
If the buffer is is too small and Truncate is FALSE,
|
|
||||||
then no read will occur.
|
|
||||||
|
|
||||||
@param[in,out] Ascii Boolean value for indicating whether the file is
|
|
||||||
Ascii (TRUE) or UCS2 (FALSE).
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The operation was successful. The line is stored in
|
|
||||||
Buffer.
|
|
||||||
@retval EFI_INVALID_PARAMETER Handle was NULL.
|
|
||||||
@retval EFI_INVALID_PARAMETER Size was NULL.
|
|
||||||
@retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.
|
|
||||||
Size was updated to the minimum space required.
|
|
||||||
@sa ShellFileHandleRead
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
ShellFileHandleReadLine(
|
|
||||||
IN SHELL_FILE_HANDLE Handle,
|
|
||||||
IN OUT CHAR16 *Buffer,
|
|
||||||
IN OUT UINTN *Size,
|
|
||||||
IN BOOLEAN Truncate,
|
|
||||||
IN OUT BOOLEAN *Ascii
|
|
||||||
);
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
void *Buffer;
|
void *Buffer;
|
||||||
|
|
|
@ -1266,4 +1266,61 @@ ShellFileExists(
|
||||||
IN CONST CHAR16 *Name
|
IN CONST CHAR16 *Name
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function to read a single line from a SHELL_FILE_HANDLE. The \n is not included in the returned
|
||||||
|
buffer. The returned buffer must be callee freed.
|
||||||
|
|
||||||
|
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||||
|
maintained and not changed for all operations with the same file.
|
||||||
|
|
||||||
|
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
||||||
|
@param[in,out] Ascii Boolean value for indicating whether the file is
|
||||||
|
Ascii (TRUE) or UCS2 (FALSE).
|
||||||
|
|
||||||
|
@return The line of text from the file.
|
||||||
|
|
||||||
|
@sa ShellFileHandleReadLine
|
||||||
|
**/
|
||||||
|
CHAR16*
|
||||||
|
EFIAPI
|
||||||
|
ShellFileHandleReturnLine(
|
||||||
|
IN SHELL_FILE_HANDLE Handle,
|
||||||
|
IN OUT BOOLEAN *Ascii
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function to read a single line (up to but not including the \n) from a SHELL_FILE_HANDLE.
|
||||||
|
|
||||||
|
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||||
|
maintained and not changed for all operations with the same file.
|
||||||
|
|
||||||
|
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
||||||
|
@param[in,out] Buffer The pointer to buffer to read into.
|
||||||
|
@param[in,out] Size The pointer to number of bytes in Buffer.
|
||||||
|
@param[in] Truncate If the buffer is large enough, this has no effect.
|
||||||
|
If the buffer is is too small and Truncate is TRUE,
|
||||||
|
the line will be truncated.
|
||||||
|
If the buffer is is too small and Truncate is FALSE,
|
||||||
|
then no read will occur.
|
||||||
|
|
||||||
|
@param[in,out] Ascii Boolean value for indicating whether the file is
|
||||||
|
Ascii (TRUE) or UCS2 (FALSE).
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The operation was successful. The line is stored in
|
||||||
|
Buffer.
|
||||||
|
@retval EFI_INVALID_PARAMETER Handle was NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER Size was NULL.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.
|
||||||
|
Size was updated to the minimum space required.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellFileHandleReadLine(
|
||||||
|
IN SHELL_FILE_HANDLE Handle,
|
||||||
|
IN OUT CHAR16 *Buffer,
|
||||||
|
IN OUT UINTN *Size,
|
||||||
|
IN BOOLEAN Truncate,
|
||||||
|
IN OUT BOOLEAN *Ascii
|
||||||
|
);
|
||||||
|
|
||||||
#endif // __SHELL_LIB__
|
#endif // __SHELL_LIB__
|
||||||
|
|
|
@ -1282,157 +1282,6 @@ ShellFileHandleEof(
|
||||||
return (RetVal);
|
return (RetVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Function to read a single line from a SHELL_FILE_HANDLE. The \n is not included in the returned
|
|
||||||
buffer. The returned buffer must be callee freed.
|
|
||||||
|
|
||||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
|
||||||
maintained and not changed for all operations with the same file.
|
|
||||||
|
|
||||||
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
|
||||||
@param[in,out] Ascii Boolean value for indicating whether the file is
|
|
||||||
Ascii (TRUE) or UCS2 (FALSE).
|
|
||||||
|
|
||||||
@return The line of text from the file.
|
|
||||||
|
|
||||||
@sa ShellFileHandleReadLine
|
|
||||||
**/
|
|
||||||
CHAR16*
|
|
||||||
EFIAPI
|
|
||||||
ShellFileHandleReturnLine(
|
|
||||||
IN SHELL_FILE_HANDLE Handle,
|
|
||||||
IN OUT BOOLEAN *Ascii
|
|
||||||
)
|
|
||||||
{
|
|
||||||
CHAR16 *RetVal;
|
|
||||||
UINTN Size;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
Size = 0;
|
|
||||||
RetVal = NULL;
|
|
||||||
|
|
||||||
Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
|
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
|
||||||
RetVal = AllocateZeroPool(Size);
|
|
||||||
Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
|
|
||||||
}
|
|
||||||
ASSERT_EFI_ERROR(Status);
|
|
||||||
if (EFI_ERROR(Status) && (RetVal != NULL)) {
|
|
||||||
FreePool(RetVal);
|
|
||||||
RetVal = NULL;
|
|
||||||
}
|
|
||||||
return (RetVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Function to read a single line (up to but not including the \n) from a SHELL_FILE_HANDLE.
|
|
||||||
|
|
||||||
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
|
||||||
maintained and not changed for all operations with the same file.
|
|
||||||
|
|
||||||
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
|
||||||
@param[in,out] Buffer The pointer to buffer to read into.
|
|
||||||
@param[in,out] Size The pointer to number of bytes in Buffer.
|
|
||||||
@param[in] Truncate If the buffer is large enough, this has no effect.
|
|
||||||
If the buffer is is too small and Truncate is TRUE,
|
|
||||||
the line will be truncated.
|
|
||||||
If the buffer is is too small and Truncate is FALSE,
|
|
||||||
then no read will occur.
|
|
||||||
|
|
||||||
@param[in,out] Ascii Boolean value for indicating whether the file is
|
|
||||||
Ascii (TRUE) or UCS2 (FALSE).
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The operation was successful. The line is stored in
|
|
||||||
Buffer.
|
|
||||||
@retval EFI_INVALID_PARAMETER Handle was NULL.
|
|
||||||
@retval EFI_INVALID_PARAMETER Size was NULL.
|
|
||||||
@retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.
|
|
||||||
Size was updated to the minimum space required.
|
|
||||||
@sa ShellFileHandleRead
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
ShellFileHandleReadLine(
|
|
||||||
IN SHELL_FILE_HANDLE Handle,
|
|
||||||
IN OUT CHAR16 *Buffer,
|
|
||||||
IN OUT UINTN *Size,
|
|
||||||
IN BOOLEAN Truncate,
|
|
||||||
IN OUT BOOLEAN *Ascii
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
CHAR16 CharBuffer;
|
|
||||||
UINTN CharSize;
|
|
||||||
UINTN CountSoFar;
|
|
||||||
UINT64 OriginalFilePosition;
|
|
||||||
|
|
||||||
|
|
||||||
if (Handle == NULL
|
|
||||||
||Size == NULL
|
|
||||||
){
|
|
||||||
return (EFI_INVALID_PARAMETER);
|
|
||||||
}
|
|
||||||
if (Buffer == NULL) {
|
|
||||||
ASSERT(*Size == 0);
|
|
||||||
} else {
|
|
||||||
*Buffer = CHAR_NULL;
|
|
||||||
}
|
|
||||||
gEfiShellProtocol->GetFilePosition(Handle, &OriginalFilePosition);
|
|
||||||
if (OriginalFilePosition == 0) {
|
|
||||||
CharSize = sizeof(CHAR16);
|
|
||||||
Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
|
|
||||||
ASSERT_EFI_ERROR(Status);
|
|
||||||
if (CharBuffer == gUnicodeFileTag) {
|
|
||||||
*Ascii = FALSE;
|
|
||||||
} else {
|
|
||||||
*Ascii = TRUE;
|
|
||||||
gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (CountSoFar = 0;;CountSoFar++){
|
|
||||||
CharBuffer = 0;
|
|
||||||
if (*Ascii) {
|
|
||||||
CharSize = sizeof(CHAR8);
|
|
||||||
} else {
|
|
||||||
CharSize = sizeof(CHAR16);
|
|
||||||
}
|
|
||||||
Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
|
|
||||||
if ( EFI_ERROR(Status)
|
|
||||||
|| CharSize == 0
|
|
||||||
|| (CharBuffer == L'\n' && !(*Ascii))
|
|
||||||
|| (CharBuffer == '\n' && *Ascii)
|
|
||||||
){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// if we have space save it...
|
|
||||||
//
|
|
||||||
if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
|
|
||||||
ASSERT(Buffer != NULL);
|
|
||||||
((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
|
|
||||||
((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// if we ran out of space tell when...
|
|
||||||
//
|
|
||||||
if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
|
|
||||||
*Size = (CountSoFar+1)*sizeof(CHAR16);
|
|
||||||
if (!Truncate) {
|
|
||||||
gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
|
|
||||||
} else {
|
|
||||||
DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));
|
|
||||||
}
|
|
||||||
return (EFI_BUFFER_TOO_SMALL);
|
|
||||||
}
|
|
||||||
while(Buffer[StrLen(Buffer)-1] == L'\r') {
|
|
||||||
Buffer[StrLen(Buffer)-1] = CHAR_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Status);
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
Frees any BUFFER_LIST defined type.
|
Frees any BUFFER_LIST defined type.
|
||||||
|
|
||||||
|
|
|
@ -3808,3 +3808,154 @@ ShellIsHexOrDecimalNumber (
|
||||||
}
|
}
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function to read a single line from a SHELL_FILE_HANDLE. The \n is not included in the returned
|
||||||
|
buffer. The returned buffer must be callee freed.
|
||||||
|
|
||||||
|
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||||
|
maintained and not changed for all operations with the same file.
|
||||||
|
|
||||||
|
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
||||||
|
@param[in,out] Ascii Boolean value for indicating whether the file is
|
||||||
|
Ascii (TRUE) or UCS2 (FALSE).
|
||||||
|
|
||||||
|
@return The line of text from the file.
|
||||||
|
|
||||||
|
@sa ShellFileHandleReadLine
|
||||||
|
**/
|
||||||
|
CHAR16*
|
||||||
|
EFIAPI
|
||||||
|
ShellFileHandleReturnLine(
|
||||||
|
IN SHELL_FILE_HANDLE Handle,
|
||||||
|
IN OUT BOOLEAN *Ascii
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CHAR16 *RetVal;
|
||||||
|
UINTN Size;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
Size = 0;
|
||||||
|
RetVal = NULL;
|
||||||
|
|
||||||
|
Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
|
||||||
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
|
RetVal = AllocateZeroPool(Size);
|
||||||
|
Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
|
||||||
|
}
|
||||||
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
if (EFI_ERROR(Status) && (RetVal != NULL)) {
|
||||||
|
FreePool(RetVal);
|
||||||
|
RetVal = NULL;
|
||||||
|
}
|
||||||
|
return (RetVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Function to read a single line (up to but not including the \n) from a SHELL_FILE_HANDLE.
|
||||||
|
|
||||||
|
If the position upon start is 0, then the Ascii Boolean will be set. This should be
|
||||||
|
maintained and not changed for all operations with the same file.
|
||||||
|
|
||||||
|
@param[in] Handle SHELL_FILE_HANDLE to read from.
|
||||||
|
@param[in,out] Buffer The pointer to buffer to read into.
|
||||||
|
@param[in,out] Size The pointer to number of bytes in Buffer.
|
||||||
|
@param[in] Truncate If the buffer is large enough, this has no effect.
|
||||||
|
If the buffer is is too small and Truncate is TRUE,
|
||||||
|
the line will be truncated.
|
||||||
|
If the buffer is is too small and Truncate is FALSE,
|
||||||
|
then no read will occur.
|
||||||
|
|
||||||
|
@param[in,out] Ascii Boolean value for indicating whether the file is
|
||||||
|
Ascii (TRUE) or UCS2 (FALSE).
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The operation was successful. The line is stored in
|
||||||
|
Buffer.
|
||||||
|
@retval EFI_INVALID_PARAMETER Handle was NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER Size was NULL.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.
|
||||||
|
Size was updated to the minimum space required.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ShellFileHandleReadLine(
|
||||||
|
IN SHELL_FILE_HANDLE Handle,
|
||||||
|
IN OUT CHAR16 *Buffer,
|
||||||
|
IN OUT UINTN *Size,
|
||||||
|
IN BOOLEAN Truncate,
|
||||||
|
IN OUT BOOLEAN *Ascii
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
CHAR16 CharBuffer;
|
||||||
|
UINTN CharSize;
|
||||||
|
UINTN CountSoFar;
|
||||||
|
UINT64 OriginalFilePosition;
|
||||||
|
|
||||||
|
|
||||||
|
if (Handle == NULL
|
||||||
|
||Size == NULL
|
||||||
|
){
|
||||||
|
return (EFI_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
if (Buffer == NULL) {
|
||||||
|
ASSERT(*Size == 0);
|
||||||
|
} else {
|
||||||
|
*Buffer = CHAR_NULL;
|
||||||
|
}
|
||||||
|
gEfiShellProtocol->GetFilePosition(Handle, &OriginalFilePosition);
|
||||||
|
if (OriginalFilePosition == 0) {
|
||||||
|
CharSize = sizeof(CHAR16);
|
||||||
|
Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
|
||||||
|
ASSERT_EFI_ERROR(Status);
|
||||||
|
if (CharBuffer == gUnicodeFileTag) {
|
||||||
|
*Ascii = FALSE;
|
||||||
|
} else {
|
||||||
|
*Ascii = TRUE;
|
||||||
|
gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CountSoFar = 0;;CountSoFar++){
|
||||||
|
CharBuffer = 0;
|
||||||
|
if (*Ascii) {
|
||||||
|
CharSize = sizeof(CHAR8);
|
||||||
|
} else {
|
||||||
|
CharSize = sizeof(CHAR16);
|
||||||
|
}
|
||||||
|
Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
|
||||||
|
if ( EFI_ERROR(Status)
|
||||||
|
|| CharSize == 0
|
||||||
|
|| (CharBuffer == L'\n' && !(*Ascii))
|
||||||
|
|| (CharBuffer == '\n' && *Ascii)
|
||||||
|
){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// if we have space save it...
|
||||||
|
//
|
||||||
|
if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
|
||||||
|
ASSERT(Buffer != NULL);
|
||||||
|
((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
|
||||||
|
((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if we ran out of space tell when...
|
||||||
|
//
|
||||||
|
if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
|
||||||
|
*Size = (CountSoFar+1)*sizeof(CHAR16);
|
||||||
|
if (!Truncate) {
|
||||||
|
gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
|
||||||
|
} else {
|
||||||
|
DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));
|
||||||
|
}
|
||||||
|
return (EFI_BUFFER_TOO_SMALL);
|
||||||
|
}
|
||||||
|
while(Buffer[StrLen(Buffer)-1] == L'\r') {
|
||||||
|
Buffer[StrLen(Buffer)-1] = CHAR_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Status);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue