git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11759 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			263 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Implementation of various string and line routines
 | |
|   
 | |
|   Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>
 | |
|   This program and the accompanying materials
 | |
|   are licensed and made available under the terms and conditions of the BSD License
 | |
|   which accompanies this distribution.  The full text of the license may be found at
 | |
|   http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "HexEditor.h"
 | |
| 
 | |
| extern BOOLEAN  HEditorMouseAction;
 | |
| 
 | |
| /**
 | |
|   Free a line and it's internal buffer.
 | |
|   
 | |
|   @param[in] Src    The line to be freed.
 | |
| **/
 | |
| VOID
 | |
| HLineFree (
 | |
|   IN  HEFI_EDITOR_LINE *Src
 | |
|   )
 | |
| {
 | |
|   if (Src == NULL) {
 | |
|     return ;
 | |
|   }
 | |
| 
 | |
|   SHELL_FREE_NON_NULL (Src);
 | |
| 
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Advance to the next Count lines.
 | |
| 
 | |
|   @param[in] Count      The line number to advance.
 | |
| 
 | |
|   @retval NULL An error occured.
 | |
|   @return A pointer to the line after advance.
 | |
| **/
 | |
| HEFI_EDITOR_LINE *
 | |
| HLineAdvance (
 | |
|   IN  UINTN Count
 | |
|   )
 | |
| {
 | |
|   UINTN             Index;
 | |
|   HEFI_EDITOR_LINE  *Line;
 | |
| 
 | |
|   Line = HMainEditor.BufferImage->CurrentLine;
 | |
|   if (Line == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   for (Index = 0; Index < Count; Index++) {
 | |
|     //
 | |
|     // if already last line
 | |
|     //
 | |
|     if (Line->Link.ForwardLink == HMainEditor.BufferImage->ListHead) {
 | |
|       return NULL;
 | |
|     }
 | |
| 
 | |
|     Line = CR (Line->Link.ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);
 | |
|   }
 | |
| 
 | |
|   return Line;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Retreat to the previous Count lines.
 | |
| 
 | |
|   @param[in] Count    The line number to retreat.
 | |
| 
 | |
|   @retval NULL An error occured.
 | |
|   @return A pointer to the line after retreat.
 | |
| **/
 | |
| HEFI_EDITOR_LINE *
 | |
| HLineRetreat (
 | |
|   IN  UINTN Count
 | |
|   )
 | |
| {
 | |
|   UINTN             Index;
 | |
|   HEFI_EDITOR_LINE  *Line;
 | |
| 
 | |
|   Line = HMainEditor.BufferImage->CurrentLine;
 | |
|   if (Line == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   for (Index = 0; Index < Count; Index++) {
 | |
|     //
 | |
|     // already the first line
 | |
|     //
 | |
|     if (Line->Link.BackLink == HMainEditor.BufferImage->ListHead) {
 | |
|       return NULL;
 | |
|     }
 | |
| 
 | |
|     Line = CR (Line->Link.BackLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);
 | |
|   }
 | |
| 
 | |
|   return Line;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Advance/Retreat lines.
 | |
| 
 | |
|   @param[in] Count      The line number to advance/retreat.
 | |
|                             >0 : advance
 | |
|                             <0: retreat  
 | |
| 
 | |
|   @retval NULL An error occured.
 | |
|   @return A pointer to the line after move.
 | |
| **/
 | |
| HEFI_EDITOR_LINE *
 | |
| HMoveLine (
 | |
|   IN  INTN Count
 | |
|   )
 | |
| {
 | |
|   HEFI_EDITOR_LINE  *Line;
 | |
|   UINTN             AbsCount;
 | |
| 
 | |
|   //
 | |
|   // difference with MoveCurrentLine
 | |
|   //     just return Line
 | |
|   //     do not set currentline to Line
 | |
|   //
 | |
|   if (Count <= 0) {
 | |
|     AbsCount  = (UINTN)ABS(Count);
 | |
|     Line      = HLineRetreat (AbsCount);
 | |
|   } else {
 | |
|     Line = HLineAdvance ((UINTN)Count);
 | |
|   }
 | |
| 
 | |
|   return Line;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Advance/Retreat lines and set CurrentLine in BufferImage to it.
 | |
| 
 | |
|   @param[in] Count    The line number to advance/retreat.
 | |
|                           >0 : advance
 | |
|                           <0: retreat
 | |
| 
 | |
|   @retval NULL An error occured.
 | |
|   @return A pointer to the line after move.
 | |
| **/
 | |
| HEFI_EDITOR_LINE *
 | |
| HMoveCurrentLine (
 | |
|   IN  INTN Count
 | |
|   )
 | |
| {
 | |
|   HEFI_EDITOR_LINE  *Line;
 | |
|   UINTN             AbsCount;
 | |
| 
 | |
|   //
 | |
|   // <0: retreat
 | |
|   // >0: advance
 | |
|   //
 | |
|   if (Count <= 0) {
 | |
|     AbsCount  = (UINTN)ABS(Count);
 | |
|     Line      = HLineRetreat (AbsCount);
 | |
|   } else {
 | |
|     Line = HLineAdvance ((UINTN)Count);
 | |
|   }
 | |
| 
 | |
|   if (Line == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   HMainEditor.BufferImage->CurrentLine = Line;
 | |
| 
 | |
|   return Line;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Free all the lines in HBufferImage.
 | |
|     Fields affected:
 | |
|     Lines
 | |
|     CurrentLine
 | |
|     NumLines
 | |
|     ListHead 
 | |
| 
 | |
|   @param[in] ListHead     The list head.
 | |
|   @param[in] Lines        The lines.
 | |
| 
 | |
|   @retval EFI_SUCCESS     The operation was successful.
 | |
| **/
 | |
| EFI_STATUS
 | |
| HFreeLines (
 | |
|   IN LIST_ENTRY   *ListHead,
 | |
|   IN HEFI_EDITOR_LINE *Lines
 | |
|   )
 | |
| {
 | |
|   LIST_ENTRY        *Link;
 | |
|   HEFI_EDITOR_LINE  *Line;
 | |
| 
 | |
|   //
 | |
|   // release all the lines
 | |
|   //
 | |
|   if (Lines != NULL) {
 | |
| 
 | |
|     Line  = Lines;
 | |
|     Link  = &(Line->Link);
 | |
|     do {
 | |
|       Line  = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);
 | |
|       Link  = Link->ForwardLink;
 | |
|       HLineFree (Line);
 | |
|     } while (Link != ListHead);
 | |
|   }
 | |
| 
 | |
|   ListHead->ForwardLink = ListHead;
 | |
|   ListHead->BackLink = ListHead;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get the X information for the mouse.
 | |
| 
 | |
|   @param[in] GuidX      The change.
 | |
| 
 | |
|   @return the new information.
 | |
| **/
 | |
| INT32
 | |
| HGetTextX (
 | |
|   IN INT32 GuidX
 | |
|   )
 | |
| {
 | |
|   INT32 Gap;
 | |
| 
 | |
|   HMainEditor.MouseAccumulatorX += GuidX;
 | |
|   Gap = (HMainEditor.MouseAccumulatorX * (INT32) HMainEditor.ScreenSize.Column) / (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionX);
 | |
|   HMainEditor.MouseAccumulatorX = (HMainEditor.MouseAccumulatorX * (INT32) HMainEditor.ScreenSize.Column) % (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionX);
 | |
|   HMainEditor.MouseAccumulatorX = HMainEditor.MouseAccumulatorX / (INT32) HMainEditor.ScreenSize.Column;
 | |
|   return Gap;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get the Y information for the mouse.
 | |
| 
 | |
|   @param[in] GuidY      The change.
 | |
| 
 | |
|   @return the new information.
 | |
| **/
 | |
| INT32
 | |
| HGetTextY (
 | |
|   IN INT32 GuidY
 | |
|   )
 | |
| {
 | |
|   INT32 Gap;
 | |
| 
 | |
|   HMainEditor.MouseAccumulatorY += GuidY;
 | |
|   Gap = (HMainEditor.MouseAccumulatorY * (INT32) HMainEditor.ScreenSize.Row) / (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionY);
 | |
|   HMainEditor.MouseAccumulatorY = (HMainEditor.MouseAccumulatorY * (INT32) HMainEditor.ScreenSize.Row) % (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionY);
 | |
|   HMainEditor.MouseAccumulatorY = HMainEditor.MouseAccumulatorY / (INT32) HMainEditor.ScreenSize.Row;
 | |
| 
 | |
|   return Gap;
 | |
| }
 |