\r
If the position upon start is 0, then the Ascii Boolean will be set. This should be\r
maintained and not changed for all operations with the same file.\r
+ The function will not return the \r and \n character in buffer. When an empty line is\r
+ read a CHAR_NULL character will be returned in buffer.\r
\r
@param[in] Handle FileHandle to read from.\r
@param[in, out] Buffer The pointer to buffer to read into.\r
UINT64 FileSize;\r
UINTN CharSize;\r
UINTN CountSoFar;\r
+ UINTN CrCount;\r
UINT64 OriginalFilePosition;\r
\r
if (Handle == NULL\r
return (EFI_INVALID_PARAMETER);\r
} \r
\r
- if (Buffer != NULL) {\r
+ if (Buffer != NULL && *Size != 0) {\r
*Buffer = CHAR_NULL;\r
- }\r
+ } \r
\r
Status = FileHandleGetSize (Handle, &FileSize);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
} else if (FileSize == 0) {\r
+ *Ascii = TRUE;\r
return EFI_SUCCESS;\r
} \r
\r
}\r
}\r
\r
+ CrCount = 0;\r
for (CountSoFar = 0;;CountSoFar++){\r
CharBuffer = 0;\r
if (*Ascii) {\r
|| (CharBuffer == '\n' && *Ascii)\r
){\r
break;\r
+ } else if (\r
+ (CharBuffer == L'\r' && !(*Ascii)) ||\r
+ (CharBuffer == '\r' && *Ascii)\r
+ ) {\r
+ CrCount++;\r
+ continue;\r
}\r
//\r
// if we have space save it...\r
//\r
- if ((CountSoFar+1)*sizeof(CHAR16) < *Size){\r
+ if ((CountSoFar+1-CrCount)*sizeof(CHAR16) < *Size){\r
ASSERT(Buffer != NULL);\r
- ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;\r
- ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;\r
+ ((CHAR16*)Buffer)[CountSoFar-CrCount] = CharBuffer;\r
+ ((CHAR16*)Buffer)[CountSoFar+1-CrCount] = CHAR_NULL;\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 ((CountSoFar+1-CrCount)*sizeof(CHAR16) > *Size){\r
+ *Size = (CountSoFar+1-CrCount)*sizeof(CHAR16);\r
if (!Truncate) {\r
+ if (Buffer != NULL && *Size != 0) {\r
+ ZeroMem(Buffer, *Size);\r
+ }\r
FileHandleSetPosition(Handle, OriginalFilePosition);\r
+ return (EFI_BUFFER_TOO_SMALL);\r
} else {\r
DEBUG((DEBUG_WARN, "The line was truncated in FileHandleReadLine"));\r
+ return (EFI_SUCCESS);\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