/** @file String support library implementation. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include /** Get next line start pointer. @param[in] Start The pointer for current line. @param[out] Length The UINT32 pointer to receive the length of current line. @retval The pointer for next line. NULL if no more line is available. **/ CHAR8 * EFIAPI GetNextLine ( IN CHAR8 *Start, OUT UINT32 *Length ) { CHAR8 *Ptr; if (Start == NULL) { return NULL; } Ptr = Start; while ((Ptr[0] != 0) && (Ptr[0] != '\n')) { Ptr++; } if (Length != NULL){ *Length = (UINT32)(Ptr - Start); } if (Ptr[0] == 0) { return NULL; } else { return Ptr + 1; } } /** Trim leading white space for a line. @param[in] Line The pointer to the line buffer. @retval The pointer to the trimmed line. **/ CHAR8 * EFIAPI TrimLeft ( IN CHAR8 *Line ) { if (Line == NULL) { return NULL; } while ((Line[0] == ' ') || (Line[0] == '\t')) { Line++; } return Line; } /** Get next space for the start of a line. @param[in] LineStart The pointer to the start of the line buffer. @param[in] LineEnd The pointer to the end of the line buffer. @retval The pointer to the trimmed line. **/ CHAR8 * EFIAPI GetNextSpace ( IN CHAR8 *LineStart, IN CHAR8 *LineEnd ) { CHAR8 *Line; if ((LineStart == NULL) || (LineEnd == NULL)) { return NULL; } Line = LineStart; while ((Line[0] != 0) && (Line[0] != ' ') && (Line[0] != '\t') && (Line < LineEnd)) { Line++; } return Line; } /** Trim trailing white space for a line. @param[in] Line The pointer to the line buffer. @retval The pointer to the trimmed line. **/ CHAR8 * EFIAPI TrimRight ( IN CHAR8 *Line ) { if (Line == NULL) { return NULL; } while ((Line[0] == ' ') || (Line[0] == '\t') || (Line[0] == '\r') || (Line[0] == '\n')) { Line--; } return Line; } /** Check if a line starts with a known keyword. @param[in] Line The pointer to the line buffer. @param[in] Keyword The pointer to the keyword. @retval Length of the matched keyword. 0 if there is no match. **/ UINT32 EFIAPI MatchKeyWord ( IN CHAR8 *Line, IN CHAR8 *Keyword ) { UINT32 KeywordLen; if ((Line == NULL) || (Keyword == NULL)) { return 0; } KeywordLen = (UINT32)AsciiStrLen (Keyword); if (AsciiStrnCmp (Line, Keyword, KeywordLen) == 0) { // A separator is required to follow the keyword if (((Line[KeywordLen] == 0)) || (Line[KeywordLen] == ' ') || (Line[KeywordLen] == '\t')) { return KeywordLen; } } return 0; } /** Check if a line matches varaible assignment syntax. @param[in] Line The pointer to the line buffer. @param[in] Variable The pointer to the variable name. @retval Length of the matched variable name. 0 if there is no match. **/ UINT32 EFIAPI MatchAssignment ( IN CHAR8 *Line, IN CHAR8 *Variable ) { UINT32 VarLen; if ((Line == NULL) || (Variable == NULL)) { return 0; } VarLen = (UINT32)AsciiStrLen (Variable); if (AsciiStrnCmp (Line, Variable, VarLen) == 0) { if (Line[VarLen] == '=') { return VarLen; } } return 0; }