blob: 9f967803724388d1fe4f34104fd09f1b7e474e45 [file] [log] [blame]
/** @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;
}