https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
		
			
				
	
	
		
			257 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Implementation of various string and line routines
 | |
| 
 | |
|   Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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;
 | |
| }
 |