windows-nt/Source/XPSP1/NT/base/ntsetup/localinf/local.c

248 lines
6.5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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;
}