236 lines
5.5 KiB
C
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));
|
||
|
}
|