| /** @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 occurred. | |
| @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 occurred. | |
| @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 occurred. | |
| @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 occurred. | |
| @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; | |
| } |