From 5ea466a55102b7a60fa9b771e750398e69e33f45 Mon Sep 17 00:00:00 2001 From: ydong10 Date: Mon, 23 Apr 2012 10:26:04 +0000 Subject: [PATCH] Refine the code to have same function to process the string info. Also update the logic to process special char. Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13205 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SetupBrowserDxe/ProcessOptions.c | 203 ++---------------- MdeModulePkg/Universal/SetupBrowserDxe/Ui.c | 11 +- 2 files changed, 23 insertions(+), 191 deletions(-) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c b/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c index c91ba48d21..7fb292592f 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c @@ -988,200 +988,31 @@ ProcessHelpString ( IN UINTN RowCount ) { - UINTN BlockWidth; - UINTN AllocateSize; - // - // [PrevCurrIndex, CurrIndex) forms a range of a screen-line - // - UINTN CurrIndex; - UINTN PrevCurrIndex; - UINTN LineCount; - UINTN VirtualLineCount; - // - // GlyphOffset stores glyph width of current screen-line - // - UINTN GlyphOffset; - // - // GlyphWidth equals to 2 if we meet width directive - // - UINTN GlyphWidth; - // - // during scanning, we remember the position of last space character - // in case that if next word cannot put in current line, we could restore back to the position - // of last space character - // while we should also remmeber the glyph width of the last space character for restoring - // - UINTN LastSpaceIndex; - UINTN LastSpaceGlyphWidth; - // - // every time we begin to form a new screen-line, we should remember glyph width of single character - // of last line - // - UINTN LineStartGlyphWidth; - UINTN *IndexArray; - UINTN *OldIndexArray; + UINTN Index; + CHAR16 *OutputString; + UINTN TotalRowNum; + UINTN CheckedNum; - BlockWidth = (UINTN) gHelpBlockWidth - 1; + TotalRowNum = 0; + CheckedNum = 0; // - // every three elements of IndexArray form a screen-line of string:[ IndexArray[i*3], IndexArray[i*3+1] ) - // IndexArray[i*3+2] stores the initial glyph width of single character. to save this is because we want - // to bring the width directive of the last line to current screen-line. - // e.g.: "\wideabcde ... fghi", if "fghi" also has width directive but is splitted to the next screen-line - // different from that of "\wideabcde", we should remember the width directive. + // Get row number of the String. // - AllocateSize = 0x20; - IndexArray = AllocatePool (AllocateSize * sizeof (UINTN) * 3); - ASSERT (IndexArray != NULL); - - if (*FormattedString != NULL) { - FreePool (*FormattedString); - *FormattedString = NULL; + for (Index = 0; GetLineByWidth (StringPtr, (UINTN) gHelpBlockWidth - 1, &Index, &OutputString) != 0x0000; ) { + TotalRowNum ++; + FreePool (OutputString); } - - for (PrevCurrIndex = 0, CurrIndex = 0, LineCount = 0, LastSpaceIndex = 0, - IndexArray[0] = 0, GlyphWidth = 1, GlyphOffset = 0, LastSpaceGlyphWidth = 1, LineStartGlyphWidth = 1; - (StringPtr[CurrIndex] != CHAR_NULL); - CurrIndex ++) { - - if (LineCount == AllocateSize) { - AllocateSize += 0x10; - OldIndexArray = IndexArray; - IndexArray = AllocatePool (AllocateSize * sizeof (UINTN) * 3); - ASSERT (IndexArray != NULL); - - CopyMem (IndexArray, OldIndexArray, LineCount * sizeof (UINTN) * 3); - FreePool (OldIndexArray); - } - switch (StringPtr[CurrIndex]) { - - case NARROW_CHAR: - case WIDE_CHAR: - GlyphWidth = ((StringPtr[CurrIndex] == WIDE_CHAR) ? 2 : 1); - if (CurrIndex == 0) { - LineStartGlyphWidth = GlyphWidth; - } - break; - - // - // char is '\n' - // "\r\n" isn't handled here, handled by case CHAR_CARRIAGE_RETURN - // - case CHAR_LINEFEED: - // - // Store a range of string as a line - // - IndexArray[LineCount*3] = PrevCurrIndex; - IndexArray[LineCount*3+1] = CurrIndex; - IndexArray[LineCount*3+2] = LineStartGlyphWidth; - LineCount ++; - // - // Reset offset and save begin position of line - // - GlyphOffset = 0; - LineStartGlyphWidth = GlyphWidth; - PrevCurrIndex = CurrIndex + 1; - break; - - // - // char is '\r' - // "\r\n" and "\r" both are handled here - // - case CHAR_CARRIAGE_RETURN: - if (StringPtr[CurrIndex + 1] == CHAR_LINEFEED) { - // - // next char is '\n' - // - IndexArray[LineCount*3] = PrevCurrIndex; - IndexArray[LineCount*3+1] = CurrIndex; - IndexArray[LineCount*3+2] = LineStartGlyphWidth; - LineCount ++; - CurrIndex ++; - } - GlyphOffset = 0; - LineStartGlyphWidth = GlyphWidth; - PrevCurrIndex = CurrIndex + 1; - break; - - // - // char is space or other char - // - default: - GlyphOffset += GlyphWidth; - if (GlyphOffset >= BlockWidth) { - if (LastSpaceIndex > PrevCurrIndex) { - // - // LastSpaceIndex points to space inside current screen-line, - // restore to LastSpaceIndex - // (Otherwise the word is too long to fit one screen-line, just cut it) - // - CurrIndex = LastSpaceIndex; - GlyphWidth = LastSpaceGlyphWidth; - } else if (GlyphOffset > BlockWidth) { - // - // the word is too long to fit one screen-line and we don't get the chance - // of GlyphOffset == BlockWidth because GlyphWidth = 2 - // - CurrIndex --; - } - - IndexArray[LineCount*3] = PrevCurrIndex; - IndexArray[LineCount*3+1] = CurrIndex + 1; - IndexArray[LineCount*3+2] = LineStartGlyphWidth; - LineStartGlyphWidth = GlyphWidth; - LineCount ++; - // - // Reset offset and save begin position of line - // - GlyphOffset = 0; - PrevCurrIndex = CurrIndex + 1; - } - - // - // LastSpaceIndex: remember position of last space - // - if (StringPtr[CurrIndex] == CHAR_SPACE) { - LastSpaceIndex = CurrIndex; - LastSpaceGlyphWidth = GlyphWidth; - } - break; - } - } - - if (GlyphOffset > 0) { - IndexArray[LineCount*3] = PrevCurrIndex; - IndexArray[LineCount*3+1] = CurrIndex; - IndexArray[LineCount*3+2] = GlyphWidth; - LineCount ++; - } - - if (LineCount == 0) { - // - // in case we meet null string - // - IndexArray[0] = 0; - IndexArray[1] = 1; - // - // we assume null string's glyph width is 1 - // - IndexArray[1] = 1; - LineCount ++; - } - - VirtualLineCount = RowCount * (LineCount / RowCount + (LineCount % RowCount > 0)); - *FormattedString = AllocateZeroPool (VirtualLineCount * (BlockWidth + 1) * sizeof (CHAR16) * 2); + + *FormattedString = AllocateZeroPool (TotalRowNum * gHelpBlockWidth * sizeof (CHAR16) * 2); ASSERT (*FormattedString != NULL); - for (CurrIndex = 0; CurrIndex < LineCount; CurrIndex ++) { - *(*FormattedString + CurrIndex * 2 * (BlockWidth + 1)) = (CHAR16) ((IndexArray[CurrIndex*3+2] == 2) ? WIDE_CHAR : NARROW_CHAR); - StrnCpy ( - *FormattedString + CurrIndex * 2 * (BlockWidth + 1) + 1, - StringPtr + IndexArray[CurrIndex*3], - IndexArray[CurrIndex*3+1]-IndexArray[CurrIndex*3] - ); + for (Index = 0; GetLineByWidth (StringPtr, (UINTN) gHelpBlockWidth - 1, &Index, &OutputString) != 0x0000; CheckedNum ++) { + CopyMem (*FormattedString + CheckedNum * gHelpBlockWidth * sizeof (CHAR16), OutputString, gHelpBlockWidth * sizeof (CHAR16)); + FreePool (OutputString); } - FreePool (IndexArray); + ASSERT (CheckedNum == TotalRowNum); - return LineCount; + return TotalRowNum; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c index 82a82e5115..6999f625db 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c @@ -1308,6 +1308,7 @@ GetWidth ( /** Will copy LineWidth amount of a string in the OutputString buffer and return the number of CHAR16 characters that were copied into the OutputString buffer. + In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g. @param InputString String description for this option. @param LineWidth Width of the desired string to extract in CHAR16 @@ -1353,9 +1354,9 @@ GetLineByWidth ( } // - // Fast-forward the string and see if there is a carriage-return in the string + // Fast-forward the string and see if there is a carriage-return or linefeed in the string // - for (; (InputString[*Index + Count2] != CHAR_CARRIAGE_RETURN) && (Count2 != LineWidth); Count2++) + for (; (InputString[*Index + Count2] != CHAR_LINEFEED) && (InputString[*Index + Count2] != CHAR_CARRIAGE_RETURN) && (Count2 != LineWidth); Count2++) ; // @@ -1391,10 +1392,10 @@ GetLineByWidth ( CopyMem (*OutputString, &InputString[*Index], LineWidth * 2); // - // If currently pointing to a space, increment the index to the first non-space character + // If currently pointing to a space or carriage-return or linefeed, increment the index to the first non-space character // for (; - (InputString[*Index + LineWidth] == CHAR_SPACE) || (InputString[*Index + LineWidth] == CHAR_CARRIAGE_RETURN); + (InputString[*Index + LineWidth] == CHAR_SPACE) || (InputString[*Index + LineWidth] == CHAR_CARRIAGE_RETURN)|| (InputString[*Index + LineWidth] == CHAR_LINEFEED); (*Index)++ ) ; @@ -2923,7 +2924,7 @@ UiDisplayMenu ( // Print the help string info. // if (!MultiHelpPage) { - for (Index = 0; Index < RowCount; Index++) { + for (Index = 0; Index < HelpLine; Index++) { PrintStringAt ( LocalScreen.RightColumn - gHelpBlockWidth, Index + TopRow, -- 2.39.2