248 lines
6.5 KiB
C
248 lines
6.5 KiB
C
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <ctype.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
|
||
|
/*
|
||
|
local.c - It will open a localization file and append the content of the
|
||
|
localization file to each file indicated within the
|
||
|
localization file.
|
||
|
|
||
|
syntax: local < input file > < localize directory >
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
typedef struct _PLATFORM_DATA {
|
||
|
|
||
|
//
|
||
|
// Name of platform and platform's subdirectory in
|
||
|
// the build tree.
|
||
|
//
|
||
|
PSTR PlatformName;
|
||
|
|
||
|
//
|
||
|
// Current output file for this platform.
|
||
|
// If a line in the input file applies to this platform,
|
||
|
// this handle will be used to write the line into the
|
||
|
// output file being generated for this platform.
|
||
|
//
|
||
|
FILE *OutputFile;
|
||
|
|
||
|
} PLATFORM_DATA, *PPLATFORM_DATA;
|
||
|
|
||
|
|
||
|
//
|
||
|
// When porting, simply bump up this number and add
|
||
|
// a line to the PlatformData array below.
|
||
|
//
|
||
|
#define NUMBER_OF_PLATFORMS 4
|
||
|
|
||
|
PLATFORM_DATA PlatformData[NUMBER_OF_PLATFORMS] =
|
||
|
|
||
|
{{ "i386", NULL },
|
||
|
{ "mips", NULL },
|
||
|
{ "alpha", NULL },
|
||
|
{ "ppc", NULL }};
|
||
|
|
||
|
//
|
||
|
// Value to indicate that a line of input belongs in output file
|
||
|
// for all platforms.
|
||
|
//
|
||
|
#define ALL_PLATFORMS NUMBER_OF_PLATFORMS
|
||
|
|
||
|
//
|
||
|
// Input buffer.
|
||
|
//
|
||
|
CHAR InputBuffer[1000];
|
||
|
|
||
|
|
||
|
VOID
|
||
|
CloseAllOpenOutputFiles(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
unsigned Platform;
|
||
|
|
||
|
for(Platform=0; Platform<NUMBER_OF_PLATFORMS; Platform++) {
|
||
|
|
||
|
if(PlatformData[Platform].OutputFile) {
|
||
|
fclose(PlatformData[Platform].OutputFile);
|
||
|
PlatformData[Platform].OutputFile = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
ProcessInputFile(
|
||
|
IN FILE *InputFile,
|
||
|
IN PSTR TargetDirectory
|
||
|
)
|
||
|
{
|
||
|
CHAR InfFileName[MAX_PATH];
|
||
|
CHAR PlatformName[100];
|
||
|
CHAR OutputFileName[MAX_PATH];
|
||
|
BOOL TotalSuccess;
|
||
|
unsigned CurrentPlatform;
|
||
|
unsigned Platform;
|
||
|
HANDLE FindHandle;
|
||
|
WIN32_FIND_DATA FindData;
|
||
|
|
||
|
//
|
||
|
// Assume overall success.
|
||
|
//
|
||
|
TotalSuccess = TRUE;
|
||
|
|
||
|
//
|
||
|
// Until a platform is specified, all platforms are selected.
|
||
|
// Note that nothing will actually get written until a platform
|
||
|
// is selected because no output files are open until then.
|
||
|
//
|
||
|
CurrentPlatform = ALL_PLATFORMS;
|
||
|
|
||
|
//
|
||
|
// Process each line in the input file.
|
||
|
//
|
||
|
while(TotalSuccess && fgets(InputBuffer,sizeof(InputBuffer),InputFile)) {
|
||
|
|
||
|
//
|
||
|
// If the line begins with ##### then this line specifies
|
||
|
// which platform lines following it in the input file apply to.
|
||
|
//
|
||
|
// Otherwise the line will be copied to the appropriate output
|
||
|
// file(s).
|
||
|
//
|
||
|
if(strncmp(InputBuffer,"#####",5)) {
|
||
|
|
||
|
//
|
||
|
// Plain old line. Place in output file for current platform
|
||
|
// or all platforms as appropriate.
|
||
|
//
|
||
|
for(Platform=0; TotalSuccess && (Platform<NUMBER_OF_PLATFORMS); Platform++) {
|
||
|
|
||
|
if(PlatformData[Platform].OutputFile
|
||
|
&& ((CurrentPlatform == ALL_PLATFORMS) || (Platform == CurrentPlatform))) {
|
||
|
|
||
|
if(fputs(InputBuffer,PlatformData[Platform].OutputFile) == EOF) {
|
||
|
fprintf(stderr,"unable to write to output file\n");
|
||
|
TotalSuccess = FALSE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
//
|
||
|
// Platform specifier line. Next two values are output filename
|
||
|
// and output file platform.
|
||
|
//
|
||
|
if (sscanf(InputBuffer,"#####%s %s",InfFileName,PlatformName) < 2) {
|
||
|
fprintf(stderr,"invalid localization file\n");
|
||
|
TotalSuccess = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Attempt to determine the platform specified.
|
||
|
// If the value in the input file is not recognized then
|
||
|
// it specifies all platforms.
|
||
|
//
|
||
|
CurrentPlatform = ALL_PLATFORMS;
|
||
|
|
||
|
for(Platform=0; Platform<NUMBER_OF_PLATFORMS; Platform++) {
|
||
|
|
||
|
if(!_stricmp(PlatformName,PlatformData[Platform].PlatformName)) {
|
||
|
CurrentPlatform = Platform;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Close all open output files.
|
||
|
//
|
||
|
CloseAllOpenOutputFiles();
|
||
|
|
||
|
//
|
||
|
// Now open output files as appropriate. Note that this means
|
||
|
// we will either open a single platform's output file or all
|
||
|
// platforms' output files.
|
||
|
//
|
||
|
for(Platform=0; TotalSuccess && (Platform<NUMBER_OF_PLATFORMS); Platform++) {
|
||
|
|
||
|
if((Platform == CurrentPlatform) || (CurrentPlatform == ALL_PLATFORMS)) {
|
||
|
|
||
|
//
|
||
|
// First we will determine whether the relevent platform's
|
||
|
// directory exists. If not, we'll simply skip this platform.
|
||
|
// This prevents us from erroring out when we're generating
|
||
|
// 3.5" media, because there will be no mips, alpha, ppc, etc
|
||
|
// subdirectories for 3.5" media.
|
||
|
//
|
||
|
sprintf(
|
||
|
OutputFileName,
|
||
|
"%s\\%s",
|
||
|
TargetDirectory,
|
||
|
PlatformData[Platform].PlatformName
|
||
|
);
|
||
|
|
||
|
FindHandle = FindFirstFile(OutputFileName,&FindData);
|
||
|
if(FindHandle != INVALID_HANDLE_VALUE) {
|
||
|
|
||
|
FindClose(FindHandle);
|
||
|
|
||
|
strcat(OutputFileName,"\\");
|
||
|
strcat(OutputFileName,InfFileName);
|
||
|
|
||
|
if((PlatformData[Platform].OutputFile = fopen(OutputFileName,"a")) == NULL) {
|
||
|
fprintf(stderr,"open file:%s fail.\n",OutputFileName);
|
||
|
TotalSuccess = FALSE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Close all open output files.
|
||
|
//
|
||
|
CloseAllOpenOutputFiles();
|
||
|
|
||
|
//
|
||
|
// Return value indicating whether we were totally successful.
|
||
|
//
|
||
|
return TotalSuccess;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
__cdecl
|
||
|
main(
|
||
|
IN int argc,
|
||
|
IN char *argv[]
|
||
|
)
|
||
|
{
|
||
|
FILE *InputFile;
|
||
|
int ReturnCode;
|
||
|
|
||
|
if(argc != 3) {
|
||
|
fprintf(stderr,"usage: local <file name> <directory name>\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
if(InputFile = fopen(argv[1],"r")) {
|
||
|
|
||
|
ReturnCode = ProcessInputFile(InputFile,argv[2]) ? 0 : 1;
|
||
|
fclose(InputFile);
|
||
|
|
||
|
} else {
|
||
|
|
||
|
fprintf(stderr,"cannot open localizer file.");
|
||
|
ReturnCode = 1;
|
||
|
}
|
||
|
|
||
|
return ReturnCode;
|
||
|
}
|