summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather
diff options
context:
space:
mode:
authorGuo Mang <mang.guo@intel.com>2017-08-02 09:54:47 +0800
committerGuo Mang <mang.guo@intel.com>2017-09-05 19:45:08 +0800
commit6c128c65b5ec0e5b8b5a0ccb165f3afd29e485f8 (patch)
tree444372d92a0ae8991fe4d15eb3937df43690dfda /EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather
parentb207c6434d7a5a4502975d322312e07017e8a8cb (diff)
downloadedk2-platforms-6c128c65b5ec0e5b8b5a0ccb165f3afd29e485f8.tar.xz
Remove core packages since we can get them from edk2 repository
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Mang <mang.guo@intel.com>
Diffstat (limited to 'EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather')
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/Makefile103
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.c3081
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.h85
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.c2708
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.h262
5 files changed, 0 insertions, 6239 deletions
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/Makefile b/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/Makefile
deleted file mode 100644
index ff2714c49a..0000000000
--- a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/Makefile
+++ /dev/null
@@ -1,103 +0,0 @@
-#/*++
-#
-# Copyright (c) 2004 - 2007, Intel Corporation. All rights reserved.<BR>
-# 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:
-#
-# Makefile
-#
-# Abstract:
-#
-# makefile for building the StrGather utility.
-#
-#--*/
-
-#
-# Make sure environmental variable EDK_SOURCE is set
-#
-!IFNDEF EDK_SOURCE
-!ERROR EDK_SOURCE environmental variable not set
-!ENDIF
-
-#
-# Do this if you want to compile from this directory
-#
-!IFNDEF TOOLCHAIN
-TOOLCHAIN = TOOLCHAIN_MSVC
-!ENDIF
-
-!INCLUDE $(BUILD_DIR)\PlatformTools.env
-
-#
-# Target specific information
-#
-TARGET_NAME = StrGather
-TARGET_SRC_DIR = $(EDK_TOOLS_SOURCE)\Uefi$(TARGET_NAME)
-TARGET_EXE = $(EDK_TOOLS_OUTPUT)\StrGather.exe
-
-#
-# Build targets
-#
-
-all: $(TARGET_EXE)
-
-
-LIBS = "$(EDK_TOOLS_OUTPUT)\Common.lib"
-
-OBJECTS = $(EDK_TOOLS_OUTPUT)\StrGather.obj \
- $(EDK_TOOLS_OUTPUT)\StringDB.obj
-
-INC_PATHS = -I $(TARGET_SRC_DIR) \
- -I $(EDK_SOURCE)\Foundation\Include\Ia32 \
- -I $(EDK_SOURCE)\Foundation\Efi\Include \
- -I $(EDK_SOURCE)\Foundation\Framework\Include \
- -I $(EDK_SOURCE)\Foundation\Include\IndustryStandard \
- -I $(EDK_SOURCE)\Foundation\ \
- -I $(EDK_SOURCE)\Foundation\Core\Dxe \
- -I $(EDK_SOURCE)\Foundation\Efi \
- -I $(EDK_SOURCE)\Foundation\Framework \
- -I $(EDK_TOOLS_SOURCE)\Common \
- -I $(EDK_SOURCE)\Foundation\Include
-
-INC_DEPS = $(TARGET_SRC_DIR)\StrGather.h $(TARGET_SRC_DIR)\StringDB.h
-
-C_FLAGS = $(C_FLAGS) /W4
-
-#
-# Compile each source file
-#
-$(EDK_TOOLS_OUTPUT)\StrGather.obj : $(TARGET_SRC_DIR)\StrGather.c $(INC_DEPS)
- $(CC) $(C_FLAGS) $(INC_PATHS) $(TARGET_SRC_DIR)\StrGather.c /Fo$@
-
-$(EDK_TOOLS_OUTPUT)\StringDB.obj : $(TARGET_SRC_DIR)\StringDB.c $(INC_DEPS)
- $(CC) $(C_FLAGS) $(INC_PATHS) $(TARGET_SRC_DIR)\StringDB.c /Fo$@
-
-#
-# Add Binary Build description for this tools.
-#
-
-!IF (("$(EFI_BINARY_TOOLS)" == "YES") && EXIST($(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe))
-$(TARGET_EXE): $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe
- copy $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).exe $(TARGET_EXE) /Y
- if exist $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb \
- copy $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb /Y
-!ELSE
-$(TARGET_EXE) : $(OBJECTS) $(LIBS)
- $(LINK) $(MSVS_LINK_LIBPATHS) $(L_FLAGS) $(LIBS) /out:$(TARGET_EXE) $(OBJECTS)
-!IF ("$(EFI_BINARY_BUILD)" == "YES")
- if not exist $(EFI_PLATFORM_BIN)\Tools mkdir $(EFI_PLATFORM_BIN)\Tools
- if exist $(TARGET_EXE) copy $(TARGET_EXE) $(EFI_PLATFORM_BIN)\tools\$(TARGET_NAME).exe /Y
- if exist $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb \
- copy $(EDK_TOOLS_OUTPUT)\$(TARGET_NAME).pdb $(EFI_PLATFORM_BIN)\Tools\$(TARGET_NAME).pdb /Y
-!ENDIF
-!ENDIF
-
-clean:
-
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.c b/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.c
deleted file mode 100644
index 535a265046..0000000000
--- a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.c
+++ /dev/null
@@ -1,3081 +0,0 @@
-/*++
-
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
-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:
-
- StrGather.c
-
-Abstract:
-
- Parse a strings file and create or add to a string database file.
-
---*/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <Tiano.h>
-#include <EfiUtilityMsgs.h>
-#include <EfiHii.h>
-#include "StrGather.h"
-#include "StringDB.h"
-
-#define UTILITY_NAME "StrGather"
-#define UTILITY_VERSION "v1.2"
-
-typedef UINT16 WCHAR;
-
-#define MAX_PATH 1024
-#define MAX_NEST_DEPTH 20 // just in case we get in an endless loop.
-#define MAX_STRING_IDENTIFIER_NAME 128 // number of wchars
-#define MAX_LINE_LEN 400
-#define STRING_TOKEN "STRING_TOKEN"
-#define DEFAULT_BASE_NAME "BaseName"
-//
-// Operational modes for this utility
-//
-#define MODE_UNKNOWN 0
-#define MODE_PARSE 1
-#define MODE_SCAN 2
-#define MODE_DUMP 3
-
-//
-// This is how we invoke the C preprocessor on the source file
-// to resolve #if, #else, etc.
-//
-#define PREPROCESSOR_COMMAND "cl"
-#define PREPROCESSOR_OPTIONS "/nologo /EP /TC /DSTRGATHER"
-#define PREPROCESS_TEMP_FILE_EXTENSION ".ii"
-#define PREPROCESS_OUTPUT_FILE_EXTENSION ".iii"
-
-//
-// We keep a linked list of these for the source files we process
-//
-typedef struct _SOURCE_FILE {
- FILE *Fptr;
- WCHAR *FileBuffer;
- WCHAR *FileBufferPtr;
- UINT32 FileSize;
- INT8 FileName[MAX_PATH];
- UINT32 LineNum;
- BOOLEAN EndOfFile;
- BOOLEAN SkipToHash;
- struct _SOURCE_FILE *Previous;
- struct _SOURCE_FILE *Next;
- WCHAR ControlCharacter;
-} SOURCE_FILE;
-
-#define DEFAULT_CONTROL_CHARACTER UNICODE_SLASH
-
-//
-// Here's all our globals. We need a linked list of include paths, a linked
-// list of source files, a linked list of subdirectories (appended to each
-// include path when searching), and a couple other fields.
-//
-static struct {
- SOURCE_FILE SourceFiles;
- TEXT_STRING_LIST *IncludePaths; // all include paths to search
- TEXT_STRING_LIST *LastIncludePath;
- TEXT_STRING_LIST *ScanFileName;
- TEXT_STRING_LIST *LastScanFileName;
- TEXT_STRING_LIST *SkipExt; // if -skipext .uni
- TEXT_STRING_LIST *LastSkipExt;
- TEXT_STRING_LIST *IndirectionFileName;
- TEXT_STRING_LIST *LastIndirectionFileName;
- TEXT_STRING_LIST *DatabaseFileName;
- TEXT_STRING_LIST *LastDatabaseFileName;
- TEXT_STRING_LIST *PreprocessFlags;
- TEXT_STRING_LIST *LastPreprocessFlags;
- WCHAR_STRING_LIST *Language;
- WCHAR_STRING_LIST *LastLanguage;
- WCHAR_MATCHING_STRING_LIST *IndirectionList; // from indirection file(s)
- WCHAR_MATCHING_STRING_LIST *LastIndirectionList;
- BOOLEAN Verbose; // for more detailed output
- BOOLEAN VerboseDatabaseWrite; // for more detailed output when writing database
- BOOLEAN VerboseDatabaseRead; // for more detailed output when reading database
- BOOLEAN NewDatabase; // to start from scratch
- BOOLEAN IgnoreNotFound; // when scanning
- BOOLEAN VerboseScan;
- BOOLEAN UnquotedStrings; // -uqs option
- BOOLEAN Preprocess; // -ppflag option
- INT8 PreprocessFileName[MAX_PATH];
- INT8 OutputDatabaseFileName[MAX_PATH];
- INT8 StringHFileName[MAX_PATH];
- INT8 StringCFileName[MAX_PATH]; // output .C filename
- INT8 DumpUFileName[MAX_PATH]; // output unicode dump file name
- INT8 HiiExportPackFileName[MAX_PATH]; // HII export pack file name
- INT8 BaseName[MAX_PATH]; // base filename of the strings file
- INT8 OutputDependencyFileName[MAX_PATH];
- FILE *OutputDependencyFptr;
- UINT32 Mode;
-} mGlobals;
-
-static
-BOOLEAN
-IsValidIdentifierChar (
- INT8 Char,
- BOOLEAN FirstChar
- );
-
-static
-void
-RewindFile (
- SOURCE_FILE *SourceFile
- );
-
-static
-BOOLEAN
-SkipTo (
- SOURCE_FILE *SourceFile,
- WCHAR WChar,
- BOOLEAN StopAfterNewline
- );
-
-static
-UINT32
-SkipWhiteSpace (
- SOURCE_FILE *SourceFile
- );
-
-static
-BOOLEAN
-IsWhiteSpace (
- SOURCE_FILE *SourceFile
- );
-
-static
-BOOLEAN
-EndOfFile (
- SOURCE_FILE *SourceFile
- );
-
-static
-void
-PreprocessFile (
- SOURCE_FILE *SourceFile
- );
-
-static
-UINT32
-GetStringIdentifierName (
- IN SOURCE_FILE *SourceFile,
- IN OUT WCHAR *StringIdentifierName,
- IN UINT32 StringIdentifierNameLen
- );
-
-static
-STATUS
-GetLanguageIdentifierName (
- IN SOURCE_FILE *SourceFile,
- IN OUT WCHAR *LanguageIdentifierName,
- IN UINT32 LanguageIdentifierNameLen,
- IN BOOLEAN Optional
- );
-
-static
-WCHAR *
-GetPrintableLanguageName (
- IN SOURCE_FILE *SourceFile
- );
-
-static
-STATUS
-AddCommandLineLanguage (
- IN INT8 *Language
- );
-
-static
-WCHAR *
-GetQuotedString (
- SOURCE_FILE *SourceFile,
- BOOLEAN Optional
- );
-
-static
-STATUS
-ProcessIncludeFile (
- SOURCE_FILE *SourceFile,
- SOURCE_FILE *ParentSourceFile
- );
-
-static
-STATUS
-ParseFile (
- SOURCE_FILE *SourceFile
- );
-
-static
-FILE *
-FindFile (
- IN INT8 *FileName,
- OUT INT8 *FoundFileName,
- IN UINT32 FoundFileNameLen
- );
-
-static
-STATUS
-ProcessArgs (
- int Argc,
- char *Argv[]
- );
-
-static
-STATUS
-ProcessFile (
- SOURCE_FILE *SourceFile
- );
-
-static
-UINT32
-wstrcmp (
- WCHAR *Buffer,
- WCHAR *Str
- );
-
-static
-WCHAR *
-wstrcatenate (
- WCHAR *Dst,
- WCHAR *Src
- );
-
-static
-void
-Usage (
- VOID
- );
-
-static
-void
-FreeLists (
- VOID
- );
-
-static
-void
-ProcessTokenString (
- SOURCE_FILE *SourceFile
- );
-
-static
-void
-ProcessTokenInclude (
- SOURCE_FILE *SourceFile
- );
-
-static
-void
-ProcessTokenScope (
- SOURCE_FILE *SourceFile
- );
-
-static
-void
-ProcessTokenLanguage (
- SOURCE_FILE *SourceFile
- );
-
-static
-void
-ProcessTokenLangDef (
- SOURCE_FILE *SourceFile
- );
-
-static
-VOID
-ProcessTokenSecondaryLangDef (
- SOURCE_FILE *SourceFile
- );
-
-static
-STATUS
-ScanFiles (
- TEXT_STRING_LIST *ScanFiles
- );
-
-static
-STATUS
-ParseIndirectionFiles (
- TEXT_STRING_LIST *Files
- );
-
-int
-main (
- int Argc,
- char *Argv[]
- )
-/*++
-
-Routine Description:
-
- Call the routine to parse the command-line options, then process the file.
-
-Arguments:
-
- Argc - Standard C main() argc and argv.
- Argv - Standard C main() argc and argv.
-
-Returns:
-
- 0 if successful
- nonzero otherwise
-
---*/
-{
- STATUS Status;
-
- SetUtilityName (UTILITY_NAME);
- //
- // Process the command-line arguments
- //
- Status = ProcessArgs (Argc, Argv);
- if (Status != STATUS_SUCCESS) {
- return Status;
- }
- //
- // Initialize the database manager
- //
- StringDBConstructor ();
- //
- // We always try to read in an existing database file. It may not
- // exist, which is ok usually.
- //
- if (mGlobals.NewDatabase == 0) {
- //
- // Read all databases specified.
- //
- for (mGlobals.LastDatabaseFileName = mGlobals.DatabaseFileName;
- mGlobals.LastDatabaseFileName != NULL;
- mGlobals.LastDatabaseFileName = mGlobals.LastDatabaseFileName->Next
- ) {
- Status = StringDBReadDatabase (mGlobals.LastDatabaseFileName->Str, TRUE, mGlobals.VerboseDatabaseRead);
- if (Status != STATUS_SUCCESS) {
- return Status;
- }
- }
- }
- //
- // Read indirection file(s) if specified
- //
- if (ParseIndirectionFiles (mGlobals.IndirectionFileName) != STATUS_SUCCESS) {
- goto Finish;
- }
- //
- // If scanning source files, do that now
- //
- if (mGlobals.Mode == MODE_SCAN) {
- ScanFiles (mGlobals.ScanFileName);
- } else if (mGlobals.Mode == MODE_PARSE) {
- //
- // Parsing a unicode strings file
- //
- mGlobals.SourceFiles.ControlCharacter = DEFAULT_CONTROL_CHARACTER;
- if (mGlobals.OutputDependencyFileName[0] != 0) {
- if ((mGlobals.OutputDependencyFptr = fopen (mGlobals.OutputDependencyFileName, "w")) == NULL) {
- Error (NULL, 0, 0, mGlobals.OutputDependencyFileName, "failed to open output dependency file");
- goto Finish;
- }
- }
- Status = ProcessIncludeFile (&mGlobals.SourceFiles, NULL);
- if (mGlobals.OutputDependencyFptr != NULL) {
- fclose (mGlobals.OutputDependencyFptr);
- }
- if (Status != STATUS_SUCCESS) {
- goto Finish;
- }
- }
- //
- // Create the string defines header file if there have been no errors.
- //
- ParserSetPosition (NULL, 0);
- if ((mGlobals.StringHFileName[0] != 0) && (GetUtilityStatus () < STATUS_ERROR)) {
- Status = StringDBDumpStringDefines (mGlobals.StringHFileName, mGlobals.BaseName);
- if (Status != EFI_SUCCESS) {
- goto Finish;
- }
- }
-
- //
- // Dump the strings to a .c file if there have still been no errors.
- //
- if ((mGlobals.StringCFileName[0] != 0) && (GetUtilityStatus () < STATUS_ERROR)) {
- Status = StringDBDumpCStrings (
- mGlobals.BaseName,
- mGlobals.StringCFileName,
- mGlobals.Language
- );
- if (Status != EFI_SUCCESS) {
- goto Finish;
- }
- }
-
- //
- // Dump the database if requested
- //
- if ((mGlobals.DumpUFileName[0] != 0) && (GetUtilityStatus () < STATUS_ERROR)) {
- StringDBDumpDatabase (NULL, mGlobals.DumpUFileName, FALSE);
- }
- //
- // Dump the string data as HII binary string pack if requested
- //
- if ((mGlobals.HiiExportPackFileName[0] != 0) && (GetUtilityStatus () < STATUS_ERROR)) {
- StringDBCreateHiiExportPack (mGlobals.HiiExportPackFileName, mGlobals.Language);
- }
- //
- // Always update the database if no errors and not in dump mode. If they specified -od
- // for an output database file name, then use that name. Otherwise use the name of
- // the first database file specified with -db
- //
- if ((mGlobals.Mode != MODE_DUMP) && (GetUtilityStatus () < STATUS_ERROR)) {
- if (mGlobals.OutputDatabaseFileName[0]) {
- Status = StringDBWriteDatabase (mGlobals.OutputDatabaseFileName, mGlobals.VerboseDatabaseWrite);
- } else {
- Status = StringDBWriteDatabase (mGlobals.DatabaseFileName->Str, mGlobals.VerboseDatabaseWrite);
- }
-
- if (Status != EFI_SUCCESS) {
- goto Finish;
- }
- }
-
-Finish:
- //
- // Free up memory
- //
- FreeLists ();
- StringDBDestructor ();
- return GetUtilityStatus ();
-}
-
-static
-STATUS
-ProcessIncludeFile (
- SOURCE_FILE *SourceFile,
- SOURCE_FILE *ParentSourceFile
- )
-/*++
-
-Routine Description:
-
- Given a source file, open the file and parse it
-
-Arguments:
-
- SourceFile - name of file to parse
- ParentSourceFile - for error reporting purposes, the file that #included SourceFile.
-
-Returns:
-
- Standard status.
-
---*/
-{
- static UINT32 NestDepth = 0;
- INT8 FoundFileName[MAX_PATH];
- STATUS Status;
-
- Status = STATUS_SUCCESS;
- NestDepth++;
- //
- // Print the file being processed. Indent so you can tell the include nesting
- // depth.
- //
- if (mGlobals.Verbose) {
- fprintf (stdout, "%*cProcessing file '%s'\n", NestDepth * 2, ' ', SourceFile->FileName);
- }
-
- //
- // Make sure we didn't exceed our maximum nesting depth
- //
- if (NestDepth > MAX_NEST_DEPTH) {
- Error (NULL, 0, 0, SourceFile->FileName, "max nesting depth (%d) exceeded", NestDepth);
- Status = STATUS_ERROR;
- goto Finish;
- }
- //
- // Try to open the file locally, and if that fails try along our include paths.
- //
- strcpy (FoundFileName, SourceFile->FileName);
- if ((SourceFile->Fptr = fopen (FoundFileName, "rb")) == NULL) {
- //
- // Try to find it among the paths if it has a parent (that is, it is included
- // by someone else).
- //
- if (ParentSourceFile == NULL) {
- Error (NULL, 0, 0, SourceFile->FileName, "file not found");
- Status = STATUS_ERROR;
- goto Finish;
- }
-
- SourceFile->Fptr = FindFile (SourceFile->FileName, FoundFileName, sizeof (FoundFileName));
- if (SourceFile->Fptr == NULL) {
- Error (ParentSourceFile->FileName, ParentSourceFile->LineNum, 0, SourceFile->FileName, "include file not found");
- Status = STATUS_ERROR;
- goto Finish;
- }
- }
-
- //
- // Output the dependency
- //
- if (mGlobals.OutputDependencyFptr != NULL) {
- fprintf (mGlobals.OutputDependencyFptr, "%s : %s\n", mGlobals.DatabaseFileName->Str, FoundFileName);
- //
- // Add pseudo target to avoid incremental build failure when the file is deleted
- //
- fprintf (mGlobals.OutputDependencyFptr, "%s : \n", FoundFileName);
- }
-
- //
- // Process the file found
- //
- ProcessFile (SourceFile);
-
-Finish:
- NestDepth--;
- //
- // Close open files and return status
- //
- if (SourceFile->Fptr != NULL) {
- fclose (SourceFile->Fptr);
- }
-
- return Status;
-}
-
-static
-STATUS
-ProcessFile (
- SOURCE_FILE *SourceFile
- )
-{
- //
- // Get the file size, and then read the entire thing into memory.
- // Allocate space for a terminator character.
- //
- fseek (SourceFile->Fptr, 0, SEEK_END);
- SourceFile->FileSize = ftell (SourceFile->Fptr);
- fseek (SourceFile->Fptr, 0, SEEK_SET);
- SourceFile->FileBuffer = (WCHAR *) malloc (SourceFile->FileSize + sizeof (WCHAR));
- if (SourceFile->FileBuffer == NULL) {
- Error (NULL, 0, 0, "memory allocation failure", NULL);
- return STATUS_ERROR;
- }
-
- fread ((VOID *) SourceFile->FileBuffer, SourceFile->FileSize, 1, SourceFile->Fptr);
- SourceFile->FileBuffer[(SourceFile->FileSize / sizeof (WCHAR))] = UNICODE_NULL;
- //
- // Pre-process the file to replace comments with spaces
- //
- PreprocessFile (SourceFile);
- //
- // Parse the file
- //
- ParseFile (SourceFile);
- free (SourceFile->FileBuffer);
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-ParseFile (
- SOURCE_FILE *SourceFile
- )
-{
- BOOLEAN InComment;
- UINT32 Len;
-
- //
- // First character of a unicode file is special. Make sure
- //
- if (SourceFile->FileBufferPtr[0] != UNICODE_FILE_START) {
- Error (SourceFile->FileName, 1, 0, SourceFile->FileName, "file does not appear to be a unicode file");
- return STATUS_ERROR;
- }
-
- SourceFile->FileBufferPtr++;
- InComment = FALSE;
- //
- // Print the first line if in verbose mode
- //
- if (mGlobals.Verbose) {
- printf ("%d: %S\n", SourceFile->LineNum, SourceFile->FileBufferPtr);
- }
- //
- // Since the syntax is relatively straightforward, just switch on the next char
- //
- while (!EndOfFile (SourceFile)) {
- //
- // Check for whitespace
- //
- if (SourceFile->FileBufferPtr[0] == UNICODE_SPACE) {
- SourceFile->FileBufferPtr++;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_TAB) {
- SourceFile->FileBufferPtr++;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_CR) {
- SourceFile->FileBufferPtr++;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_LF) {
- SourceFile->FileBufferPtr++;
- SourceFile->LineNum++;
- if (mGlobals.Verbose) {
- printf ("%d: %S\n", SourceFile->LineNum, SourceFile->FileBufferPtr);
- }
-
- InComment = FALSE;
- } else if (SourceFile->FileBufferPtr[0] == 0) {
- SourceFile->FileBufferPtr++;
- } else if (InComment) {
- SourceFile->FileBufferPtr++;
- } else if ((SourceFile->FileBufferPtr[0] == UNICODE_SLASH) && (SourceFile->FileBufferPtr[1] == UNICODE_SLASH)) {
- SourceFile->FileBufferPtr += 2;
- InComment = TRUE;
- } else if (SourceFile->SkipToHash && (SourceFile->FileBufferPtr[0] != SourceFile->ControlCharacter)) {
- SourceFile->FileBufferPtr++;
- } else {
- SourceFile->SkipToHash = FALSE;
- if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- ((Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"include")) > 0)
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenInclude (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"scope")) > 0
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenScope (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"language")) > 0
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenLanguage (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"langdef")) > 0
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenLangDef (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"secondarylang")) > 0
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenSecondaryLangDef (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"string")) > 0
- ) {
- SourceFile->FileBufferPtr += Len + 1;
- ProcessTokenString (SourceFile);
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (Len = wstrcmp (SourceFile->FileBufferPtr + 1, L"EFI_BREAKPOINT()")) > 0
- ) {
- SourceFile->FileBufferPtr += Len;
- EFI_BREAKPOINT ();
- } else if ((SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter) &&
- (SourceFile->FileBufferPtr[1] == UNICODE_EQUAL_SIGN)
- ) {
- SourceFile->ControlCharacter = SourceFile->FileBufferPtr[2];
- SourceFile->FileBufferPtr += 3;
- } else {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "unrecognized token", "%S", SourceFile->FileBufferPtr);
- //
- // Treat rest of line as a comment.
- //
- InComment = TRUE;
- }
- }
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-void
-PreprocessFile (
- SOURCE_FILE *SourceFile
- )
-/*++
-
-Routine Description:
- Preprocess a file to replace all carriage returns with NULLs so
- we can print lines from the file to the screen.
-
-Arguments:
- SourceFile - structure that we use to keep track of an input file.
-
-Returns:
- Nothing.
-
---*/
-{
- BOOLEAN InComment;
-
- RewindFile (SourceFile);
- InComment = FALSE;
- while (!EndOfFile (SourceFile)) {
- //
- // If a line-feed, then no longer in a comment
- //
- if (SourceFile->FileBufferPtr[0] == UNICODE_LF) {
- SourceFile->FileBufferPtr++;
- SourceFile->LineNum++;
- InComment = 0;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_CR) {
- //
- // Replace all carriage returns with a NULL so we can print stuff
- //
- SourceFile->FileBufferPtr[0] = 0;
- SourceFile->FileBufferPtr++;
- } else if (InComment) {
- SourceFile->FileBufferPtr[0] = UNICODE_SPACE;
- SourceFile->FileBufferPtr++;
- } else if ((SourceFile->FileBufferPtr[0] == UNICODE_SLASH) && (SourceFile->FileBufferPtr[1] == UNICODE_SLASH)) {
- SourceFile->FileBufferPtr += 2;
- InComment = TRUE;
- } else {
- SourceFile->FileBufferPtr++;
- }
- }
- //
- // Could check for end-of-file and still in a comment, but
- // should not be necessary. So just restore the file pointers.
- //
- RewindFile (SourceFile);
-}
-
-static
-WCHAR *
-GetPrintableLanguageName (
- IN SOURCE_FILE *SourceFile
- )
-{
- WCHAR *String;
- WCHAR *Start;
- WCHAR *Ptr;
- UINT32 Len;
-
- SkipWhiteSpace (SourceFile);
- if (SourceFile->FileBufferPtr[0] != UNICODE_DOUBLE_QUOTE) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "expected quoted printable language name", "%S", SourceFile->FileBufferPtr);
- SourceFile->SkipToHash = TRUE;
- return NULL;
- }
-
- Len = 0;
- SourceFile->FileBufferPtr++;
- Start = Ptr = SourceFile->FileBufferPtr;
- while (!EndOfFile (SourceFile)) {
- if (SourceFile->FileBufferPtr[0] == UNICODE_CR) {
- Warning (SourceFile->FileName, SourceFile->LineNum, 0, "carriage return found in quoted string", "%S", Start);
- break;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_DOUBLE_QUOTE) {
- break;
- }
-
- SourceFile->FileBufferPtr++;
- Len++;
- }
-
- if (SourceFile->FileBufferPtr[0] != UNICODE_DOUBLE_QUOTE) {
- Warning (
- SourceFile->FileName,
- SourceFile->LineNum,
- 0,
- "missing closing quote on printable language name string",
- "%S",
- Start
- );
- } else {
- SourceFile->FileBufferPtr++;
- }
- //
- // Now allocate memory for the string and save it off
- //
- String = (WCHAR *) malloc ((Len + 1) * sizeof (WCHAR));
- if (String == NULL) {
- Error (NULL, 0, 0, "memory allocation failed", NULL);
- return NULL;
- }
- //
- // Copy the string from the file buffer to the local copy.
- // We do no reformatting of it whatsoever at this point.
- //
- Ptr = String;
- while (Len > 0) {
- *Ptr = *Start;
- Start++;
- Ptr++;
- Len--;
- }
-
- *Ptr = 0;
- //
- // Now format the string to convert \wide and \narrow controls
- //
- StringDBFormatString (String);
- return String;
-}
-
-static struct {
- WCHAR *ISO639;
- WCHAR *RFC3066;
-} LanguageConvertTable[] = {
- { L"eng", L"en-US" },
- { L"fra", L"fr-FR" },
- { L"spa", L"es-ES" },
- { NULL, NULL }
-};
-
-WCHAR *
-GetLangCode (
- IN WCHAR *Lang
- )
-{
- UINT32 Index;
- WCHAR *LangCode;
-
- LangCode = NULL;
-
- //
- // The Lang is xx-XX format and return.
- //
- if (wcschr (Lang, L'-') != NULL) {
- LangCode = (WCHAR *) malloc ((wcslen (Lang) + 1) * sizeof(WCHAR));
- if (LangCode != NULL) {
- wcscpy (LangCode, Lang);
- }
- return LangCode;
- }
-
- //
- // Convert the language accoring to the table.
- //
- for (Index = 0; LanguageConvertTable[Index].ISO639 != NULL; Index++) {
- if (wcscmp(LanguageConvertTable[Index].ISO639, Lang) == 0) {
- LangCode = (WCHAR *) malloc ((wcslen (LanguageConvertTable[Index].RFC3066) + 1) * sizeof (WCHAR));
- if (LangCode != NULL) {
- wcscpy (LangCode, LanguageConvertTable[Index].RFC3066);
- }
- return LangCode;
- }
- }
-
- return NULL;
-}
-
-WCHAR *
-GetLangCodeList (
- IN WCHAR *SecondaryLangList
- )
-{
- WCHAR *CodeBeg, *CodeEnd;
- WCHAR *CodeRet;
- WCHAR *LangCodeList = NULL;
- WCHAR *TempLangCodeList = NULL;
-
- TempLangCodeList = (WCHAR *) malloc ((wcslen(SecondaryLangList) + 1) * sizeof(WCHAR));
- if (TempLangCodeList == NULL) {
- return NULL;
- }
- wcscpy (TempLangCodeList, SecondaryLangList);
- CodeBeg = TempLangCodeList;
-
- while (CodeBeg != NULL) {
- CodeEnd = wcschr (CodeBeg, L';');
- if (CodeEnd != NULL) {
- *CodeEnd = L'\0';
- CodeEnd++;
- }
-
- CodeRet = GetLangCode (CodeBeg);
- if (CodeRet != NULL) {
- if (LangCodeList != NULL) {
- LangCodeList = wstrcatenate (LangCodeList, L";");
- }
- LangCodeList = wstrcatenate (LangCodeList, CodeRet);
- }
-
- CodeBeg = CodeEnd;
- FREE (CodeRet);
- }
-
- free (TempLangCodeList);
-
- return LangCodeList;
-}
-
-static
-WCHAR *
-GetSecondaryLanguageList (
- IN SOURCE_FILE *SourceFile
- )
-{
- WCHAR *SecondaryLangList = NULL;
- WCHAR SecondaryLang[MAX_STRING_IDENTIFIER_NAME + 1];
- WCHAR *LangCodeList;
- WCHAR *Start;
- WCHAR *Ptr;
- UINT32 Index;
-
- SkipWhiteSpace (SourceFile);
-
- if (SourceFile->FileBufferPtr[0] != UNICODE_OPEN_PAREN) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "expected open bracket", "%S", SourceFile->FileBufferPtr);
- SourceFile->SkipToHash = TRUE;
- return NULL;
- }
-
- Index = 0;
- SecondaryLang [0] = L'\0';
- SourceFile->FileBufferPtr++;
- Start = Ptr = SourceFile->FileBufferPtr;
- while (!EndOfFile (SourceFile)) {
- if (((SourceFile->FileBufferPtr[0] >= UNICODE_a) && (SourceFile->FileBufferPtr[0] <= UNICODE_z)) ||
- ((SourceFile->FileBufferPtr[0] >= UNICODE_A) && (SourceFile->FileBufferPtr[0] <= UNICODE_Z)) ||
- (SourceFile->FileBufferPtr[0] == UNICODE_MINUS)) {
- if (Index > MAX_STRING_IDENTIFIER_NAME) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "secondary language length is too lang", "%S", SourceFile->FileBufferPtr);
- goto Err;
- }
- SecondaryLang[Index] = SourceFile->FileBufferPtr[0];
- Index++;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_SPACE) {
- SecondaryLang[Index] = L'\0';
-
- if (SecondaryLang[0] != L'\0') {
- if (SecondaryLangList != NULL) {
- SecondaryLangList = wstrcatenate (SecondaryLangList, L";");
- }
- SecondaryLangList = wstrcatenate (SecondaryLangList, SecondaryLang);
- Index = 0;
- SecondaryLang [0] = L'\0';
- SourceFile->FileBufferPtr++;
- continue;
- }
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_CLOSE_PAREN) {
- if (SecondaryLangList != NULL) {
- SecondaryLangList = wstrcatenate (SecondaryLangList, L";");
- }
- SecondaryLangList = wstrcatenate (SecondaryLangList, SecondaryLang);
- break;
- } else {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "can not recognize the secondary language", "%S", SourceFile->FileBufferPtr);
- goto Err;
- }
-
- SourceFile->FileBufferPtr++;
- }
-
- if (SourceFile->FileBufferPtr[0] != UNICODE_CLOSE_PAREN) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "missing closing bracket", "%S", Start);
- } else {
- SourceFile->FileBufferPtr++;
- }
-
- LangCodeList = GetLangCodeList (SecondaryLangList);
- FREE (SecondaryLangList);
- return LangCodeList;
-
-Err:
- FREE(SecondaryLangList);
- return NULL;
-}
-
-static
-WCHAR *
-GetQuotedString (
- SOURCE_FILE *SourceFile,
- BOOLEAN Optional
- )
-{
- WCHAR *String;
- WCHAR *Start;
- WCHAR *Ptr;
- UINT32 Len;
- BOOLEAN PreviousBackslash;
-
- if (SourceFile->FileBufferPtr[0] != UNICODE_DOUBLE_QUOTE) {
- if (!Optional) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "expected quoted string", "%S", SourceFile->FileBufferPtr);
- }
-
- return NULL;
- }
-
- Len = 0;
- SourceFile->FileBufferPtr++;
- Start = Ptr = SourceFile->FileBufferPtr;
- PreviousBackslash = FALSE;
- while (!EndOfFile (SourceFile)) {
- if ((SourceFile->FileBufferPtr[0] == UNICODE_DOUBLE_QUOTE) && (!PreviousBackslash)) {
- break;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_CR) {
- Warning (SourceFile->FileName, SourceFile->LineNum, 0, "carriage return found in quoted string", "%S", Start);
- PreviousBackslash = FALSE;
- } else if (SourceFile->FileBufferPtr[0] == UNICODE_BACKSLASH) {
- PreviousBackslash = TRUE;
- } else {
- PreviousBackslash = FALSE;
- }
-
- SourceFile->FileBufferPtr++;
- Len++;
- }
-
- if (SourceFile->FileBufferPtr[0] != UNICODE_DOUBLE_QUOTE) {
- Warning (SourceFile->FileName, SourceFile->LineNum, 0, "missing closing quote on string", "%S", Start);
- } else {
- SourceFile->FileBufferPtr++;
- }
- //
- // Now allocate memory for the string and save it off
- //
- String = (WCHAR *) malloc ((Len + 1) * sizeof (WCHAR));
- if (String == NULL) {
- Error (NULL, 0, 0, "memory allocation failed", NULL);
- return NULL;
- }
- //
- // Copy the string from the file buffer to the local copy.
- // We do no reformatting of it whatsoever at this point.
- //
- Ptr = String;
- while (Len > 0) {
- *Ptr = *Start;
- Start++;
- Ptr++;
- Len--;
- }
-
- *Ptr = 0;
- return String;
-}
-//
-// Parse:
-// #string STR_ID_NAME
-//
-// All we can do is call the string database to add the string identifier. Unfortunately
-// he'll have to keep track of the last identifier we added.
-//
-static
-void
-ProcessTokenString (
- SOURCE_FILE *SourceFile
- )
-{
- WCHAR StringIdentifier[MAX_STRING_IDENTIFIER_NAME + 1];
- UINT16 StringId;
- //
- // Extract the string identifier name and add it to the database.
- //
- if (GetStringIdentifierName (SourceFile, StringIdentifier, sizeof (StringIdentifier)) > 0) {
- StringId = STRING_ID_INVALID;
- StringDBAddStringIdentifier (StringIdentifier, &StringId, 0);
- } else {
- //
- // Error recovery -- skip to the next #
- //
- SourceFile->SkipToHash = TRUE;
- }
-}
-
-static
-BOOLEAN
-EndOfFile (
- SOURCE_FILE *SourceFile
- )
-{
- //
- // The file buffer pointer will typically get updated before the End-of-file flag in the
- // source file structure, so check it first.
- //
- if (SourceFile->FileBufferPtr >= SourceFile->FileBuffer + SourceFile->FileSize / sizeof (WCHAR)) {
- SourceFile->EndOfFile = TRUE;
- return TRUE;
- }
-
- if (SourceFile->EndOfFile) {
- return TRUE;
- }
-
- return FALSE;
-}
-
-static
-UINT32
-GetStringIdentifierName (
- IN SOURCE_FILE *SourceFile,
- IN OUT WCHAR *StringIdentifierName,
- IN UINT32 StringIdentifierNameLen
- )
-{
- UINT32 Len;
- WCHAR *From;
- WCHAR *Start;
-
- //
- // Skip whitespace
- //
- SkipWhiteSpace (SourceFile);
- if (SourceFile->EndOfFile) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "end-of-file encountered", "expected string identifier");
- return 0;
- }
- //
- // Verify first character of name is [A-Za-z]
- //
- Len = 0;
- StringIdentifierNameLen /= 2;
- From = SourceFile->FileBufferPtr;
- Start = SourceFile->FileBufferPtr;
- if (((SourceFile->FileBufferPtr[0] >= UNICODE_A) && (SourceFile->FileBufferPtr[0] <= UNICODE_Z)) ||
- ((SourceFile->FileBufferPtr[0] >= UNICODE_z) && (SourceFile->FileBufferPtr[0] <= UNICODE_z))
- ) {
- //
- // Do nothing
- //
- } else {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "invalid character in string identifier name", "%S", Start);
- return 0;
- }
-
- while (!EndOfFile (SourceFile)) {
- if (((SourceFile->FileBufferPtr[0] >= UNICODE_A) && (SourceFile->FileBufferPtr[0] <= UNICODE_Z)) ||
- ((SourceFile->FileBufferPtr[0] >= UNICODE_z) && (SourceFile->FileBufferPtr[0] <= UNICODE_z)) ||
- ((SourceFile->FileBufferPtr[0] >= UNICODE_0) && (SourceFile->FileBufferPtr[0] <= UNICODE_9)) ||
- (SourceFile->FileBufferPtr[0] == UNICODE_UNDERSCORE)
- ) {
- Len++;
- if (Len >= StringIdentifierNameLen) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "string identifier name too long", "%S", Start);
- return 0;
- }
-
- *StringIdentifierName = SourceFile->FileBufferPtr[0];
- StringIdentifierName++;
- SourceFile->FileBufferPtr++;
- } else if (SkipWhiteSpace (SourceFile) == 0) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "invalid string identifier name", "%S", Start);
- return 0;
- } else {
- break;
- }
- }
- //
- // Terminate the copy of the string.
- //
- *StringIdentifierName = 0;
- return Len;
-}
-
-static
-STATUS
-GetLanguageIdentifierName (
- IN SOURCE_FILE *SourceFile,
- IN OUT WCHAR *LanguageIdentifierName,
- IN UINT32 LanguageIdentifierNameLen,
- IN BOOLEAN Optional
- )
-{
- UINT32 Len;
- WCHAR *Start;
- WCHAR *LangCode;
- WCHAR *LanguageIdentifier;
-
- LanguageIdentifier = LanguageIdentifierName;
-
- //
- // Skip whitespace
- //
- SkipWhiteSpace (SourceFile);
- if (SourceFile->EndOfFile) {
- if (!Optional) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "end-of-file encountered", "expected language identifier");
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
- }
- //
- // This function is called to optionally get a language identifier name in:
- // #string STR_ID eng "the string"
- // If it's optional, and we find a double-quote, then return now.
- //
- if (Optional) {
- if (*SourceFile->FileBufferPtr == UNICODE_DOUBLE_QUOTE) {
- return STATUS_SUCCESS;
- }
- }
-
- LanguageIdentifierNameLen /= 2;
- //
- // Internal error if we weren't given at least 4 WCHAR's to work with.
- //
- if (LanguageIdentifierNameLen < LANGUAGE_IDENTIFIER_NAME_LEN + 1) {
- Error (
- SourceFile->FileName,
- SourceFile->LineNum,
- 0,
- "app error -- language identifier name length is invalid",
- NULL
- );
- }
-
- Len = 0;
- Start = SourceFile->FileBufferPtr;
- while (!EndOfFile (SourceFile)) {
- if (((SourceFile->FileBufferPtr[0] >= UNICODE_a) && (SourceFile->FileBufferPtr[0] <= UNICODE_z)) ||
- ((SourceFile->FileBufferPtr[0] >= UNICODE_A) && (SourceFile->FileBufferPtr[0] <= UNICODE_Z)) ||
- (SourceFile->FileBufferPtr[0] == UNICODE_MINUS)) {
- Len++;
- if (Len > LANGUAGE_IDENTIFIER_NAME_LEN) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "language identifier name too long", "%S", Start);
- return STATUS_ERROR;
- }
- *LanguageIdentifierName = SourceFile->FileBufferPtr[0];
- SourceFile->FileBufferPtr++;
- LanguageIdentifierName++;
- } else if (!IsWhiteSpace (SourceFile)) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "invalid language identifier name", "%S", Start);
- return STATUS_ERROR;
- } else {
- break;
- }
- }
- //
- // Terminate the copy of the string.
- //
- *LanguageIdentifierName = 0;
- LangCode = GetLangCode (LanguageIdentifier);
- if (LangCode != NULL) {
- wcscpy (LanguageIdentifier, LangCode);
- FREE (LangCode);
- }
- return STATUS_SUCCESS;
-}
-
-static
-void
-ProcessTokenInclude (
- SOURCE_FILE *SourceFile
- )
-{
- INT8 IncludeFileName[MAX_PATH];
- INT8 *To;
- UINT32 Len;
- BOOLEAN ReportedError;
- SOURCE_FILE IncludedSourceFile;
-
- ReportedError = FALSE;
- if (SkipWhiteSpace (SourceFile) == 0) {
- Warning (SourceFile->FileName, SourceFile->LineNum, 0, "expected whitespace following #include keyword", NULL);
- }
- //
- // Should be quoted file name
- //
- if (SourceFile->FileBufferPtr[0] != UNICODE_DOUBLE_QUOTE) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "expected quoted include file name", NULL);
- goto FailDone;
- }
-
- SourceFile->FileBufferPtr++;
- //
- // Copy the filename as ascii to our local string
- //
- To = IncludeFileName;
- Len = 0;
- while (!EndOfFile (SourceFile)) {
- if ((SourceFile->FileBufferPtr[0] == UNICODE_CR) || (SourceFile->FileBufferPtr[0] == UNICODE_LF)) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "end-of-line found in quoted include file name", NULL);
- goto FailDone;
- }
-
- if (SourceFile->FileBufferPtr[0] == UNICODE_DOUBLE_QUOTE) {
- SourceFile->FileBufferPtr++;
- break;
- }
- //
- // If too long, then report the error once and process until the closing quote
- //
- Len++;
- if (!ReportedError && (Len >= sizeof (IncludeFileName))) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "length of include file name exceeds limit", NULL);
- ReportedError = TRUE;
- }
-
- if (!ReportedError) {
- *To = UNICODE_TO_ASCII (SourceFile->FileBufferPtr[0]);
- To++;
- }
-
- SourceFile->FileBufferPtr++;
- }
-
- if (!ReportedError) {
- *To = 0;
- memset ((char *) &IncludedSourceFile, 0, sizeof (SOURCE_FILE));
- strcpy (IncludedSourceFile.FileName, IncludeFileName);
- IncludedSourceFile.ControlCharacter = DEFAULT_CONTROL_CHARACTER;
- ProcessIncludeFile (&IncludedSourceFile, SourceFile);
- //
- // printf ("including file '%s'\n", IncludeFileName);
- //
- }
-
- return ;
-FailDone:
- //
- // Error recovery -- skip to next #
- //
- SourceFile->SkipToHash = TRUE;
-}
-
-static
-void
-ProcessTokenScope (
- SOURCE_FILE *SourceFile
- )
-{
- WCHAR StringIdentifier[MAX_STRING_IDENTIFIER_NAME + 1];
- //
- // Extract the scope name
- //
- if (GetStringIdentifierName (SourceFile, StringIdentifier, sizeof (StringIdentifier)) > 0) {
- StringDBSetScope (StringIdentifier);
- }
-}
-
-//
-// Parse: #langdef eng "English"
-// #langdef chn "\wideChinese"
-//
-static
-void
-ProcessTokenLangDef (
- SOURCE_FILE *SourceFile
- )
-{
- STATUS Status;
- WCHAR LanguageIdentifier[MAX_STRING_IDENTIFIER_NAME + 1];
- WCHAR *PrintableName;
-
- Status = GetLanguageIdentifierName (SourceFile, LanguageIdentifier, sizeof (LanguageIdentifier), FALSE);
- if (Status != STATUS_SUCCESS) {
- return;
- }
-
- //
- // Extract the printable name
- //
- PrintableName = GetPrintableLanguageName (SourceFile);
- if (PrintableName != NULL) {
- ParserSetPosition (SourceFile->FileName, SourceFile->LineNum);
- StringDBAddLanguage (LanguageIdentifier, PrintableName, NULL);
- FREE (PrintableName);
- return ;
- }
- //
- // Error recovery -- skip to next #
- //
- SourceFile->SkipToHash = TRUE;
-}
-
-static
-VOID
-ProcessTokenSecondaryLangDef (
- SOURCE_FILE *SourceFile
- )
-{
- STATUS Status;
- LANGUAGE_LIST *Lang;
- WCHAR LanguageIdentifier[MAX_STRING_IDENTIFIER_NAME + 1];
- WCHAR *LangCode;
- WCHAR *SecondaryLangList = NULL;
-
- Status = GetLanguageIdentifierName (SourceFile, LanguageIdentifier, sizeof (LanguageIdentifier), FALSE);
- if (Status != STATUS_SUCCESS) {
- return;
- }
- LangCode = GetLangCode(LanguageIdentifier);
- if (LangCode == NULL) {
- return ;
- }
-
- Lang = StringDBFindLanguageList (LanguageIdentifier);
- if (Lang == NULL) {
- return;
- }
-
- SecondaryLangList = GetSecondaryLanguageList (SourceFile);
- if (SecondaryLangList != NULL) {
- ParserSetPosition (SourceFile->FileName, SourceFile->LineNum);
- Status = StringDBAddSecondaryLanguage (LangCode, GetLangCodeList(SecondaryLangList));
- if (Status != STATUS_SUCCESS) {
- SourceFile->SkipToHash = TRUE;
- }
- FREE (LangCode);
- FREE (SecondaryLangList);
- return ;
- }
- FREE (LangCode);
-
-
- SourceFile->SkipToHash = TRUE;
-}
-
-static
-BOOLEAN
-ApparentQuotedString (
- SOURCE_FILE *SourceFile
- )
-{
- WCHAR *Ptr;
- //
- // See if the first and last nonblank characters on the line are double quotes
- //
- for (Ptr = SourceFile->FileBufferPtr; *Ptr && (*Ptr == UNICODE_SPACE); Ptr++)
- ;
- if (*Ptr != UNICODE_DOUBLE_QUOTE) {
- return FALSE;
- }
-
- while (*Ptr) {
- Ptr++;
- }
-
- Ptr--;
- for (; *Ptr && (*Ptr == UNICODE_SPACE); Ptr--)
- ;
- if (*Ptr != UNICODE_DOUBLE_QUOTE) {
- return FALSE;
- }
-
- return TRUE;
-}
-//
-// Parse:
-// #language eng "some string " "more string"
-//
-static
-void
-ProcessTokenLanguage (
- SOURCE_FILE *SourceFile
- )
-{
- STATUS Status;
- WCHAR *String;
- WCHAR *SecondString;
- WCHAR *TempString;
- WCHAR *From;
- WCHAR *To;
- WCHAR Language[LANGUAGE_IDENTIFIER_NAME_LEN + 1];
- UINT32 Len;
- BOOLEAN PreviousNewline;
- //
- // Get the language identifier
- //
- Language[0] = 0;
- Status = GetLanguageIdentifierName (SourceFile, Language, sizeof (Language), TRUE);
- if (Status != STATUS_SUCCESS) {
- return;
- }
-
- //
- // Extract the string value. It's either a quoted string that starts on the current line, or
- // an unquoted string that starts on the following line and continues until the next control
- // character in column 1.
- // Look ahead to find a quote or a newline
- //
- if (SkipTo (SourceFile, UNICODE_DOUBLE_QUOTE, TRUE)) {
- String = GetQuotedString (SourceFile, FALSE);
- if (String != NULL) {
- //
- // Set the position in the file of where we are parsing for error
- // reporting purposes. Then start looking ahead for additional
- // quoted strings, and concatenate them until we get a failure
- // back from the string parser.
- //
- Len = wcslen (String) + 1;
- ParserSetPosition (SourceFile->FileName, SourceFile->LineNum);
- do {
- SkipWhiteSpace (SourceFile);
- SecondString = GetQuotedString (SourceFile, TRUE);
- if (SecondString != NULL) {
- Len += wcslen (SecondString);
- TempString = (WCHAR *) malloc (Len * sizeof (WCHAR));
- if (TempString == NULL) {
- Error (NULL, 0, 0, "application error", "failed to allocate memory");
- return ;
- }
-
- wcscpy (TempString, String);
- wcscat (TempString, SecondString);
- free (String);
- free (SecondString);
- String = TempString;
- }
- } while (SecondString != NULL);
- StringDBAddString (Language, NULL, NULL, String, TRUE, 0);
- free (String);
- } else {
- //
- // Error was reported at lower level. Error recovery mode.
- //
- SourceFile->SkipToHash = TRUE;
- }
- } else {
- if (!mGlobals.UnquotedStrings) {
- //
- // They're using unquoted strings. If the next non-blank character is a double quote, and the
- // last non-blank character on the line is a double quote, then more than likely they're using
- // quotes, so they need to put the quoted string on the end of the previous line
- //
- if (ApparentQuotedString (SourceFile)) {
- Warning (
- SourceFile->FileName,
- SourceFile->LineNum,
- 0,
- "unexpected quoted string on line",
- "specify -uqs option if necessary"
- );
- }
- }
- //
- // Found end-of-line (hopefully). Skip over it and start taking in characters
- // until we find a control character at the start of a line.
- //
- Len = 0;
- From = SourceFile->FileBufferPtr;
- PreviousNewline = FALSE;
- while (!EndOfFile (SourceFile)) {
- if (SourceFile->FileBufferPtr[0] == UNICODE_LF) {
- PreviousNewline = TRUE;
- SourceFile->LineNum++;
- } else {
- Len++;
- if (PreviousNewline && (SourceFile->FileBufferPtr[0] == SourceFile->ControlCharacter)) {
- break;
- }
-
- PreviousNewline = FALSE;
- }
-
- SourceFile->FileBufferPtr++;
- }
-
- if ((Len == 0) && EndOfFile (SourceFile)) {
- Error (SourceFile->FileName, SourceFile->LineNum, 0, "unexpected end of file", NULL);
- SourceFile->SkipToHash = TRUE;
- return ;
- }
- //
- // Now allocate a buffer, copy the characters, and add the string.
- //
- String = (WCHAR *) malloc ((Len + 1) * sizeof (WCHAR));
- if (String == NULL) {
- Error (NULL, 0, 0, "application error", "failed to allocate memory");
- return ;
- }
-
- To = String;
- while (From < SourceFile->FileBufferPtr) {
- switch (*From) {
- case UNICODE_LF:
- case 0:
- break;
-
- default:
- *To = *From;
- To++;
- break;
- }
-
- From++;
- }
-
- //
- // String[Len] = 0;
- //
- *To = 0;
- StringDBAddString (Language, NULL, NULL, String, TRUE, 0);
- }
-}
-
-static
-BOOLEAN
-IsWhiteSpace (
- SOURCE_FILE *SourceFile
- )
-{
- switch (SourceFile->FileBufferPtr[0]) {
- case UNICODE_NULL:
- case UNICODE_CR:
- case UNICODE_SPACE:
- case UNICODE_TAB:
- case UNICODE_LF:
- return TRUE;
-
- default:
- return FALSE;
- }
-}
-
-static
-UINT32
-SkipWhiteSpace (
- SOURCE_FILE *SourceFile
- )
-{
- UINT32 Count;
-
- Count = 0;
- while (!EndOfFile (SourceFile)) {
- Count++;
- switch (*SourceFile->FileBufferPtr) {
- case UNICODE_NULL:
- case UNICODE_CR:
- case UNICODE_SPACE:
- case UNICODE_TAB:
- SourceFile->FileBufferPtr++;
- break;
-
- case UNICODE_LF:
- SourceFile->FileBufferPtr++;
- SourceFile->LineNum++;
- if (mGlobals.Verbose) {
- printf ("%d: %S\n", SourceFile->LineNum, SourceFile->FileBufferPtr);
- }
- break;
-
- default:
- return Count - 1;
- }
- }
- //
- // Some tokens require trailing whitespace. If we're at the end of the
- // file, then we count that as well.
- //
- if ((Count == 0) && (EndOfFile (SourceFile))) {
- Count++;
- }
-
- return Count;
-}
-
-static
-UINT32
-wstrcmp (
- WCHAR *Buffer,
- WCHAR *Str
- )
-{
- UINT32 Len;
-
- Len = 0;
- while (*Str == *Buffer) {
- Buffer++;
- Str++;
- Len++;
- }
-
- if (*Str) {
- return 0;
- }
-
- return Len;
-}
-
-static
-WCHAR *
-wstrcatenate (
- WCHAR *Dst,
- WCHAR *Src
- )
-{
- UINT32 Len = 0;
- WCHAR *Bak = Dst;
-
- if (Src == NULL) {
- return Dst;
- }
-
- if (Dst != NULL) {
- Len = wcslen (Dst);
- }
- Len += wcslen (Src);
- Dst = (WCHAR *) malloc ((Len + 1) * 2);
- if (Dst == NULL) {
- return NULL;
- }
-
- Dst[0] = L'\0';
- if (Bak != NULL) {
- wcscpy (Dst, Bak);
- FREE (Bak);
- }
- wcscat (Dst, Src);
- return Dst;
-}
-
-//
-// Given a filename, try to find it along the include paths.
-//
-static
-FILE *
-FindFile (
- IN INT8 *FileName,
- OUT INT8 *FoundFileName,
- IN UINT32 FoundFileNameLen
- )
-{
- FILE *Fptr;
- TEXT_STRING_LIST *List;
-
- //
- // Traverse the list of paths and try to find the file
- //
- List = mGlobals.IncludePaths;
- while (List != NULL) {
- //
- // Put the path and filename together
- //
- if (strlen (List->Str) + strlen (FileName) + 1 > FoundFileNameLen) {
- Error (UTILITY_NAME, 0, 0, NULL, "internal error - cannot concatenate path+filename");
- return NULL;
- }
- //
- // Append the filename to this include path and try to open the file.
- //
- strcpy (FoundFileName, List->Str);
- strcat (FoundFileName, FileName);
- if ((Fptr = fopen (FoundFileName, "rb")) != NULL) {
- //
- // Return the file pointer
- //
- return Fptr;
- }
-
- List = List->Next;
- }
- //
- // Not found
- //
- FoundFileName[0] = 0;
- return NULL;
-}
-//
-// Process the command-line arguments
-//
-static
-STATUS
-ProcessArgs (
- int Argc,
- char *Argv[]
- )
-{
- TEXT_STRING_LIST *NewList;
- char *Cptr;
- char *Cptr2;
-
- //
- // Clear our globals
- //
- memset ((char *) &mGlobals, 0, sizeof (mGlobals));
- strcpy (mGlobals.BaseName, DEFAULT_BASE_NAME);
- //
- // Skip program name
- //
- Argc--;
- Argv++;
-
- if (Argc == 0) {
- Usage ();
- return STATUS_ERROR;
- }
-
- mGlobals.Mode = MODE_UNKNOWN;
- //
- // Process until no more -args.
- //
- while ((Argc > 0) && (Argv[0][0] == '-')) {
- //
- // -parse option
- //
- if (_stricmp (Argv[0], "-parse") == 0) {
- if (mGlobals.Mode != MODE_UNKNOWN) {
- Error (NULL, 0, 0, "only one of -parse/-scan/-dump allowed", NULL);
- return STATUS_ERROR;
- }
-
- mGlobals.Mode = MODE_PARSE;
- //
- // -scan option
- //
- } else if (_stricmp (Argv[0], "-scan") == 0) {
- if (mGlobals.Mode != MODE_UNKNOWN) {
- Error (NULL, 0, 0, "only one of -parse/-scan/-dump allowed", NULL);
- return STATUS_ERROR;
- }
-
- mGlobals.Mode = MODE_SCAN;
- //
- // -vscan verbose scanning option
- //
- } else if (_stricmp (Argv[0], "-vscan") == 0) {
- mGlobals.VerboseScan = TRUE;
- //
- // -dump option
- //
- } else if (_stricmp (Argv[0], "-dump") == 0) {
- if (mGlobals.Mode != MODE_UNKNOWN) {
- Error (NULL, 0, 0, "only one of -parse/-scan/-dump allowed", NULL);
- return STATUS_ERROR;
- }
-
- mGlobals.Mode = MODE_DUMP;
- } else if (_stricmp (Argv[0], "-uqs") == 0) {
- mGlobals.UnquotedStrings = TRUE;
- //
- // -i path add include search path when parsing
- //
- } else if (_stricmp (Argv[0], "-i") == 0) {
- //
- // check for one more arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing include path");
- return STATUS_ERROR;
- }
- //
- // Allocate memory for a new list element, fill it in, and
- // add it to our list of include paths. Always make sure it
- // has a "\" on the end of it.
- //
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- memset ((char *) NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = malloc (strlen (Argv[1]) + 2);
- if (NewList->Str == NULL) {
- free (NewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- strcpy (NewList->Str, Argv[1]);
- if (NewList->Str[strlen (NewList->Str) - 1] != '\\') {
- strcat (NewList->Str, "\\");
- }
- //
- // Add it to our linked list
- //
- if (mGlobals.IncludePaths == NULL) {
- mGlobals.IncludePaths = NewList;
- } else {
- mGlobals.LastIncludePath->Next = NewList;
- }
-
- mGlobals.LastIncludePath = NewList;
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-if") == 0) {
- //
- // Indirection file -- check for one more arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing indirection file name");
- return STATUS_ERROR;
- }
- //
- // Allocate memory for a new list element, fill it in, and
- // add it to our list of include paths. Always make sure it
- // has a "\" on the end of it.
- //
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- memset ((char *) NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = malloc (strlen (Argv[1]) + 1);
- if (NewList->Str == NULL) {
- free (NewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- strcpy (NewList->Str, Argv[1]);
- //
- // Add it to our linked list
- //
- if (mGlobals.IndirectionFileName == NULL) {
- mGlobals.IndirectionFileName = NewList;
- } else {
- mGlobals.LastIndirectionFileName->Next = NewList;
- }
-
- mGlobals.LastIndirectionFileName = NewList;
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-db") == 0) {
- //
- // -db option to specify a database file.
- // Check for one more arg (the database file name)
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing database file name");
- return STATUS_ERROR;
- }
-
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- memset ((char *) NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = malloc (strlen (Argv[1]) + 1);
- if (NewList->Str == NULL) {
- free (NewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- strcpy (NewList->Str, Argv[1]);
- //
- // Add it to our linked list
- //
- if (mGlobals.DatabaseFileName == NULL) {
- mGlobals.DatabaseFileName = NewList;
- } else {
- mGlobals.LastDatabaseFileName->Next = NewList;
- }
-
- mGlobals.LastDatabaseFileName = NewList;
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-ou") == 0) {
- //
- // -ou option to specify an output unicode file to
- // which we can dump our database.
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing database dump output file name");
- return STATUS_ERROR;
- }
-
- if (mGlobals.DumpUFileName[0] == 0) {
- strcpy (mGlobals.DumpUFileName, Argv[1]);
- } else {
- Error (UTILITY_NAME, 0, 0, Argv[1], "-ou option already specified with '%s'", mGlobals.DumpUFileName);
- return STATUS_ERROR;
- }
-
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-hpk") == 0) {
- //
- // -hpk option to create an HII export pack of the input database file
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing raw string data dump output file name");
- return STATUS_ERROR;
- }
-
- if (mGlobals.HiiExportPackFileName[0] == 0) {
- strcpy (mGlobals.HiiExportPackFileName, Argv[1]);
- } else {
- Error (UTILITY_NAME, 0, 0, Argv[1], "-or option already specified with '%s'", mGlobals.HiiExportPackFileName);
- return STATUS_ERROR;
- }
-
- Argc--;
- Argv++;
- } else if ((_stricmp (Argv[0], "-?") == 0) || (_stricmp (Argv[0], "-h") == 0)) {
- Usage ();
- return STATUS_ERROR;
- } else if (_stricmp (Argv[0], "-v") == 0) {
- mGlobals.Verbose = 1;
- } else if (_stricmp (Argv[0], "-vdbw") == 0) {
- mGlobals.VerboseDatabaseWrite = 1;
- } else if (_stricmp (Argv[0], "-vdbr") == 0) {
- mGlobals.VerboseDatabaseRead = 1;
- } else if (_stricmp (Argv[0], "-newdb") == 0) {
- mGlobals.NewDatabase = 1;
- } else if (_stricmp (Argv[0], "-ignorenotfound") == 0) {
- mGlobals.IgnoreNotFound = 1;
- } else if (_stricmp (Argv[0], "-oc") == 0) {
- //
- // check for one more arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing output C filename");
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.StringCFileName, Argv[1]);
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-bn") == 0) {
- //
- // check for one more arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing base name");
- Usage ();
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.BaseName, Argv[1]);
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-oh") == 0) {
- //
- // -oh to specify output .h defines file name
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing output .h filename");
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.StringHFileName, Argv[1]);
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-dep") == 0) {
- //
- // -dep to specify output dependency file name
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing output dependency filename");
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.OutputDependencyFileName, Argv[1]);
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-skipext") == 0) {
- //
- // -skipext to skip scanning of files with certain filename extensions
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing filename extension");
- return STATUS_ERROR;
- }
- //
- // Allocate memory for a new list element, fill it in, and
- // add it to our list of excluded extensions. Always make sure it
- // has a "." as the first character.
- //
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- memset ((char *) NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = malloc (strlen (Argv[1]) + 2);
- if (NewList->Str == NULL) {
- free (NewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- if (Argv[1][0] == '.') {
- strcpy (NewList->Str, Argv[1]);
- } else {
- NewList->Str[0] = '.';
- strcpy (NewList->Str + 1, Argv[1]);
- }
- //
- // Add it to our linked list
- //
- if (mGlobals.SkipExt == NULL) {
- mGlobals.SkipExt = NewList;
- } else {
- mGlobals.LastSkipExt->Next = NewList;
- }
-
- mGlobals.LastSkipExt = NewList;
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-lang") == 0) {
- //
- // "-lang zh-Hans" or "-lang en-US" to only output certain languages
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing language name");
- Usage ();
- return STATUS_ERROR;
- }
-
- if (AddCommandLineLanguage (Argv[1]) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- Argc--;
- Argv++;
- } else if (_stricmp (Argv[0], "-od") == 0) {
- //
- // Output database file name -- check for another arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing output database file name");
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.OutputDatabaseFileName, Argv[1]);
- Argv++;
- Argc--;
- } else if (_stricmp (Argv[0], "-ppflag") == 0) {
- //
- // -ppflag "Preprocess flags" -- check for another arg
- //
- if ((Argc <= 1) || (Argv[1][0] == '-')) {
- Error (UTILITY_NAME, 0, 0, Argv[0], "missing preprocess flags");
- Usage ();
- return STATUS_ERROR;
- }
-
- //
- // Allocate memory for a new list element, fill it in, and
- // add it to our list of preprocess flag.
- //
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- memset ((char *) NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = malloc (strlen (Argv[1]) * 2 + 1);
- if (NewList->Str == NULL) {
- free (NewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-
- //
- // Convert '"' to '\"' in preprocess flag
- //
- Cptr = Argv[1];
- Cptr2 = NewList->Str;
- if (*Cptr == '"') {
- *Cptr2++ = '\\';
- *Cptr2++ = '"';
- Cptr++;
- }
- while (*Cptr != '\0') {
- if ((*Cptr == '"') && (*(Cptr - 1) != '\\')) {
- *Cptr2++ = '\\';
- }
- *Cptr2++ = *Cptr++;
- }
- *Cptr2 = '\0';
-
- //
- // Add it to our linked list
- //
- if (mGlobals.PreprocessFlags == NULL) {
- mGlobals.PreprocessFlags = NewList;
- } else {
- mGlobals.LastPreprocessFlags->Next = NewList;
- }
- mGlobals.LastPreprocessFlags = NewList;
-
- mGlobals.Preprocess = TRUE;
-
- Argv++;
- Argc--;
- } else {
- //
- // Unrecognized arg
- //
- Error (UTILITY_NAME, 0, 0, Argv[0], "unrecognized option");
- Usage ();
- return STATUS_ERROR;
- }
-
- Argv++;
- Argc--;
- }
- //
- // Make sure they specified the mode parse/scan/dump
- //
- if (mGlobals.Mode == MODE_UNKNOWN) {
- Error (NULL, 0, 0, "must specify one of -parse/-scan/-dump", NULL);
- return STATUS_ERROR;
- }
- //
- // All modes require a database filename
- //
- if (mGlobals.DatabaseFileName == 0) {
- Error (NULL, 0, 0, "must specify a database filename using -db DbFileName", NULL);
- Usage ();
- return STATUS_ERROR;
- }
- //
- // If dumping the database file, then return immediately if all
- // parameters check out.
- //
- if (mGlobals.Mode == MODE_DUMP) {
- //
- // Not much use if they didn't specify -oh or -oc or -ou or -hpk
- //
- if ((mGlobals.DumpUFileName[0] == 0) &&
- (mGlobals.StringHFileName[0] == 0) &&
- (mGlobals.StringCFileName[0] == 0) &&
- (mGlobals.HiiExportPackFileName[0] == 0)
- ) {
- Error (NULL, 0, 0, "-dump without -oc/-oh/-ou/-hpk is a NOP", NULL);
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
- }
- //
- // Had to specify source string file and output string defines header filename.
- //
- if (mGlobals.Mode == MODE_SCAN) {
- if (Argc < 1) {
- Error (UTILITY_NAME, 0, 0, NULL, "must specify at least one source file to scan with -scan");
- Usage ();
- return STATUS_ERROR;
- }
- //
- // If -ppflag is specified, -oh should also be specified for preprocess
- //
- if (mGlobals.Preprocess && (mGlobals.StringHFileName[0] == 0)) {
- Error (UTILITY_NAME, 0, 0, NULL, "must specify string defines file name to preprocess before scan");
- Usage ();
- return STATUS_ERROR;
- }
- //
- // Get the list of filenames
- //
- while (Argc > 0) {
- NewList = malloc (sizeof (TEXT_STRING_LIST));
- if (NewList == NULL) {
- Error (UTILITY_NAME, 0, 0, "memory allocation failure", NULL);
- return STATUS_ERROR;
- }
-
- memset (NewList, 0, sizeof (TEXT_STRING_LIST));
- NewList->Str = (UINT8 *) malloc (strlen (Argv[0]) + 1);
- if (NewList->Str == NULL) {
- Error (UTILITY_NAME, 0, 0, "memory allocation failure", NULL);
- return STATUS_ERROR;
- }
-
- strcpy (NewList->Str, Argv[0]);
- if (mGlobals.ScanFileName == NULL) {
- mGlobals.ScanFileName = NewList;
- } else {
- mGlobals.LastScanFileName->Next = NewList;
- }
-
- mGlobals.LastScanFileName = NewList;
- Argc--;
- Argv++;
- }
- } else {
- //
- // Parse mode -- must specify an input unicode file name
- //
- if (Argc < 1) {
- Error (UTILITY_NAME, 0, 0, NULL, "must specify input unicode string file name with -parse");
- Usage ();
- return STATUS_ERROR;
- }
-
- strcpy (mGlobals.SourceFiles.FileName, Argv[0]);
- }
-
- return STATUS_SUCCESS;
-}
-//
-// Found "-lang zh-Hans;en-US" on the command line. Parse the
-// language list and save the setting for later processing.
-//
-static
-STATUS
-AddCommandLineLanguage (
- IN INT8 *Language
- )
-{
- char Separator[] = ";";
- char *Token;
- WCHAR_STRING_LIST *WNewList;
-
- //
- // Keep processing the input string until we find the end.
- //
- Token = strtok (Language, Separator);
- while (Token != NULL) {
- WNewList = MALLOC (sizeof (WCHAR_STRING_LIST));
- if (WNewList == NULL) {
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
- WNewList->Next = NULL;
- WNewList->Str = MALLOC ((strlen (Token) + 1) * sizeof (WCHAR));
- if (WNewList->Str == NULL) {
- free (WNewList);
- Error (UTILITY_NAME, 0, 0, NULL, "memory allocation failure");
- return STATUS_ERROR;
- }
-#ifdef USE_VC8
- swprintf (WNewList->Str, (strlen (Token) + 1) * sizeof (WCHAR), L"%S", Token);
-#else
- swprintf (WNewList->Str, L"%S", Token);
-#endif
-
- //
- // Add it to our linked list
- //
- if (mGlobals.Language == NULL) {
- mGlobals.Language = WNewList;
- } else {
- mGlobals.LastLanguage->Next = WNewList;
- }
-
- mGlobals.LastLanguage = WNewList;
- Token = strtok (NULL, Separator);
- }
-
- return STATUS_SUCCESS;
-}
-//
-// The contents of the text file are expected to be (one per line)
-// STRING_IDENTIFIER_NAME ScopeName
-// For example:
-// STR_ID_MY_FAVORITE_STRING IBM
-//
-static
-STATUS
-ParseIndirectionFiles (
- TEXT_STRING_LIST *Files
- )
-{
- FILE *Fptr;
- INT8 Line[200];
- INT8 *StringName;
- INT8 *ScopeName;
- INT8 *End;
- UINT32 LineCount;
- WCHAR_MATCHING_STRING_LIST *NewList;
-
- Line[sizeof (Line) - 1] = 0;
- Fptr = NULL;
- while (Files != NULL) {
- Fptr = fopen (Files->Str, "r");
- LineCount = 0;
- if (Fptr == NULL) {
- Error (NULL, 0, 0, Files->Str, "failed to open input indirection file for reading");
- return STATUS_ERROR;
- }
-
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {
- //
- // remove terminating newline for error printing purposes.
- //
- if (Line[strlen (Line) - 1] == '\n') {
- Line[strlen (Line) - 1] = 0;
- }
-
- LineCount++;
- if (Line[sizeof (Line) - 1] != 0) {
- Error (Files->Str, LineCount, 0, "line length exceeds maximum supported", NULL);
- goto Done;
- }
-
- StringName = Line;
- while (*StringName && (isspace (*StringName))) {
- StringName++;
- }
-
- if (*StringName) {
- if ((*StringName == '_') || isalpha (*StringName)) {
- End = StringName;
- while ((*End) && (*End == '_') || (isalnum (*End))) {
- End++;
- }
-
- if (isspace (*End)) {
- *End = 0;
- End++;
- while (isspace (*End)) {
- End++;
- }
-
- if (*End) {
- ScopeName = End;
- while (*End && !isspace (*End)) {
- End++;
- }
-
- *End = 0;
- //
- // Add the string name/scope pair
- //
- NewList = malloc (sizeof (WCHAR_MATCHING_STRING_LIST));
- if (NewList == NULL) {
- Error (NULL, 0, 0, "memory allocation error", NULL);
- goto Done;
- }
-
- memset (NewList, 0, sizeof (WCHAR_MATCHING_STRING_LIST));
- NewList->Str1 = (WCHAR *) malloc ((strlen (StringName) + 1) * sizeof (WCHAR));
- NewList->Str2 = (WCHAR *) malloc ((strlen (ScopeName) + 1) * sizeof (WCHAR));
- if ((NewList->Str1 == NULL) || (NewList->Str2 == NULL)) {
- Error (NULL, 0, 0, "memory allocation error", NULL);
- goto Done;
- }
-
-#ifdef USE_VC8
- swprintf (NewList->Str1, (strlen (StringName) + 1) * sizeof (WCHAR), L"%S", StringName);
- swprintf (NewList->Str2, (strlen (ScopeName) + 1) * sizeof (WCHAR), L"%S", ScopeName);
-#else
- swprintf (NewList->Str1, L"%S", StringName);
- swprintf (NewList->Str2, L"%S", ScopeName);
-#endif
- if (mGlobals.IndirectionList == NULL) {
- mGlobals.IndirectionList = NewList;
- } else {
- mGlobals.LastIndirectionList->Next = NewList;
- }
-
- mGlobals.LastIndirectionList = NewList;
- } else {
- Error (Files->Str, LineCount, 0, StringName, "invalid line : expected 'StringIdentifier Scope'");
- goto Done;
- }
- } else {
- Error (Files->Str, LineCount, 0, StringName, "invalid line : expected 'StringIdentifier Scope'");
- goto Done;
- }
- } else {
- Error (Files->Str, LineCount, 0, StringName, "invalid string identifier");
- goto Done;
- }
- }
- }
-
- fclose (Fptr);
- Fptr = NULL;
- Files = Files->Next;
- }
-
-Done:
- if (Fptr != NULL) {
- fclose (Fptr);
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-INTN
-PreprocessSourceFile (
- UINT8 *SourceFileName
- )
-{
- char *Cptr;
- FILE *InFptr;
- FILE *OutFptr;
- UINT32 CmdLen;
- char *PreProcessCmd;
- char BaseName[MAX_PATH];
- char TempFileName[MAX_PATH];
- char SourceFileDir[MAX_PATH];
- char Line[MAX_LINE_LEN];
- TEXT_STRING_LIST *List;
- char InsertLine[] = "#undef STRING_TOKEN\n";
- int Status;
-
- //
- // Check whehter source file exist
- //
- InFptr = fopen (SourceFileName, "r");
- if (InFptr == NULL) {
- Error (NULL, 0, 0, SourceFileName, "failed to open input file for scanning");
- return STATUS_ERROR;
- }
-
- //
- // Get source file directory
- //
- strcpy (SourceFileDir, SourceFileName);
- Cptr = strrchr (SourceFileDir, '\\');
- if (Cptr != NULL) {
- *Cptr = '\0';
- }
-
- //
- // Generate preprocess output file name
- //
- strcpy (BaseName, mGlobals.OutputDatabaseFileName);
- Cptr = strrchr (BaseName, '\\');
- if (Cptr != NULL) {
- *++Cptr = '\0';
- }
-
- Cptr = strrchr (SourceFileName, '\\');
- if (Cptr != NULL) {
- Cptr++;
- }
- strcat (BaseName, Cptr);
-
- Cptr = strrchr (BaseName, '.');
- if (Cptr != NULL) {
- *Cptr = '\0';
- }
-
- strcpy (mGlobals.PreprocessFileName, BaseName);
- strcat (mGlobals.PreprocessFileName, PREPROCESS_OUTPUT_FILE_EXTENSION);
-
- strcpy (TempFileName, BaseName);
- strcat (TempFileName, PREPROCESS_TEMP_FILE_EXTENSION);
-
- //
- // Insert "#undef STRING_TOKEN" after each line of "#include ...", so as to
- // preserve the STRING_TOKEN() for scanning after preprocess
- //
- OutFptr = fopen (TempFileName, "w");
- if (OutFptr == NULL) {
- Error (NULL, 0, 0, TempFileName, "failed to open file for write");
- fclose (InFptr);
- return STATUS_ERROR;
- }
- while (fgets (Line, MAX_LINE_LEN, InFptr) != NULL) {
- fputs (Line, OutFptr);
- Cptr = Line;
-
- //
- // Skip leading blank space
- //
- while (*Cptr == ' ' || *Cptr == '\t') {
- Cptr++;
- }
-
- if (*Cptr == '#' && strncmp (Cptr + 1, "include", 7) == 0){
- fputs (InsertLine, OutFptr);
- }
- }
- fclose (InFptr);
- fclose (OutFptr);
-
- //
- // Prepare preprocess command
- //
- CmdLen = 1;
- CmdLen += strlen (PREPROCESSOR_COMMAND);
- CmdLen++;
- CmdLen += strlen (PREPROCESSOR_OPTIONS);
- CmdLen++;
-
- //
- // "-I SourceFileDir "
- //
- CmdLen += strlen (SourceFileDir);
- CmdLen += 4;
-
- List = mGlobals.PreprocessFlags;
- while (List != NULL) {
- CmdLen += strlen (List->Str);
- CmdLen++;
-
- List = List->Next;
- }
-
- CmdLen += strlen (TempFileName);
- CmdLen += 3;
- CmdLen += strlen (mGlobals.PreprocessFileName);
-
- PreProcessCmd = malloc (CmdLen);
- if (PreProcessCmd == NULL) {
- Error (NULL, 0, 0, UTILITY_NAME, "memory allocation fail (%d bytes)\n", CmdLen);
- return STATUS_ERROR;
- }
-
- strcpy (PreProcessCmd, PREPROCESSOR_COMMAND);
- strcat (PreProcessCmd, " ");
- strcat (PreProcessCmd, PREPROCESSOR_OPTIONS);
- strcat (PreProcessCmd, " ");
-
-
- strcat (PreProcessCmd, "-I ");
- strcat (PreProcessCmd, SourceFileDir);
- strcat (PreProcessCmd, " ");
-
- List = mGlobals.PreprocessFlags;
- while (List != NULL) {
- strcat (PreProcessCmd, List->Str);
- strcat (PreProcessCmd, " ");
-
- List = List->Next;
- }
-
- strcat (PreProcessCmd, TempFileName);
- strcat (PreProcessCmd, " > ");
- strcat (PreProcessCmd, mGlobals.PreprocessFileName);
-
- //
- // Preprocess the source file
- //
- Status = system (PreProcessCmd);
- if (Status != 0) {
- Error (NULL, 0, 0, PreProcessCmd, "failed to spawn C preprocessor on source file\n");
- free (PreProcessCmd);
- return STATUS_ERROR;
- }
-
- free (PreProcessCmd);
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-ScanFiles (
- TEXT_STRING_LIST *ScanFiles
- )
-{
- char Line[MAX_LINE_LEN];
- FILE *Fptr;
- char *FileName;
- UINT32 LineNum;
- char *Cptr;
- char *SavePtr;
- char *TermPtr;
- char *StringTokenPos;
- TEXT_STRING_LIST *SList;
- BOOLEAN SkipIt;
- BOOLEAN FileExist;
-
- //
- // Put a null-terminator at the end of the line. If we read in
- // a line longer than we support, then we can catch it.
- //
- Line[MAX_LINE_LEN - 1] = 0;
- //
- // Process each file. If they gave us a skip extension list, then
- // skip it if the extension matches.
- //
- FileExist = FALSE;
- while (ScanFiles != NULL) {
- SkipIt = FALSE;
- for (SList = mGlobals.SkipExt; SList != NULL; SList = SList->Next) {
- if ((strlen (ScanFiles->Str) > strlen (SList->Str)) &&
- (strcmp (ScanFiles->Str + strlen (ScanFiles->Str) - strlen (SList->Str), SList->Str) == 0)
- ) {
- SkipIt = TRUE;
- //
- // printf ("Match: %s : %s\n", ScanFiles->Str, SList->Str);
- //
- break;
- }
- }
-
- if (!SkipIt) {
- if (mGlobals.VerboseScan) {
- printf ("Scanning %s\n", ScanFiles->Str);
- }
-
- if (mGlobals.Preprocess) {
- //
- // Create an empty string defines file for preprocessor
- //
- if (!FileExist) {
- Fptr = fopen (mGlobals.StringHFileName, "w");
- if (Fptr == NULL) {
- Error (NULL, 0, 0, mGlobals.StringHFileName, "failed to open file for write");
- return STATUS_ERROR;
- }
-
- fclose (Fptr);
- FileExist = TRUE;
- }
-
- //
- // Preprocess using C preprocessor
- //
- if (PreprocessSourceFile (ScanFiles->Str) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- FileName = mGlobals.PreprocessFileName;
- } else {
- FileName = ScanFiles->Str;
- }
-
- Fptr = fopen (FileName, "r");
- if (Fptr == NULL) {
- Error (NULL, 0, 0, FileName, "failed to open input file for scanning");
- return STATUS_ERROR;
- }
-
- LineNum = 0;
- while (fgets (Line, sizeof (Line), Fptr) != NULL) {
- LineNum++;
- if (Line[MAX_LINE_LEN - 1] != 0) {
- Error (ScanFiles->Str, LineNum, 0, "line length exceeds maximum supported by tool", NULL);
- fclose (Fptr);
- return STATUS_ERROR;
- }
- //
- // Remove the newline from the input line so we can print a warning message
- //
- if (Line[strlen (Line) - 1] == '\n') {
- Line[strlen (Line) - 1] = 0;
- }
- //
- // Terminate the line at // comments
- //
- Cptr = strstr (Line, "//");
- if (Cptr != NULL) {
- *Cptr = 0;
- }
-
- Cptr = Line;
- while ((Cptr = strstr (Cptr, STRING_TOKEN)) != NULL) {
- //
- // Found "STRING_TOKEN". Make sure we don't have NUM_STRING_TOKENS or
- // something like that. Then make sure it's followed by
- // an open parenthesis, a string identifier, and then a closing
- // parenthesis.
- //
- if (mGlobals.VerboseScan) {
- printf (" %d: %s", LineNum, Cptr);
- }
-
- if (((Cptr == Line) || (!IsValidIdentifierChar (*(Cptr - 1), FALSE))) &&
- (!IsValidIdentifierChar (*(Cptr + sizeof (STRING_TOKEN) - 1), FALSE))
- ) {
- StringTokenPos = Cptr;
- SavePtr = Cptr;
- Cptr += strlen (STRING_TOKEN);
- while (*Cptr && isspace (*Cptr) && (*Cptr != '(')) {
- Cptr++;
- }
-
- if (*Cptr != '(') {
- Warning (ScanFiles->Str, LineNum, 0, StringTokenPos, "expected "STRING_TOKEN "(identifier)");
- } else {
- //
- // Skip over the open-parenthesis and find the next non-blank character
- //
- Cptr++;
- while (isspace (*Cptr)) {
- Cptr++;
- }
-
- SavePtr = Cptr;
- if ((*Cptr == '_') || isalpha (*Cptr)) {
- while ((*Cptr == '_') || (isalnum (*Cptr))) {
- Cptr++;
- }
-
- TermPtr = Cptr;
- while (*Cptr && isspace (*Cptr)) {
- Cptr++;
- }
-
- if (*Cptr != ')') {
- Warning (ScanFiles->Str, LineNum, 0, StringTokenPos, "expected "STRING_TOKEN "(identifier)");
- }
-
- if (*TermPtr) {
- *TermPtr = 0;
- Cptr = TermPtr + 1;
- } else {
- Cptr = TermPtr;
- }
- //
- // Add the string identifier to the list of used strings
- //
- ParserSetPosition (ScanFiles->Str, LineNum);
- StringDBSetStringReferenced (SavePtr, mGlobals.IgnoreNotFound);
- if (mGlobals.VerboseScan) {
- printf ("...referenced %s", SavePtr);
- }
- } else {
- Warning (ScanFiles->Str, LineNum, 0, StringTokenPos, "expected valid string identifier name");
- }
- }
- } else {
- //
- // Found it, but it's a substring of something else. Advance our pointer.
- //
- Cptr++;
- }
-
- if (mGlobals.VerboseScan) {
- printf ("\n");
- }
- }
- }
-
- fclose (Fptr);
- } else {
- //
- // Skipping this file type
- //
- if (mGlobals.VerboseScan) {
- printf ("Skip scanning of %s\n", ScanFiles->Str);
- }
- }
-
- ScanFiles = ScanFiles->Next;
- }
-
- //
- // Remove the empty string defines file
- //
- if (FileExist) {
- remove (mGlobals.StringHFileName);
- }
-
- return STATUS_SUCCESS;
-}
-//
-// Free the global string lists we allocated memory for
-//
-static
-void
-FreeLists (
- VOID
- )
-{
- TEXT_STRING_LIST *Temp;
- WCHAR_STRING_LIST *WTemp;
-
- //
- // Traverse the include paths, freeing each
- //
- while (mGlobals.IncludePaths != NULL) {
- Temp = mGlobals.IncludePaths->Next;
- free (mGlobals.IncludePaths->Str);
- free (mGlobals.IncludePaths);
- mGlobals.IncludePaths = Temp;
- }
- //
- // If we did a scan, then free up our
- // list of files to scan.
- //
- while (mGlobals.ScanFileName != NULL) {
- Temp = mGlobals.ScanFileName->Next;
- free (mGlobals.ScanFileName->Str);
- free (mGlobals.ScanFileName);
- mGlobals.ScanFileName = Temp;
- }
- //
- // Free up preprocess flags list
- //
- while (mGlobals.PreprocessFlags != NULL) {
- Temp = mGlobals.PreprocessFlags->Next;
- free (mGlobals.PreprocessFlags->Str);
- free (mGlobals.PreprocessFlags);
- mGlobals.PreprocessFlags = Temp;
- }
- //
- // If they gave us a list of filename extensions to
- // skip on scan, then free them up.
- //
- while (mGlobals.SkipExt != NULL) {
- Temp = mGlobals.SkipExt->Next;
- free (mGlobals.SkipExt->Str);
- free (mGlobals.SkipExt);
- mGlobals.SkipExt = Temp;
- }
- //
- // Free up any languages specified
- //
- while (mGlobals.Language != NULL) {
- WTemp = mGlobals.Language->Next;
- free (mGlobals.Language->Str);
- free (mGlobals.Language);
- mGlobals.Language = WTemp;
- }
- //
- // Free up our indirection list
- //
- while (mGlobals.IndirectionList != NULL) {
- mGlobals.LastIndirectionList = mGlobals.IndirectionList->Next;
- free (mGlobals.IndirectionList->Str1);
- free (mGlobals.IndirectionList->Str2);
- free (mGlobals.IndirectionList);
- mGlobals.IndirectionList = mGlobals.LastIndirectionList;
- }
-
- while (mGlobals.IndirectionFileName != NULL) {
- mGlobals.LastIndirectionFileName = mGlobals.IndirectionFileName->Next;
- free (mGlobals.IndirectionFileName->Str);
- free (mGlobals.IndirectionFileName);
- mGlobals.IndirectionFileName = mGlobals.LastIndirectionFileName;
- }
-}
-
-static
-BOOLEAN
-IsValidIdentifierChar (
- INT8 Char,
- BOOLEAN FirstChar
- )
-{
- //
- // If it's the first character of an identifier, then
- // it must be one of [A-Za-z_].
- //
- if (FirstChar) {
- if (isalpha (Char) || (Char == '_')) {
- return TRUE;
- }
- } else {
- //
- // If it's not the first character, then it can
- // be one of [A-Za-z_0-9]
- //
- if (isalnum (Char) || (Char == '_')) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static
-void
-RewindFile (
- SOURCE_FILE *SourceFile
- )
-{
- SourceFile->LineNum = 1;
- SourceFile->FileBufferPtr = SourceFile->FileBuffer;
- SourceFile->EndOfFile = FALSE;
-}
-
-static
-BOOLEAN
-SkipTo (
- SOURCE_FILE *SourceFile,
- WCHAR WChar,
- BOOLEAN StopAfterNewline
- )
-{
- while (!EndOfFile (SourceFile)) {
- //
- // Check for the character of interest
- //
- if (SourceFile->FileBufferPtr[0] == WChar) {
- return TRUE;
- } else {
- if (SourceFile->FileBufferPtr[0] == UNICODE_LF) {
- SourceFile->LineNum++;
- if (StopAfterNewline) {
- SourceFile->FileBufferPtr++;
- if (SourceFile->FileBufferPtr[0] == 0) {
- SourceFile->FileBufferPtr++;
- }
-
- return FALSE;
- }
- }
-
- SourceFile->FileBufferPtr++;
- }
- }
-
- return FALSE;
-}
-
-static
-void
-Usage (
- VOID
- )
-/*++
-
-Routine Description:
-
- Print usage information for this utility.
-
-Arguments:
-
- None.
-
-Returns:
-
- Nothing.
-
---*/
-{
- int Index;
- const char *Str[] = {
- UTILITY_NAME" "UTILITY_VERSION" - Intel UEFI String Gather Utility",
- " Copyright (C), 2004 - 2008 Intel Corporation",
-
-#if ( defined(UTILITY_BUILD) && defined(UTILITY_VENDOR) )
- " Built from "UTILITY_BUILD", project of "UTILITY_VENDOR,
-#endif
- "",
- "Usage:",
- " "UTILITY_NAME" -parse [OPTION] FILE",
- " "UTILITY_NAME" -scan [OPTION] FILE",
- " "UTILITY_NAME" -dump [OPTION]",
- "Description:",
- " Process unicode strings file.",
- "Common options include:",
- " -h or -? for this help information",
- " -db Database required name of output/input database file",
- " -bn BaseName for use in the .h and .c output files",
- " Default = "DEFAULT_BASE_NAME,
- " -v for verbose output",
- " -vdbw for verbose output when writing database",
- " -vdbr for verbose output when reading database",
- " -od FileName to specify an output database file name",
- "Parse options include:",
- " -i IncludePath add IncludePath to list of search paths",
- " -dep FileName to specify an output dependency file name",
- " -newdb to not read in existing database file",
- " -uqs to indicate that unquoted strings are used",
- " FileNames name of one or more unicode files to parse",
- "Scan options include:",
- " -scan scan text file(s) for STRING_TOKEN() usage",
- " -skipext .ext to skip scan of files with .ext filename extension",
- " -ppflag \"Flags\" to specify the C preprocessor flags",
- " -oh FileName to specify string defines file name for preprocessor",
- " -ignorenotfound ignore if a given STRING_TOKEN(STR) is not ",
- " found in the database",
- " FileNames one or more files to scan",
- "Dump options include:",
- " -oc FileName write string data to FileName",
- " -oh FileName write string defines to FileName",
- " -ou FileName dump database to unicode file FileName",
- " -lang Lang only dump for the language 'Lang'",
- " use ';' to separate multiple languages",
- " -if FileName to specify an indirection file",
- " -hpk FileName to create an HII export pack of the strings",
- "",
- "The expected process is to parse a unicode string file to create an initial",
- "database of string identifier names and string definitions. Then text files",
- "should be scanned for STRING_TOKEN() usages, and the referenced",
- "strings will be tagged as used in the database. After all files have been",
- "scanned, then the database should be dumped to create the necessary output",
- "files.",
- "",
- NULL
- };
- for (Index = 0; Str[Index] != NULL; Index++) {
- fprintf (stdout, "%s\n", Str[Index]);
- }
-}
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.h
deleted file mode 100644
index 4ab20d9359..0000000000
--- a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StrGather.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*++
-
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
-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:
-
- StrGather.h
-
-Abstract:
-
- Common defines and prototypes for StrGather.
-
---*/
-
-#ifndef _STR_GATHER_H_
-#define _STR_GATHER_H_
-
-#define MALLOC(size) malloc (size)
-#define FREE(ptr) do { if ((ptr) != NULL) { free (ptr); } } while (0)
-
-typedef CHAR16 WCHAR;
-
-#define UNICODE_TO_ASCII(w) (INT8) ((w) & 0xFF)
-#define ASCII_TO_UNICODE(a) (WCHAR) ((UINT8) (a))
-
-#define UNICODE_HASH L'#'
-#define UNICODE_BACKSLASH L'\\'
-#define UNICODE_SLASH L'/'
-#define UNICODE_EQUAL_SIGN L'='
-#define UNICODE_PLUS_SIGN L'+'
-
-#define UNICODE_FILE_START 0xFEFF
-#define UNICODE_CR 0x000D
-#define UNICODE_LF 0x000A
-#define UNICODE_NULL 0x0000
-#define UNICODE_SPACE L' '
-#define UNICODE_SLASH L'/'
-#define UNICODE_DOUBLE_QUOTE L'"'
-#define UNICODE_OPEN_PAREN L'('
-#define UNICODE_CLOSE_PAREN L')'
-#define UNICODE_Z L'Z'
-#define UNICODE_z L'z'
-#define UNICODE_A L'A'
-#define UNICODE_a L'a'
-#define UNICODE_F L'F'
-#define UNICODE_f L'f'
-#define UNICODE_UNDERSCORE L'_'
-#define UNICODE_MINUS L'-'
-#define UNICODE_0 L'0'
-#define UNICODE_9 L'9'
-#define UNICODE_TAB L'\t'
-#define UNICODE_NBR_STRING L"\\nbr"
-#define UNICODE_BR_STRING L"\\br"
-#define UNICODE_WIDE_STRING L"\\wide"
-#define UNICODE_NARROW_STRING L"\\narrow"
-
-//
-// This is the length of a valid string identifier
-//
-#define LANGUAGE_IDENTIFIER_NAME_LEN 128
-
-typedef struct _TEXT_STRING_LIST {
- struct _TEXT_STRING_LIST *Next;
- UINT8 *Str;
-} TEXT_STRING_LIST;
-
-typedef struct _WCHAR_STRING_LIST {
- struct _WCHAR_STRING_LIST *Next;
- WCHAR *Str;
-} WCHAR_STRING_LIST;
-
-typedef struct _WCHAR_MATCHING_STRING_LIST {
- struct _WCHAR_MATCHING_STRING_LIST *Next;
- WCHAR *Str1;
- WCHAR *Str2;
-} WCHAR_MATCHING_STRING_LIST;
-
-#endif // #ifndef _STR_GATHER_H_
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.c b/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.c
deleted file mode 100644
index eaa15ad763..0000000000
--- a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.c
+++ /dev/null
@@ -1,2708 +0,0 @@
-/*++
-
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
-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:
-
- StringDB.c
-
-Abstract:
-
- String database implementation
-
---*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <Tiano.h>
-#include <EfiUtilityMsgs.h>
-#include <EfiHii.h>
-#include "StrGather.h"
-#include "StringDb.h"
-
-static STRING_DB_DATA mDBData;
-
-static const char *mSourceFileHeader[] = {
- "//",
- "// DO NOT EDIT -- auto-generated file",
- "//",
- "// This file is generated by the string gather utility",
- "//",
- NULL
-};
-
-static
-STRING_LIST *
-StringDBFindString (
- WCHAR *LanguageName,
- WCHAR *StringName,
- WCHAR *Scope,
- WCHAR_STRING_LIST *LanguagesOfInterest,
- WCHAR_MATCHING_STRING_LIST *IndirectionList
- );
-
-static
-STRING_IDENTIFIER *
-StringDBFindStringIdentifierByName (
- WCHAR *Name
- );
-
-static
-STRING_IDENTIFIER *
-StringDBFindStringIdentifierByIndex (
- UINT32 Index
- );
-
-static
-void
-StringDBWriteStandardFileHeader (
- FILE *OutFptr
- );
-
-static
-WCHAR *
-AsciiToWchar (
- INT8 *Str
- );
-
-static
-CHAR8 *
-WcharToAscii (
- WCHAR *Str
- );
-
-static
-WCHAR *
-DuplicateString (
- WCHAR *Str
- );
-
-static
-WCHAR *
-WstrCatenate (
- WCHAR *Dst,
- WCHAR *Src
- );
-
-static
-STATUS
-StringDBWriteStringIdentifier (
- FILE *DBFptr,
- UINT16 StringId,
- UINT16 Flags,
- WCHAR *IdentifierName
- );
-
-static
-STATUS
-StringDBReadStringIdentifier (
- FILE *DBFptr
- );
-
-static
-STATUS
-StringDBWriteLanguageDefinition (
- FILE *DBFptr,
- WCHAR *LanguageName,
- WCHAR *PrintableLanguageName,
- WCHAR *SecondaryLanguageList
- );
-
-static
-STATUS
-StringDBReadLanguageDefinition (
- FILE *DBFptr
- );
-
-static
-STATUS
-StringDBWriteString (
- FILE *DBFptr,
- UINT16 Flags,
- WCHAR *Language,
- WCHAR *StringName,
- WCHAR *Scope,
- WCHAR *Str
- );
-
-static
-STATUS
-StringDBReadString (
- FILE *DBFptr
- );
-
-static
-STATUS
-StringDBReadGenericString (
- FILE *DBFptr,
- UINT16 *Size,
- WCHAR **Str
- );
-
-static
-STATUS
-StringDBWriteGenericString (
- FILE *DBFptr,
- WCHAR *Str
- );
-
-static
-void
-StringDBAssignStringIndexes (
- VOID
- );
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
- Constructor function for the string database handler.
-
-Arguments:
- None.
-
-Returns:
- None.
-
---*/
-void
-StringDBConstructor (
- VOID
- )
-{
- memset ((char *) &mDBData, 0, sizeof (STRING_DB_DATA));
- mDBData.CurrentScope = DuplicateString (L"NULL");
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
- Destructor function for the string database handler.
-
-Arguments:
- None.
-
-Returns:
- None.
-
---*/
-void
-StringDBDestructor (
- VOID
- )
-{
- LANGUAGE_LIST *NextLang;
- STRING_LIST *NextStr;
- STRING_IDENTIFIER *NextIdentifier;
- //
- // Close the database file if it's open
- //
- if (mDBData.StringDBFptr != NULL) {
- fclose (mDBData.StringDBFptr);
- mDBData.StringDBFptr = NULL;
- }
- //
- // If we've allocated any strings/languages, free them up
- //
- while (mDBData.LanguageList != NULL) {
- NextLang = mDBData.LanguageList->Next;
- //
- // Free up all strings for this language
- //
- while (mDBData.LanguageList->String != NULL) {
- NextStr = mDBData.LanguageList->String->Next;
- FREE (mDBData.LanguageList->String->Str);
- FREE (mDBData.LanguageList->String);
- mDBData.LanguageList->String = NextStr;
- }
-
- FREE (mDBData.LanguageList->SecondaryLanguageList);
- FREE (mDBData.LanguageList->PrintableLanguageName);
- FREE (mDBData.LanguageList);
- mDBData.LanguageList = NextLang;
- }
- //
- // Free up string identifiers
- //
- while (mDBData.StringIdentifier != NULL) {
- NextIdentifier = mDBData.StringIdentifier->Next;
- FREE (mDBData.StringIdentifier->StringName);
- FREE (mDBData.StringIdentifier);
- mDBData.StringIdentifier = NextIdentifier;
- }
- //
- // Free the filename
- //
- if (mDBData.StringDBFileName != NULL) {
- FREE (mDBData.StringDBFileName);
- mDBData.StringDBFileName = NULL;
- }
- //
- // We save a copy of the scope, so free it up if we
- // have one.
- //
- if (mDBData.CurrentScope != NULL) {
- FREE (mDBData.CurrentScope);
- mDBData.CurrentScope = NULL;
- }
-}
-
-/*****************************************************************************/
-STATUS
-StringDBDumpStringDefines (
- INT8 *FileName,
- INT8 *BaseName
- )
-{
- FILE *Fptr;
- STRING_IDENTIFIER *Identifier;
- INT8 CopyBaseName[100];
- UINT32 Index;
- const INT8 *StrDefHeader[] = {
- "#ifndef _%s_STRINGS_DEFINE_H_\n",
- "#define _%s_STRINGS_DEFINE_H_\n\n",
- NULL
- };
-
- if ((Fptr = fopen (FileName, "w")) == NULL) {
- Error (NULL, 0, 0, FileName, "failed to open output string defines file");
- return STATUS_ERROR;
- }
- //
- // Get the base source filename and convert to uppercase.
- //
- if (sizeof (CopyBaseName) <= strlen (BaseName) + 1) {
- Error (NULL, 0, 0, "application error", "StringDBDumpStringDefines() string length insufficient");
- return STATUS_ERROR;
- }
-
- strcpy (CopyBaseName, BaseName);
- for (Index = 0; CopyBaseName[Index] != 0; Index++) {
- if (islower (CopyBaseName[Index])) {
- CopyBaseName[Index] = (INT8) toupper (CopyBaseName[Index]);
- }
- }
- //
- // Assign index values to the string identifiers
- //
- StringDBAssignStringIndexes ();
- //
- // Write the standard header to the output file, and then the
- // protective #ifndef.
- //
- StringDBWriteStandardFileHeader (Fptr);
- for (Index = 0; StrDefHeader[Index] != NULL; Index++) {
- fprintf (Fptr, StrDefHeader[Index], CopyBaseName);
- }
- //
- // Print all the #defines for the string identifiers. Print identifiers
- // whose names start with '$' as comments. Add comments for string
- // identifiers not used as well.
- //
- Identifier = mDBData.StringIdentifier;
- while (Identifier != NULL) {
- if (Identifier->StringName[0] == L'$') {
- fprintf (Fptr, "// ");
- }
-
- if (Identifier->Flags & STRING_FLAGS_REFERENCED) {
- fprintf (Fptr, "#define %-40S 0x%04X\n", Identifier->StringName, Identifier->Index);
- } else {
- fprintf (Fptr, "//#define %-40S 0x%04X // not referenced\n", Identifier->StringName, Identifier->Index);
- }
-
- Identifier = Identifier->Next;
- }
-
- fprintf (Fptr, "\n#endif\n");
- fclose (Fptr);
- return STATUS_SUCCESS;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Add a string identifier to the database.
-
-Arguments:
-
- StringName - name of the string identifier. For example "STR_MY_STRING"
- NewId - if an ID has been assigned
- Flags - characteristics for the identifier
-
-Returns:
-
- STATUS
-
---*/
-STATUS
-StringDBAddStringIdentifier (
- WCHAR *StringName,
- UINT16 *NewId,
- UINT16 Flags
- )
-{
- STRING_IDENTIFIER *StringIdentifier;
- STATUS Status;
- //
- // If it was already used for some other language, then we don't
- // need to add it. But set it to the current string identifier.
- // The referenced bit is sticky.
- //
- Status = STATUS_SUCCESS;
- StringIdentifier = StringDBFindStringIdentifierByName (StringName);
- if (StringIdentifier != NULL) {
- if (Flags & STRING_FLAGS_REFERENCED) {
- StringIdentifier->Flags |= STRING_FLAGS_REFERENCED;
- }
-
- mDBData.CurrentStringIdentifier = StringIdentifier;
- *NewId = (UINT16) StringIdentifier->Index;
- return Status;
- }
-
- StringIdentifier = (STRING_IDENTIFIER *) MALLOC (sizeof (STRING_IDENTIFIER));
- if (StringIdentifier == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
-
- memset ((char *) StringIdentifier, 0, sizeof (STRING_IDENTIFIER));
- StringIdentifier->StringName = (WCHAR *) malloc ((wcslen (StringName) + 1) * sizeof (WCHAR));
- if (StringIdentifier->StringName == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
-
- wcscpy (StringIdentifier->StringName, StringName);
- if (*NewId != STRING_ID_INVALID) {
- StringIdentifier->Index = *NewId;
- StringIdentifier->Flags |= STRING_FLAGS_INDEX_ASSIGNED;
- if (mDBData.NumStringIdentifiers <= StringIdentifier->Index) {
- mDBData.NumStringIdentifiers = StringIdentifier->Index + 1;
- }
- } else {
- StringIdentifier->Index = mDBData.NumStringIdentifiers++;
- }
-
- StringIdentifier->Flags |= Flags;
- //
- // Add it to our list of string identifiers
- //
- if (mDBData.StringIdentifier == NULL) {
- mDBData.StringIdentifier = StringIdentifier;
- } else {
- mDBData.LastStringIdentifier->Next = StringIdentifier;
- }
-
- mDBData.LastStringIdentifier = StringIdentifier;
- mDBData.CurrentStringIdentifier = StringIdentifier;
- *NewId = (UINT16) StringIdentifier->Index;
- return Status;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Add a new string to the database.
-
-Arguments:
-
- LanguageName - "eng" or "spa" language name
- StringName - "STR_MY_TEXT" string name
- Scope - from the #scope statements in the string file
- Format - if we should format the string
- Flags - characteristic flags for the string
-
-Returns:
-
- STATUS
-
-Notes:
-
- Several of the fields can be "inherited" from the previous calls to
- our database functions. For example, if scope is NULL here, then
- we'll use the previous setting.
-
---*/
-STATUS
-StringDBAddString (
- WCHAR *LanguageName,
- WCHAR *StringName,
- WCHAR *Scope,
- WCHAR *String,
- BOOLEAN Format,
- UINT16 Flags
- )
-{
- LANGUAGE_LIST *Lang;
- UINT32 Size;
- STRING_LIST *Str;
- UINT16 StringIndex;
- STRING_IDENTIFIER *StringIdentifier;
-
- //
- // If they specified a language, make sure they've defined it already
- // via a #langdef statement. Otherwise use the current default language.
- //
- if (LanguageName != NULL) {
- Lang = StringDBFindLanguageList (LanguageName);
- if (Lang == NULL) {
- ParserError (0, "language not defined", "%S", LanguageName);
- return STATUS_ERROR;
- } else {
- StringDBSetCurrentLanguage (LanguageName);
- }
- } else {
- Lang = mDBData.CurrentLanguage;
- if (Lang == NULL) {
- //
- // Have to call SetLanguage() first
- //
- ParserError (0, "no language defined", "%S", StringName);
- return STATUS_ERROR;
- }
- }
- //
- // If they didn't define a string identifier, use the last string identifier
- // added.
- //
- if (StringName == NULL) {
- StringName = mDBData.CurrentStringIdentifier->StringName;
- if (StringName == NULL) {
- ParserError (0, "no string identifier previously specified", NULL);
- return STATUS_ERROR;
- }
- }
- //
- // If scope was not specified, use the default setting
- //
- if (Scope != NULL) {
- Scope = DuplicateString (Scope);
- } else {
- Scope = DuplicateString (mDBData.CurrentScope);
- }
- //
- // printf ("Adding string: %S.%S.%S\n", Lang->LanguageName, StringName, Scope);
- //
- // Check for duplicates for this Language.StringName.Scope. Allow multiple
- // definitions of the language name and printable language name, since the
- // user does not specifically define them.
- //
- if (StringDBFindString (Lang->LanguageName, StringName, Scope, NULL, NULL) != NULL) {
- if ((wcscmp (StringName, LANGUAGE_NAME_STRING_NAME) == 0) &&
- (wcscmp (StringName, PRINTABLE_LANGUAGE_NAME_STRING_NAME) == 0)
- ) {
- ParserError (
- 0,
- "string multiply defined",
- "Language.Name.Scope = %S.%S.%S",
- Lang->LanguageName,
- StringName,
- Scope
- );
- return STATUS_ERROR;
- }
- }
-
- StringIndex = STRING_ID_INVALID;
- if (StringDBAddStringIdentifier (StringName, &StringIndex, Flags) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- StringIdentifier = StringDBFindStringIdentifierByName (StringName);
- //
- // Add this string to the end of the strings for this language.
- //
- Str = (STRING_LIST *) malloc (sizeof (STRING_LIST));
- if (Str == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
-
- memset ((char *) Str, 0, sizeof (STRING_LIST));
- Size = (wcslen (String) + 1) * sizeof (WCHAR);
- Str->Flags = Flags;
- Str->Scope = Scope;
- Str->StringName = StringIdentifier->StringName;
- Str->LanguageName = DuplicateString (LanguageName);
- Str->Str = (WCHAR *) MALLOC (Size);
- if (Str->Str == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
- //
- // If not formatting, just copy the string.
- //
- wcscpy (Str->Str, String);
- if (Format) {
- StringDBFormatString (Str->Str);
- }
- //
- // Size may change after formatting. We set the size to
- // the actual size of the string, including the null for
- // easier processing later.
- //
- Str->Size = (wcslen (Str->Str) + 1) * sizeof (WCHAR);
- if (Lang->String == NULL) {
- Lang->String = Str;
- } else {
- Lang->LastString->Next = Str;
- }
-
- Lang->LastString = Str;
- return STATUS_SUCCESS;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Given a language name, see if a language list for it has been defined
-
-Arguments:
-
- LanguageName - like "eng"
-
-Returns:
-
- A pointer to the language list
-
---*/
-LANGUAGE_LIST *
-StringDBFindLanguageList (
- WCHAR *LanguageName
- )
-{
- LANGUAGE_LIST *Lang;
-
- Lang = mDBData.LanguageList;
- while (Lang != NULL) {
- if (wcscmp (LanguageName, Lang->LanguageName) == 0) {
- break;
- }
-
- Lang = Lang->Next;
- }
-
- return Lang;
-}
-
-/*****************************************************************************/
-STATUS
-StringDBSetCurrentLanguage (
- WCHAR *LanguageName
- )
-{
- LANGUAGE_LIST *Lang;
-
- Lang = StringDBFindLanguageList (LanguageName);
- if (Lang == NULL) {
- ParserError (0, "language not previously defined", "%S", LanguageName);
- return STATUS_ERROR;
- }
-
- mDBData.CurrentLanguage = Lang;
- return STATUS_SUCCESS;
-}
-
-/*****************************************************************************/
-STATUS
-StringDBAddLanguage (
- WCHAR *LanguageName,
- WCHAR *PrintableLanguageName,
- WCHAR *SecondaryLanguageList
- )
-{
- LANGUAGE_LIST *Lang;
- //
- // Check for redefinitions
- //
- Lang = StringDBFindLanguageList (LanguageName);
- if (Lang != NULL) {
- //
- // Better be the same printable name
- //
- if (wcscmp (PrintableLanguageName, Lang->PrintableLanguageName) != 0) {
- ParserError (
- 0,
- "language redefinition",
- "%S:%S != %S:%S",
- Lang->LanguageName,
- Lang->PrintableLanguageName,
- LanguageName,
- PrintableLanguageName
- );
- return STATUS_ERROR;
- //
- // } else {
- // ParserWarning (0, "benign language redefinition", "%S", PrintableLanguageName);
- // return STATUS_WARNING;
- //
- }
- } else {
- //
- // Allocate memory to keep track of this new language
- //
- Lang = (LANGUAGE_LIST *) malloc (sizeof (LANGUAGE_LIST));
- if (Lang == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
-
- memset ((char *) Lang, 0, sizeof (LANGUAGE_LIST));
- //
- // Save the language name, then allocate memory to save the
- // printable language name
- //
- Lang->LanguageName = (WCHAR *) malloc ((wcslen (LanguageName) + 1) * 2);
- if (Lang->LanguageName == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- return STATUS_ERROR;
- }
- wcscpy (Lang->LanguageName, LanguageName);
- Lang->PrintableLanguageName = (WCHAR *) malloc ((wcslen (PrintableLanguageName) + 1) * sizeof (WCHAR));
- if (Lang->PrintableLanguageName == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- FREE (Lang->LanguageName);
- return STATUS_ERROR;
- }
- wcscpy (Lang->PrintableLanguageName, PrintableLanguageName);
-
- if (SecondaryLanguageList != NULL) {
- Lang->SecondaryLanguageList = (WCHAR *) malloc ((wcslen (SecondaryLanguageList) + 1) * sizeof (WCHAR));
- if (Lang->SecondaryLanguageList == NULL) {
- Error (NULL, 0, 0, NULL, "memory allocation error");
- FREE (Lang->PrintableLanguageName);
- FREE (Lang->LanguageName);
- return STATUS_ERROR;
- }
- wcscpy (Lang->SecondaryLanguageList, SecondaryLanguageList);
- } else {
- Lang->SecondaryLanguageList = NULL;
- }
-
- if (mDBData.LanguageList == NULL) {
- mDBData.LanguageList = Lang;
- } else {
- mDBData.LastLanguageList->Next = Lang;
- }
-
- mDBData.LastLanguageList = Lang;
- }
- //
- // Default is to make our active language this new one
- //
- StringDBSetCurrentLanguage (LanguageName);
- //
- // The first two strings for any language are the language name,
- // followed by the printable language name. Add them and set them
- // to referenced so they never get stripped out.
- //
- StringDBAddString (
- LanguageName,
- LANGUAGE_NAME_STRING_NAME,
- NULL,
- LanguageName,
- FALSE,
- STRING_FLAGS_REFERENCED
- );
- StringDBAddString (
- LanguageName,
- PRINTABLE_LANGUAGE_NAME_STRING_NAME,
- NULL,
- PrintableLanguageName,
- FALSE,
- STRING_FLAGS_REFERENCED
- );
- return STATUS_SUCCESS;
-}
-
-STATUS
-StringDBAddSecondaryLanguage (
- WCHAR *LanguageName,
- WCHAR *SecondaryLanguageList
- )
-{
- LANGUAGE_LIST *Lang;
-
- Lang = StringDBFindLanguageList (LanguageName);
- if (Lang == NULL) {
- return STATUS_ERROR;
- } else {
- Lang->SecondaryLanguageList = WstrCatenate(Lang->SecondaryLanguageList, SecondaryLanguageList);
- return STATUS_SUCCESS;
- }
-}
-
-/*****************************************************************************/
-static
-STRING_IDENTIFIER *
-StringDBFindStringIdentifierByName (
- WCHAR *StringName
- )
-{
- STRING_IDENTIFIER *Identifier;
-
- Identifier = mDBData.StringIdentifier;
- while (Identifier != NULL) {
- if (wcscmp (StringName, Identifier->StringName) == 0) {
- return Identifier;
- }
-
- Identifier = Identifier->Next;
- }
-
- return NULL;
-}
-
-static
-STRING_IDENTIFIER *
-StringDBFindStringIdentifierByIndex (
- UINT32 StringIndex
- )
-{
- STRING_IDENTIFIER *Identifier;
-
- Identifier = mDBData.StringIdentifier;
- while (Identifier != NULL) {
- if (Identifier->Index == StringIndex) {
- return Identifier;
- }
-
- Identifier = Identifier->Next;
- }
-
- return NULL;
-}
-
-/*****************************************************************************/
-static
-void
-StringDBWriteStandardFileHeader (
- FILE *OutFptr
- )
-{
- UINT32 TempIndex;
- for (TempIndex = 0; mSourceFileHeader[TempIndex] != NULL; TempIndex++) {
- fprintf (OutFptr, "%s\n", mSourceFileHeader[TempIndex]);
- }
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Given a Unicode string from an input file, reformat the string to replace
- backslash control sequences with the appropriate encoding.
-
-Arguments:
-
- String - pointer to string to reformat
-
-Returns:
-
- Nothing
-
---*/
-void
-StringDBFormatString (
- WCHAR *String
- )
-{
- WCHAR *From;
- WCHAR *To;
- int HexNibbles;
- WCHAR HexValue;
- //
- // Go through the string and process any formatting characters
- //
- From = String;
- To = String;
- while (*From) {
- if (*From == UNICODE_BACKSLASH) {
- //
- // First look for \wide and replace with the appropriate control character. Note that
- // when you have "define STR L"ABC"", then sizeof(ABC) is 8 because the null char is
- // counted. Make adjustments for this. We advance From below, so subtract 2 each time.
- //
- if (wcsncmp (From, UNICODE_WIDE_STRING, sizeof (UNICODE_WIDE_STRING) / sizeof (WCHAR) - 1) == 0) {
- *To = WIDE_CHAR;
- From += sizeof (UNICODE_WIDE_STRING) / sizeof (WCHAR) - 2;
- } else if (wcsncmp (From, UNICODE_NARROW_STRING, sizeof (UNICODE_NARROW_STRING) / sizeof (WCHAR) - 1) == 0) {
- //
- // Found: \narrow
- //
- *To = NARROW_CHAR;
- From += sizeof (UNICODE_NARROW_STRING) / sizeof (WCHAR) - 2;
- } else if (wcsncmp (From, UNICODE_NBR_STRING, sizeof (UNICODE_NBR_STRING) / sizeof (WCHAR) - 1) == 0) {
- //
- // Found: \nbr
- //
- *To = NON_BREAKING_CHAR;
- From += sizeof (UNICODE_NBR_STRING) / sizeof (WCHAR) - 2;
- } else if (wcsncmp (From, UNICODE_BR_STRING, sizeof (UNICODE_BR_STRING) / sizeof (WCHAR) - 1) == 0) {
- //
- // Found: \br -- pass through untouched
- //
- *To = *From;
- } else {
- //
- // Standard one-character control sequences such as \n, \r, \\, or \x
- //
- From++;
- switch (*From) {
- case ASCII_TO_UNICODE ('n'):
- *To = UNICODE_CR;
- To++;
- *To = UNICODE_LF;
- break;
-
- //
- // carriage return
- //
- case ASCII_TO_UNICODE ('r'):
- *To = UNICODE_CR;
- break;
-
- //
- // backslash
- //
- case UNICODE_BACKSLASH:
- *To = UNICODE_BACKSLASH;
- break;
-
- //
- // Tab
- //
- case ASCII_TO_UNICODE ('t'):
- *To = UNICODE_TAB;
- break;
-
- //
- // embedded double-quote
- //
- case UNICODE_DOUBLE_QUOTE:
- *To = UNICODE_DOUBLE_QUOTE;
- break;
-
- //
- // Hex Unicode character \x1234. We'll process up to 4 hex characters
- //
- case ASCII_TO_UNICODE ('x'):
- HexValue = 0;
- for (HexNibbles = 0; HexNibbles < 4; HexNibbles++) {
- if ((From[1] >= UNICODE_0) && (From[1] <= UNICODE_9)) {
- HexValue = (HexValue << 4) | (From[1] - UNICODE_0);
- } else if ((From[1] >= UNICODE_a) && (From[1] <= UNICODE_f)) {
- HexValue = (HexValue << 4) | (10 + From[1] - UNICODE_a);
- } else if ((From[1] >= UNICODE_A) && (From[1] <= UNICODE_F)) {
- HexValue = (HexValue << 4) | (10 + From[1] - UNICODE_A);
- } else {
- break;
- }
-
- From++;
- }
-
- if (HexNibbles == 0) {
- ParserWarning (
- 0,
- "expected at least one valid hex digit with \\x escaped character in string",
- "\\%C",
- *From
- );
- } else {
- *To = HexValue;
- }
- break;
-
- default:
- *To = UNICODE_SPACE;
- ParserWarning (0, "invalid escaped character in string", "\\%C", *From);
- break;
- }
- }
- } else {
- *To = *From;
- }
-
- From++;
- To++;
- }
-
- *To = 0;
-}
-
-/*****************************************************************************/
-STATUS
-StringDBReadDatabase (
- INT8 *DBFileName,
- BOOLEAN IgnoreIfNotExist,
- BOOLEAN Verbose
- )
-{
- STRING_DB_HEADER DbHeader;
- STATUS Status;
- FILE *DBFptr;
- DB_DATA_ITEM_HEADER DataItemHeader;
-
- Status = STATUS_SUCCESS;
- DBFptr = NULL;
- //
- // if (Verbose) {
- // fprintf (stdout, "Reading database file %s\n", DBFileName);
- // }
- //
- // Try to open the input file
- //
- if ((DBFptr = fopen (DBFileName, "rb")) == NULL) {
- if (IgnoreIfNotExist) {
- return STATUS_SUCCESS;
- }
-
- Error (NULL, 0, 0, DBFileName, "failed to open input database file for reading");
- return STATUS_ERROR;
- }
- //
- // Read and verify the database header
- //
- if (fread ((void *) &DbHeader, sizeof (STRING_DB_HEADER), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, DBFileName, "failed to read header from database file");
- Status = STATUS_ERROR;
- goto Finish;
- }
-
- if (DbHeader.Key != STRING_DB_KEY) {
- Error (NULL, 0, 0, DBFileName, "invalid header in database file");
- Status = STATUS_ERROR;
- goto Finish;
- }
-
- if ((DbHeader.Version & STRING_DB_MAJOR_VERSION_MASK) != (STRING_DB_VERSION & STRING_DB_MAJOR_VERSION_MASK)) {
- Error (NULL, 0, 0, DBFileName, "incompatible database file version -- rebuild clean");
- Status = STATUS_ERROR;
- goto Finish;
- }
- //
- // Read remaining items
- //
- while (fread (&DataItemHeader, sizeof (DataItemHeader), 1, DBFptr) == 1) {
- switch (DataItemHeader.DataType) {
- case DB_DATA_TYPE_STRING_IDENTIFIER:
- StringDBReadStringIdentifier (DBFptr);
- break;
-
- case DB_DATA_TYPE_LANGUAGE_DEFINITION:
- StringDBReadLanguageDefinition (DBFptr);
- break;
-
- case DB_DATA_TYPE_STRING_DEFINITION:
- StringDBReadString (DBFptr);
- break;
-
- default:
- Error (
- NULL,
- 0,
- 0,
- "database corrupted",
- "invalid data item type 0x%X at offset 0x%X",
- (UINT32) DataItemHeader.DataType,
- ftell (DBFptr) - sizeof (DataItemHeader)
- );
- Status = STATUS_ERROR;
- goto Finish;
- }
- }
-
-Finish:
- if (DBFptr != NULL) {
- fclose (DBFptr);
- }
-
- return Status;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Write everything we know to the output database file. Write:
-
- Database header
- String identifiers[]
- StringPacks[]
-
-Arguments:
-
- DBFileName - name of the file to write to
- Verbose - for debug purposes, print info messages along the way.
-
-Returns:
-
- STATUS
-
---*/
-STATUS
-StringDBWriteDatabase (
- INT8 *DBFileName,
- BOOLEAN Verbose
- )
-{
- STRING_DB_HEADER DbHeader;
- UINT32 Counter;
- UINT32 StrLen;
- LANGUAGE_LIST *Lang;
- STRING_IDENTIFIER *StringIdentifier;
- STRING_LIST *StrList;
- FILE *DBFptr;
-
- if (Verbose) {
- fprintf (stdout, "Writing database %s\n", DBFileName);
- }
-
- if ((DBFptr = fopen (DBFileName, "wb")) == NULL) {
- Error (NULL, 0, 0, DBFileName, "failed to open output database file for writing");
- return STATUS_ERROR;
- }
- //
- // Fill in and write the database header
- //
- memset (&DbHeader, 0, sizeof (STRING_DB_HEADER));
- DbHeader.HeaderSize = sizeof (STRING_DB_HEADER);
- DbHeader.Key = STRING_DB_KEY;
- DbHeader.Version = STRING_DB_VERSION;
- //
- // Count the number of languages we have
- //
- for (Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- DbHeader.NumLanguages++;
- }
- //
- // Count up how many string identifiers we have, and total up the
- // size of the names plus the size of the flags field we will
- // write out too.
- //
- DbHeader.NumStringIdenfiers = mDBData.NumStringIdentifiers;
- StringIdentifier = mDBData.StringIdentifier;
- for (Counter = 0; Counter < mDBData.NumStringIdentifiers; Counter++) {
- StrLen = wcslen (StringIdentifier->StringName) + 1;
- DbHeader.StringIdentifiersSize += StrLen * sizeof (WCHAR) + sizeof (StringIdentifier->Flags);
- StringIdentifier = StringIdentifier->Next;
- }
-
- //
- // Write the header
- //
- fwrite (&DbHeader, sizeof (STRING_DB_HEADER), 1, DBFptr);
- if (Verbose) {
- fprintf (stdout, " Number of string identifiers 0x%04X\n", DbHeader.NumStringIdenfiers);
- fprintf (stdout, " Number of languages %d\n", DbHeader.NumLanguages);
- }
- //
- // Write the string identifiers
- //
- for (StringIdentifier = mDBData.StringIdentifier; StringIdentifier != NULL; StringIdentifier = StringIdentifier->Next) {
- StringDBWriteStringIdentifier (
- DBFptr,
- (UINT16) StringIdentifier->Index,
- StringIdentifier->Flags,
- StringIdentifier->StringName
- );
- }
- //
- // Now write all the strings for each language
- //
- for (Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- StringDBWriteLanguageDefinition (DBFptr, Lang->LanguageName, Lang->PrintableLanguageName, Lang->SecondaryLanguageList);
- for (StrList = Lang->String; StrList != NULL; StrList = StrList->Next) {
- StringDBWriteString (
- DBFptr,
- StrList->Flags,
- Lang->LanguageName,
- StrList->StringName,
- StrList->Scope,
- StrList->Str
- );
- }
- }
-
- fclose (DBFptr);
- return STATUS_SUCCESS;
-}
-
-STATUS
-StringDBSetStringReferenced (
- INT8 *StringIdentifierName,
- BOOLEAN IgnoreNotFound
- )
-{
- STRING_IDENTIFIER *Id;
- WCHAR *WName;
- STATUS Status;
- //
- // See if it's already been defined.
- //
- Status = STATUS_SUCCESS;
- WName = (WCHAR *) malloc ((strlen (StringIdentifierName) + 1) * sizeof (WCHAR));
-#ifdef USE_VC8
- swprintf (WName, (strlen (StringIdentifierName) + 1) * sizeof (WCHAR), L"%S", StringIdentifierName);
-#else
- swprintf (WName, L"%S", StringIdentifierName);
-#endif
- Id = StringDBFindStringIdentifierByName (WName);
- if (Id != NULL) {
- Id->Flags |= STRING_FLAGS_REFERENCED;
- } else {
- if (IgnoreNotFound == 0) {
- ParserWarning (0, StringIdentifierName, "string identifier not found in database");
- Status = STATUS_WARNING;
- }
- }
-
- free (WName);
- return Status;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Dump the contents of a database to an output unicode file.
-
-Arguments:
-
- DBFileName - name of the pre-existing database file to read
- OutputFileName - name of the file to dump the database contents to
- Verbose - for printing of additional info useful for debugging
-
-Returns:
-
- STATUS
-
-Notes:
-
- There's some issue with the unicode printing routines. Therefore to
- write to the output file properly, open it as binary and use fwrite.
- Ideally we could open it with just L"w" and use fwprintf().
-
---*/
-STATUS
-StringDBDumpDatabase (
- INT8 *DBFileName,
- INT8 *OutputFileName,
- BOOLEAN Verbose
- )
-{
- LANGUAGE_LIST *Lang;
- STRING_IDENTIFIER *StringIdentifier;
- STRING_LIST *StrList;
- FILE *OutFptr;
- WCHAR WChar;
- WCHAR *WOutputFileName;
- WCHAR CrLf[2];
- WCHAR Line[200];
- WCHAR *Scope;
- //
- // This function assumes the database has already been read, and
- // we're just dumping our internal data structures to a unicode file.
- //
- if (Verbose) {
- fprintf (stdout, "Dumping database file %s\n", DBFileName);
- }
-
- WOutputFileName = AsciiToWchar (OutputFileName);
- OutFptr = _wfopen (WOutputFileName, L"wb");
- free (WOutputFileName);
- if (OutFptr == NULL) {
- Error (NULL, 0, 0, OutputFileName, "failed to open output file for writing");
- return STATUS_ERROR;
- }
-
- WChar = UNICODE_FILE_START;
- fwrite (&WChar, sizeof (WCHAR), 1, OutFptr);
- CrLf[1] = UNICODE_LF;
- CrLf[0] = UNICODE_CR;
- //
- // The default control character is '/'. Make it '#' by writing
- // "/=#" to the output file.
- //
-#ifdef USE_VC8
- swprintf (Line, wcslen(Line) * sizeof (WCHAR), L"/=#");
-#else
- swprintf (Line, L"/=#");
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- //
- // Dump all the string identifiers and their values
- //
- StringDBAssignStringIndexes ();
- for (StringIdentifier = mDBData.StringIdentifier; StringIdentifier != NULL; StringIdentifier = StringIdentifier->Next) {
- //
- // Write the "#define " string
- //
- if (StringIdentifier->Flags & STRING_FLAGS_REFERENCED) {
-#ifdef USE_VC8
- swprintf (
- Line,
- wcslen(Line) * sizeof (WCHAR),
- L"%s %-60.60s 0x%04X",
- DEFINE_STR,
- StringIdentifier->StringName,
- StringIdentifier->Index
- );
-#else
- swprintf (
- Line,
- L"%s %-60.60s 0x%04X",
- DEFINE_STR,
- StringIdentifier->StringName,
- StringIdentifier->Index
- );
-#endif
- } else {
-#ifdef USE_VC8
- swprintf (
- Line,
- wcslen(Line) * sizeof (WCHAR),
- L"%s %-60.60s 0x%04X // NOT REFERENCED",
- DEFINE_STR,
- StringIdentifier->StringName,
- StringIdentifier->Index
- );
-#else
- swprintf (
- Line,
- L"%s %-60.60s 0x%04X // NOT REFERENCED",
- DEFINE_STR,
- StringIdentifier->StringName,
- StringIdentifier->Index
- );
-#endif
- }
-
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- }
-
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- //
- // Now write all the strings for each language.
- //
- WChar = UNICODE_DOUBLE_QUOTE;
- Scope = NULL;
- for (Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
-#ifdef USE_VC8
- swprintf (Line, wcslen(Line) * sizeof (WCHAR), L"#langdef %s \"%s\"", Lang->LanguageName, Lang->PrintableLanguageName);
-#else
- swprintf (Line, L"#langdef %s \"%s\"", Lang->LanguageName, Lang->PrintableLanguageName);
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- //
- // Now the strings (in double-quotes) for this language. Write
- // #string STR_NAME #language eng "string"
- //
- for (StrList = Lang->String; StrList != NULL; StrList = StrList->Next) {
- //
- // Print the internal flags for debug
- //
-#ifdef USE_VC8
- swprintf (Line, wcslen(Line) * sizeof (WCHAR), L"// flags=0x%02X", (UINT32) StrList->Flags);
-#else
- swprintf (Line, L"// flags=0x%02X", (UINT32) StrList->Flags);
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- //
- // Print the scope if changed
- //
- if ((Scope == NULL) || (wcscmp (Scope, StrList->Scope) != 0)) {
-#ifdef USE_VC8
- swprintf (Line, wcslen(Line) * sizeof (WCHAR), L"#scope %s", StrList->Scope);
-#else
- swprintf (Line, L"#scope %s", StrList->Scope);
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- Scope = StrList->Scope;
- }
-
-#ifdef USE_VC8
- swprintf (
- Line,
- wcslen(Line) * sizeof (WCHAR),
- L"#string %-50.50s #language %s \"",
- StrList->StringName,
- Lang->LanguageName
- );
-#else
- swprintf (
- Line,
- L"#string %-50.50s #language %s \"",
- StrList->StringName,
- Lang->LanguageName
- );
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (StrList->Str, StrList->Size - sizeof (WCHAR), 1, OutFptr);
-#ifdef USE_VC8
- swprintf (Line, wcslen(Line) * sizeof (WCHAR), L"\"");
-#else
- swprintf (Line, L"\"");
-#endif
- fwrite (Line, wcslen (Line) * sizeof (WCHAR), 1, OutFptr);
- fwrite (&CrLf, sizeof (CrLf), 1, OutFptr);
- }
- }
-
- fclose (OutFptr);
- return STATUS_SUCCESS;
-}
-
-/*****************************************************************************/
-
-/*++
-
-Routine Description:
-
- Given a primary language, a string identifier number, and a list of
- languages, find a secondary string.
-
-Arguments:
-
- LanguageName - primary language, like "spa"
- StringId - string index value
- LanguageList - linked list of "eng", "spa+cat",...
-
-Returns:
-
- Pointer to a secondary string if found. NULL otherwise.
-
-Notes:
-
- Given: LanguageName "spa" and LanguageList "spa+cat", match the
- "spa" and extract the "cat" and see if there is a string defined
- for "cat".StringId.
-
---*/
-static
-STATUS
-StringDBWriteStringIdentifier (
- FILE *DBFptr,
- UINT16 StringId,
- UINT16 Flags,
- WCHAR *IdentifierName
- )
-{
- DB_DATA_ITEM_HEADER Hdr;
- memset (&Hdr, 0, sizeof (DB_DATA_ITEM_HEADER));
- Hdr.DataType = DB_DATA_TYPE_STRING_IDENTIFIER;
- if (fwrite (&Hdr, sizeof (DB_DATA_ITEM_HEADER), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string to output database file", NULL);
- return STATUS_ERROR;
- }
-
- if (fwrite (&StringId, sizeof (StringId), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write StringId to output database", NULL);
- return STATUS_ERROR;
- }
-
- if (fwrite (&Flags, sizeof (Flags), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write StringId flags to output database", NULL);
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, IdentifierName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBReadStringIdentifier (
- FILE *DBFptr
- )
-{
- WCHAR *IdentifierName;
- UINT16 Flags;
- UINT16 StringId;
- UINT16 Size;
-
- if (fread (&StringId, sizeof (StringId), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to read StringId from database", NULL);
- return STATUS_ERROR;
- }
-
- if (fread (&Flags, sizeof (Flags), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to read StringId flags from database", NULL);
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &IdentifierName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- StringDBAddStringIdentifier (IdentifierName, &StringId, Flags);
- //
- // printf ("STRID: 0x%04X %S\n", (UINT32)StringId, IdentifierName);
- //
- FREE (IdentifierName);
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBWriteString (
- FILE *DBFptr,
- UINT16 Flags,
- WCHAR *Language,
- WCHAR *StringName,
- WCHAR *Scope,
- WCHAR *Str
- )
-{
- DB_DATA_ITEM_HEADER Hdr;
- memset (&Hdr, 0, sizeof (DB_DATA_ITEM_HEADER));
- Hdr.DataType = DB_DATA_TYPE_STRING_DEFINITION;
- if (fwrite (&Hdr, sizeof (DB_DATA_ITEM_HEADER), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string header to output database file", NULL);
- return STATUS_ERROR;
- }
-
- if (fwrite (&Flags, sizeof (Flags), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string flags to output database", NULL);
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, Language) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, StringName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, Scope) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, Str) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
- //
- // printf ("DBWriteString: %S.%S.%S\n", Language, StringName, Scope);
- //
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBReadString (
- FILE *DBFptr
- )
-{
- UINT16 Flags;
- UINT16 Size;
- WCHAR *Language;
- WCHAR *StringName;
- WCHAR *Scope;
- WCHAR *Str;
-
- if (fread (&Flags, sizeof (Flags), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to read string flags from database", NULL);
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &Language) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &StringName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &Scope) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &Str) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
- //
- // If the first or second string (language name and printable language name),
- // then skip them. They're added via language definitions data items in
- // the database.
- //
- if (StringName[0] != L'$') {
- StringDBAddString (Language, StringName, Scope, Str, FALSE, Flags);
- }
- //
- // printf ("DBReadString: %S.%S.%S\n", Language, StringName, Scope);
- //
- FREE (Language);
- FREE (StringName);
- if (Str != NULL) {
- FREE (Str);
- }
-
- if (Scope != NULL) {
- FREE (Scope);
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBWriteLanguageDefinition (
- FILE *DBFptr,
- WCHAR *LanguageName,
- WCHAR *PrintableLanguageName,
- WCHAR *SecondaryLanguageList
- )
-{
- DB_DATA_ITEM_HEADER Hdr;
- memset (&Hdr, 0, sizeof (DB_DATA_ITEM_HEADER));
- Hdr.DataType = DB_DATA_TYPE_LANGUAGE_DEFINITION;
- if (fwrite (&Hdr, sizeof (DB_DATA_ITEM_HEADER), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string to output database file", NULL);
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, LanguageName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, PrintableLanguageName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBWriteGenericString (DBFptr, SecondaryLanguageList) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBReadLanguageDefinition (
- FILE *DBFptr
- )
-{
- WCHAR *LanguageName = NULL;
- WCHAR *PrintableLanguageName = NULL;
- WCHAR *SecondaryLanguageList = NULL;
- UINT16 Size;
- STATUS Status;
-
- if (StringDBReadGenericString (DBFptr, &Size, &LanguageName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &PrintableLanguageName) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- if (StringDBReadGenericString (DBFptr, &Size, &SecondaryLanguageList) != STATUS_SUCCESS) {
- return STATUS_ERROR;
- }
-
- //
- // printf("LANG: %S %S\n", LanguageName, PrintableLanguageName);
- //
- Status = StringDBAddLanguage (LanguageName, PrintableLanguageName, SecondaryLanguageList);
- FREE (LanguageName);
- FREE (PrintableLanguageName);
- FREE (SecondaryLanguageList);
- return Status;
-}
-//
-// All unicode strings in the database consist of a UINT16 length
-// field, followed by the string itself. This routine reads one
-// of those and returns the info.
-//
-static
-STATUS
-StringDBReadGenericString (
- FILE *DBFptr,
- UINT16 *Size,
- WCHAR **Str
- )
-{
- UINT16 LSize;
- UINT16 Flags;
- WCHAR *LStr;
-
- if (fread (&LSize, sizeof (UINT16), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to read a string length field from the database", NULL);
- return STATUS_ERROR;
- }
-
- if (fread (&Flags, sizeof (UINT16), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to read a string flags field from the database", NULL);
- return STATUS_ERROR;
- }
-
- LStr = MALLOC (LSize);
- if (LStr == NULL) {
- Error (__FILE__, __LINE__, 0, "memory allocation failed reading the database", NULL);
- return STATUS_ERROR;
- }
-
- if (fread (LStr, sizeof (WCHAR), (UINT32) LSize / sizeof (WCHAR), DBFptr) != (UINT32) LSize / sizeof (WCHAR)) {
- Error (NULL, 0, 0, "failed to read string from database", NULL);
- Error (NULL, 0, 0, "database read failure", "offset 0x%X", ftell (DBFptr));
- free (LStr);
- return STATUS_ERROR;
- }
- //
- // printf ("DBR: %S\n", LStr);
- //
- // If the flags field indicated we were asked to write a NULL string, then
- // return them a NULL pointer.
- //
- if (Flags & STRING_FLAGS_UNDEFINED) {
- *Size = 0;
- *Str = NULL;
- } else {
- *Size = LSize;
- *Str = LStr;
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-STATUS
-StringDBWriteGenericString (
- FILE *DBFptr,
- WCHAR *Str
- )
-{
- UINT16 Size;
- UINT16 Flags;
- WCHAR ZeroString[1];
- //
- // Strings in the database consist of a size UINT16 followed
- // by the string itself.
- //
- if (Str == NULL) {
- ZeroString[0] = 0;
- Str = ZeroString;
- Size = sizeof (ZeroString);
- Flags = STRING_FLAGS_UNDEFINED;
- } else {
- Flags = 0;
- Size = (UINT16) ((wcslen (Str) + 1) * sizeof (WCHAR));
- }
-
- if (fwrite (&Size, sizeof (UINT16), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string size to database", NULL);
- return STATUS_ERROR;
- }
-
- if (fwrite (&Flags, sizeof (UINT16), 1, DBFptr) != 1) {
- Error (NULL, 0, 0, "failed to write string flags to database", NULL);
- return STATUS_ERROR;
- }
-
- if (fwrite (Str, sizeof (WCHAR), Size / sizeof (WCHAR), DBFptr) != Size / sizeof (WCHAR)) {
- Error (NULL, 0, 0, "failed to write string to database", NULL);
- return STATUS_ERROR;
- }
-
- return STATUS_SUCCESS;
-}
-
-static
-STRING_LIST *
-StringDBFindString (
- WCHAR *LanguageName,
- WCHAR *StringName,
- WCHAR *Scope,
- WCHAR_STRING_LIST *LanguagesOfInterest,
- WCHAR_MATCHING_STRING_LIST *IndirectionList
- )
-{
- LANGUAGE_LIST *Lang;
- STRING_LIST *CurrString;
- WCHAR_MATCHING_STRING_LIST *IndListPtr;
- WCHAR TempLangName[LANGUAGE_IDENTIFIER_NAME_LEN + 1];
- WCHAR *WCharPtr;
-
- //
- // If we were given an indirection list, then see if one was specified for this
- // string identifier. That is to say, if the indirection says "STR_ID_MY_FAVORITE MyScope",
- // then if this string name matches one in the list, then do a lookup with the
- // specified scope and return that value.
- //
- if (IndirectionList != NULL) {
- for (IndListPtr = IndirectionList; IndListPtr != NULL; IndListPtr = IndListPtr->Next) {
- if (wcscmp (StringName, IndListPtr->Str1) == 0) {
- CurrString = StringDBFindString (LanguageName, StringName, IndListPtr->Str2, LanguagesOfInterest, NULL);
- if (CurrString != NULL) {
- return CurrString;
- }
- }
- }
- }
- //
- // First look for exact match language.stringname
- //
- for (Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- if (wcscmp (LanguageName, Lang->LanguageName) == 0) {
- //
- // Found language match. Try to find string name match
- //
- for (CurrString = Lang->String; CurrString != NULL; CurrString = CurrString->Next) {
- if (wcscmp (StringName, CurrString->StringName) == 0) {
- //
- // Found a string name match. See if we're supposed to find
- // a scope match.
- //
- if (Scope != NULL) {
- if (wcscmp (CurrString->Scope, Scope) == 0) {
- return CurrString;
- }
- } else {
- return CurrString;
- }
- }
- }
- }
- }
- //
- // If we got here, then we didn't find a match. Look for secondary string
- // matches. That is to say, if we're processing "spa", and they requested
- // "spa+cat", then recursively call with "cat"
- //
- while (LanguagesOfInterest != NULL) {
- //
- // If this is the language we're looking for, then process the
- // languages of interest list for it.
- //
- if (wcsncmp (LanguageName, LanguagesOfInterest->Str, LANGUAGE_IDENTIFIER_NAME_LEN) == 0) {
- WCharPtr = LanguagesOfInterest->Str + LANGUAGE_IDENTIFIER_NAME_LEN;
- while (*WCharPtr) {
- //
- // Double-check the length, though it should have been checked on the
- // command line.
- //
- if (wcslen (WCharPtr) < LANGUAGE_IDENTIFIER_NAME_LEN) {
- Error (NULL, 0, 0, "malformed alternate language list", "%S", LanguagesOfInterest->Str);
- return NULL;
- }
-
- wcsncpy (TempLangName, WCharPtr, LANGUAGE_IDENTIFIER_NAME_LEN);
- TempLangName[LANGUAGE_IDENTIFIER_NAME_LEN] = 0;
- CurrString = StringDBFindString (TempLangName, StringName, NULL, NULL, IndirectionList);
- if (CurrString != NULL) {
- return CurrString;
- }
-
- WCharPtr += LANGUAGE_IDENTIFIER_NAME_LEN;
- }
- }
-
- LanguagesOfInterest = LanguagesOfInterest->Next;
- }
-
- return NULL;
-}
-
-STATUS
-StringDBSetScope (
- WCHAR *Scope
- )
-{
- //
- // Free up existing scope memory.
- //
- if (mDBData.CurrentScope != NULL) {
- FREE (mDBData.CurrentScope);
- }
-
- mDBData.CurrentScope = DuplicateString (Scope);
- return STATUS_SUCCESS;
-}
-//
-// We typically don't assign index values to string identifiers
-// until we're ready to write out files. To reduce the size of
-// the output file, re-order the string identifiers to move any
-// unreferenced ones to the end. Then we'll walk the list
-// again to assign string indexes, keeping track of the last
-// one referenced.
-//
-static
-void
-StringDBAssignStringIndexes (
- VOID
- )
-{
- STRING_IDENTIFIER *StrId;
- STRING_IDENTIFIER *FirstUsed;
- STRING_IDENTIFIER *LastUsed;
- STRING_IDENTIFIER *FirstUnused;
- STRING_IDENTIFIER *LastUnused;
- UINT32 Index;
- UINT32 MaxReferenced;
-
- //
- // Create two lists -- used and unused. Then put them together with
- // the unused ones on the end.
- //
- FirstUsed = NULL;
- LastUsed = NULL;
- FirstUnused = NULL;
- LastUnused = NULL;
- StrId = mDBData.StringIdentifier;
- while (StrId != NULL) {
- if ((StrId->Flags & STRING_FLAGS_REFERENCED) == 0) {
- //
- // Put it on the unused list
- //
- if (FirstUnused == NULL) {
- FirstUnused = StrId;
- } else {
- LastUnused->Next = StrId;
- }
-
- LastUnused = StrId;
- StrId = StrId->Next;
- LastUnused->Next = NULL;
- } else {
- //
- // Put it on the used list
- //
- if (FirstUsed == NULL) {
- FirstUsed = StrId;
- } else {
- LastUsed->Next = StrId;
- }
-
- LastUsed = StrId;
- StrId = StrId->Next;
- LastUsed->Next = NULL;
- }
- }
- //
- // Join the lists
- //
- if (FirstUsed != NULL) {
- mDBData.StringIdentifier = FirstUsed;
- LastUsed->Next = FirstUnused;
- } else {
- mDBData.StringIdentifier = FirstUnused;
- }
-
- MaxReferenced = 0;
- Index = 0;
- for (StrId = mDBData.StringIdentifier; StrId != NULL; StrId = StrId->Next) {
- StrId->Index = Index;
- Index++;
- if (StrId->Flags & STRING_FLAGS_REFERENCED) {
- mDBData.NumStringIdentifiersReferenced = Index;
- }
- }
-
- mDBData.NumStringIdentifiers = Index;
-}
-
-static
-WCHAR *
-DuplicateString (
- WCHAR *Str
- )
-{
- WCHAR *NewStr;
- if (Str == NULL) {
- return NULL;
- }
-
- NewStr = MALLOC ((wcslen (Str) + 1) * sizeof (WCHAR));
- if (NewStr == NULL) {
- Error (NULL, 0, 0, "memory allocation failure", NULL);
- return NULL;
- }
-
- wcscpy (NewStr, Str);
- return NewStr;
-}
-
-static
-WCHAR *
-WstrCatenate (
- WCHAR *Dst,
- WCHAR *Src
- )
-{
- UINT32 Len = 0;
- WCHAR *Bak = Dst;
-
- if (Src == NULL) {
- return Dst;
- }
-
- if (Dst != NULL) {
- Len = wcslen (Dst);
- }
- Len += wcslen (Src);
- Dst = (WCHAR *) malloc ((Len + 1) * 2);
- if (Dst == NULL) {
- return NULL;
- }
-
- Dst[0] = L'\0';
- if (Bak != NULL) {
- wcscpy (Dst, Bak);
- FREE (Bak);
- }
- wcscat (Dst, Src);
- return Dst;
-}
-
-static
-WCHAR *
-AsciiToWchar (
- INT8 *Str
- )
-{
- UINT32 Len;
- WCHAR *NewStr;
- WCHAR *Ptr;
-
- Len = strlen (Str) + 1;
- NewStr = (WCHAR *) malloc (Len * sizeof (WCHAR));
- for (Ptr = NewStr; *Str != 0; Str++, Ptr++) {
- *Ptr = (UINT16) (UINT8) *Str;
- }
-
- *Ptr = 0;
- return NewStr;
-}
-
-static
-CHAR8 *
-WcharToAscii (
- WCHAR *Str
- )
-{
- UINT32 Len;
- CHAR8 *NewStr;
- CHAR8 *Ptr;
-
- Len = wcslen (Str) + 1;
- NewStr = (CHAR8 *) malloc (Len * sizeof (CHAR8));
- for (Ptr = NewStr; *Str != L'\0'; Str++, Ptr++) {
- *Ptr = (CHAR8) *Str;
- }
-
- *Ptr = '\0';
- return NewStr;
-}
-
-/*****************************************************************************/
-CHAR8 *
-unicode2ascii (
- WCHAR *UnicodeStr
- )
-{
- CHAR8 *RetStr = (CHAR8 *)UnicodeStr;
- CHAR8 *AsciiStr = (CHAR8 *)UnicodeStr;
-
- while (*UnicodeStr != '\0') {
- *AsciiStr = (CHAR8) *(UnicodeStr++);
- AsciiStr++;
- }
- *AsciiStr = '\0';
-
- return RetStr;
-}
-
-STATUS
-BuildStringPkgHdr (
- IN WCHAR *PrimaryLangName,
- IN WCHAR *SecondaryLangList,
- IN UINT32 Type,
- IN UINT32 PkgBlkSize,
- OUT EFI_HII_STRING_PACKAGE_HDR **StrPkgHdr
- )
-{
- UINT32 LangNameLen;
-
- LangNameLen = wcslen (PrimaryLangName);
- if (SecondaryLangList != NULL) {
- LangNameLen += wcslen (SecondaryLangList) + 1;
- }
-
- *StrPkgHdr = (EFI_HII_STRING_PACKAGE_HDR *) malloc(sizeof (EFI_HII_STRING_PACKAGE_HDR) + LangNameLen);
- if (*StrPkgHdr == NULL) {
- return STATUS_ERROR;
- }
- memset (*StrPkgHdr, 0, sizeof (EFI_HII_STRING_PACKAGE_HDR) + LangNameLen);
-
- (*StrPkgHdr)->Header.Type = Type;
- (*StrPkgHdr)->Header.Length = PkgBlkSize + sizeof (EFI_HII_STRING_PACKAGE_HDR) + LangNameLen;
- (*StrPkgHdr)->HdrSize = sizeof (EFI_HII_STRING_PACKAGE_HDR) + LangNameLen;
- (*StrPkgHdr)->StringInfoOffset = sizeof (EFI_HII_STRING_PACKAGE_HDR) + LangNameLen;
- (*StrPkgHdr)->LanguageWindow[0] = L'\0';
- (*StrPkgHdr)->LanguageName = (EFI_STRING_ID)1;
-
- strcpy ((*StrPkgHdr)->Language, unicode2ascii(PrimaryLangName));
- if (SecondaryLangList != NULL) {
- strcat ((*StrPkgHdr)->Language, ";");
- strcat ((*StrPkgHdr)->Language, unicode2ascii(SecondaryLangList));
- }
-
-#ifdef DEBUG_STRGATHER
- printf ("STR HDR\t %s\n", (*StrPkgHdr)->Language);
-#endif
- return STATUS_SUCCESS;
-}
-
-STATUS
-BuildStringPkgUCS2Blk (
- IN EFI_STRING_ID StringId,
- IN WCHAR *LangName,
- IN WCHAR *StrName,
- OUT EFI_HII_SIBT_STRING_UCS2_BLOCK **StrBlk,
- OUT UINT32 *BlkSize
- )
-{
- UINT32 StrLen = 0;
- STRING_LIST *CurrString = NULL;
-
- if ((LangName == NULL) || (StrName == NULL) || (StrBlk == NULL)) {
- return STATUS_ERROR;
- }
-
- *StrBlk = NULL;
- *BlkSize = 0;
-
- CurrString = StringDBFindString (LangName, StrName, NULL, NULL, NULL);
- if (CurrString == NULL) {
- return STATUS_WARNING;
- }
-
- StrLen = wcslen (CurrString->Str);
- *BlkSize = sizeof (EFI_HII_SIBT_STRING_UCS2_BLOCK) + StrLen * 2;
- *StrBlk = (EFI_HII_SIBT_STRING_UCS2_BLOCK *) malloc (*BlkSize);
- if (*StrBlk == NULL) {
- *StrBlk = NULL;
- *BlkSize = 0;
- return STATUS_ERROR;
- }
- (*StrBlk)->Header.BlockType = EFI_HII_SIBT_STRING_UCS2;
- wcscpy((*StrBlk)->StringText, CurrString->Str);
-
- return STATUS_SUCCESS;
-}
-
-STATUS
-BuildStringPkgSKIP2Blk (
- IN EFI_STRING_ID SkipIdCount,
- OUT EFI_HII_SIBT_SKIP2_BLOCK **StrBlk
- )
-{
- if (StrBlk == NULL) {
- return STATUS_ERROR;
- }
-
- *StrBlk = NULL;
-
- *StrBlk = (EFI_HII_SIBT_SKIP2_BLOCK *) malloc (sizeof (EFI_HII_SIBT_SKIP2_BLOCK));
- if (*StrBlk == NULL) {
- *StrBlk = NULL;
- return STATUS_ERROR;
- }
- (*StrBlk)->Header.BlockType = EFI_HII_SIBT_SKIP2;
- (*StrBlk)->SkipCount = SkipIdCount;
-
- return STATUS_SUCCESS;
-}
-
-STATUS
-BuildStringPkgEndBlk (
- OUT EFI_HII_SIBT_END_BLOCK **End
- )
-{
- *End = (EFI_HII_SIBT_END_BLOCK *) malloc (sizeof (EFI_HII_SIBT_END_BLOCK));
- if (*End == NULL) {
- return STATUS_ERROR;
- }
-
- (*End)->Header.BlockType = EFI_HII_SIBT_END;
- return STATUS_SUCCESS;
-}
-
-/*++
-
-Routine Description:
-
- Create an HII export string pack for the strings in our database.
-
-Arguments:
-
- FileName - name of the output file to write
-
-Returns:
-
- STATUS
-
-
---*/
-STATUS
-StrPkgBlkBufferListAddTail (
- IN EFI_STRING_ID StringId,
- IN WCHAR *StrName,
- IN SPkgBlkBuffer **PkgBufferListHead,
- IN SPkgBlkBuffer **PkgBufferListTail,
- IN VOID *Buffer,
- IN UINT32 Size
- )
-{
- SPkgBlkBuffer *pNew = NULL;
-#ifdef DEBUG_STRGATHER
- EFI_HII_STRING_BLOCK *SBlk = (EFI_HII_STRING_BLOCK *)Buffer;
-#endif
-
- if ((PkgBufferListHead == NULL) || (PkgBufferListTail == NULL)) {
- return STATUS_ERROR;
- }
-
- pNew = (SPkgBlkBuffer *) malloc (sizeof (SPkgBlkBuffer));
- if (pNew == NULL) {
- return STATUS_ERROR;
- }
-
- pNew->mBlkBuffer = Buffer;
- pNew->mBlkSize = Size;
- if ((*PkgBufferListTail) == NULL) {
- (*PkgBufferListHead) = (*PkgBufferListTail) = pNew;
- } else {
- (*PkgBufferListTail)->mNext = pNew;
- (*PkgBufferListTail) = pNew;
- pNew->mNext = NULL;
- }
-
-#ifdef DEBUG_STRGATHER
- switch (SBlk->BlockType) {
- case EFI_HII_SIBT_STRING_UCS2 :
- printf ("\tID: [%x] TYPE: [UCS2]\t NAME: %S \t STR: %S\n", StringId, StrName, ((EFI_HII_SIBT_STRING_UCS2_BLOCK *)SBlk)->StringText);
- break;
- case EFI_HII_SIBT_SKIP2 :
- printf ("\tID: [NULL] TYPE: [SKIP2] SKIPCOUNT: [%x]\n", ((EFI_HII_SIBT_SKIP2_BLOCK *)SBlk)->SkipCount);
- break;
- case EFI_HII_SIBT_END :
- printf ("\tID: [%x] TYPE: [END]\n", StringId);
- break;
- default :
- printf ("!!!!UNKNOWN STRING TYPE!!!\n");
- }
-#endif
-
- return STATUS_SUCCESS;
-}
-
-VOID
-StrPkgHdrFree (
- IN EFI_HII_STRING_PACKAGE_HDR *StrPkgHdr
- )
-{
- if (StrPkgHdr != NULL) {
- free (StrPkgHdr);
- }
-}
-
-VOID
-StrPkgBlkBufferListFree (
- IN SPkgBlkBuffer *PkgBlkList
- )
-{
- SPkgBlkBuffer *Buffer;
-
- while (PkgBlkList != NULL) {
- Buffer = PkgBlkList;
- PkgBlkList = PkgBlkList->mNext;
-
- if (Buffer->mBlkBuffer != NULL) {
- free (Buffer->mBlkBuffer);
- }
- free (Buffer);
- }
-}
-
-VOID
-WriteBlockLine (
- IN FILE *pFile,
- IN UINT32 LineBytes,
- IN INT8 *LineHeader,
- IN INT8 *BlkBuf,
- IN UINT32 BlkSize
- )
-{
- UINT32 Index;
-
- if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
- return;
- }
-
- for (Index = 0; Index < BlkSize; Index++) {
- if ((Index % LineBytes) == 0) {
- fprintf (pFile, "\n%s", LineHeader);
- }
- fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
- }
-}
-
-VOID
-WriteBlockEnd (
- IN FILE *pFile,
- IN UINT32 LineBytes,
- IN INT8 *LineHeader,
- IN INT8 *BlkBuf,
- IN UINT32 BlkSize
- )
-{
- UINT32 Index;
-
- if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {
- return;
- }
-
- for (Index = 0; Index < BlkSize - 1; Index++) {
- if ((Index % LineBytes) == 0) {
- fprintf (pFile, "\n%s", LineHeader);
- }
- fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);
- }
-
- if ((Index % LineBytes) == 0) {
- fprintf (pFile, "\n%s", LineHeader);
- }
- fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);
-}
-
-#define BYTES_PRE_LINE 0x10
-
-VOID
-StrPkgWriteHdrCFile (
- IN FILE *File,
- IN EFI_HII_STRING_PACKAGE_HDR *StrPkgHdr
- )
-{
- if (StrPkgHdr != NULL) {
- fprintf (File, "\n // PACKAGE HEADER\n");
- WriteBlockLine(File, BYTES_PRE_LINE, " ", (INT8 *)StrPkgHdr, StrPkgHdr->HdrSize);
- }
-}
-
-VOID
-StrPkgWirteArrayLength (
- IN FILE *File,
- IN UINT32 PkgNumber,
- IN EFI_HII_STRING_PACKAGE_HDR **PkgHdr
- )
-{
- UINT32 Index;
- UINT32 ArrayLen;
-
- ArrayLen = sizeof (UINT32);
- for (Index = 0; Index < PkgNumber; Index++) {
- if (PkgHdr[Index] != NULL) {
- ArrayLen += PkgHdr[Index]->Header.Length;
- }
- }
-
- fprintf (File, "\n // STRING ARRAY LENGTH\n");
- WriteBlockLine(File, BYTES_PRE_LINE, " ", (UINT8 *)&ArrayLen, sizeof (UINT32));
-}
-
-VOID
-StrPkgWriteBlkListCFile (
- IN FILE *File,
- IN SPkgBlkBuffer *BlkList,
- IN BOOLEAN WriteEnd
- )
-{
- SPkgBlkBuffer *Buffer;
-
- fprintf (File, "\n\n // PACKAGE DATA\n");
-
- while (BlkList != NULL) {
- Buffer = BlkList;
- BlkList = BlkList->mNext;
-
- if ((Buffer->mNext == NULL) && (WriteEnd == TRUE)) {
- if (Buffer->mBlkBuffer != NULL) {
- WriteBlockEnd (File, BYTES_PRE_LINE, " ", Buffer->mBlkBuffer, Buffer->mBlkSize);
- }
- } else {
- if (Buffer->mBlkBuffer != NULL) {
- WriteBlockLine(File, BYTES_PRE_LINE, " ", Buffer->mBlkBuffer, Buffer->mBlkSize);
- }
- }
- }
-}
-
-VOID
-StrPkgWriteHdrBinary (
- IN FILE *File,
- IN EFI_HII_STRING_PACKAGE_HDR *StrPkgHdr
- )
-{
- fwrite (StrPkgHdr, StrPkgHdr->HdrSize, 1, File);
-}
-
-VOID
-StrPkgWriteBlkListBinary (
- IN FILE *File,
- IN SPkgBlkBuffer *BlkList
- )
-{
- SPkgBlkBuffer *Buffer;
-
- while (BlkList != NULL) {
- Buffer = BlkList;
- BlkList = BlkList->mNext;
-
- if (Buffer->mBlkBuffer != NULL) {
- fwrite (Buffer->mBlkBuffer, Buffer->mBlkSize, 1, File);
- }
- }
-}
-
-STATUS
-StringDBGenStrPkgHdrAndBlkList (
- IN LANGUAGE_LIST *Lang,
- OUT EFI_HII_STRING_PACKAGE_HDR **StrPkgHdr,
- OUT SPkgBlkBuffer **BlkList
- )
-{
- STATUS Status;
- UINT32 StringIndex;
- EFI_STRING_ID StringIdCurrent;
- EFI_STRING_ID SkipIdCount;
- UINT32 BlkSize = 0;
- EFI_HII_SIBT_STRING_UCS2_BLOCK *StrUCS2Blk = NULL;
- EFI_HII_SIBT_SKIP2_BLOCK *StrSKIP2Blk = NULL;
- STRING_IDENTIFIER *StringIdentifier = NULL;
- EFI_HII_SIBT_END_BLOCK *EndBlk = NULL;
- UINT32 PkgBlkSize = 0;
- SPkgBlkBuffer *PkgBufferListHead = NULL;
- SPkgBlkBuffer *PkgBufferListTail = NULL;
-
- if ((Lang == NULL) || (StrPkgHdr == NULL) || (BlkList == NULL)) {
- return STATUS_ERROR;
- }
-
- //
- // Assign index values to the string identifiers
- //
- StringDBAssignStringIndexes ();
- StringIdCurrent = EFI_STRING_ID_BEGIN;
- SkipIdCount = 0;
-
- for (StringIndex = STRING_ID_PRINTABLE_LANGUAGE_NAME; StringIndex < mDBData.NumStringIdentifiersReferenced; StringIndex++) {
- if ((StringIdentifier = StringDBFindStringIdentifierByIndex (StringIndex)) == NULL) {
- Error (NULL, 0, 0, "internal error", "invalid string index 0x%X", StringIndex);
- goto ExportPackOut;
- }
-
- if (StringIdentifier->Flags & STRING_FLAGS_REFERENCED) {
- Status = BuildStringPkgUCS2Blk (StringIdCurrent, Lang->LanguageName, StringIdentifier->StringName, &StrUCS2Blk, &BlkSize);
- switch (Status) {
- case STATUS_ERROR:
- goto ExportPackOut;
- break;
- case STATUS_WARNING :
- SkipIdCount++;
- break;
- case STATUS_SUCCESS :
- if (SkipIdCount == 0) {
- if (StrPkgBlkBufferListAddTail (
- StringIdCurrent,
- StringIdentifier->StringName,
- &PkgBufferListHead,
- &PkgBufferListTail,
- StrUCS2Blk,
- BlkSize
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
- PkgBlkSize += BlkSize;
- } else {
- if (BuildStringPkgSKIP2Blk (SkipIdCount, &StrSKIP2Blk) != STATUS_SUCCESS) {
- goto ExportPackOut;
- } else {
- if (StrPkgBlkBufferListAddTail (
- StringIdCurrent,
- NULL,
- &PkgBufferListHead,
- &PkgBufferListTail,
- StrSKIP2Blk,
- sizeof (EFI_HII_SIBT_SKIP2_BLOCK)
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
- PkgBlkSize += sizeof (EFI_HII_SIBT_SKIP2_BLOCK);
- SkipIdCount = 0;
- }
-
- if (StrPkgBlkBufferListAddTail (
- StringIdCurrent,
- StringIdentifier->StringName,
- &PkgBufferListHead,
- &PkgBufferListTail,
- StrUCS2Blk,
- BlkSize
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
- PkgBlkSize += BlkSize;
- }
- }
- }
-
- StringIdCurrent++;
- }
-
- if (SkipIdCount != 0) {
- if (BuildStringPkgSKIP2Blk (SkipIdCount, &StrSKIP2Blk) != STATUS_SUCCESS) {
- goto ExportPackOut;
- } else {
- if (StrPkgBlkBufferListAddTail (
- StringIdCurrent,
- NULL,
- &PkgBufferListHead,
- &PkgBufferListTail,
- StrSKIP2Blk,
- sizeof (EFI_HII_SIBT_SKIP2_BLOCK)
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
- PkgBlkSize += sizeof (EFI_HII_SIBT_SKIP2_BLOCK);
- SkipIdCount = 0;
- }
- }
-
- if (BuildStringPkgEndBlk (&EndBlk) != STATUS_SUCCESS) {
- goto ExportPackOut;
- } else if (StrPkgBlkBufferListAddTail (
- StringIdCurrent,
- NULL,
- &PkgBufferListHead,
- &PkgBufferListTail,
- EndBlk,
- sizeof (EFI_HII_SIBT_END_BLOCK)
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
- StringIdCurrent++;
- PkgBlkSize += sizeof (EFI_HII_SIBT_END_BLOCK);
-
- if (BuildStringPkgHdr(
- Lang->LanguageName,
- Lang->SecondaryLanguageList,
- EFI_HII_PACKAGE_STRINGS,
- PkgBlkSize,
- StrPkgHdr
- ) != STATUS_SUCCESS) {
- goto ExportPackOut;
- }
-
- *BlkList = PkgBufferListHead;
-
- return STATUS_SUCCESS;
-
-ExportPackOut:
- StrPkgBlkBufferListFree(PkgBufferListHead);
- *BlkList = NULL;
- *StrPkgHdr = NULL;
- return STATUS_ERROR;
-}
-
-STATUS
-StringDBCreateHiiExportPack (
- INT8 *FileName,
- WCHAR_STRING_LIST *LanguagesOfInterest
- )
-{
- FILE *File;
- LANGUAGE_LIST *Lang;
- EFI_HII_STRING_PACKAGE_HDR *StrPkgHdr;
- SPkgBlkBuffer *BlkList;
- WCHAR_STRING_LIST *LOIPtr;
-
- if (FileName == NULL) {
- return STATUS_ERROR;
- }
-
- if ((File = fopen (FileName, "wb")) == NULL) {
- Error (NULL, 0, 0, FileName, "failed to open output HII export file");
- return STATUS_ERROR;
- }
-
- for (Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- for (LOIPtr = LanguagesOfInterest; LOIPtr != NULL; LOIPtr = LOIPtr->Next) {
- if (wcscmp (LOIPtr->Str, Lang->LanguageName) == 0) {
- break;
- }
- }
-
- if ((LanguagesOfInterest == NULL) ||
- (LanguagesOfInterest != NULL && LOIPtr != NULL)) {
- if (StringDBGenStrPkgHdrAndBlkList(Lang, &StrPkgHdr, &BlkList) != STATUS_SUCCESS) {
- fclose (File);
- return STATUS_SUCCESS;
- }
-
- StrPkgWriteHdrBinary (File, StrPkgHdr);
- StrPkgWriteBlkListBinary (File, BlkList);
-
- StrPkgHdrFree (StrPkgHdr);
- StrPkgBlkBufferListFree (BlkList);
- }
- }
- fclose (File);
- return STATUS_SUCCESS;
-}
-
-static const char *gSourceFileHeader[] = {
- "//",
- "// DO NOT EDIT -- auto-generated file",
- "//",
- "// This file is generated by the StrGather utility",
- "//",
- NULL
-};
-
-STATUS
-StringDBDumpCStrings (
- INT8 *BaseName,
- INT8 *FileName,
- WCHAR_STRING_LIST *LanguagesOfInterest
- )
-{
- EFI_STATUS Status;
- FILE *File;
- LANGUAGE_LIST *Lang;
- EFI_HII_STRING_PACKAGE_HDR **StrPkgHdr;
- SPkgBlkBuffer **BlkList;
- UINT32 Index;
- UINT32 LangNumber;
- WCHAR_STRING_LIST *LOIPtr;
-
- if ((BaseName == NULL) || (FileName == NULL)) {
- return STATUS_ERROR;
- }
-
- if (mDBData.LanguageList == NULL) {
- return STATUS_SUCCESS;
- }
-
- for (LangNumber = 0, Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next, LangNumber++)
- ;
-
- StrPkgHdr = (EFI_HII_STRING_PACKAGE_HDR **) malloc (sizeof (EFI_HII_STRING_PACKAGE_HDR *) * LangNumber);
- BlkList = (SPkgBlkBuffer **) malloc (sizeof (SPkgBlkBuffer *) * LangNumber);
- for (Index = 0; Index < LangNumber; Index++) {
- StrPkgHdr[Index] = NULL;
- BlkList[Index] = NULL;
- }
-
- for (Index = 0, Lang = mDBData.LanguageList; Lang != NULL; Lang = Lang->Next) {
- for (LOIPtr = LanguagesOfInterest; LOIPtr != NULL; LOIPtr = LOIPtr->Next) {
- if (wcscmp (LOIPtr->Str, Lang->LanguageName) == 0) {
- break;
- }
- }
- if ((LanguagesOfInterest == NULL) ||
- (LanguagesOfInterest != NULL && LOIPtr != NULL)) {
- Status = StringDBGenStrPkgHdrAndBlkList(Lang, &StrPkgHdr[Index], &BlkList[Index]);
- Index++;
- if (EFI_ERROR(Status)) {
- free (StrPkgHdr);
- free (BlkList);
- return STATUS_ERROR;
- }
- }
- }
-
- //
- // Update LangNumber after filter
- //
- LangNumber = Index;
-
- if (LangNumber == 0) {
- free (StrPkgHdr);
- free (BlkList);
- return STATUS_SUCCESS;
- }
-
- if ((File = fopen (FileName, "w")) == NULL) {
- Error (NULL, 0, 0, FileName, "failed to open output C file - %s", FileName);
- return STATUS_ERROR;
- }
-
- for (Index = 0; gSourceFileHeader[Index] != NULL; Index++) {
- fprintf (File, "%s\n", gSourceFileHeader[Index]);
- }
-
- fprintf (File, "\nunsigned char %s[] = {\n", BaseName);
-
- //
- // Save the length of the string package array.
- //
- StrPkgWirteArrayLength (File, LangNumber, StrPkgHdr);
-
- for (Index = 0; Index < LangNumber; Index++) {
- StrPkgWriteHdrCFile (File, StrPkgHdr[Index]);
- StrPkgWriteBlkListCFile (File, BlkList[Index], (Index == LangNumber - 1) ? TRUE : FALSE);
-
- StrPkgHdrFree (StrPkgHdr[Index]);
- StrPkgBlkBufferListFree (BlkList[Index]);
- }
-
- fprintf (File, "\n};\n");
-
- fclose (File);
- free (StrPkgHdr);
- free (BlkList);
- return STATUS_SUCCESS;
-}
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.h b/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.h
deleted file mode 100644
index d98b5b71cc..0000000000
--- a/EdkCompatibilityPkg/Sample/Tools/Source/UefiStrGather/StringDB.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/*++
-
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
-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:
-
- StringDB.h
-
-Abstract:
-
- Common defines and prototypes for string database management
-
---*/
-
-#ifndef _STRING_DB_H_
-#define _STRING_DB_H_
-
-#define LANGUAGE_NAME_STRING_NAME L"$LANGUAGE_NAME"
-#define PRINTABLE_LANGUAGE_NAME_STRING_NAME L"$PRINTABLE_LANGUAGE_NAME"
-
-typedef CHAR16 WCHAR;
-
-#define NARROW_CHAR 0xFFF0
-#define WIDE_CHAR 0xFFF1
-#define NON_BREAKING_CHAR 0xFFF2
-#define GLYPH_WIDTH 8
-#define GLYPH_HEIGHT 19
-
-#define STRING_DB_KEY (('S' << 24) | ('D' << 16) | ('B' << 8) | 'K')
-//
-// Version supported by this tool
-//
-#define STRING_DB_VERSION 0x00010000
-
-#define STRING_DB_MAJOR_VERSION_MASK 0xFFFF0000
-#define STRING_DB_MINOR_VERSION_MASK 0x0000FFFF
-
-#define DEFINE_STR L"// #define"
-
-#define EFI_STRING_ID_BEGIN 0x01
-
-//
-// This is the header that gets written to the top of the
-// output binary database file.
-//
-typedef struct {
- UINT32 Key;
- UINT32 HeaderSize;
- UINT32 Version;
- UINT32 NumStringIdenfiers;
- UINT32 StringIdentifiersSize;
- UINT32 NumLanguages;
-} STRING_DB_HEADER;
-
-//
-// When we write out data to the database, we have a UINT16 identifier, which
-// indicates what follows, followed by the data. Here's the structure.
-//
-typedef struct {
- UINT16 DataType;
- UINT16 Reserved;
-} DB_DATA_ITEM_HEADER;
-
-#define DB_DATA_TYPE_INVALID 0x0000
-#define DB_DATA_TYPE_STRING_IDENTIFIER 0x0001
-#define DB_DATA_TYPE_LANGUAGE_DEFINITION 0x0002
-#define DB_DATA_TYPE_STRING_DEFINITION 0x0003
-#define DB_DATA_TYPE_LAST DB_DATA_TYPE_STRING_DEFINITION
-
-//
-// We have to keep track of a list of languages, each of which has its own
-// list of strings. Define a structure to keep track of all languages and
-// their list of strings.
-//
-typedef struct _STRING_LIST {
- struct _STRING_LIST *Next;
- UINT32 Size; // number of bytes in string, including null terminator
- WCHAR *LanguageName;
- WCHAR *StringName; // for example STR_ID_TEXT1
- WCHAR *Scope; //
- WCHAR *Str; // the actual string
- UINT16 Flags; // properties of this string (used, undefined)
-} STRING_LIST;
-
-typedef struct _LANGUAGE_LIST {
- struct _LANGUAGE_LIST *Next;
- WCHAR *LanguageName;
- WCHAR *PrintableLanguageName;
- WCHAR *SecondaryLanguageList;
- STRING_LIST *String;
- STRING_LIST *LastString;
-} LANGUAGE_LIST;
-
-//
-// We also keep track of all the string identifier names, which we assign unique
-// values to. Create a structure to keep track of them all.
-//
-typedef struct _STRING_IDENTIFIER {
- struct _STRING_IDENTIFIER *Next;
- UINT32 Index; // only need 16 bits, but makes it easier with UINT32
- WCHAR *StringName;
- UINT16 Flags; // if someone referenced it via STRING_TOKEN()
-} STRING_IDENTIFIER;
-//
-// Keep our globals in this structure to be as modular as possible.
-//
-typedef struct {
- FILE *StringDBFptr;
- LANGUAGE_LIST *LanguageList;
- LANGUAGE_LIST *LastLanguageList;
- LANGUAGE_LIST *CurrentLanguage; // keep track of the last language they used
- STRING_IDENTIFIER *StringIdentifier;
- STRING_IDENTIFIER *LastStringIdentifier;
- UINT8 *StringDBFileName;
- UINT32 NumStringIdentifiers;
- UINT32 NumStringIdentifiersReferenced;
- STRING_IDENTIFIER *CurrentStringIdentifier; // keep track of the last string identifier they added
- WCHAR *CurrentScope;
-} STRING_DB_DATA;
-
-typedef struct _SPkgBlkBuffer {
- UINT32 mBlkSize;
- VOID *mBlkBuffer;
- struct _SPkgBlkBuffer *mNext;
-} SPkgBlkBuffer;
-
-void
-StringDBConstructor (
- void
- )
-;
-void
-StringDBDestructor (
- void
- )
-;
-
-STATUS
-StringDBAddString (
- WCHAR *LanguageName,
- WCHAR *StringIdentifier,
- WCHAR *Scope,
- WCHAR *String,
- BOOLEAN Format,
- UINT16 Flags
- )
-;
-
-STATUS
-StringDBSetScope (
- WCHAR *Scope
- )
-;
-
-#define STRING_FLAGS_REFERENCED 0x0001 // if referenced somewhere
-#define STRING_FLAGS_UNDEFINED 0x0002 // if we added it for padding purposes
-#define STRING_FLAGS_INDEX_ASSIGNED 0x0004 // so don't change the index value
-#define STRING_ID_INVALID 0xFFFF
-#define STRING_ID_LANGUAGE_NAME 0x0000
-#define STRING_ID_PRINTABLE_LANGUAGE_NAME 0x0001
-
-STATUS
-StringDBAddStringIdentifier (
- WCHAR *StringIdentifier,
- UINT16 *NewId,
- UINT16 Flags
- )
-;
-
-STATUS
-StringDBReadDatabase (
- INT8 *DBFileName,
- BOOLEAN IgnoreIfNotExist,
- BOOLEAN Verbose
- )
-;
-
-STATUS
-StringDBWriteDatabase (
- INT8 *DBFileName,
- BOOLEAN Verbose
- )
-;
-
-STATUS
-StringDBDumpDatabase (
- INT8 *DBFileName,
- INT8 *OutputFileName,
- BOOLEAN Verbose
- )
-;
-
-STATUS
-StringDBAddLanguage (
- WCHAR *LanguageName,
- WCHAR *PrintableLanguageName,
- WCHAR *SecondaryLanguageList
- )
-;
-
-STATUS
-StringDBAddSecondaryLanguage (
- WCHAR *LanguageName,
- WCHAR *SecondaryLanguageList
- )
-;
-
-STATUS
-StringDBDumpCStrings (
- INT8 *BaseName,
- INT8 *FileName,
- WCHAR_STRING_LIST *LanguagesOfInterests
- )
-;
-
-STATUS
-StringDBCreateHiiExportPack (
- INT8 *OutputFileName,
- WCHAR_STRING_LIST *LanguagesOfInterests
- )
-;
-
-STATUS
-StringDBDumpStringDefines (
- INT8 *FileName,
- INT8 *BaseName
- )
-;
-
-STATUS
-StringDBSetCurrentLanguage (
- WCHAR *LanguageName
- )
-;
-
-STATUS
-StringDBSetStringReferenced (
- INT8 *StringIdentifierName,
- BOOLEAN IgnoreNotFound
- )
-;
-
-void
-StringDBFormatString (
- WCHAR *String
- )
-;
-
-LANGUAGE_LIST *
-StringDBFindLanguageList (
- WCHAR *LanguageName
- )
-;
-
-#endif // #ifndef _STRING_DB_H_