4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides interface to shell MAN file parser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Verifies that the filename has .MAN on the end.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allocates a new buffer and copies the name (appending .MAN if necessary)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT if ManFileName is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ManFileName original filename
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the new filename with .man as the extension.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fix the file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(ManFileName+StrLen(ManFileName)-4, L".man", 4)==0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(StrSize(ManFileName) + 4*sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search the path environment variable for possible locations and test for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which one contains a man file with the name specified. If a valid file is found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stop searching and return the (opened) SHELL_FILE_HANDLE for that file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileName Name of the file to find and open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Handle Pointer to the handle of the found file. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value of this is undefined for return values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except EFI_SUCCESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The file was found. Handle is a valid SHELL_FILE_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter had an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The file was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now open that file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiShellOpenFileByName(FullFileName, Handle, EFI_FILE_MODE_READ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parses through Buffer (which is MAN file formatted) and returns the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync detailed help for any sub section specified in the comma seperated list of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sections provided. If the end of the file or a .TH section is found then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *HelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Buffer to read from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sections name of command's sub sections to find
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HelpText pointer to pointer to string where text goes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HelpSize pointer to size of allocated HelpText (may be updated)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the section was found and its description sotred in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an alloceted buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation != NULL && *CurrentLocation != CHAR_NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation=StrStr(CurrentLocation, L"\r\n"),TempString = NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(CurrentLocation[0] == L'\r' || CurrentLocation[0] == L'\n') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we hit the end of this commands section so stop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is this a section we want to read in?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\r"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, CurrentLocation, TempString2==NULL?0:TempString2 - CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(SectionName + SectionLen) == CHAR_NULL || *(SectionName + SectionLen) == L',') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, CurrentLocation, TempString2==NULL?0:TempString2 - CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy and save the current line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((*HelpText == NULL && *HelpSize == 0) || (*HelpText != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parses through the MAN file specified by SHELL_FILE_HANDLE and returns the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync detailed help for any sub section specified in the comma seperated list of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sections provided. If the end of the file or a .TH section is found then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *HelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle FileHandle to read from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sections name of command's sub sections to find
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] HelpText pointer to pointer to string where text goes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] HelpSize pointer to size of allocated HelpText (may be updated)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ascii TRUE if the file is ASCII, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the section was found and its description sotred in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an alloceted buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, ReadLine, &Size, TRUE, &Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore too small of buffer...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we hit the end of this commands section so stop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found a section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is this a section we want to read in?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(SectionName + SectionLen) == CHAR_NULL || *(SectionName + SectionLen) == L',') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy and save the current line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((*HelpText == NULL && *HelpSize == 0) || (*HelpText != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parses through the MAN file formatted Buffer and returns the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Brief Description" for the .TH section as specified by Command. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command section is not found return EFI_NOT_FOUND.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle Buffer to read from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Command name of command's section to find
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BriefDesc pointer to pointer to string where description goes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BriefSize pointer to size of allocated BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the section was found and its description sotred in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an alloceted buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleString = AllocateZeroPool((7*sizeof(CHAR16)) + StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found it so copy out the rest of the line into BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After skipping any spaces or zeroes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *CurrentLocation == L' ' || *CurrentLocation == L'0' || *CurrentLocation == L'1' || *CurrentLocation == L'\"'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy(*BriefDesc, CurrentLocation, TitleEnd-CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *CurrentLocation == L' ' || *CurrentLocation == L'\n' || *CurrentLocation == L'\r'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parses through the MAN file specified by SHELL_FILE_HANDLE and returns the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Brief Description" for the .TH section as specified by Command. if the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command section is not found return EFI_NOT_FOUND.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle FileHandle to read from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Command name of command's section to find
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BriefDesc pointer to pointer to string where description goes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BriefSize pointer to size of allocated BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Ascii TRUE if the file is ASCII, FALSE otherwise, will be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set if the file handle is at the 0 position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the section was found and its description sotred in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an alloceted buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleString = AllocateZeroPool((4*sizeof(CHAR16)) + StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, ReadLine, &Size, TRUE, Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore too small of buffer...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(ReadLine, TitleString, TitleLen) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found it so copy out the rest of the line into BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After skipping any spaces or zeroes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *TitleEnd == L' ' || *TitleEnd == L'0' || *TitleEnd == L'1'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns the help information for the specified command. The help text
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be parsed from a UEFI Shell manual page. (see UEFI Shell 2.0 Appendix B)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Sections is specified, then each section name listed will be compared in a casesensitive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync manner, to the section names described in Appendix B. If the section exists,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync it will be appended to the returned help text. If the section does not exist, no
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync information will be returned. If Sections is NULL, then all help text information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync available will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if BriefDesc is NULL, then the breif description will not be savedd seperatly,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync but placed first in the main HelpText.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ManFileName Points to the NULL-terminated UEFI Shell MAN file name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Command Points to the NULL-terminated UEFI Shell command name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sections Points to the NULL-terminated comma-delimited
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync section names to return. If NULL, then all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sections will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BriefDesc On return, points to a callee-allocated buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync containing brief description text.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] HelpText On return, points to a callee-allocated buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync containing all specified help text.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The help text was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The necessary buffer could not be allocated to hold the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned help text.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER HelpText is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER ManFileName is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND There is no help text available for Command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if it's in HII first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManBufferFindTitleSection(&TempString2, Command, BriefDesc, &BriefSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManBufferFindSections(TempString2, Sections, HelpText, &HelpSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SearchPathForFile(TempString, &FileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = AppendDevicePath (ShellInfoObject.ImageDevPath, FileDevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalOpenFileDevicePath(DevPath, &FileHandle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManFileFindTitleSection(FileHandle, Command, BriefDesc, &BriefSize, &Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManFileFindSections(FileHandle, Sections, HelpText, &HelpSize, Ascii);