windows-nt/Source/XPSP1/NT/base/ntsetup/bom/infs/infs.c
2020-09-26 16:20:57 +08:00

236 lines
5.5 KiB
C

//
// 05.10.94 Joe Holman Add better messaging and commented out some
// debugging code for media generation.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include "general.h"
FILE* logFile;
void Msg ( const char * szFormat, ... ) {
va_list vaArgs;
va_start ( vaArgs, szFormat );
vprintf ( szFormat, vaArgs );
vfprintf ( logFile, szFormat, vaArgs );
va_end ( vaArgs );
}
void Header(argv)
char* argv[];
{
time_t t;
PRINT1("\n=========== INFS ===============\n");
PRINT2("Input Layout: %s\n",argv[2]);
PRINT2("Target directory for file lists: %s\n",argv[3]);
time(&t); PRINT2("Time: %s",ctime(&t))
PRINT1("================================\n\n");
}
void Usage()
{
printf("PURPOSE: Creates INF file lists.\n");
printf("\n");
printf("PARAMETERS:\n");
printf("\n");
printf("[LogFile] - Path to append a log of actions and errors.\n");
printf("[InLayout] - Path of Layout file from which INFs are generated.\n");
printf("[Target Dir] - Directory where i386, mips, and alpha dirs are for lists.\n\n");
}
int Same(a,b)
char* a;
char* b;
{
int i;
int j;
char tempa[100];
char tempb[100];
strcpy(tempa,a);
strcpy(tempb,b);
i=j=0;
while (tempa[j]=tempa[i++])
if (tempa[j]!=' ')
j++;
i=j=0;
while (tempb[j]=tempb[i++])
if (tempb[j]!=' ')
j++;
return(_stricmp(tempa,tempb));
}
void CreateInfs(e,path,records,cdProduct)
Entry* e;
char* path;
int records;
int cdProduct;
{
int i,j,t,quotes;
char inf[MAX_PATH];
char infPath[MAX_PATH];
char section[MAX_PATH];
char line[MAX_PATH];
FILE *f=NULL;
inf[0]='\0';
section[0]='\0';
for (i=0;i<records;i++) {
//Msg ( "inf = %s, i=%d\n", e[i].inf,i );
if (e[i].inf[0]) {
if (_stricmp(e[i].inf,inf)) {
if (f!=NULL) {
fprintf(f,"\r\n");
fclose(f);
}
strcpy(inf,e[i].inf);
strcpy(infPath,path);
if (path[strlen(path)-1]!='\\') {
strcat(infPath,"\\");
}
strcat(infPath,inf);
if (MyOpenFile(&f,infPath,"wb")) {
Msg ( "ERROR: Must fix this problem, since all inf filelist's did not get created...\n" );
exit(1);
}
//Msg ( "opening file: %s\n", infPath );
PRINT2("INFO Making file list: %s\n",infPath)
}
if (_stricmp(e[i].section,section) ||
(!i) ||
_stricmp(e[i].inf,e[i-1].inf)) {
strcpy(section,e[i].section);
//Msg ("section=%s\n", section );
fprintf(f,"\r\n%s\r\n",section);
}
if ((i==0) || (!((!_stricmp(e[i].name,e[i-1].name)) &&
(!Same(e[i].inf,e[i-1].inf)) &&
(!Same(e[i].infline,e[i-1].infline)) &&
(!_stricmp(e[i].section,e[i-1].section))))) {
quotes=t=j=0;
line[0]='\0';
while (e[i].infline[j]) {
if (e[i].infline[j]=='\"')
quotes++;
if ((e[i].infline[j]!='\"') || ((quotes>2) && (quotes%2))){
switch(e[i].infline[j])
{
case '[':
j++;
switch (e[i].infline[j])
{
case 's': case 'S':
sprintf(&line[t],"%d\0",e[i].size);
break;
case 'd': case 'D':
sprintf(&line[t],"%d\0",e[i].disk);
break;
case 'n': case 'N':
sprintf(&line[t],"%s\0",strlen(e[i].medianame) ? e[i].medianame : e[i].name);
break;
break;
}
while(e[i].infline[j++]!=']');
j--;
break;
default:
line[t++]=e[i].infline[j];
line[t]='\0';
break;
}
while(line[t++]);
t--;
}
j++;
}
line[t]='\0';
fprintf(f,"%s\r\n",line);
//Msg ( "line=%s\n", line );
if (!e[i].infline[0]) {
PRINT2("WARNING - No INF line specified for %s\n",e[i].name)
}
}
}
else {
PRINT2("WARNING - No INF file specified for %s\n",e[i].name)
}
}
fclose(f);
}
int __cdecl InfCompare(const void*,const void*);
int __cdecl main(argc,argv)
int argc;
char* argv[];
{
Entry *e;
char* buf;
int records,i;
int cdProduct;
if (argc!=4) { Usage(); return(1); }
if ((logFile=fopen(argv[1],"a"))==NULL)
{
printf("ERROR Couldn't open %s.\n",argv[1]);
return(1);
}
Header(argv);
LoadFile(argv[2],&buf,&e,&records,"ALL");
//Msg ( "loaded records = %d\n", records );
qsort(e,records,sizeof(Entry),InfCompare);
//
// If this is a cd-rom layout, all files will be on disk 1.
// If floppy layout, some files will be on other disks.
//
for(cdProduct=1,i=0; i<records; i++) {
if(e[i].disk > 1) {
cdProduct=0;
break;
}
}
CreateInfs(e,argv[3],records,cdProduct);
fclose(logFile);
free(e);
free(buf);
return(0);
}
int __cdecl InfCompare(const void *v1, const void *v2)
{
int result;
Entry *e1 = (Entry *)v1;
Entry *e2 = (Entry *)v2;
if (result=_stricmp(e1->inf,e2->inf)) return(result);
if (result=_stricmp(e1->section,e2->section)) return(result);
if (result=_stricmp(e1->infline,e2->infline)) return(result);
return(_stricmp(e1->name,e2->name));
}