simplefileparsing.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,457 行 · 第 1/3 页
C
1,457 行
/*++
Copyright (c) 2004, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
SimpleFileParsing.c
Abstract:
Generic but simple file parsing routines.
--*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "Tiano.h"
#include "EfiUtilityMsgs.h"
#include "SimpleFileParsing.h"
#define MAX_PATH 255
//
// just in case we get in an endless loop.
//
#define MAX_NEST_DEPTH 20
//
// number of wchars
//
#define MAX_STRING_IDENTIFIER_NAME 100
#define MAX_LINE_LEN 400
#define T_CHAR_SPACE ' '
#define T_CHAR_NULL 0
#define T_CHAR_CR '\r'
#define T_CHAR_TAB '\t'
#define T_CHAR_LF '\n'
#define T_CHAR_SLASH '/'
#define T_CHAR_BACKSLASH '\\'
#define T_CHAR_DOUBLE_QUOTE '"'
#define T_CHAR_LC_X 'x'
#define T_CHAR_0 '0'
#define T_CHAR_STAR '*'
//
// We keep a linked list of these for the source files we process
//
typedef struct _SOURCE_FILE {
FILE *Fptr;
T_CHAR *FileBuffer;
T_CHAR *FileBufferPtr;
unsigned int FileSize;
char FileName[MAX_PATH];
unsigned int LineNum;
BOOLEAN EndOfFile;
BOOLEAN SkipToHash;
struct _SOURCE_FILE *Previous;
struct _SOURCE_FILE *Next;
T_CHAR ControlCharacter;
} SOURCE_FILE;
typedef struct {
T_CHAR *FileBufferPtr;
} FILE_POSITION;
//
// Keep all our module globals in this structure
//
static struct {
SOURCE_FILE SourceFile;
BOOLEAN VerboseFile;
BOOLEAN VerboseToken;
} mGlobals;
static
unsigned int
t_strcmp (
T_CHAR *Buffer,
T_CHAR *Str
);
static
unsigned int
t_strncmp (
T_CHAR *Str1,
T_CHAR *Str2,
int Len
);
static
unsigned int
t_strlen (
T_CHAR *Str
);
static
void
RewindFile (
SOURCE_FILE *SourceFile
);
static
BOOLEAN
IsWhiteSpace (
SOURCE_FILE *SourceFile
);
static
unsigned int
SkipWhiteSpace (
SOURCE_FILE *SourceFile
);
static
BOOLEAN
EndOfFile (
SOURCE_FILE *SourceFile
);
static
void
PreprocessFile (
SOURCE_FILE *SourceFile
);
static
T_CHAR *
t_strcpy (
T_CHAR *Dest,
T_CHAR *Src
);
static
STATUS
ProcessIncludeFile (
SOURCE_FILE *SourceFile,
SOURCE_FILE *ParentSourceFile
);
static
STATUS
ParseFile (
SOURCE_FILE *SourceFile
);
static
FILE *
FindFile (
char *FileName,
char *FoundFileName,
unsigned int FoundFileNameLen
);
static
STATUS
ProcessFile (
SOURCE_FILE *SourceFile
);
static
STATUS
GetFilePosition (
FILE_POSITION *Fpos
);
static
STATUS
SetFilePosition (
FILE_POSITION *Fpos
);
STATUS
SFPInit (
VOID
)
/*++
Routine Description:
Arguments:
None.
Returns:
STATUS_SUCCESS always
--*/
{
memset ((void *) &mGlobals, 0, sizeof (mGlobals));
return STATUS_SUCCESS;
}
unsigned
int
SFPGetLineNumber (
VOID
)
/*++
Routine Description:
Return the line number of the file we're parsing. Used
for error reporting purposes.
Arguments:
None.
Returns:
The line number, or 0 if no file is being processed
--*/
{
return mGlobals.SourceFile.LineNum;
}
T_CHAR *
SFPGetFileName (
VOID
)
/*++
Routine Description:
Return the name of the file we're parsing. Used
for error reporting purposes.
Arguments:
None.
Returns:
A pointer to the file name. Null if no file is being
processed.
--*/
{
if (mGlobals.SourceFile.FileName[0]) {
return mGlobals.SourceFile.FileName;
}
return NULL;
}
STATUS
SFPOpenFile (
char *FileName
)
/*++
Routine Description:
Open a file for parsing.
Arguments:
FileName - name of the file to parse
Returns:
--*/
{
STATUS Status;
t_strcpy (mGlobals.SourceFile.FileName, FileName);
Status = ProcessIncludeFile (&mGlobals.SourceFile, NULL);
return Status;
}
BOOLEAN
SFPIsToken (
T_CHAR *Str
)
/*++
Routine Description:
Check to see if the specified token is found at
the current position in the input file.
Arguments:
Str - the token to look for
Returns:
TRUE - the token is next
FALSE - the token is not next
Notes:
We do a simple string comparison on this function. It is
the responsibility of the caller to ensure that the token
is not a subset of some other token.
The file pointer is advanced past the token in the input file.
--*/
{
unsigned int Len;
SkipWhiteSpace (&mGlobals.SourceFile);
if (EndOfFile (&mGlobals.SourceFile)) {
return FALSE;
}
if ((Len = t_strcmp (mGlobals.SourceFile.FileBufferPtr, Str)) > 0) {
mGlobals.SourceFile.FileBufferPtr += Len;
if (mGlobals.VerboseToken) {
printf ("Token: '%s'\n", Str);
}
return TRUE;
}
return FALSE;
}
BOOLEAN
SFPIsKeyword (
T_CHAR *Str
)
/*++
Routine Description:
Check to see if the specified keyword is found at
the current position in the input file.
Arguments:
Str - keyword to look for
Returns:
TRUE - the keyword is next
FALSE - the keyword is not next
Notes:
A keyword is defined as a "special" string that has a non-alphanumeric
character following it.
--*/
{
unsigned int Len;
SkipWhiteSpace (&mGlobals.SourceFile);
if (EndOfFile (&mGlobals.SourceFile)) {
return FALSE;
}
if ((Len = t_strcmp (mGlobals.SourceFile.FileBufferPtr, Str)) > 0) {
if (isalnum (mGlobals.SourceFile.FileBufferPtr[Len])) {
return FALSE;
}
mGlobals.SourceFile.FileBufferPtr += Len;
if (mGlobals.VerboseToken) {
printf ("Token: '%s'\n", Str);
}
return TRUE;
}
return FALSE;
}
BOOLEAN
SFPGetNextToken (
T_CHAR *Str,
unsigned int Len
)
/*++
Routine Description:
Get the next token from the input stream.
Arguments:
Str - pointer to a copy of the next token
Len - size of buffer pointed to by Str
Returns:
TRUE - next token successfully returned
FALSE - otherwise
Notes:
Preceeding white space is ignored.
The parser's buffer pointer is advanced past the end of the
token.
--*/
{
unsigned int Index;
T_CHAR TempChar;
SkipWhiteSpace (&mGlobals.SourceFile);
if (EndOfFile (&mGlobals.SourceFile)) {
return FALSE;
}
//
// Have to have enough string for at least one char and a null-terminator
//
if (Len < 2) {
return FALSE;
}
//
// Look at the first character. If it's an identifier, then treat it
// as such
//
TempChar = mGlobals.SourceFile.FileBufferPtr[0];
if (((TempChar >= 'a') && (TempChar <= 'z')) || ((TempChar >= 'A') && (TempChar <= 'Z')) || (TempChar == '_')) {
Str[0] = TempChar;
mGlobals.SourceFile.FileBufferPtr++;
Index = 1;
while (!EndOfFile (&mGlobals.SourceFile) && (Index < Len)) {
TempChar = mGlobals.SourceFile.FileBufferPtr[0];
if (((TempChar >= 'a') && (TempChar <= 'z')) ||
((TempChar >= 'A') && (TempChar <= 'Z')) ||
((TempChar >= '0') && (TempChar <= '9')) ||
(TempChar == '_')
) {
Str[Index] = mGlobals.SourceFile.FileBufferPtr[0];
mGlobals.SourceFile.FileBufferPtr++;
Index++;
} else {
//
// Invalid character for symbol name, so break out
//
break;
}
}
//
// Null terminate and return success
//
Str[Index] = 0;
return TRUE;
} else if ((TempChar == ')') || (TempChar == '(') || (TempChar == '*')) {
Str[0] = mGlobals.SourceFile.FileBufferPtr[0];
mGlobals.SourceFile.FileBufferPtr++;
Str[1] = 0;
return TRUE;
} else {
//
// Everything else is white-space (or EOF) separated
//
Index = 0;
while (!EndOfFile (&mGlobals.SourceFile) && (Index < Len)) {
if (IsWhiteSpace (&mGlobals.SourceFile)) {
if (Index > 0) {
Str[Index] = 0;
return TRUE;
}
return FALSE;
} else {
Str[Index] = mGlobals.SourceFile.FileBufferPtr[0];
mGlobals.SourceFile.FileBufferPtr++;
Index++;
}
}
//
// See if we just ran out of file contents, but did find a token
//
if ((Index > 0) && EndOfFile (&mGlobals.SourceFile)) {
Str[Index] = 0;
return TRUE;
}
}
return FALSE;
}
BOOLEAN
SFPGetGuidToken (
T_CHAR *Str,
UINT32 Len
)
/*++
Routine Description:
Parse a GUID from the input stream. Stop when you discover white space.
Arguments:
Str - pointer to a copy of the next token
Len - size of buffer pointed to by Str
Returns:
TRUE - GUID string returned successfully
FALSE - otherwise
--*/
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?