mirror of https://github.com/acidanthera/audk.git
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 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;
|
|
}
|