You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
508 lines
10 KiB
508 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1999 Intel Corporation
|
|
|
|
Module Name:
|
|
libMisc.c
|
|
|
|
Abstract:
|
|
Defines various routines for Line handling
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _LIB_MISC
|
|
#define _LIB_MISC
|
|
|
|
#include "libMisc.h"
|
|
|
|
VOID
|
|
EditorError (
|
|
IN EFI_STATUS Status,
|
|
IN CHAR16 *Msg
|
|
)
|
|
{
|
|
CHAR16 *Str;
|
|
CHAR16 *Error;
|
|
|
|
Error = AllocatePool(255);
|
|
StatusToString(Error,Status);
|
|
Str = PoolPrint(L"%s: %s",Msg,Error);
|
|
MainEditor.StatusBar->SetStatusString(Str);
|
|
|
|
FreePool(Str);
|
|
FreePool(Error);
|
|
}
|
|
|
|
|
|
EE_LINE*
|
|
LineDup (
|
|
IN EE_LINE *Src
|
|
)
|
|
{
|
|
EE_LINE *Dest;
|
|
UINTN i;
|
|
Dest = AllocatePool(sizeof(EE_LINE));
|
|
Dest->Signature = EE_LINE_LIST;
|
|
Dest->Size = Src->Size;
|
|
for (i = 0; i < 0x10; i++) {
|
|
Dest->Buffer[i] = Src->Buffer[i];
|
|
}
|
|
|
|
Dest->Link = Src->Link;
|
|
|
|
return Dest;
|
|
}
|
|
|
|
VOID
|
|
LineSplit (
|
|
IN EE_LINE *Src,
|
|
IN UINTN Pos,
|
|
OUT EE_LINE *Dest
|
|
)
|
|
{
|
|
UINTN i;
|
|
Dest->Size = Src->Size - Pos;
|
|
for (i = 0; (i+Pos) < Src->Size; i++) {
|
|
Dest->Buffer[i] = Src->Buffer[Pos+i];
|
|
}
|
|
}
|
|
|
|
VOID
|
|
LineMerge (
|
|
IN OUT EE_LINE* Line1,
|
|
IN UINTN Line1Pos,
|
|
IN EE_LINE* Line2,
|
|
IN UINTN Line2Pos
|
|
)
|
|
{
|
|
UINTN Size;
|
|
UINTN i;
|
|
|
|
Size = Line1Pos + Line2->Size - Line2Pos;
|
|
Line1->Size = Size;
|
|
|
|
for (i = 0; i + Line2Pos < 0x10; i++) {
|
|
Line1->Buffer[Line1Pos+i] = Line2->Buffer[Line2Pos+i];
|
|
}
|
|
|
|
}
|
|
|
|
|
|
EE_LINE*
|
|
LineFirst (
|
|
VOID
|
|
)
|
|
{
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.BufferImage->ListHead->Flink;
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LineLast (
|
|
VOID
|
|
)
|
|
{
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.BufferImage->ListHead->Blink;
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LineNext (
|
|
VOID
|
|
)
|
|
{
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Flink;
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LinePrevious (
|
|
VOID
|
|
)
|
|
{
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Blink;
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LineAdvance (
|
|
IN UINTN Count
|
|
)
|
|
{
|
|
UINTN i;
|
|
|
|
for (i = 0; i < Count && (MainEditor.FileBuffer->CurrentLine->Flink != MainEditor.BufferImage->ListHead); i++ ) {
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Flink;
|
|
}
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LineRetreat (
|
|
IN UINTN Count
|
|
)
|
|
{
|
|
UINTN i;
|
|
|
|
for (i = 0; i < Count && (MainEditor.FileBuffer->CurrentLine->Blink != MainEditor.BufferImage->ListHead); i++ ) {
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Blink;
|
|
}
|
|
return LineCurrent();
|
|
}
|
|
|
|
EE_LINE*
|
|
LineCurrent (VOID)
|
|
{
|
|
return CR(MainEditor.FileBuffer->CurrentLine,EE_LINE,Link,EE_LINE_LIST);
|
|
}
|
|
|
|
VOID
|
|
LineDeleteAt (
|
|
LIST_ENTRY* Link,
|
|
UINTN Pos,
|
|
UINTN Num
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
EE_LINE *Next;
|
|
UINTN LinePos;
|
|
UINTN NextPos;
|
|
LIST_ENTRY *NextLink;
|
|
LIST_ENTRY *Blank;
|
|
|
|
NextLink = Link;
|
|
|
|
MainEditor.BufferImage->NumBytes -= Num;
|
|
Num += Pos;
|
|
while (Num > 0x10) {
|
|
NextLink = NextLink->Flink;
|
|
Num -= 0x10;
|
|
}
|
|
|
|
Blank = MainEditor.BufferImage->ListHead->Blink;
|
|
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
Next = CR(NextLink,EE_LINE,Link,EE_LINE_LIST);
|
|
NextPos = Num;
|
|
LinePos = Pos;
|
|
|
|
while (NextLink != Blank) {
|
|
while (LinePos < Line->Size && NextPos < Next->Size) {
|
|
Line->Buffer[LinePos] = Next->Buffer[NextPos];
|
|
++LinePos;
|
|
++NextPos;
|
|
}
|
|
if (NextPos == Next->Size) {
|
|
NextLink = NextLink->Flink;
|
|
Next = CR(NextLink,EE_LINE,Link,EE_LINE_LIST);
|
|
NextPos = 0;
|
|
}
|
|
if (LinePos == Line->Size) {
|
|
Link = Link->Flink;
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
LinePos = 0;
|
|
}
|
|
}
|
|
Line->Size = LinePos;
|
|
Link = Link->Flink;
|
|
|
|
while (Link != Blank) {
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
NextLink = Link->Flink;
|
|
RemoveEntryList(Link);
|
|
FreePool(Line);
|
|
Link = NextLink;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
LinePrint (
|
|
LIST_ENTRY* Link,
|
|
UINTN Offset,
|
|
UINTN Row
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
UINTN j;
|
|
UINTN Pos;
|
|
|
|
if (Row > DISP_MAX_ROWS) {
|
|
return;
|
|
}
|
|
MainEditor.FileBuffer->ClearLine (Row);
|
|
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
|
|
PrintAt(0,Row,L"%X",Offset);
|
|
if (Line->Size == 0) {
|
|
return;
|
|
}
|
|
|
|
for (j = 0; j < 0x08 && j < Line->Size; j++) {
|
|
Pos = HEX_POSITION + (j*3);
|
|
if (Line->Buffer[j] < 0x10) {
|
|
PrintAt(Pos,Row,L"0");
|
|
++Pos;
|
|
}
|
|
PrintAt(Pos,Row,L"%x ",Line->Buffer[j]);
|
|
}
|
|
while (j < 0x10 && j < Line->Size) {
|
|
Pos = HEX_POSITION + (j*3) + 1;
|
|
if (Line->Buffer[j] < 0x10) {
|
|
PrintAt(Pos,Row,L"0");
|
|
++Pos;
|
|
}
|
|
PrintAt(Pos,Row,L"%x ",Line->Buffer[j]);
|
|
++j;
|
|
}
|
|
for (j = 0; j < 0x10 && j < Line->Size; j++) {
|
|
Pos = ASCII_POSITION+j;
|
|
if (IsValidChar(Line->Buffer[j])) {
|
|
PrintAt(Pos,Row,L"%c",(CHAR16)Line->Buffer[j]);
|
|
} else {
|
|
PrintAt(Pos,Row,L"%c",'.');
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
DigitPrint (
|
|
IN LIST_ENTRY *Link,
|
|
IN UINTN Digit,
|
|
IN UINTN Row
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
UINTN Pos;
|
|
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
|
|
Pos = HEX_POSITION + (Digit*3);
|
|
if (Digit > 0x07) {
|
|
Pos++;
|
|
}
|
|
if (Line->Buffer[Digit] < 0x10) {
|
|
PrintAt(Pos,Row,L"0");
|
|
++Pos;
|
|
}
|
|
PrintAt(Pos,Row,L"%x ",Line->Buffer[Digit]);
|
|
|
|
Pos = ASCII_POSITION+Digit;
|
|
if (IsValidChar(Line->Buffer[Digit])) {
|
|
PrintAt(Pos,Row,L"%c",(CHAR16)Line->Buffer[Digit]);
|
|
} else {
|
|
PrintAt(Pos,Row,L"%c",'.');
|
|
}
|
|
}
|
|
|
|
UINTN
|
|
StrStr (
|
|
IN CHAR16 *Str,
|
|
IN CHAR16 *Pat
|
|
)
|
|
{
|
|
INTN *Failure;
|
|
INTN i,j;
|
|
INTN Lenp;
|
|
INTN Lens;
|
|
|
|
Lenp = StrLen(Pat);
|
|
Lens = StrLen(Str);
|
|
|
|
Failure = AllocatePool(Lenp*sizeof(INTN));
|
|
Failure[0] = -1;
|
|
for (j=1; j< Lenp; j++ ) {
|
|
i = Failure[j-1];
|
|
while ( (Pat[j] != Pat[i+1]) && (i >= 0)) {
|
|
i = Failure[i];
|
|
}
|
|
if ( Pat[i] == Pat[i+1]) {
|
|
Failure[j] = i+1;
|
|
} else {
|
|
Failure[j] = -1;
|
|
}
|
|
}
|
|
|
|
i = 0;
|
|
j = 0;
|
|
while (i < Lens && j < Lenp) {
|
|
if (Str[i] == Pat[j]) {
|
|
i++;
|
|
j++;
|
|
} else if (j == 0) {
|
|
i++;
|
|
} else {
|
|
j = Failure[j-1] + 1;
|
|
}
|
|
}
|
|
|
|
FreePool(Failure);
|
|
|
|
return ((j == Lenp) ? (i - Lenp) : -1)+1;
|
|
|
|
}
|
|
|
|
VOID
|
|
FileModification (
|
|
VOID
|
|
)
|
|
{
|
|
if ( !MainEditor.FileModified ) {
|
|
MainEditor.StatusBar->SetStatusString(L"File Modified");
|
|
MainEditor.FileModified = TRUE;
|
|
}
|
|
|
|
}
|
|
|
|
EFI_STATUS
|
|
Nothing (
|
|
VOID
|
|
)
|
|
{
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
|
|
STATIC
|
|
VOID
|
|
LineDeleteAll (
|
|
IN LIST_ENTRY* Head
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
LIST_ENTRY *Item;
|
|
|
|
Item = Head->Flink;
|
|
|
|
while (Item != Head->Blink) {
|
|
|
|
RemoveEntryList(Item);
|
|
|
|
Line = CR(Item,EE_LINE,Link,EE_LINE_LIST);
|
|
|
|
FreePool (Line);
|
|
Item = Head->Flink;
|
|
}
|
|
MainEditor.FileBuffer->CurrentLine = Head->Flink;
|
|
}
|
|
|
|
EE_LINE*
|
|
LineCreateNode (
|
|
IN LIST_ENTRY* Head
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
UINTN i;
|
|
|
|
Line = AllocatePool (sizeof(EE_LINE));
|
|
|
|
if ( Line == NULL ) {
|
|
MainEditor.StatusBar->SetStatusString(L"LineCreateNode: Could not allocate Node");
|
|
return NULL;
|
|
}
|
|
|
|
Line->Signature = EE_LINE_LIST;
|
|
Line->Size = 0;
|
|
|
|
for (i = 0; i < 0x10; i++) {
|
|
Line->Buffer[i] = 0x00;
|
|
}
|
|
|
|
InsertTailList(Head,&Line->Link);
|
|
|
|
return Line;
|
|
}
|
|
|
|
VOID
|
|
BufferToList (
|
|
OUT LIST_ENTRY *Head,
|
|
IN UINTN Size,
|
|
IN VOID *Buffer
|
|
)
|
|
{
|
|
EE_LINE *Line = NULL;
|
|
UINTN i = 0;
|
|
UINTN LineSize;
|
|
UINT8 *UintBuffer;
|
|
LIST_ENTRY *Blank;
|
|
|
|
LineDeleteAll(Head);
|
|
Blank = Head->Flink;
|
|
RemoveEntryList (Blank);
|
|
|
|
UintBuffer = Buffer;
|
|
|
|
while (i < Size) {
|
|
|
|
Line = LineCreateNode (Head);
|
|
|
|
|
|
if (Line == NULL || Line == (EE_LINE*)BAD_POINTER) {
|
|
EditorError(EFI_OUT_OF_RESOURCES,L"BufferToList: Could not allocate another line");
|
|
break;
|
|
}
|
|
for (LineSize = 0; LineSize < 0x10 && i < Size; LineSize++) {
|
|
Line->Buffer[LineSize] = UintBuffer[i];
|
|
i++;
|
|
}
|
|
Line->Size = LineSize;
|
|
}
|
|
|
|
InsertTailList(Head,Blank);
|
|
|
|
MainEditor.BufferImage->NumBytes = Size;
|
|
|
|
MainEditor.FileBuffer->Offset = 0x00;
|
|
MainEditor.StatusBar->SetOffset(0x00);
|
|
|
|
MainEditor.FileBuffer->CurrentLine = MainEditor.BufferImage->ListHead->Flink;
|
|
}
|
|
|
|
EFI_STATUS
|
|
ListToBuffer (
|
|
IN LIST_ENTRY *Head,
|
|
IN OUT UINTN *Size,
|
|
OUT VOID **Buffer
|
|
)
|
|
{
|
|
EE_LINE *Line;
|
|
UINTN i;
|
|
UINTN LineSize;
|
|
UINT8 *UintBuffer;
|
|
LIST_ENTRY *Link;
|
|
LIST_ENTRY *Blank;
|
|
|
|
i = 0;
|
|
|
|
Blank = Head->Blink;
|
|
RemoveEntryList(Blank);
|
|
|
|
*Size = MainEditor.BufferImage->NumBytes;
|
|
*Buffer = AllocatePool(*Size);
|
|
|
|
if (*Buffer == NULL) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
|
|
UintBuffer = *Buffer;
|
|
|
|
for(Link = Head->Flink; Link != Head; Link = Link->Flink) {
|
|
|
|
Line = CR(Link,EE_LINE,Link,EE_LINE_LIST);
|
|
for (LineSize = 0; LineSize < Line->Size; LineSize++) {
|
|
UintBuffer[i] = Line->Buffer[LineSize];
|
|
++i;
|
|
}
|
|
|
|
}
|
|
*Size = i;
|
|
InsertTailList(Head,Blank);
|
|
|
|
return EFI_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
#endif /* _LIB_MISC */
|