445 lines
11 KiB
C
445 lines
11 KiB
C
//
|
|
// 10.25.95 Joe Holman Created to calculate file sizes on the release shares
|
|
// and stick the size into _layout.inf.
|
|
// 12.04.95 Joe Holman _Layout.inf is now Layout.inf.
|
|
// 10.16.96 Joe Holman Comment out MIPS code, but leave there for P7 in a few
|
|
// years.
|
|
// 10.28.96 Joe Holman Use actual file size, don't bump up for any cluster size.
|
|
// 01.20.97 Joe Holman Comment out PPC.
|
|
// 07.31.97 Joe Holman Changes for the build team since the release shares have
|
|
// compressed files now.
|
|
// 09.28.99 Joe Holman Take out Alpha.
|
|
//
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
|
|
#define MFL 256
|
|
|
|
BOOL b;
|
|
|
|
char LocalInfPath[MFL];
|
|
char LocalFlatShare[MFL];
|
|
char i386FlatShare[MFL];
|
|
//char AlphaFlatShare[MFL];
|
|
|
|
#define idLOCAL 0
|
|
#define idX86 1
|
|
//#define idALPHA 3
|
|
|
|
|
|
// Macro for rounding up any number (x) to multiple of (n) which
|
|
// must be a power of 2. For example, ROUNDUP( 2047, 512 ) would
|
|
// yield result of 2048.
|
|
//
|
|
|
|
#define ROUNDUP2( x, n ) (((x) + ((n) - 1 )) & ~((n) - 1 ))
|
|
|
|
|
|
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,argc)
|
|
char * argv[];
|
|
int argc;
|
|
{
|
|
time_t t;
|
|
char tmpTime[100];
|
|
CHAR wtmpTime[200];
|
|
|
|
Msg ( "\n=========== INFSIZE ====================\n" );
|
|
Msg ( "Log file : %s\n", argv[1] );
|
|
Msg ( "Local location of Layout.inf : %s\n", argv[2] );
|
|
Msg ( "Local Flat directory location : %s\n", argv[3] );
|
|
Msg ( "x86 Flat directory location : %s\n", argv[4] );
|
|
//Msg ( "ALPHA Flat directory location : %s\n", argv[5] );
|
|
|
|
time(&t);
|
|
Msg ( "Time: %s", ctime(&t) );
|
|
Msg ( "==========================================\n\n");
|
|
}
|
|
|
|
void Usage()
|
|
{
|
|
printf( "PURPOSE: Finds product file sizes for LAYOUT.INF\n");
|
|
printf( "\n");
|
|
printf( "PARAMETERS:\n");
|
|
printf( "\n");
|
|
printf( "[LogFile] - Path to append a log of actions and errors.\n");
|
|
printf( "[LocalInf] - Local location of the layout.inf.\n" );
|
|
printf( "[LocalPath] - Local flat directory containing product files.\n" );
|
|
printf( "[x86Path] - x86 flat directory containing product files.\n" );
|
|
//printf( "[AlphaPath] - Alpha flat directory containing product files.\n" );
|
|
|
|
printf( "\n" );
|
|
}
|
|
|
|
char dbgStr1[30];
|
|
char dbgStr2[30];
|
|
|
|
|
|
#define FILE_SECTION_LOCAL "[SourceDisksFiles]"
|
|
#define FILE_SECTION_X86 "[SourceDisksFiles.x86]"
|
|
//#define FILE_SECTION_ALPHA "[SourceDisksFiles.alpha]"
|
|
|
|
#define FILE_SECTION_NOT_USED 0xFFFF
|
|
|
|
DWORD dwInsideSection = FILE_SECTION_NOT_USED;
|
|
|
|
DWORD FigureSection ( char * Line ) {
|
|
|
|
//Msg ( "FigureSection on: %s\n", Line );
|
|
|
|
if ( strstr ( Line, FILE_SECTION_LOCAL ) ) {
|
|
|
|
dwInsideSection = idLOCAL;
|
|
|
|
}
|
|
else
|
|
if ( strstr ( Line, FILE_SECTION_X86 ) ) {
|
|
|
|
dwInsideSection = idX86;
|
|
|
|
}
|
|
//else
|
|
//if ( strstr ( Line, FILE_SECTION_ALPHA ) ) {
|
|
//
|
|
// dwInsideSection = idALPHA;
|
|
//
|
|
//}
|
|
else {
|
|
|
|
dwInsideSection = FILE_SECTION_NOT_USED;
|
|
}
|
|
|
|
//Msg ( "dwInsideSection = %x\n", dwInsideSection );
|
|
return(dwInsideSection);
|
|
|
|
}
|
|
char * SuckName ( const char * Line ) {
|
|
|
|
static char szSuckedName[MFL];
|
|
|
|
DWORD dwIndex = 0;
|
|
|
|
// Copy the file name until a space is encountered.
|
|
//
|
|
while ( *Line != ' ' ) {
|
|
|
|
szSuckedName[dwIndex] = *Line;
|
|
szSuckedName[dwIndex+1] = '\0';
|
|
|
|
++Line;
|
|
++dwIndex;
|
|
}
|
|
|
|
//Msg ( "szSuckedName = %s\n", szSuckedName );
|
|
return szSuckedName;
|
|
}
|
|
|
|
|
|
|
|
BOOL GetTheSizes ( void ) {
|
|
|
|
CHAR infFilePath[MFL];
|
|
CHAR infTmpPath[MFL];
|
|
DWORD dwErrorLine;
|
|
BOOL b;
|
|
char dstDirectory[MFL];
|
|
FILE * fHandle;
|
|
FILE * fhTmpLayout;
|
|
char Line[MFL];
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
|
|
|
|
// Open the temporary inf file for writing.
|
|
//
|
|
|
|
sprintf ( infTmpPath, "%s\\%s", LocalInfPath, "LAYOUT.TMP" );
|
|
|
|
Msg ( "infTmpPath = %s\n", infTmpPath );
|
|
|
|
fhTmpLayout = fopen ( infTmpPath, "wt" );
|
|
|
|
if ( fhTmpLayout == NULL ) {
|
|
|
|
Msg ( "FATAL ERROR fopen (%s)\n", infTmpPath );
|
|
return (FALSE);
|
|
}
|
|
|
|
|
|
// Open the real LAYOUT.INF for reading.
|
|
//
|
|
|
|
sprintf ( infFilePath, "%s\\%s", LocalInfPath, "LAYOUT.INF" );
|
|
|
|
Msg ( "infFilePath = %s\n", infFilePath );
|
|
|
|
fHandle = fopen ( infFilePath, "rt" );
|
|
|
|
if ( fHandle ) {
|
|
|
|
char szFile[MFL];
|
|
char szPath[MFL];
|
|
char newLine[MFL];
|
|
|
|
while ( fgets ( Line, sizeof(Line), fHandle ) ) {
|
|
|
|
int i;
|
|
HANDLE hFF;
|
|
|
|
//Msg ( "Line: %s\n", Line );
|
|
|
|
if ( Line[0] == '[' ) {
|
|
|
|
// We may have a new section.
|
|
//
|
|
dwInsideSection = FigureSection ( Line );
|
|
|
|
fwrite ( Line, 1, strlen(Line), fhTmpLayout );
|
|
continue;
|
|
}
|
|
|
|
|
|
// Reasons to ignore this line from further processing.
|
|
//
|
|
//
|
|
|
|
// File section not one we process.
|
|
//
|
|
if ( dwInsideSection == FILE_SECTION_NOT_USED ) {
|
|
|
|
fwrite ( Line, 1, strlen(Line), fhTmpLayout );
|
|
continue;
|
|
}
|
|
|
|
// Line just contains a non-usefull data.
|
|
//
|
|
i = strlen ( Line );
|
|
if ( i < 4 ) {
|
|
|
|
fwrite ( Line, 1, strlen(Line), fhTmpLayout );
|
|
continue;
|
|
}
|
|
|
|
// Line contains a comment.
|
|
//
|
|
if ( Line[0] == ';' ) {
|
|
|
|
fwrite ( Line, 1, strlen(Line), fhTmpLayout );
|
|
continue;
|
|
}
|
|
|
|
|
|
// At this point, we must be a i386, MIPS, ALPHA, or PPC section AND
|
|
// the line contains a filename and setup data.
|
|
//
|
|
|
|
//Msg ( "file == %s\n", SuckName ( Line ) );
|
|
|
|
strcpy ( szFile, SuckName ( Line ) );
|
|
|
|
// Determine where to look for the file size.
|
|
//
|
|
|
|
switch ( dwInsideSection ) {
|
|
|
|
case idLOCAL :
|
|
|
|
sprintf ( szPath, "%s\\%s", LocalFlatShare, szFile );
|
|
|
|
break;
|
|
|
|
case idX86 :
|
|
|
|
sprintf ( szPath, "%s\\%s", i386FlatShare, szFile );
|
|
|
|
break;
|
|
|
|
//case idALPHA :
|
|
//
|
|
// sprintf ( szPath, "%s\\%s", "fakealphapath", szFile );
|
|
//
|
|
// break;
|
|
|
|
default :
|
|
|
|
Msg ( "FATAL ERROR: unknown section switch value = %ld\n", dwInsideSection );
|
|
return (FALSE);
|
|
break;
|
|
|
|
}
|
|
|
|
// Get the size of the file.
|
|
//
|
|
hFF = FindFirstFile ( szPath, &wfd );
|
|
|
|
if ( hFF == INVALID_HANDLE_VALUE ) {
|
|
|
|
|
|
Msg ( "FATAL ERROR: FindFirst (%s), gle = %ld\n", szPath, GetLastError() );
|
|
wfd.nFileSizeLow = 0;
|
|
}
|
|
|
|
// Modify the string, inserting the size.
|
|
//
|
|
{
|
|
|
|
int i = 0;
|
|
int numCommas = 0;
|
|
char * LinePtr = Line;
|
|
|
|
while ( 1 ) {
|
|
|
|
// If we have seen 2 commas, it is time to put the filesize
|
|
// in the line and write-out the remaining part of the string.
|
|
//
|
|
|
|
if ( numCommas == 2 ) {
|
|
|
|
// Now, since the build team may have
|
|
// run propagation more than once,
|
|
// let's just make sure there is another
|
|
// comma write after the 2nd one, because if there isn't
|
|
// we probably have filesize inserted from the last time.
|
|
// If that is the case, crawl up to the next comma and put
|
|
// the size in and then the rest.
|
|
//
|
|
|
|
if ( *LinePtr != ',' ) { // check out the next character
|
|
|
|
// There is NOT a comma, but rather a file size then a comma.
|
|
// Let's crawl up to the next comma.
|
|
//
|
|
|
|
while ( *LinePtr != ',' ) { // end when we see the next comma.
|
|
|
|
++LinePtr;
|
|
}
|
|
|
|
}
|
|
|
|
sprintf ( &newLine[i], "%d%s", wfd.nFileSizeLow, LinePtr );
|
|
break;
|
|
|
|
}
|
|
|
|
newLine[i] = *LinePtr;
|
|
|
|
if ( newLine[i] == ',' ) {
|
|
|
|
++numCommas;
|
|
}
|
|
|
|
++LinePtr;
|
|
++i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Write out the newly modified line !
|
|
//
|
|
//Msg ( "Line = >>>%s<<<\n", Line );
|
|
//Msg ( "newLine = >>>%s<<<\n", newLine );
|
|
|
|
fwrite ( newLine, 1, strlen ( newLine ), fhTmpLayout );
|
|
|
|
FindClose ( hFF );
|
|
}
|
|
if ( ferror(fHandle) ) {
|
|
|
|
Msg ( "FATAL ERROR fgets reading from file...\n" );
|
|
}
|
|
|
|
}
|
|
else {
|
|
|
|
Msg ( "FATAL ERROR fopen (%s)\n", infFilePath );
|
|
fclose ( fhTmpLayout );
|
|
return (FALSE);
|
|
}
|
|
|
|
fclose ( fHandle );
|
|
fclose ( fhTmpLayout );
|
|
|
|
|
|
// Copy the temporary inf file to the real one.
|
|
//
|
|
|
|
b = CopyFile ( infTmpPath, infFilePath, FALSE );
|
|
|
|
if ( b ) {
|
|
|
|
Msg ( "Copy: %s >>> %s [OK]\n", infTmpPath, infFilePath );
|
|
}
|
|
else {
|
|
|
|
Msg ( "FATAL ERROR Copy: %s >>> %s, gle = %ld\n",
|
|
infTmpPath, infFilePath, GetLastError() );
|
|
return ( FALSE );
|
|
}
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
int __cdecl main(argc,argv)
|
|
int argc;
|
|
char * argv[];
|
|
{
|
|
HANDLE h;
|
|
int records, i;
|
|
WIN32_FIND_DATA fd;
|
|
time_t t;
|
|
|
|
printf ( "argc = %d\n", argc );
|
|
|
|
if ( argc != 5 ) {
|
|
Usage();
|
|
return(1);
|
|
}
|
|
|
|
logFile = fopen ( argv[1], "a" );
|
|
|
|
if ( logFile == NULL ) {
|
|
printf("ERROR Couldn't open log file: %s\n",argv[1]);
|
|
return(1);
|
|
}
|
|
|
|
Header(argv,argc);
|
|
|
|
strcpy ( LocalInfPath, argv[2] );
|
|
strcpy ( LocalFlatShare, argv[3] );
|
|
strcpy ( i386FlatShare, argv[4] );
|
|
//strcpy ( AlphaFlatShare, argv[5] );
|
|
|
|
|
|
// Get files that product installs.
|
|
//
|
|
GetTheSizes ( );
|
|
|
|
Msg ( "==============================\n");
|
|
time(&t);
|
|
Msg ( "Time: %s", ctime(&t) );
|
|
Msg ( "==============================\n\n");
|
|
|
|
fclose(logFile);
|
|
|
|
return(0);
|
|
}
|