diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c index 61b9ef854e..de79b825db 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Cls.c @@ -1,6 +1,7 @@ /** @file Main file for attrib shell level 2 function. + (C) Copyright 2016 Hewlett Packard Enterprise Development LP
(C) Copyright 2015 Hewlett-Packard Development Company, L.P.
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials @@ -15,6 +16,11 @@ #include "UefiShellLevel3CommandsLib.h" +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + {L"-sfo", TypeFlag}, + {NULL, TypeMax} + }; + /** Function for 'cls' command. @@ -31,10 +37,11 @@ ShellCommandRunCls ( EFI_STATUS Status; LIST_ENTRY *Package; UINTN Background; - UINTN ForeColor; + UINTN Foreground; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; - CONST CHAR16 *Param1; + CONST CHAR16 *BackColorStr; + CONST CHAR16 *ForeColorStr; // // Initialize variables @@ -42,6 +49,7 @@ ShellCommandRunCls ( ShellStatus = SHELL_SUCCESS; ProblemParam = NULL; Background = 0; + Foreground = 0; // // initialize the shell lib (we must be in non-auto-init...) @@ -52,7 +60,7 @@ ShellCommandRunCls ( // // parse the command line // - Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"cls", ProblemParam); @@ -67,55 +75,143 @@ ShellCommandRunCls ( // if (ShellCommandLineGetFlag(Package, L"-?")) { ASSERT(FALSE); + } else if (ShellCommandLineGetFlag (Package, L"-sfo")) { + if (ShellCommandLineGetCount (Package) > 1) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + Background = (gST->ConOut->Mode->Attribute >> 4) & 0x7; + Foreground = gST->ConOut->Mode->Attribute & 0x0F; + ShellPrintHiiEx ( + -1, + -1, + NULL, + STRING_TOKEN (STR_CLS_OUTPUT_SFO), + gShellLevel3HiiHandle, + gST->ConOut->Mode->Attribute, + Foreground, + Background + ); + } } else { // // If there are 0 value parameters, clear sceen // - Param1 = ShellCommandLineGetRawValue(Package, 1); - if (Param1 == NULL) { + BackColorStr = ShellCommandLineGetRawValue (Package, 1); + ForeColorStr = ShellCommandLineGetRawValue (Package, 2); + + if (BackColorStr == NULL && ForeColorStr == NULL) { // // clear screen // gST->ConOut->ClearScreen (gST->ConOut); - } else if (ShellCommandLineGetCount(Package) > 2) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); + } else if (ShellCommandLineGetCount (Package) > 3) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"cls"); ShellStatus = SHELL_INVALID_PARAMETER; } else { - if (ShellStrToUintn(Param1) > 7 || StrLen(Param1) > 1 || !ShellIsDecimalDigitCharacter(*Param1)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", Param1); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - switch (ShellStrToUintn(Param1)) { - case 0: - Background = EFI_BACKGROUND_BLACK; - break; - case 1: - Background = EFI_BACKGROUND_BLUE; - break; - case 2: - Background = EFI_BACKGROUND_GREEN; - break; - case 3: - Background = EFI_BACKGROUND_CYAN; - break; - case 4: - Background = EFI_BACKGROUND_RED; - break; - case 5: - Background = EFI_BACKGROUND_MAGENTA; - break; - case 6: - Background = EFI_BACKGROUND_BROWN; - break; - case 7: - Background = EFI_BACKGROUND_LIGHTGRAY; - break; + if (BackColorStr != NULL) { + if ((ShellStrToUintn (BackColorStr) > 7) || (StrLen (BackColorStr) > 1) || (!ShellIsDecimalDigitCharacter (*BackColorStr))) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", BackColorStr); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + switch (ShellStrToUintn (BackColorStr)) { + case 0: + Background = EFI_BACKGROUND_BLACK; + break; + case 1: + Background = EFI_BACKGROUND_BLUE; + break; + case 2: + Background = EFI_BACKGROUND_GREEN; + break; + case 3: + Background = EFI_BACKGROUND_CYAN; + break; + case 4: + Background = EFI_BACKGROUND_RED; + break; + case 5: + Background = EFI_BACKGROUND_MAGENTA; + break; + case 6: + Background = EFI_BACKGROUND_BROWN; + break; + case 7: + Background = EFI_BACKGROUND_LIGHTGRAY; + break; + } + + if (ForeColorStr != NULL) { + if ((ShellStrToUintn (ForeColorStr) > 15) || (StrLen (ForeColorStr) > 2) || (!ShellIsDecimalDigitCharacter (*ForeColorStr))) { + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"cls", ForeColorStr); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + switch (ShellStrToUintn (ForeColorStr)) { + case 0: + Foreground = EFI_BLACK; + break; + case 1: + Foreground = EFI_BLUE; + break; + case 2: + Foreground = EFI_GREEN; + break; + case 3: + Foreground = EFI_CYAN; + break; + case 4: + Foreground = EFI_RED; + break; + case 5: + Foreground = EFI_MAGENTA; + break; + case 6: + Foreground = EFI_BROWN; + break; + case 7: + Foreground = EFI_LIGHTGRAY; + break; + case 8: + Foreground = EFI_DARKGRAY; + break; + case 9: + Foreground = EFI_LIGHTBLUE; + break; + case 10: + Foreground = EFI_LIGHTGREEN; + break; + case 11: + Foreground = EFI_LIGHTCYAN; + break; + case 12: + Foreground = EFI_LIGHTRED; + break; + case 13: + Foreground = EFI_LIGHTMAGENTA; + break; + case 14: + Foreground = EFI_YELLOW; + break; + case 15: + Foreground = EFI_WHITE; + break; + } + } + } else { + // + // Since foreground color is not modified, so retain + // existing foreground color without any change to it. + // + Foreground = gST->ConOut->Mode->Attribute & 0x0F; + } + + if (ShellStatus == SHELL_SUCCESS) { + Status = gST->ConOut->SetAttribute (gST->ConOut, (Foreground | Background) & 0x7F); + ASSERT_EFI_ERROR (Status); + Status = gST->ConOut->ClearScreen (gST->ConOut); + ASSERT_EFI_ERROR (Status); + } } - ForeColor = (~ShellStrToUintn(Param1)) & 0xF; - Status = gST->ConOut->SetAttribute (gST->ConOut, (ForeColor | Background) & 0x7F ); - ASSERT_EFI_ERROR(Status); - Status = gST->ConOut->ClearScreen (gST->ConOut); - ASSERT_EFI_ERROR(Status); } } } diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni b/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni index fc9c5d447c..bbcb752ac0 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.uni @@ -1,5 +1,6 @@ // /** // +// (C) Copyright 2016 Hewlett Packard Enterprise Development LP
// (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.
// Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.
// This program and the accompanying materials @@ -82,6 +83,7 @@ #string STR_ALIAS_OUTPUT #language en-US "%1c %10s:%s\r\n" #string STR_GET_MTC_OUTPUT #language en-US "%016Lx\r\n" +#string STR_CLS_OUTPUT_SFO #language en-US "ConOutAttribInfo,"%d","%d","%d"\r\n" #string STR_GET_HELP_HELP #language en-US "" ".TH help 0 "Displays help information from the UEFI Shell."\r\n" @@ -201,38 +203,62 @@ #string STR_GET_HELP_CLS #language en-US "" ".TH cls 0 "clear screen"\r\n" ".SH NAME\r\n" -"Clears standard output and optionally changes background color.\r\n" +"Clears the console output and optionally changes the background and foreground color.\r\n" ".SH SYNOPSIS\r\n" " \r\n" -"CLS [color]\r\n" +"CLS [background] [foreground] | [-sfo]\r\n" ".SH OPTIONS\r\n" " \r\n" -" color - Sets a new background color:\r\n" -" 0 - Black\r\n" -" 1 - Blue\r\n" -" 2 - Green\r\n" -" 3 - Cyan\r\n" -" 4 - Red\r\n" -" 5 - Magenta\r\n" -" 6 - Yellow\r\n" -" 7 - Light gray\r\n" +" background - Sets a new background color:\r\n" +" 0 - Black\r\n" +" 1 - Blue\r\n" +" 2 - Green\r\n" +" 3 - Cyan\r\n" +" 4 - Red\r\n" +" 5 - Magenta\r\n" +" 6 - Yellow\r\n" +" 7 - Light gray\r\n" +" foreground - Sets a new foreground color:\r\n" +" 0 - Black\r\n" +" 1 - Blue\r\n" +" 2 - Green\r\n" +" 3 - Cyan\r\n" +" 4 - Red\r\n" +" 5 - Magenta\r\n" +" 6 - Yellow\r\n" +" 7 - Light gray\r\n" +" 8 - Dark gray\r\n" +" 9 - Light blue\r\n" +" 10 - Light green\r\n" +" 11 - Light cyan\r\n" +" 12 - Light red\r\n" +" 13 - Light magenta\r\n" +" 14 - Yellow\r\n" +" 15 - White\r\n" +" -sfo - Displays current console color settings in Standard Format\r\n" +" Output.\r\n" ".SH DESCRIPTION\r\n" " \r\n" "NOTES:\r\n" " 1. This command clears the standard output device with an optional\r\n" -" background color attribute. If a color is not specified, then the\r\n" -" background color does not change.\r\n" +" background and foreground color attribute.\r\n" +" 2. If background color is not specified, or if background and foreground\r\n" +" colors are not specified, then the colors do not change.\r\n" +" 3. When -sfo flag is used, console output is not cleared and instead it\r\n" +" displays current console foreground and background attribute settings.\r\n" ".SH EXAMPLES\r\n" " \r\n" "EXAMPLES:\r\n" -" * To clear standard output without changing the background color:\r\n" +" * To clear standard output without changing the background or foreground\r\n" +" color:\r\n" " fs0:\> cls\r\n" " \r\n" " * To clear standard output and change the background color to cyan:\r\n" " fs0:\> cls 3\r\n" " \r\n" -" * To clear standard output and change the background to the default color:\r\n" -" fs0:\> cls 0\r\n" +" * To clear standard output and change the background to black and foreground\r\n" +" to white:\r\n" +" fs0:\> cls 0 15\r\n" ".SH RETURNVALUES\r\n" " \r\n" "RETURN VALUES:\r\n"