|
|
/*++
Copyright (c) 1999 Intel Corporation
Module Name: libMisc.c
Abstract: Implementation of various string and line routines
--*/
#include "libMisc.h"
#ifndef _LIB_MISC
#define _LIB_MISC
UINTN StrInsert (CHAR16**,CHAR16,UINTN,UINTN); UINTN StrnCpy (CHAR16*,CHAR16*,UINTN,UINTN); INTN StrStr (CHAR16*,CHAR16*);
VOID LineCat (EFI_EDITOR_LINE*,EFI_EDITOR_LINE*); VOID LineDeleteAt (EFI_EDITOR_LINE*,UINTN); VOID LineSplit (EFI_EDITOR_LINE*,UINTN,EFI_EDITOR_LINE*); VOID LineMerge (EFI_EDITOR_LINE*,UINTN,EFI_EDITOR_LINE*,UINTN); EFI_EDITOR_LINE* LineDup (EFI_EDITOR_LINE*);
EFI_EDITOR_LINE* LineNext (VOID); EFI_EDITOR_LINE* LinePrevious (VOID); EFI_EDITOR_LINE* LineAdvance (UINTN Count); EFI_EDITOR_LINE* LineRetreat (UINTN Count); EFI_EDITOR_LINE* LineCurrent (VOID);
EFI_EDITOR_LINE* LineFirst (VOID); EFI_EDITOR_LINE* LineLast (VOID);
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); }
UINTN StrInsert ( IN OUT CHAR16 **Str, IN CHAR16 Char, IN UINTN Pos, IN UINTN StrSize ) { UINTN i; CHAR16 *s;
i = (StrSize)*2;
*Str = ReallocatePool(*Str,i,i+2);
s = *Str; for (i = StrSize-1; i > Pos; i--) { s[i] = s[i-1]; } s[i] = Char; return (StrSize+1); }
UINTN StrnCpy ( OUT CHAR16 *Dest, IN CHAR16 *Src, IN UINTN Offset, IN UINTN Num ) { UINTN i,j; j = 0;
for ( i = Offset; (i < Num) && (Src[j] != 0); i++ ) { Dest[i] = Src[j]; ++j; }
return j; }
INTN 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 LineCat ( IN OUT EFI_EDITOR_LINE* Dest, IN EFI_EDITOR_LINE* Src ) { CHAR16 *Str; UINTN Size; Size = Dest->Size - 1;
Dest->Buffer[Size] = 0;
Str = PoolPrint (L"%s%s",Dest->Buffer,Src->Buffer);
Dest->Size = Size + Src->Size;
FreePool (Dest->Buffer); FreePool (Src->Buffer); Dest->Buffer = Str; }
VOID LineDeleteAt ( IN OUT EFI_EDITOR_LINE* Line, IN UINTN Pos ) { UINTN i;
for ( i = Pos; i < Line->Size; i++) { Line->Buffer[i] = Line->Buffer[i+1]; } --Line->Size; }
EFI_EDITOR_LINE* LineDup ( IN EFI_EDITOR_LINE *Src ) { EFI_EDITOR_LINE *Dest; Dest = AllocatePool(sizeof(EFI_EDITOR_LINE)); Dest->Signature = EFI_EDITOR_LINE_LIST; Dest->Size = Src->Size; Dest->Buffer = PoolPrint(L"%s\0",Src->Buffer);
Dest->Link = Src->Link;
return Dest; }
VOID LineSplit ( IN EFI_EDITOR_LINE *Src, IN UINTN Pos, OUT EFI_EDITOR_LINE *Dest ) { Dest->Size = Src->Size - Pos; Dest->Buffer = PoolPrint(L"%s\0",Src->Buffer+Pos); }
VOID LineMerge ( IN OUT EFI_EDITOR_LINE* Line1, IN UINTN Line1Pos, IN EFI_EDITOR_LINE* Line2, IN UINTN Line2Pos ) { UINTN Size; CHAR16 *Buffer;
Size = Line1Pos + Line2->Size - Line2Pos; Line1->Size = Size;
Buffer = PoolPrint(L"%s%s\0",Line1->Buffer,Line2->Buffer+Line2Pos);
FreePool(Line1->Buffer);
Line1->Buffer = Buffer;
}
EFI_EDITOR_LINE* LineFirst ( VOID ) { MainEditor.FileBuffer->CurrentLine = MainEditor.FileImage->ListHead->Flink; return LineCurrent(); }
EFI_EDITOR_LINE* LineLast ( VOID ) { MainEditor.FileBuffer->CurrentLine = MainEditor.FileImage->ListHead->Blink; return LineCurrent(); }
EFI_EDITOR_LINE* LineNext ( VOID ) { LIST_ENTRY *Link; Link = MainEditor.FileBuffer->CurrentLine->Flink; if (Link == MainEditor.FileImage->ListHead) { Link = Link->Flink; } MainEditor.FileBuffer->CurrentLine = Link; return LineCurrent(); }
EFI_EDITOR_LINE* LinePrevious ( VOID ) { LIST_ENTRY *Link; Link = MainEditor.FileBuffer->CurrentLine->Blink; if (Link == MainEditor.FileImage->ListHead) { Link = Link->Blink; } MainEditor.FileBuffer->CurrentLine = Link; return LineCurrent(); }
EFI_EDITOR_LINE* LineAdvance ( IN UINTN Count ) { UINTN i;
for (i = 0; i < Count && (MainEditor.FileBuffer->CurrentLine->Flink != MainEditor.FileImage->ListHead); i++ ) { MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Flink; } return LineCurrent(); }
EFI_EDITOR_LINE* LineRetreat ( IN UINTN Count ) { UINTN i;
for (i = 0; i < Count && (MainEditor.FileBuffer->CurrentLine->Blink != MainEditor.FileImage->ListHead); i++ ) { MainEditor.FileBuffer->CurrentLine = MainEditor.FileBuffer->CurrentLine->Blink; } return LineCurrent(); }
EFI_EDITOR_LINE* LineCurrent ( VOID ) { return CR(MainEditor.FileBuffer->CurrentLine,EFI_EDITOR_LINE,Link,EFI_EDITOR_LINE_LIST); }
UINTN UnicodeToAscii ( IN CHAR16 *UStr, IN UINTN Length, OUT CHAR8 *AStr ) { UINTN i;
for (i = 0; i < Length; i++) { *AStr++ = (CHAR8)*UStr++; }
return i; }
#endif
|