📄 kwtools.c
字号:
/*******************************************************
Copyright (c) 2005 Lenovo Corporation
All rights reserved.
Module Name:
kwTools.c
Abstract:
提供常用好使的工具函数
Author: WangZhe
Revision History
********************************************************/
#include "kwTools.h"
extern const UINTN UNICODE_GB_COUNT;
extern const CHAR8 UNICODE_GB_TABLE[];
#define WEBFTP_DEBUG_VER //调试版
void *MEM_ALLOC( UINTN n )//开辟内存
{
void *p = NULL;
p = AllocateZeroPool (n);
return p;
}
void MEM_FREE( void *pBase )//释放内存
{
FreePool(pBase);
}
//返回最终8为字符串的长度
INTN String16To8(CHAR16* SrcStr, CHAR8* DestStr)
{
INTN counter = 0;
CHAR16 * pchar16;
if (SrcStr == NULL)
return -1;
pchar16 = SrcStr;
while ( (*pchar16 != 0) && (*pchar16 != EOF))
{
if (*pchar16 & 0xff00) //chinese word, dissolve into 2 char
{
//DestStr[counter++] = (*pchar16 >> 8) & 0xff;
//DestStr[counter++] = *pchar16 & 0xff;
DestStr[counter++] = UNICODE_GB_TABLE[(*pchar16) * 2];
DestStr[counter++] = UNICODE_GB_TABLE[(*pchar16) * 2+1];
}
else //english word
DestStr[counter++] = *pchar16 & 0xff;
pchar16++;
}
DestStr[counter] = 0;
return counter;
}
//返回最终16为字符串的长度
INTN String8To16(CHAR8* SrcStr, CHAR16* DestStr)
{
INTN len=0,counter = 0;
CHAR8 * pchar;
CHAR16 unicodechar;
pchar = SrcStr;
if (pchar == NULL)
return -1;
while ( (*pchar != 0) && (*pchar != EOF))
{
unicodechar = 0;
if (*pchar < 0x80) //english word
{
unicodechar = *pchar;
pchar = pchar + 1;
len++;
}
else //chinese world
{
unicodechar = *(pchar);
unicodechar = unicodechar << 8;
unicodechar += *(pchar+1);
pchar = pchar + 2;
len++;
len++;
}
DestStr[counter++] = unicodechar;
}
DestStr[counter] = 0;
return counter;
}
//返回最终16为字符串的长度
//将接收的宽8位字符串(其实已经是Unicode编码形式了),变成Unicode
//只有连续2个SrcStr为0,才是结尾
INTN StringWide8To16(CHAR8* SrcStr, CHAR16* DestStr)
{
INTN counter = 0;
CHAR8 * pchar;
CHAR16 unicodechar;
pchar = SrcStr;
if (pchar == NULL)
return -1;
while (!((*pchar == 0) && (*(pchar+1)== 0)))
{
unicodechar = 0;
unicodechar = *(pchar);
unicodechar = unicodechar << 8;
unicodechar += *(pchar+1);
pchar += 2;
DestStr[counter++] = unicodechar;
}
DestStr[counter] = 0;
return counter;
}
//-----------------------------------------------------------------------------
// Copy from SEnv
//-----------------------------------------------------------------------------
VOID
KWFreeFileArg (
IN SHELL_FILE_ARG *Arg
)
{
//
// Free memory for all elements belonging to Arg
//
if (Arg->Parent)
Arg->Parent->Close (Arg->Parent);
if (Arg->ParentName)
FreePool (Arg->ParentName);
if (Arg->ParentDevicePath)
FreePool (Arg->ParentDevicePath);
if (Arg->FullName)
FreePool (Arg->FullName);
if (Arg->FileName)
FreePool (Arg->FileName);
if (Arg->Handle)
Arg->Handle->Close (Arg->Handle);
if (Arg->Info)
FreePool (Arg->Info);
if (Arg->Link.Flink)
RemoveEntryList (&Arg->Link);
//
// Free memory for Arg
//
FreePool (Arg);
}
//-----------------------------------------------------------------------------
// File System
//-----------------------------------------------------------------------------
LIST_ENTRY FileList;
UINTN InitFileListFlag = 0;
EFI_FILE_HANDLE kwfopen(CHAR16 *filename,CHAR16 *AccessMode)
{
EFI_STATUS Status;
SHELL_FILE_ARG *FileArg;
EFI_FILE_HANDLE File = 0;
UINT64 OpenMode = 0;
CHAR16 ch;
BOOLEAN CreateNewFile=FALSE;
EFI_FILE_INFO *FileInfo;
INTN FileInfoSize=SIZE_OF_EFI_FILE_INFO + 1024;
LIST_ENTRY *Link;
if (InitFileListFlag == 0)
{
InitializeListHead (&FileList);
InitFileListFlag |= 1;
}
OpenMode = 0;
do {
if (AccessMode)
ch = *AccessMode++;
else
ch = 0;
if (ch == 'r')
{
OpenMode |= EFI_FILE_MODE_READ;
}
else if (ch == '+')
{
OpenMode |= EFI_FILE_MODE_READ;
OpenMode |= EFI_FILE_MODE_WRITE;
}
else if (ch == 'w')
{
OpenMode |= EFI_FILE_MODE_CREATE;
OpenMode |= EFI_FILE_MODE_WRITE;
CreateNewFile=TRUE;
}
else
ch = 0;
} while (ch);
Status = ShellFileMetaArg(filename, &FileList);
if (EFI_ERROR(Status))
{
Status = EFI_NOT_FOUND;
Print(L"open file error!\n");
}
if (IsListEmpty(&FileList))
{
Status = EFI_NOT_FOUND;
Print(L"open file error!\n");
}
//FileArg = CR(FileList.Flink, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
for (Link=FileList.Flink; Link!=&FileList; Link=Link->Flink)
{
FileArg = CR(Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
if (StrCmp(FileArg->FileName,filename)==0)
{
break;
}
}
if (OpenMode & EFI_FILE_MODE_CREATE)
{
Status = FileArg->Parent->Open(FileArg->Parent,
&FileArg->Handle,
FileArg->FileName,
FILE_CREATE,
0
);
if (EFI_ERROR(Status))
//return EFI_NOT_FOUND;
return NULL;
}
File = FileArg->Handle;
if(CreateNewFile)//如果是新创建文件,将它清空
{
//创建文件属性INFO,开辟空间
FileInfo = (EFI_FILE_INFO*)AllocatePool(FileInfoSize);
//获取文件属性
File->GetInfo (File, &GenericFileInfo,&FileInfoSize, FileInfo );
//设置文件属性
FileInfo->FileSize = 0;
File->SetInfo( File,&GenericFileInfo,(UINTN) FileInfo->Size,FileInfo);
if (FileInfo != NULL){
BS->FreePool (FileInfo);
}
}
return File;
}
UINTN kwfread(VOID *Buffer,UINTN ItemSize,UINTN Length,EFI_FILE_HANDLE Handle)
{
EFI_STATUS Status;
UINTN size;
size = Length * ItemSize;
if (Handle)
Status = Handle->Read(Handle,&size,Buffer);
else
size = 0;
return size;
}
//读出Handle此时所处位置的一行出来行的结束标记是\n\r就是 0D 0A
//返回这一行的长度,读取完毕后Handle处于\r后的那个位置
UINTN kwfreadLine(UINT8 *ExBuffer,EFI_FILE_HANDLE Handle)
{
UINT8 *Buffer = NULL;
UINT64 StartPostion;//行的开始位置
UINT64 EndPostion;//行的结束位置
UINT64 CurPosition,tmpPosition;
UINTN ReadSize;
UINT64 i,filesize;
UINT64 nextBegin;//读取完毕后位置
filesize = kwfsize(Handle);
BS->AllocatePool(EfiLoaderData,1024, &Buffer);//开辟缓冲区
if (Buffer == NULL) {
Print(L"Can not allocate a buffer\n");
return 0;
}
Handle->GetPosition(Handle,&CurPosition);
tmpPosition = CurPosition;
//从文件指针现在的位置,向前读取1024个字节
//寻找此行开始位置
while(1)
{
if(tmpPosition<=0)
{
StartPostion=0;break;
}
else
{
if(tmpPosition<1024)//前面的数据不足1024个
{
Handle->SetPosition(Handle,0);//指针到文件头
ReadSize = (UINTN)tmpPosition+1;
}
else //可以读取1024个字节出来
{
Handle->SetPosition(Handle,tmpPosition-1023);//指针到文件头
ReadSize = 1024;
}
Handle->Read(Handle,&ReadSize,Buffer);//读内容出来
for(i=ReadSize-1;i>=1;i--)//寻找分割符\n\r
{
if((Buffer[i-1]==0x0d)&&(Buffer[i]==0x0a))
{
StartPostion = CurPosition-ReadSize+2+i;//找到开始位置
break;
}
}
if(i>=1)break;
Handle->GetPosition(Handle,&tmpPosition);
}
}
//向后找,找到此行结束位置
tmpPosition = CurPosition;
Handle->SetPosition(Handle,tmpPosition);
while(1)
{
if((filesize-tmpPosition+1)<1024)//到结尾不足1024个
ReadSize = (UINTN)(filesize-tmpPosition);
else ReadSize = 1024;
Handle->Read(Handle,&ReadSize,Buffer);//读内容出来
for(i=0;i<ReadSize;i++)//寻找分割符\n\r
{
if((Buffer[i]==0x0d)&&(Buffer[i+1]==0x0a))
{
EndPostion =CurPosition+i-1;//找到结束位置
nextBegin =CurPosition+i+2;
if(nextBegin>filesize)nextBegin=filesize;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -