4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides interface to shell MAN file parser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Shell.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Verifies that the filename has .MAN on the end.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allocates a new buffer and copies the name (appending .MAN if necessary)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT if ManFileName is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ManFileName original filename
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the new filename with .man as the extension.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetManFileName(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *ManFileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ManFileName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fix the file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(ManFileName+StrLen(ManFileName)-4, L".man", 4)==0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(StrSize(ManFileName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(Buffer, ManFileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(StrSize(ManFileName) + 4*sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(Buffer, ManFileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(Buffer, L".man");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSearchPathForFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT SHELL_FILE_HANDLE *Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FullFileName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( FileName == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || Handle == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || StrLen(FileName) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullFileName = ShellFindFilePath(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FullFileName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now open that file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiShellOpenFileByName(FullFileName, Handle, EFI_FILE_MODE_READ);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FullFileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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 return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *HelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncManBufferFindSections(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Sections,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 **HelpText,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN *HelpSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *CurrentLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN CurrentlyReading;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *SectionName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SectionLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( Buffer == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || HelpText == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || HelpSize == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (CurrentLocation = Buffer,TempString = NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation != NULL && *CurrentLocation != CHAR_NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation=StrStr(CurrentLocation, L"\r\n"),TempString = NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(CurrentLocation[0] == L'\r' || CurrentLocation[0] == L'\n') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentLocation++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentLocation[0] == L'#') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(CurrentLocation, L".TH", 3) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we hit the end of this commands section so stop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(CurrentLocation, L".SH ", 4) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sections == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CurrentlyReading) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentLocation += 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is this a section we want to read in?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen(CurrentLocation)!=0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = StrStr(CurrentLocation, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\r"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(TempString == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, CurrentLocation, TempString2==NULL?0:TempString2 - CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionName = TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionLen = StrLen(SectionName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionName = StrStr(Sections, SectionName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SectionName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(SectionName + SectionLen) == CHAR_NULL || *(SectionName + SectionLen) == L',') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CurrentlyReading) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen(CurrentLocation)!=0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = StrStr(CurrentLocation, L"\r");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = MIN(TempString2, StrStr(CurrentLocation, L"\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(TempString == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, CurrentLocation, TempString2==NULL?0:TempString2 - CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy and save the current line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((*HelpText == NULL && *HelpSize == 0) || (*HelpText != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow (HelpText, HelpSize, TempString, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpText == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow (HelpText, HelpSize, L"\r\n", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HelpText == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Found && !EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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 return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *HelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncManFileFindSections(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Sections,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **HelpText,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *HelpSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ReadLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN CurrentlyReading;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *SectionName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SectionLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( Handle == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || HelpText == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || HelpSize == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 1024;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReadLine = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ReadLine == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;!ShellFileHandleEof(Handle);Size = 1024) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, ReadLine, &Size, TRUE, &Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ReadLine[0] == L'#') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore too small of buffer...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StrnCmp(ReadLine, L".TH", 3) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we hit the end of this commands section so stop.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StrnCmp(ReadLine, L".SH", 3) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Sections == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found a section
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentlyReading) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is this a section we want to read in?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( SectionName = ReadLine + 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *SectionName == L' '
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; SectionName++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionLen = StrLen(SectionName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SectionName = StrStr(Sections, SectionName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SectionName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(SectionName + SectionLen) == CHAR_NULL || *(SectionName + SectionLen) == L',') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentlyReading = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (CurrentlyReading) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy and save the current line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((*HelpText == NULL && *HelpSize == 0) || (*HelpText != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow (HelpText, HelpSize, ReadLine, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow (HelpText, HelpSize, L"\r\n", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ReadLine);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Found && !EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncManBufferFindTitleSection(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 **Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Command,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 **BriefDesc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN *BriefSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TitleString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TitleEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *CurrentLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( Buffer == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || Command == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (BriefDesc != NULL && BriefSize == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleString = AllocateZeroPool((7*sizeof(CHAR16)) + StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TitleString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TitleString, L".TH ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TitleString, Command);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TitleString, L" 0 ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentLocation = StrStr(*Buffer, TitleString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentLocation == NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found it so copy out the rest of the line into BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After skipping any spaces or zeroes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (CurrentLocation += StrLen(TitleString)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *CurrentLocation == L' ' || *CurrentLocation == L'0' || *CurrentLocation == L'1' || *CurrentLocation == L'\"'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleEnd = StrStr(CurrentLocation, L"\"");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TitleEnd == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BriefDesc != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BriefSize = StrSize(TitleEnd);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BriefDesc = AllocateZeroPool(*BriefSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*BriefDesc == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy(*BriefDesc, CurrentLocation, TitleEnd-CurrentLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (CurrentLocation = TitleEnd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *CurrentLocation != L'\n'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *CurrentLocation == L' ' || *CurrentLocation == L'\n' || *CurrentLocation == L'\r'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; CurrentLocation++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Buffer = CurrentLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TitleString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Upon a sucessful return the caller is responsible to free the memory in *BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncManFileFindTitleSection(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Command,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **BriefDesc OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *BriefSize OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT BOOLEAN *Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TitleString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ReadLine;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TitleEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TitleLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( Handle == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || Command == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (BriefDesc != NULL && BriefSize == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 1024;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReadLine = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ReadLine == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleString = AllocateZeroPool((4*sizeof(CHAR16)) + StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TitleString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ReadLine);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TitleString, L".TH ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TitleString, Command);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TitleLen = StrLen(TitleString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;!ShellFileHandleEof(Handle);Size = 1024) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, ReadLine, &Size, TRUE, Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ReadLine[0] == L'#') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip comment lines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ignore too small of buffer...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(ReadLine, TitleString, TitleLen) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we found it so copy out the rest of the line into BriefDesc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After skipping any spaces or zeroes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( TitleEnd = ReadLine+TitleLen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *TitleEnd == L' ' || *TitleEnd == L'0' || *TitleEnd == L'1'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; TitleEnd++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BriefDesc != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BriefSize = StrSize(TitleEnd);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BriefDesc = AllocateZeroPool(*BriefSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*BriefDesc == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(*BriefDesc, TitleEnd);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ReadLine);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TitleString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Found && !EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if BriefDesc is NULL, then the breif description will not be savedd seperatly,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync but placed first in the main HelpText.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncProcessManFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *ManFileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Command,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Sections OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **BriefDesc OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **HelpText
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE FileHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HelpSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BriefSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Ascii;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *FileDevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( ManFileName == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || Command == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || HelpText == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BriefSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // See if it's in HII first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = ShellCommandGetCommandHelp(Command);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString2 = TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManBufferFindTitleSection(&TempString2, Command, BriefDesc, &BriefSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status) && HelpText != NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManBufferFindSections(TempString2, Sections, HelpText, &HelpSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = GetManFileName(ManFileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SearchPathForFile(TempString, &FileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileDevPath = FileDevicePath(NULL, TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = AppendDevicePath (ShellInfoObject.ImageDevPath, FileDevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalOpenFileDevicePath(DevPath, &FileHandle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FileDevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HelpSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BriefSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManFileFindTitleSection(FileHandle, Command, BriefDesc, &BriefSize, &Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status) && HelpText != NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ManFileFindSections(FileHandle, Sections, HelpText, &HelpSize, Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.NewEfiShellProtocol->CloseFile(FileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *HelpText = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}