Source code of Windows XP (NT5)
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
9.6 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 */