|
|
//****************************************************************************
//* Author: Aaron Lee
//* Purpose: Create .DDF and .INF files for specified files
//******************************************************************************/
/*
; ------------------------------------------------------------------------------------ ; Format for this file ; ; position 1 = nts_x86 flag ; position 2 = ntw_x86 flag ; position 3 = win95 flag ; position 4 = win98 flag ; position 5 = nts_alpha flag ; position 6 = ntw_alpha flag ; position 7 = other_os flag ; ; position 8 = cabfilename ; position 9 = inf section ; position 10 = filename (wildcards okay) ; ; position 11= .INF rename to ; position 12= .DDF exclude from cab flag ; position 13= Do Not Produce Error if Empty ; position 14= Do Not include this file if the cab is empty! ; position 15= Slipstream file -- don't reference the 0 cab, reference the # specified in global Variable - g_iSlipStreamDiskID ; ------------------------------------------------------------------------------------ 1,1,1,1,0,0,0,basic.cab,iis_product_files_sys,setupapi.dll,,1 1,1,1,1,0,0,0,basic.cab,iis_product_files_sys,cfgmgr32.dll 1,1,1,1,0,0,0,basic.cab,iis_product_files_sys,ocmanage.dll 1,1,1,1,0,0,0,basic.cab,iis_product_files_sys,sysocmgr.exe 1,1,1,1,0,0,0,basic.cab,iis_core_files_sys,inetsrv\mdutil.exe 1,1,1,1,0,0,0,basic.cab,iis_core_files_sys,inetsrv\iismap.dll 1,1,1,1,0,0,0,basic.cab,iis_core_files_inetsrv,inetsrv\iscomlog.dll
;nts_x86, ntw_x86, win95, win98, nts_alpha, ntw_alpha, other_os,
cab filename, inf section, filename (wildcards okay), .INF rename to, .DDF exclude from cab, 1=don't show error if file not exist, 1=Do Not include this file if the cab is empty!, Owner */ #include <direct.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <windows.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <iostream.h>
#include <fstream.h>
#include <winbase.h>
#include "filefind.h"
#include <iis64.h>
// Defines
#define delimiters ",\t\n"
#define MAX_STRING 512
#define MAX_ARRAY_SIZE 10000
#define MAX_ARRAY_SMALL 1000
#define ALL_FILES 0xff
#define NTS_X86 "nts_x86"
#define NTW_X86 "ntw_x86"
#define WIN95 "win95"
#define WIN98 "win98"
#define NTS_ALPHA "nts_alpha"
#define NTW_ALPHA "ntw_alpha"
#define OTHER_OS "other_os"
// Globals
int g_iSlipStreamDiskID = 99; // default if none specified as input parameter
int g_iGlobalReturnCode = TRUE;
int g_bOutputFileDate = FALSE; int g_bOutputFileTime = FALSE; int g_bOutputFileDateTime = FALSE; int g_bDoFileCompare = FALSE; char g_szDoFileCompareData[_MAX_PATH]; int g_bVersionCheck = FALSE; int g_bShowFileFormat = FALSE; int g_bIgnorePrefix = FALSE; int g_bOutputDetails = TRUE; int g_bChangeListOnly = FALSE; int g_bChangeListOnly2 = FALSE; int g_bCabbing_Flag = TRUE; int g_bDisplayToScreen = FALSE; char g_szModuleFilename[_MAX_FNAME]; char g_szDDFOutput[_MAX_PATH]; char g_szINFOutput[_MAX_PATH]; char g_szLSTOutput[_MAX_PATH]; char g_szCATOutput[_MAX_PATH]; char g_szCNGOutput[_MAX_PATH]; char g_szLOCOutput[_MAX_PATH]; char g_szNOTExistOutput[_MAX_PATH];
char g_szinput_filename_full[_MAX_PATH]; char g_szinput_platform[10]; char g_szCurrentDir[_MAX_PATH];
char g_szFilenameTag[_MAX_FNAME] = "CAB_";
#define USENEW
struct FileReadLine { int NTS_x86_flag; int NTW_x86_flag; int Win95_flag; int Win98_flag; int NTS_alpha_flag; int NTW_alpha_flag; int Other_os_flag; char CabFileName[50]; char INF_Sections[100]; char Filename_Full[_MAX_PATH]; char Filename_Name[_MAX_FNAME]; char Filename_Path[_MAX_PATH]; char DDF_Renamed[_MAX_PATH]; char INF_Rename_To[_MAX_FNAME]; int DDF_Exclude_From_Cab_Flag; int Do_Not_Show_Error_Flag; int Do_Not_Include_file_if_cabEmpty_Flag; // invisible stuff
long FileName_Size; int FileWasNotActuallyFoundToExist; int GetFromSlipStreamDisk; } Flat_GlobalArray_Main[MAX_ARRAY_SIZE];
struct CabSizeInfoStruct { char CabFileName[50]; int TotalFiles; long TotalFileSize; } Flat_GlobalArray_CabSizes[30];
char Flat_GlobalArray_Err[MAX_ARRAY_SIZE][255];
struct arrayrow { long total; long nextuse; } Flat_GlobalArrayIndex_Main, Flat_GlobalArrayIndex_Err, Flat_GlobalArrayIndex_CabSizes;
char Flat_GlobalUniqueDirList[300][_MAX_PATH]; int Flat_GlobalUniqueDirList_nextuse; int Flat_GlobalUniqueDirList_total;
// used for files which should not be included in the cab.
FileReadLine g_non_cablist_temp[MAX_ARRAY_SMALL]; int g_non_cablist_temp_nextuse; int g_non_cablist_temp_total;
// prototypes
int __cdecl main(int ,char *argv[]); void ShowHelp(void); void ShowFormat(void); void MakeDirIfNeedTo(char []); int strltrim(LPSTR & thestring); int RemoveAllSpaces(LPSTR & thetempstring); int IsThisStringInHere(LPTSTR, char[]); void GetPath(char *input_filespec, char *path, char *fs); int DoesFileExist(char *input_filespec); void GetThisModuleName(void); char* __cdecl strtok2(char *,const char *);
void Flat_ProcessFile(void); void Flat_GlobalArray_Fill(char[]); void Flat_GlobalArray_ChkDups(void); void Flat_GlobalArray_Prepend_UniqueString(void);
void Flat_GlobalArray_Sort_Cols1(void); void Flat_GlobalArray_Sort_Cols1a(BOOL bDescendFlag); void Flat_GlobalArray_Sort_Cols2(BOOL bDescendFlag);
int Flat_GlobalArray_Add(FileReadLine); void Flat_GlobalArray_Add_Err(char[]); int Flat_GlobalArray_EntryExists(FileReadLine); void Flat_GlobalArray_Print(void); void Flat_GlobalArray_Print_Err(void); int Flat_IsFileNameDup(int); void Flat_Create_Output_DDF(void); void Flat_Create_Output_INF(void); int Flat_Create_Output_ERR(void); int Flat_DoWeIncludeThisFileCheck(int processeduptill);
void Global_TotalCabFileSize_Compute(void); void Global_TotalCabFileSize_Print(void);
int ReturnDirLevelCount(char *DirectoryTree); void FillGlobalUniqueDirList(); int GlobalUniqueDirChkIfAlreadyThere(char *TheStringToCheck); int GlobalUniqueDirReturnMyIndexMatch(char *TheStringToCheck);
void PrintFileDateTime(char *Full_Filename); LPSTR StripWhitespaceA(LPSTR pszString); int iCompareTime(SYSTEMTIME *SystemTime1,SYSTEMTIME *SystemTime2); int CompareFiles(LPSTR lpFileName1,LPSTR lpFileName2); BOOL GetFileDate(LPTSTR lpFileName1,SYSTEMTIME *SystemTime1);
//-------------------------------------------------------------------
// purpose: main
//-------------------------------------------------------------------
int __cdecl main(int argc,char *argv[]) { LPSTR pArg = NULL; int argno = 0; int nflags=0; char ini_filename_dir[_MAX_PATH]; char ini_filename_only[_MAX_FNAME]; char ini_filename_ext[_MAX_EXT];
ini_filename_only[0]='\0'; g_szinput_platform[0]='\0';
GetThisModuleName();
// Get current directory
GetCurrentDirectory( _MAX_PATH, g_szCurrentDir);
// process command line arguments
for(argno=1; argno<argc; argno++) { if ( argv[argno][0] == '-' || argv[argno][0] == '/' ) { nflags++; switch (argv[argno][1]) { case '1': g_bOutputFileDate = TRUE; break; case '2': g_bOutputFileTime = TRUE; break; case '3': g_bOutputFileDateTime = TRUE; break; case '4': g_bDoFileCompare = TRUE; // Get the string for this flag
pArg = CharNextA(argv[argno]); pArg = CharNextA(pArg); if (*pArg == ':') { char szTempString[MAX_PATH]; LPSTR pCmdStart = NULL;
pArg = CharNextA(pArg); // Check if it's quoted
if (*pArg == '\"') { pArg = CharNextA(pArg); pCmdStart = pArg; while ((*pArg) && (*pArg != '\"')){pArg = CharNextA(pArg);} } else { pCmdStart = pArg; // while ((*pArg) && (*pArg != '/') && (*pArg != '-')){pArg = CharNextA(pArg);}
while (*pArg){pArg = CharNextA(pArg);} } *pArg = '\0'; lstrcpyA(g_szDoFileCompareData, StripWhitespaceA(pCmdStart)); }
break; case 'a': case 'A': g_bChangeListOnly = TRUE; break; case 'b': case 'B': g_bChangeListOnly2 = TRUE; break; case 'd': case 'D': g_bOutputDetails = FALSE; break; case 'f': case 'F': g_bShowFileFormat = TRUE; break; case 'i': case 'I': g_bIgnorePrefix = TRUE; break; case 'n': case 'N': g_bCabbing_Flag = FALSE; break; case 'x': case 'X': g_bDisplayToScreen = TRUE; break; case 's': g_iSlipStreamDiskID = atoi(&argv[argno][2]); break; case 't': case 'T': lstrcpyn (g_szFilenameTag, &argv[argno][2], sizeof(g_szFilenameTag)-1); strcat (g_szFilenameTag, "_"); break; case 'v': case 'V': g_bVersionCheck = TRUE; break; case '?': goto exit_with_help; break; } } // if switch character found
else { if ( *ini_filename_only == '\0' ) { // if no arguments, then
// get the ini_filename_dir and put it into
strcpy(g_szinput_filename_full, argv[argno]); ini_filename_dir[0] = '\0'; // split up this path
_splitpath( g_szinput_filename_full, NULL, ini_filename_dir, ini_filename_only, ini_filename_ext);
strcat(ini_filename_only, ini_filename_ext); // if we're missing dir, then get it.
if (*ini_filename_dir == '\0') { // stick current dir into our variable
strcpy(ini_filename_dir, g_szCurrentDir); strcpy(g_szinput_filename_full, g_szCurrentDir); strcat(g_szinput_filename_full, "\\"); strcat(g_szinput_filename_full, ini_filename_only); } } else { // Additional filenames (or arguments without a "-" or "/" preceding)
//goto exit_with_help;
// should be the section to execute.
strcpy(g_szinput_platform, argv[argno]); } } // non-switch char found
} // for all arguments
if (g_bIgnorePrefix) { g_szFilenameTag[0]='\0'; }
if (g_bShowFileFormat) { ShowFormat(); goto exit_no_printf; }
if (g_bVersionCheck) { printf("3\n\n"); exit(3); return TRUE; } // check if filename was specified
// check if section name was specified
if ( *ini_filename_only == '\0') { printf("Too few arguments, argc=%d\n\n",argc); goto exit_with_help; }
// Check if the file exists!
if (FALSE == DoesFileExist(g_szinput_filename_full)) { printf("INI file %s, does not exist!.\n", g_szinput_filename_full); goto exit_gracefully; }
// check if all they want is to compare a file with another list of files
// and check if the 2nd list of files has a date/time stamp which is more recent than file#1
if (g_bDoFileCompare) { // check if filename was specified
if (strcmp(g_szDoFileCompareData,"") == 0) { printf("-4 option missing file parameter!\n\n"); goto exit_with_help; }
// compare file#s date with the list of files in #2
if (TRUE == CompareFiles(g_szinput_filename_full,g_szDoFileCompareData)) { printf("1\n\n"); goto exit_no_printf_1; } else { printf("0\n\n"); goto exit_no_printf; } }
// check if all they want is the date,time or date and time!!!
if (g_bOutputFileDate || g_bOutputFileTime || g_bOutputFileDateTime) { // get the file's julian date and echo it out!
PrintFileDateTime(g_szinput_filename_full); goto exit_no_printf; }
// check if filename was specified
// check if section name was specified
if ( *ini_filename_only == '\0' || *g_szinput_platform == '\0') { printf("Too few arguments, argc=%d\n\n",argc); goto exit_with_help; }
// Check if g_szinput_platform is one of the available options
strcpy(g_szinput_platform, g_szinput_platform);
if ( (_stricmp(g_szinput_platform, NTS_X86) != 0) && (_stricmp(g_szinput_platform, NTW_X86) != 0) && (_stricmp(g_szinput_platform, WIN95) != 0) && (_stricmp(g_szinput_platform, WIN98) != 0) && (_stricmp(g_szinput_platform, NTS_ALPHA) != 0) && (_stricmp(g_szinput_platform, NTW_ALPHA) != 0) && (_stricmp(g_szinput_platform, OTHER_OS) != 0)) { printf("2nd parameter must be one of %s,%s,%s,%s,%s,%s or %s.\n", NTS_X86, NTW_X86, WIN95, WIN98, NTS_ALPHA, NTW_ALPHA, OTHER_OS); goto exit_gracefully; }
// Fine, process the ini file.
char stempstring[100]; sprintf(stempstring, "Start %s.\n", g_szModuleFilename); printf(stempstring); printf("---------------------------------------------------\n");
// We have at least g_szinput_platform and g_szinput_filename_full defined
// run the function to do everything
Flat_ProcessFile();
exit_gracefully: printf("---------------------------------------------------\n"); printf("Done.\n"); if (g_iGlobalReturnCode == TRUE) {exit(0);} else {exit(1);} return g_iGlobalReturnCode;
exit_with_help: ShowHelp(); return FALSE;
exit_no_printf: exit(0); return FALSE;
exit_no_printf_1: exit(1); return TRUE;
}
int CompareFiles(LPSTR lpFileName1,LPSTR lpFileName2) { int iReturn = FALSE; int attr = 0; intptr_t hFile = 0; finddata datareturn; SYSTEMTIME SystemTime1; SYSTEMTIME SystemTime2; char filename_dir[_MAX_PATH]; char filename_only[_MAX_FNAME]; char TempString[_MAX_PATH]; char *pDest = NULL;
// file#1 should be a regular file
// file#2 could be 1 file or a list of files.
// regardless, take file#1's date and compare it with the dates of the files in list#2
// if anyone of the files in list#2 is newer than file#1, return true!
InitStringTable(STRING_TABLE_SIZE);
// Get the date\time for file #1
if (FALSE == GetFileDate(lpFileName1, &SystemTime1)) { printf("CompareFiles: Failure to GetFileDate on %s\n",lpFileName1); goto CompareFiles_Exit; }
pDest = lpFileName2;
// Find end of the string
while (*pDest){pDest = _tcsinc(pDest);}
// If no trailing backslash then kool, copy on the *.*
if (*(_tcsdec(lpFileName2, pDest)) == _T('\\')) { strcat(lpFileName2, "*.*"); attr=ALL_FILES; }
// get the path
_splitpath(lpFileName2, NULL, filename_dir, filename_only, NULL); attr= 0; if (_stricmp(filename_only, "*") == 0) {attr=ALL_FILES;} if (_stricmp(filename_only, "*.*") == 0) {attr=ALL_FILES;} if (FindFirst(lpFileName2, attr, &hFile, &datareturn)) { // check if it's a sub dir
if (!(datareturn.attrib & _A_SUBDIR)) { // Get the filename portion
strcpy(TempString, filename_dir); strcat(TempString, datareturn.name); // compare the date with file#1's date
if (FALSE == GetFileDate(TempString, &SystemTime2)) { printf("CompareFiles: Failure to GetFileDate on %s\n",TempString); } else {
// check if the filedate is bigger than file#1's date
if (TRUE == iCompareTime(&SystemTime1,&SystemTime2)) { iReturn = TRUE; goto CompareFiles_Exit; } } }
while(FindNext(attr, hFile, &datareturn)) { //printf("FindNext:%s\n",datareturn.name);
// check if it's a sub dir
if (!(datareturn.attrib & _A_SUBDIR)) { // Get the filename portion
strcpy(TempString, filename_dir); strcat(TempString, datareturn.name); // compare the date with file#1's date
if (FALSE == GetFileDate(TempString, &SystemTime2)) { printf("CompareFiles: Failure to GetFileDate on %s\n",TempString); } else { // check if the filedate is bigger than file#1's date
if (TRUE == iCompareTime(&SystemTime1,&SystemTime2)) { iReturn = TRUE; goto CompareFiles_Exit; } }
} } }
CompareFiles_Exit: EndStringTable(); return iReturn; }
// if systemtime2 is larger than systemtime1 then return true!
int iCompareTime(SYSTEMTIME *SystemTime1,SYSTEMTIME *SystemTime2) { int iReturn = FALSE;
if (SystemTime2->wYear > SystemTime1->wYear){goto iCompareTime_Larger;} if (SystemTime2->wYear < SystemTime1->wYear){goto iCompareTime_Smaller;} if (SystemTime2->wMonth > SystemTime1->wMonth){goto iCompareTime_Larger;} if (SystemTime2->wMonth < SystemTime1->wMonth){goto iCompareTime_Smaller;}
if (SystemTime2->wDay > SystemTime1->wDay){goto iCompareTime_Larger;} if (SystemTime2->wDay < SystemTime1->wDay){goto iCompareTime_Smaller;}
if (SystemTime2->wHour > SystemTime1->wHour){goto iCompareTime_Larger;} if (SystemTime2->wHour < SystemTime1->wHour){goto iCompareTime_Smaller;}
if (SystemTime2->wMinute > SystemTime1->wMinute){goto iCompareTime_Larger;} if (SystemTime2->wMinute < SystemTime1->wMinute){goto iCompareTime_Smaller;}
if (SystemTime2->wSecond > SystemTime1->wSecond){goto iCompareTime_Larger;} if (SystemTime2->wSecond < SystemTime1->wSecond){goto iCompareTime_Smaller;}
if (SystemTime2->wMilliseconds > SystemTime1->wMilliseconds){goto iCompareTime_Larger;} if (SystemTime2->wMilliseconds < SystemTime1->wMilliseconds){goto iCompareTime_Smaller;}
// they are exactly the same
iReturn = FALSE; return iReturn;
iCompareTime_Larger: iReturn = TRUE; return iReturn;
iCompareTime_Smaller: iReturn = FALSE; return iReturn;
}
BOOL GetFileDate(LPTSTR lpFileName1,SYSTEMTIME *SystemTime1) { HANDLE hFile1 = NULL; FILETIME fCreate,fAccess,fWrite;
FILETIME LocalFileTime;
if (!(hFile1=CreateFile(lpFileName1,GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,0,0))) { return FALSE; } if (!GetFileTime(hFile1,&fCreate,&fAccess,&fWrite)) { CloseHandle(hFile1); return FALSE; } if (!FileTimeToLocalFileTime(&fWrite,&LocalFileTime)) { CloseHandle(hFile1); return FALSE; } if (!FileTimeToSystemTime(&LocalFileTime,SystemTime1)) { CloseHandle(hFile1); return FALSE; } CloseHandle(hFile1); return TRUE; }
void PrintFileDateTime(char *Full_Filename) { SYSTEMTIME SystemTime; char szDateandtime[50]; // get the file's time stamp 17:31.
// make it look like: 1731
//
// get the file's date 12/30/1999
// make it look like 19991230
// make it all look like 199912301731
if (TRUE == GetFileDate(Full_Filename, &SystemTime)) { //sprintf(szDateandtime,"[%02d/%02d/%02d %02d:%02d:%02d]\n",SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear,SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
//printf(szDateandtime);
if (g_bOutputFileDate) { sprintf(szDateandtime,"%02d%02d%02d\n",SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay); printf(szDateandtime); } if (g_bOutputFileTime) { sprintf(szDateandtime,"%02d%02d%02d\n",SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); printf(szDateandtime); }
if (g_bOutputFileDateTime) { sprintf(szDateandtime,"%02d%02d%02d%02d%02d%02d\n", SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond); printf(szDateandtime); } } return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_ProcessFile() { ifstream inputfile; char fileinputbuffer[1000];
char stempstring[100]; char * ptemp = NULL;
Flat_GlobalArrayIndex_Main.total=0; Flat_GlobalArrayIndex_Main.nextuse=0; Flat_GlobalArrayIndex_Err.total=0; Flat_GlobalArrayIndex_Err.nextuse=0;
// Get output file names
strcpy(g_szDDFOutput, g_szModuleFilename); strcat(g_szDDFOutput, ".DDF"); strcpy(g_szINFOutput, g_szModuleFilename); strcat(g_szINFOutput, ".INF");
strcpy(g_szLSTOutput, g_szModuleFilename); strcat(g_szLSTOutput, ".LST");
strcpy(g_szCATOutput, g_szModuleFilename); strcat(g_szCATOutput, ".CAT");
strcpy(g_szCNGOutput, g_szModuleFilename); strcat(g_szCNGOutput, ".CNG");
strcpy(g_szNOTExistOutput, g_szModuleFilename); strcat(g_szNOTExistOutput, ".NOT");
strcpy(g_szLOCOutput, g_szModuleFilename); strcat(g_szLOCOutput, ".LOC");
// don't delete these files if we're only doing the changelist file
if (!g_bChangeListOnly) { DeleteFile(g_szCATOutput); DeleteFile(g_szNOTExistOutput); } // always delete this file
DeleteFile(g_szCNGOutput); DeleteFile(g_szLOCOutput);
// Read flat file and put into huge array
inputfile.open(g_szinput_filename_full, ios::in); inputfile.getline(fileinputbuffer, sizeof(fileinputbuffer)); do { // check for any comments, don't add these to the array.
if (strchr(fileinputbuffer, ';') != NULL) { ptemp = strrchr(fileinputbuffer, ';'); if (ptemp){*ptemp = '\0';} } if (*fileinputbuffer) { // Remove spaces
char *p; p = fileinputbuffer; RemoveAllSpaces(p);
// Take line, parse it and put it into our global file structure.
// Do only for our platform!!!!
Flat_GlobalArray_Fill(fileinputbuffer); } } while (inputfile.getline(fileinputbuffer, sizeof(fileinputbuffer)));
inputfile.close();
// OK, all entries should be in the global_main array
// and all the "extra" entries should be in there too..
// add a "IIS" to the font of any filename
Flat_GlobalArray_Prepend_UniqueString();
// 1. loop thru the global array and mark any filenames for duplicates..
Flat_GlobalArray_Sort_Cols2(TRUE); Flat_GlobalArray_ChkDups();
// 2. sort on #1 cab file, then on #2 section
Flat_GlobalArray_Sort_Cols2(FALSE); if (g_bOutputDetails == TRUE) {Flat_GlobalArray_Print();}
if (!g_bChangeListOnly) { //printf("\n\n sorted by cab and section...\n");
// 3. loop thru the list and create .DDF file
sprintf(stempstring, "Creating DDF file...%s\n",g_szDDFOutput); printf(stempstring); if (g_bCabbing_Flag) {Flat_Create_Output_DDF();} } // Sort on sections
Flat_GlobalArray_Sort_Cols1a(FALSE); //printf("\n\n sorted by section...\n");
if (g_bDisplayToScreen) Flat_GlobalArray_Print();
// 4. loop thru the list and create .INF file
if (g_bChangeListOnly) { sprintf(stempstring, "Creating CNG file only...%s\n",g_szINFOutput); printf(stempstring); } else { sprintf(stempstring, "Creating INF file...%s\n",g_szINFOutput); printf(stempstring); }
Flat_Create_Output_INF();
printf("\nTotals:\n"); Global_TotalCabFileSize_Compute(); Global_TotalCabFileSize_Print();
printf("\nErrors/Warnings:\n"); Flat_GlobalArray_Print_Err();
Flat_Create_Output_ERR();
return; }
// function: SafeCopy
//
// - Copy a string from one to another.
// - This function takes the length of the destination to make sure we don't
// copy too much.
// - This will always make sure that it is null terminated
//
// Return
// A pointer to the destination string
//
inline LPSTR SafeCopy( LPSTR szDestination, LPSTR szSource, DWORD dwSize) { LPTSTR szRet;
szRet = strncpy( szDestination, szSource, dwSize); // Copy string
szDestination[dwSize - 1] = '\0'; // NULL Terminate
return szRet; }
// function: SafeCat
//
// - Concatinate one string onto another
// - This function takes the length of the destination to make sure we don't
// copy too much.
// - This will always make sure that it is null terminated
//
// Return
// A pointer to the destination string
//
inline LPSTR SafeCat( LPSTR szDestination, LPSTR szSource, DWORD dwSize) { LPTSTR szRet;
szRet = strncat( szDestination, szSource, dwSize); // Copy string
szDestination[dwSize - 1] = '\0'; // NULL Terminate
return szRet; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_GlobalArray_Fill(char fileinputbuffer[]) { char *token; int token_count; char thetempstring[MAX_STRING]; char tempstring[255]; char temperrorwords[255] = ""; FileReadLine tempentry = {0,0,0,0,0,0,0,"","","","","","","",0,0,0,0,0,0}; FileReadLine theentry = {0,0,0,0,0,0,0,"","","","","","","",0,0,0,0,0,0};
strcpy(thetempstring, fileinputbuffer);
// get the first token
token = strtok2( thetempstring, delimiters ); token_count = 0;
// Add entry to Global Array, convert to all lowercase
// parse out platforms
if (token == NULL) {goto Exit_Flat_FillGlobalArray_Main;} strcpy(temperrorwords, "x86_NTS_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.NTS_x86_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError1;} strcpy(temperrorwords, "x86_NTW_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.NTW_x86_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError1;}
strcpy(temperrorwords, "Win95_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.Win95_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError2;}
strcpy(temperrorwords, "Win98_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.Win98_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError2;}
strcpy(temperrorwords, "NTS_alpha_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.NTS_alpha_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError1;} strcpy(temperrorwords, "NTW_alpha_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.NTW_alpha_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError1;}
strcpy(temperrorwords, "Other_os_flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.Other_os_flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError1;}
// do only for our specified platform!
if ( (tempentry.NTS_x86_flag==0) && (_stricmp(g_szinput_platform,NTS_X86) == 0)) {goto Exit_Flat_FillGlobalArray_Main;} if ( (tempentry.NTW_x86_flag==0) && (_stricmp(g_szinput_platform,NTW_X86) == 0)) {goto Exit_Flat_FillGlobalArray_Main;}
if ( (tempentry.Win95_flag==0) && (_stricmp(g_szinput_platform,WIN95) == 0)) {goto Exit_Flat_FillGlobalArray_Main;} if ( (tempentry.Win98_flag==0) && (_stricmp(g_szinput_platform,WIN98) == 0)) {goto Exit_Flat_FillGlobalArray_Main;}
if ( (tempentry.NTS_alpha_flag==0) && (_stricmp(g_szinput_platform,NTS_ALPHA) == 0)) {goto Exit_Flat_FillGlobalArray_Main;} if ( (tempentry.NTW_alpha_flag==0) && (_stricmp(g_szinput_platform,NTW_ALPHA) == 0)) {goto Exit_Flat_FillGlobalArray_Main;}
if ( (tempentry.Other_os_flag==0) && (_stricmp(g_szinput_platform,OTHER_OS) == 0)) {goto Exit_Flat_FillGlobalArray_Main;} strcpy(temperrorwords, "Cabfilename"); strcpy(tempentry.CabFileName, token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError2;} strcpy(temperrorwords, "INF_Sections"); strcpy(tempentry.INF_Sections, token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto InputParseError2;} strcpy(temperrorwords, "Filename_Full"); strcpy(tempentry.Filename_Full, token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;} strcpy(temperrorwords, "INF_Rename_To"); strcpy(tempentry.INF_Rename_To, token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;} strcpy(temperrorwords, "DDF_Exclude_From_Cab_Flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.DDF_Exclude_From_Cab_Flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;}
strcpy(temperrorwords, "Do_Not_Show_Error_Flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.Do_Not_Show_Error_Flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;}
strcpy(temperrorwords, "Do_Not_Include_file_if_cabEmpty_Flag"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.Do_Not_Include_file_if_cabEmpty_Flag = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;}
strcpy(temperrorwords, "GetFromSlipStreamDisk"); if ( (_stricmp("1",(char *) token) != 0) && (_stricmp("0",(char *) token) != 0) && (_stricmp("", (char*) token)!=0) ) goto InputParseError; tempentry.GetFromSlipStreamDisk = atoi(token); token = strtok2( NULL, delimiters ); token_count++;if (token == NULL) {goto MoveToGlobals;}
MoveToGlobals: if (!(tempentry.Filename_Full)) {goto Exit_Flat_FillGlobalArray_Main;} // Check for wildcards in position array in filename position #2
int attr; char filename_dir[_MAX_PATH]; char filename_only[_MAX_FNAME];
// Get the filename portion
_splitpath( tempentry.Filename_Full, NULL, filename_dir, filename_only, NULL); attr= 0; if (_stricmp(filename_only, "*.*") == 0) {attr=ALL_FILES;}
// list thru the files
intptr_t hFile; finddata datareturn;
InitStringTable(STRING_TABLE_SIZE); if ( FindFirst(tempentry.Filename_Full, attr, &hFile, &datareturn) ) { // check if it's a sub dir
if (!( datareturn.attrib & _A_SUBDIR)) { // ok we found one.
// let's add it to our list of stuff to add
theentry = tempentry;
char tempstring1[255]; SafeCopy(tempstring1, filename_dir, sizeof(tempstring1) ); SafeCat(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Full, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Name, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, filename_dir, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Path, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.DDF_Renamed, tempstring1, _MAX_PATH );
theentry.FileName_Size = datareturn.size;
// now take this entry and try to add it to the global array!!!
Flat_GlobalArray_Add(theentry); }
while(FindNext(attr, hFile, &datareturn)) { // check if it's a sub dir
if (!(datareturn.attrib & _A_SUBDIR)) { // ok we found one.
// let's add it to our list of stuff to add
theentry = tempentry;
char tempstring1[255]; SafeCopy(tempstring1, filename_dir, sizeof(tempstring1) ); SafeCat(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Full, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Name, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, filename_dir, sizeof(tempstring1) ); SafeCopy(theentry.Filename_Path, tempstring1, _MAX_PATH );
SafeCopy(tempstring1, datareturn.name, sizeof(tempstring1) ); SafeCopy(theentry.DDF_Renamed, tempstring1, _MAX_PATH );
theentry.FileName_Size = datareturn.size;
// now take this entry and try to add it to the global array!!!
Flat_GlobalArray_Add(theentry); } }
} else // we didn't find the specified file.
{ // If this is a file which doesn't get into a cab, then
// let's add it to the .inf file section [SourceDisksFiles] later.
if (tempentry.DDF_Exclude_From_Cab_Flag) { fstream f4; f4.open(g_szNOTExistOutput, ios::out | ios::app);
char fullpath[_MAX_PATH]; char * pmyfilename; char myPath[_MAX_PATH]; pmyfilename = fullpath;
// Resolve relative path to real path
if (0 != GetFullPathName(tempentry.Filename_Full, _MAX_PATH, myPath, &pmyfilename)) { // Take only the filename...
// achg.htr=1,,1902
strcpy(tempstring,pmyfilename); f4.write(tempstring, strlen(tempstring)); if (tempentry.GetFromSlipStreamDisk == 0) { strcpy(tempstring,"=0,,50000"); } else { sprintf(tempstring,"=%d,,50000",g_iSlipStreamDiskID); }
f4.write(tempstring, strlen(tempstring)); f4.write("\n", 1);
// let's add it to our list of stuff to add
theentry = tempentry;
strcpy(theentry.Filename_Full, tempentry.Filename_Full); strcpy(theentry.Filename_Name, pmyfilename);
_splitpath( tempentry.Filename_Full, NULL, theentry.Filename_Path, NULL, NULL); //strcpy(theentry.Filename_Path, myPath);
strcpy(theentry.DDF_Renamed, pmyfilename); theentry.FileName_Size = 50000;
printf(tempentry.Filename_Full); printf(". FileWasNotActuallyFoundToExist1.\n"); theentry.FileWasNotActuallyFoundToExist = TRUE;
// now take this entry and try to add it to the global array!!!
Flat_GlobalArray_Add(theentry);
} f4.close(); } else { // check if we're not supposed to show errors!
if (tempentry.Do_Not_Show_Error_Flag == 0) { // add it to the error list.
sprintf(tempstring, "ERROR: file not found--> %s --> %s", tempentry.Filename_Full, fileinputbuffer); Flat_GlobalArray_Add_Err(tempstring); } } }
EndStringTable();
Exit_Flat_FillGlobalArray_Main: return;
InputParseError: sprintf(tempstring, "INFUTIL ERROR: %s should be numeric and is not--> %s", temperrorwords, fileinputbuffer); Flat_GlobalArray_Add_Err(tempstring); return; InputParseError1: sprintf(tempstring, "INFUTIL ERROR: missing platform info--> %s", fileinputbuffer); Flat_GlobalArray_Add_Err(tempstring); return; InputParseError2: sprintf(tempstring, "INFUTIL ERROR: missing %s--> %s", temperrorwords, fileinputbuffer); Flat_GlobalArray_Add_Err(tempstring); return;
}
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int Flat_GlobalArray_Add(FileReadLine entrytoadd) { FileReadLine Temp = {0,0,0,0,0,0,0,"","","","","","","",0,0,0,0,0,0};
// check if this value already exists in the globalarary
if (Flat_GlobalArray_EntryExists(entrytoadd)) return FALSE; // blankout the array values if any.
Flat_GlobalArray_Main[Flat_GlobalArrayIndex_Main.nextuse] = Temp;
// move info into global array
Flat_GlobalArray_Main[Flat_GlobalArrayIndex_Main.nextuse] = entrytoadd;
// increment counter to array
// increment next use space
++Flat_GlobalArrayIndex_Main.total; ++Flat_GlobalArrayIndex_Main.nextuse; return TRUE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int Flat_GlobalArray_EntryExists(FileReadLine theentry) { int matchcount;
// loop thru the whole list
for( int i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { // check if entries are the same.
matchcount=0; if (_strnicmp(Flat_GlobalArray_Main[i0].CabFileName, theentry.CabFileName, lstrlen(theentry.CabFileName) + 1) == 0 ) {++matchcount;} if (_strnicmp(Flat_GlobalArray_Main[i0].INF_Sections, theentry.INF_Sections, lstrlen(theentry.INF_Sections) + 1) == 0 ) {++matchcount;} if (_strnicmp(Flat_GlobalArray_Main[i0].Filename_Full, theentry.Filename_Full, lstrlen(theentry.Filename_Full) + 1) == 0 ) {++matchcount;} if (_strnicmp(Flat_GlobalArray_Main[i0].Filename_Name, theentry.Filename_Name, lstrlen(theentry.Filename_Name) + 1) == 0 ) {++matchcount;} if (matchcount == 4) { // we found a match!!! "WARNING: file already included"
return TRUE; } } //. no matches... return FALSE.
return FALSE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int IsThisStringInHere(LPTSTR lpTemp, char szStringToCheck[]) { int bFlag = FALSE;
// Lookup sections to see if they exists in ini file.
if (*lpTemp != '\0') { // loop thru and process results
bFlag = FALSE; while (*lpTemp) { // check if our section name is in there.
if (_strnicmp(szStringToCheck, lpTemp, lstrlen(lpTemp) + 1) == 0 ) {bFlag = TRUE;} lpTemp += (lstrlen(lpTemp) + 1); }
// Check if our section was in there
if (bFlag != TRUE) {return FALSE;}
}
return TRUE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int Flat_DDFDoesThisFileCabAlreadyExists(int processeduptill) { int i0;
char CompareTo_cab[100]; char CompareTo_fullfilename[100];
SafeCopy(CompareTo_cab, Flat_GlobalArray_Main[processeduptill].CabFileName, sizeof(CompareTo_cab) ); SafeCopy(CompareTo_fullfilename, Flat_GlobalArray_Main[processeduptill].Filename_Full, sizeof(CompareTo_fullfilename) );
for(i0=0;i0<processeduptill;i0++) { // check if global value has already been processed.
// check if the cab is the same
// check if the dir is the same
// check if the filename is the same
if (_stricmp(Flat_GlobalArray_Main[i0].CabFileName, CompareTo_cab) == 0) { if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Full,CompareTo_fullfilename) == 0) { // if they both match, then shoot that means that we already printed this out.
return TRUE; } } }
return FALSE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void ShowHelp() { printf("InfUtil2 - prints out file date/time,\n"); printf(" or print out watch list from <input file> list,\n"); printf(" or creates .ddf and .inf files from <input file> list\n"); printf("----------------------------------------------------------------\n"); printf(" Usage:\n"); printf(" infutil2 /? /F [/1 /2 /3] [/4:<filename>] [/A /B] /D /N /S? /T??? /X <input file> <section name>\n\n"); printf(" Params:\n"); printf(" /? show this stuff\n"); printf(" /F show <input file> format help\n"); printf(" Flags for Date/Time use:\n"); printf(" /1 print out <input file>'s date as number\n"); printf(" /2 print out <input file>'s time as number\n"); printf(" /3 print out <input file>'s date and time as big number\n"); printf(" Flags for compare file list timestamp use:\n"); printf(" /4: compare dir in <filename> with <input file>'s timestamp. if dir has newer files, then set ERRORLEVEL=1\n"); printf(" Flags for change list use:\n"); printf(" /A produce a list of files to watch for changes (if files in list change then re-build cabs) from <input file> list\n"); printf(" /B produce a list of files to watch for changes (includes files which aren't in cabs) from <input file> list\n"); printf(" Flags for .ddf .inf use:\n"); printf(" /D don't show details\n"); printf(" /I ignore /T tag (there'll be no prefix)\n"); printf(" /SslipstreamSourceDisksNames file id -- used for SP1 slipstream to point loose files to file specified in /S\n"); printf(" used in sync with <input file> change. look in .ddf file.\n"); printf(" /Ttag Appends tag_ to the beginning of all filenames\n"); printf(" /N Produce INF File which will not require .ddf file (meaning no cabs).(untested) \n"); printf(" /X Display output for debug\n"); printf(" <input file> is a file name.\n"); printf(" <section name> is either %s,%s,%s,%s,%s,%s,%s.\n", NTS_X86, NTW_X86, WIN95, WIN98, NTS_ALPHA, NTW_ALPHA, OTHER_OS); printf("\n"); printf("Example:\n"); printf(" infutil2.exe /3 myfile.txt\n"); printf(" Will print out myfile.txt's date/time as yymmddhhmmss.\n"); printf(" infutil2.exe /Tcore inifile.ini %s\n", NTS_X86); printf(" Will produce a infutil2.ddf,inf,cng files. the .ddf and .inf files will create cabs with files beginning with 'core_'\n"); printf(" infutil2.exe /C inifile.ini %s\n", NTS_X86); printf(" Will only produce a infutil2.cng file with a list of files to watch for changes in.\n"); return; }
void ShowFormat(void) { printf("Format for <input file>:\n"); printf(" position 1 = nts_x86 flag\n"); printf(" 2 = ntw_x86 flag\n"); printf(" 3 = win95 flag\n"); printf(" 4 = win98 flag\n"); printf(" 5 = nts_alpha flag\n"); printf(" 6 = ntw_alpha flag\n"); printf(" 7 = other_os flag\n"); printf(" 8 = cabfilename\n"); printf(" 9 = inf section\n"); printf(" 10 = filename (wildcards okay)\n"); printf(" 11 = .INF rename to\n"); printf(" 12 = .DDF exclude from cab flag\n"); printf(" 13 = Do Not Produce Error if Empty\n"); printf(" 14 = Do Not include this file if the cab is empty!\n"); printf("\n"); printf("Example of format for <input file>:\n"); printf(" 1,1,1,1,0,0,0,core.cab,core_files_sys,x86\\SysFile1.dll,,1,,\n"); printf(" 1,1,1,1,0,0,0,core.cab,core_files_sys,x86\\SysFile2.dll,,1,,\n"); printf(" 0,0,0,0,1,1,0,core.cab,core_files_sys,Alpha\\SysFile1.dll,,1,,\n"); printf(" 0,0,0,0,1,1,0,core.cab,core_files_sys,Alpha\\SysFile2.dll,,1,,\n"); printf(" 1,0,0,0,0,0,0,core.cab,product_files,x86\\ProdSrv.dll,,1,,\n"); printf(" 0,1,0,0,0,0,0,core.cab,product_files,x86\\ProdWks.dll,,1,,\n"); printf(" 0,0,1,1,0,0,0,core.cab,product_files,x86\\Prod95.dll,,1,,\n"); printf(" 0,0,0,0,1,0,0,core.cab,product_files,Alpha\\ProdSrvA.dll,,1,,\n"); printf(" 0,0,0,0,0,1,0,core.cab,product_files,Alpha\\ProdWksA.dll,,1,,\n"); printf(" 1,1,1,1,0,0,0,core.cab,product_files,x86\\Prodx86.dll,,1,,\n"); printf(" 0,0,0,0,1,1,0,core.cab,product_files,Alpha\\ProdAlph.dll,,1,,\n"); printf(" 1,1,1,1,0,0,0,core.cab,product_files2,x86\\Ext\\*.*,,,,\n"); printf(" 0,0,0,0,1,1,0,core.cab,product_files2,Alpha\\Ext\\*.*,,,,\n"); printf(" 1,1,1,1,1,1,0,core.cab,product_files2,16bit\\*.*,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir1,content\\index.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir1,content\\readme.txt,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir1,content\\default.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir2,content\\content1.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir2,content\\content2.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir2,content\\content3.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,content.cab,content_files_dir2,content\\content4.htm,,,,\n"); printf(" 1,1,1,1,1,1,0,docs.cab,help_files_dir1,help\\*.*,,,,\n"); printf(" 1,1,1,1,1,1,0,docs.cab,help_files_dir2,help\\other\\*.*,,,,\n"); printf(" 1,1,1,1,1,1,0,docs.cab,help_files_dir3,help\\support\\*.txt,,,,\n"); printf(" 1,1,1,1,1,1,0,docs.cab,help_files_dir4,help\\other\\*.xls,,,,\n"); printf("\n"); printf("Example of use:\n"); printf(" infutil2.exe -Tcore -D abovefile.csv %s\n", NTS_X86); printf(" Will produce .ddf,inf,err,cat,not and infutil2.cng files. Figure it out.\n"); return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int DoesFileExist(char *input_filespec) { if (GetFileAttributes(input_filespec) == -1) { return(FALSE); } return (TRUE); }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void GetPath(char * input_filespec, char * path, char * fs) { char filespec[100]; char * p; struct _stat s;
strcpy(filespec, input_filespec);
/* if filespec is a directory, interpret it to mean dir\*.* */ if (_stat(filespec, &s) == 0 && s.st_mode & S_IFDIR) { /* root is special case */ if ( (*filespec == '\\' && *(filespec+1) == '\0') || (*(filespec+1) == ':' && *(filespec+2) == '\\' && *(filespec+3)=='\0')) strcat(filespec, "*.*"); else strcat(filespec, "\\*.*"); }
/* search string from end to beginning for back slash */ p=filespec+strlen(filespec)-1; for(; p>filespec && *p != '\\' && *p != ':'; p--); /* is it a drive or path */ if ( *p=='\\' || *p==':') { strncpy(path, filespec, DIFF(p-filespec)+1); path[p-filespec+1]='\0'; strcpy(fs, p+1); } else /* no drive, path */ { /* yep, no path */ path[0]='\0'; strcpy(fs, filespec); }
} /* GetPath */
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int strltrim(LPSTR & thestring) { char * p = NULL;
p = thestring;
// check for spaces to the right
if (*p ==' ') { while (*p == ' ') {p += (lstrlen((char*) *p) + 1);}
thestring = p; printf("%s testing..", p); return TRUE; } return FALSE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void MakeDirIfNeedTo(char thestring[]) { char *p = NULL; char tempstring[255]; // Check the string to see if there are any "\"'s in the string
// if there are then let's remove the filename and make the directory
if (strchr(thestring, '\\') != NULL) { strcpy(tempstring, thestring); // remove the filename
p = strrchr(tempstring, '\\'); if(p){*p = '\0';}
// ok now we have the path
// let's create the directory
_mkdir(tempstring);
} return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void GetThisModuleName(void) { char szfilename_only[_MAX_FNAME]; char szPath[_MAX_PATH]; // Get the path
if (GetModuleFileName(NULL, szPath, _MAX_PATH)) { // split up this path and take filename only
_splitpath( szPath, NULL, NULL, szfilename_only, NULL);
// set global variable with it
strcpy(g_szModuleFilename, szfilename_only); } return; }
void Flat_GlobalArray_Prepend_UniqueString(void) { //char Filename_Full[_MAX_PATH];
//char Filename_Name[_MAX_FNAME];
//char Filename_Path[_MAX_PATH];
//char DDF_Renamed[_MAX_PATH];
//char INF_Rename_To[_MAX_FNAME];
char filename_only[_MAX_FNAME]; char filename_ext[_MAX_EXT]; char NewFilename[_MAX_FNAME];
int i0 =0; for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { if (Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag == 0) { // Tack on the IIS Tag.
_splitpath( Flat_GlobalArray_Main[i0].Filename_Full, NULL, NULL, filename_only, filename_ext); if (filename_ext) {sprintf(NewFilename, "%s%s%s", g_szFilenameTag, filename_only, filename_ext);} else {sprintf(NewFilename, "%s%s", g_szFilenameTag, filename_only);}
// re-create the full name
//sprintf(Flat_GlobalArray_Main[i0].Filename_Full, "%s%s", Flat_GlobalArray_Main[i0].Filename_Path, NewFilename);
// re-create the filename only
//strcpy(Flat_GlobalArray_Main[i0].Filename_Name, NewFilename);
_splitpath( Flat_GlobalArray_Main[i0].DDF_Renamed, NULL, NULL, filename_only, filename_ext); if (filename_ext) {sprintf(NewFilename, "%s%s%s", g_szFilenameTag, filename_only, filename_ext);} else {sprintf(NewFilename, "%s%s", g_szFilenameTag, filename_only);}
// re-create the filename
strcpy(Flat_GlobalArray_Main[i0].DDF_Renamed, NewFilename);
/*
_splitpath( Flat_GlobalArray_Main[i0].INF_Rename_To, NULL, NULL, filename_only, filename_ext); if (filename_only) { if (filename_ext) {sprintf(NewFilename, "%s%s%s", g_szFilenameTag, filename_only, filename_ext);} else {sprintf(NewFilename, "%s%s", g_szFilenameTag, filename_only);} // re-create the filename
strcpy(Flat_GlobalArray_Main[i0].INF_Rename_To, NewFilename); } */ } } }
//-------------------------------------------------------------------
// purpose: check for duplicate filenames
//-------------------------------------------------------------------
void Flat_GlobalArray_ChkDups(void) { int i0 =0; int i1 =0; int i3 = 0; char filetemp[255]; char filetempwhole[255]; int theflag = FALSE; char checkagainst[255]; int foundtheflag2 = FALSE; for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { if (Flat_IsFileNameDup(i0)) { printf ("."); i1 = 0; // if the file exists outside a cab, then do not rename.
// only rename files which exist in the cab.
if (Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag == 0) { do { theflag = FALSE; // Give it a new name.
// then check if the name already exists.
i1++; if (g_bCabbing_Flag != TRUE) { #ifdef USENEW
if (i1 == 1) { // Count how many directory levels in There.
int iDirLevelCount = 0; int z1 = 0; iDirLevelCount = ReturnDirLevelCount(Flat_GlobalArray_Main[i0].Filename_Full);
SafeCopy(filetemp, Flat_GlobalArray_Main[i0].Filename_Path, sizeof(filetemp) ); if (iDirLevelCount >=1) { for( z1 = 0; z1 < iDirLevelCount;z1++) {SafeCat(filetemp, "..\\", sizeof(filetemp) );} } /*
strcpy(filetemp, ""); if (iDirLevelCount >=1) { for( z1 = 0; z1 < iDirLevelCount;z1++) {strcat(filetemp, "..\\");} } strcat(filetemp, Flat_GlobalArray_Main[i0].Filename_Path); */
// add the filename
SafeCat(filetemp, Flat_GlobalArray_Main[i0].Filename_Name, sizeof(filetemp) ); SafeCopy(filetempwhole,filetemp, sizeof(filetempwhole) ); } else { sprintf(filetemp, "%s%s%d", g_szFilenameTag, Flat_GlobalArray_Main[i0].Filename_Full, i1); SafeCopy(filetempwhole, Flat_GlobalArray_Main[i0].Filename_Path, sizeof(filetempwhole) ); SafeCat(filetempwhole, filetemp, sizeof(filetempwhole) ); } #else
sprintf(filetemp, "%s%s%d", g_szFilenameTag, Flat_GlobalArray_Main[i0].Filename_Name, i1); SafeCopy(filetempwhole, Flat_GlobalArray_Main[i0].Filename_Path, sizeof(filetempwhole) ); SafeCat(filetempwhole, filetemp, sizeof(filetempwhole) ); #endif
} else { sprintf(filetemp, "%s%s%d", g_szFilenameTag, Flat_GlobalArray_Main[i0].Filename_Name, i1); SafeCopy(filetempwhole, Flat_GlobalArray_Main[i0].Filename_Path, sizeof(filetempwhole) ); SafeCat(filetempwhole, filetemp, sizeof(filetempwhole) ); } // check if the file exists..
// check if it already exists in our list...
SafeCopy(checkagainst, filetempwhole, sizeof(checkagainst)); foundtheflag2= FALSE;
for (i3=0;i3<Flat_GlobalArrayIndex_Main.total;i3++) { if (i3 != i0) { if (_stricmp(Flat_GlobalArray_Main[i3].Filename_Name, filetemp) == 0) {foundtheflag2= TRUE;} else { if (_stricmp(Flat_GlobalArray_Main[i3].DDF_Renamed, filetemp) == 0) {foundtheflag2= TRUE;} } } }
if (foundtheflag2 == FALSE) {
// check if it already exists in the filesystem...
int attr = 0; intptr_t hFile = 0; finddata datareturn; InitStringTable(STRING_TABLE_SIZE); if ( FindFirst(filetempwhole, attr, &hFile, &datareturn) ) { // shoot that blows, it already exists
// do it again.
theflag = FALSE; } else { theflag = TRUE; }
}
} while (theflag == FALSE); // Add to the ddf renamedfile place
SafeCopy(Flat_GlobalArray_Main[i0].DDF_Renamed, filetemp, _MAX_PATH); } } } printf ("\n"); return; }
//-------------------------------------------------------------------
// purpose: check for duplicate filenames in filename column
//-------------------------------------------------------------------
int Flat_IsFileNameDup(int indextocheck) { int iReturn = FALSE; int i0; char checkagainst[255]; char checkagainst2[255];
// check for exact duplicate.
// if it is then we can't have any of these
// Return false, because we will remove this entry later
// it should return false, because the files are identical and do not need to be renamed.
SafeCopy(checkagainst, Flat_GlobalArray_Main[indextocheck].Filename_Full, sizeof(checkagainst) ); SafeCopy(checkagainst2, Flat_GlobalArray_Main[indextocheck].Filename_Name, sizeof(checkagainst2) ); for (i0=0;i0<Flat_GlobalArrayIndex_Main.total;i0++) //for (i0=0;i0<indextocheck;i0++)
{ iReturn = FALSE; if (i0 != indextocheck) { /*
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, checkagainst2) == 0) { if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, "global.asa") == 0) { printf(":"); printf(Flat_GlobalArray_Main[i0].Filename_Full); printf("(");printf(Flat_GlobalArray_Main[i0].Filename_Name);printf(")"); printf("[");printf(Flat_GlobalArray_Main[i0].DDF_Renamed);printf("]");
printf(":"); printf(Flat_GlobalArray_Main[indextocheck].Filename_Full); printf("(");printf(Flat_GlobalArray_Main[indextocheck].Filename_Name);printf(")"); printf("[");printf(Flat_GlobalArray_Main[indextocheck].DDF_Renamed);printf("]"); printf("\n"); } } */
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Full, checkagainst) == 0) { // We have a duplicate which we will ignore!
//printf(Flat_GlobalArray_Main[i0].Filename_Full);
//printf(". Duplicate.1.!!!!\n");
_stricmp(Flat_GlobalArray_Main[indextocheck].DDF_Renamed, Flat_GlobalArray_Main[i0].DDF_Renamed); iReturn = FALSE; goto Flat_IsFileNameDup_Exit; } else { if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, checkagainst2) == 0) { // We have a duplicate, check if this one has already been renamed though.
if (_stricmp(Flat_GlobalArray_Main[i0].DDF_Renamed, checkagainst2) == 0) { //printf(". Duplicate.2.!!!!\n");
iReturn = TRUE; goto Flat_IsFileNameDup_Exit; } else { // check if what we are renaming indextocheck to, is the same as DDF_Renamed...
if (_stricmp(Flat_GlobalArray_Main[i0].DDF_Renamed, Flat_GlobalArray_Main[indextocheck].DDF_Renamed) == 0) { //(". Duplicate.3.!!!!\n");
iReturn = TRUE; goto Flat_IsFileNameDup_Exit; } }
}
} }
// go on to the next one....
}
/*
// Check for filename duplicate only
strcpy(checkagainst, Flat_GlobalArray_Main[indextocheck].Filename_Name); for (i0=0;i0<Flat_GlobalArrayIndex_Main.total;i0++) { if (i0 != indextocheck) { if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, checkagainst) == 0) {return TRUE;} } } */ Flat_IsFileNameDup_Exit: return iReturn; }
//-------------------------------------------------------------------
// purpose: sort on CabFileName, then on Filename_Path
//-------------------------------------------------------------------
void Flat_GlobalArray_Sort_Cols2(BOOL bDescendFlag) { int offset, inorder; int i; int j; int n; int result; int swapflag;
FileReadLine tempentry;
n = Flat_GlobalArrayIndex_Main.total;
offset=n; do{ offset = (8 * offset) /11; offset = (offset == 0) ? 1 : offset; inorder = TRUE; for (i=0,j=offset;i < (n - offset);i++,j++) { swapflag = FALSE; result = _stricmp(Flat_GlobalArray_Main[i].CabFileName, Flat_GlobalArray_Main[j].CabFileName);
if (bDescendFlag) { if (result < 0) {swapflag = TRUE;} else { if (result == 0) { result = _stricmp(Flat_GlobalArray_Main[i].Filename_Path, Flat_GlobalArray_Main[j].Filename_Path); if (result < 0) {swapflag = TRUE;} else { if (result ==0) result = _stricmp(Flat_GlobalArray_Main[i].Filename_Name, Flat_GlobalArray_Main[j].Filename_Name); if (result < 0) {swapflag = TRUE;} } } } } else { // check if larger
if (result > 0) {swapflag = TRUE;} else { if (result == 0) { result = _stricmp(Flat_GlobalArray_Main[i].Filename_Path, Flat_GlobalArray_Main[j].Filename_Path); // check if larger
if (result > 0) {swapflag = TRUE;} else { if (result ==0) result = _stricmp(Flat_GlobalArray_Main[i].Filename_Name, Flat_GlobalArray_Main[j].Filename_Name); if (result > 0) {swapflag = TRUE;} } } } }
if (swapflag == TRUE) { inorder = FALSE;
// do the swap
// move into temp
tempentry = Flat_GlobalArray_Main[i];
// move into original
Flat_GlobalArray_Main[i] = Flat_GlobalArray_Main[j];
// move temp into other
Flat_GlobalArray_Main[j] = tempentry; } } } while (!(offset == 1 && inorder == TRUE));
return; }
//-------------------------------------------------------------------
// purpose: sort on INF_Sections only
//-------------------------------------------------------------------
void Flat_GlobalArray_Sort_Cols1() { int offset, inorder; int i; int j; int n; int result; FileReadLine tempentry;
n = Flat_GlobalArrayIndex_Main.total;
offset=n; do{ offset = (8 * offset) /11; offset = (offset == 0) ? 1 : offset; inorder = TRUE; for (i=0,j=offset;i < (n - offset);i++,j++) {
result = _stricmp(Flat_GlobalArray_Main[i].INF_Sections, Flat_GlobalArray_Main[j].INF_Sections); if (result > 0) { inorder = FALSE;
// do the swap
// move into temp
tempentry = Flat_GlobalArray_Main[i];
// move into original
Flat_GlobalArray_Main[i] = Flat_GlobalArray_Main[j];
// move temp into other
Flat_GlobalArray_Main[j] = tempentry;
} } } while (!(offset == 1 && inorder == TRUE));
return; }
//-------------------------------------------------------------------
// purpose: sort on INF_Sections then on filename
//-------------------------------------------------------------------
void Flat_GlobalArray_Sort_Cols1a(BOOL bDescendFlag) { int offset, inorder; int i; int j; int n; int result; int swapflag;
FileReadLine tempentry;
n = Flat_GlobalArrayIndex_Main.total;
offset=n; do{ offset = (8 * offset) /11; offset = (offset == 0) ? 1 : offset; inorder = TRUE; for (i=0,j=offset;i < (n - offset);i++,j++) { swapflag = FALSE; result = _stricmp(Flat_GlobalArray_Main[i].INF_Sections, Flat_GlobalArray_Main[j].INF_Sections);
if (bDescendFlag) { if (result < 0) {swapflag = TRUE;} else { if (result == 0) { result = _stricmp(Flat_GlobalArray_Main[i].Filename_Name, Flat_GlobalArray_Main[j].Filename_Name); if (result < 0){swapflag = TRUE;} } } } else { // check if larger
if (result > 0) {swapflag = TRUE;} else { if (result == 0) { result = _stricmp(Flat_GlobalArray_Main[i].Filename_Name, Flat_GlobalArray_Main[j].Filename_Name); // check if larger
if (result > 0){swapflag = TRUE;} } } }
if (swapflag == TRUE) { inorder = FALSE;
// do the swap
// move into temp
tempentry = Flat_GlobalArray_Main[i];
// move into original
Flat_GlobalArray_Main[i] = Flat_GlobalArray_Main[j];
// move temp into other
Flat_GlobalArray_Main[j] = tempentry; } } } while (!(offset == 1 && inorder == TRUE));
return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_GlobalArray_Print(void) { int i0; int total; char bigtemp[20];
total = Flat_GlobalArrayIndex_Main.total;
for( i0 = 0; i0 < total;i0++) { sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].NTS_x86_flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].NTW_x86_flag); printf (bigtemp); printf(",");
sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].Win95_flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].Win98_flag); printf (bigtemp); printf(",");
sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].NTS_alpha_flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].NTW_alpha_flag); printf (bigtemp); printf(",");
sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].Other_os_flag); printf (bigtemp); printf(",");
printf(Flat_GlobalArray_Main[i0].CabFileName); printf(","); printf(Flat_GlobalArray_Main[i0].INF_Sections); printf(","); printf(Flat_GlobalArray_Main[i0].Filename_Full); printf(","); printf(Flat_GlobalArray_Main[i0].Filename_Name); printf(","); printf(Flat_GlobalArray_Main[i0].Filename_Path); printf(","); printf(Flat_GlobalArray_Main[i0].DDF_Renamed); printf(","); printf(Flat_GlobalArray_Main[i0].INF_Rename_To); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].Do_Not_Show_Error_Flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].Do_Not_Include_file_if_cabEmpty_Flag); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].GetFromSlipStreamDisk); printf (bigtemp); printf(","); sprintf(bigtemp, "%d", Flat_GlobalArray_Main[i0].FileName_Size); printf (bigtemp); printf ("\n"); }
return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_Create_Output_INF(void) { int i0; fstream f; fstream f2; fstream f3; fstream f4; fstream f5; char last_section[255]; char this_section[255]; char tempstring[255]; char fullpath[_MAX_PATH]; int Changed_f4 = FALSE; int Changed_f5 = FALSE;
if (!g_bChangeListOnly) { f.open(g_szINFOutput, ios::out); f3.open(g_szCATOutput, ios::out); }
f4.open(g_szCNGOutput, ios::out); f5.open(g_szLOCOutput, ios::out);
if (g_bCabbing_Flag == TRUE) { // Produce .inf file for use with .ddf file
// for generating cabs!!!
// ----------------------------------------
// Produce the top half -- the sections
// bottom half -- producted by diamond using.ddf file
// ------------------------------------
strcpy(last_section, " "); for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { Changed_f4 = FALSE; Changed_f5 = FALSE; strcpy(this_section, Flat_GlobalArray_Main[i0].INF_Sections);
// For each new section change.
if (_stricmp(this_section, last_section) != 0) { if (!g_bChangeListOnly) { // print out new section stuff
f.write("\n", 1); sprintf(tempstring, "[%s]\n", this_section); f.write (tempstring, strlen(tempstring)); }
strcpy(last_section, this_section); }
if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) { // write it out to the .cat file
// strcpy(tempstring,Flat_GlobalArray_Main[i0].Filename_Name);
// // take out trailing spaces.
// f3.write(tempstring, strlen(tempstring));
TCHAR * pmyfilename; pmyfilename = fullpath; TCHAR myPath[_MAX_PATH]; // Resolve relative path to real path
if (0 != GetFullPathName(Flat_GlobalArray_Main[i0].Filename_Full, _MAX_PATH, myPath, &pmyfilename)) { if (!g_bChangeListOnly) { // should look like this
// <HASH>d:\mydir\myfile=d:\mydir\myfile
SafeCopy(tempstring,"<HASH>",sizeof(tempstring)); f3.write(tempstring, strlen(tempstring));
SafeCopy(tempstring,myPath,sizeof(tempstring)); f3.write(tempstring, strlen(tempstring));
SafeCopy(tempstring,"=",sizeof(tempstring)); f3.write(tempstring, strlen(tempstring));
SafeCopy(tempstring,myPath,sizeof(tempstring)); f3.write(tempstring, strlen(tempstring)); }
if (g_bChangeListOnly2) { // write out entry for change list.
SafeCopy(tempstring,myPath,sizeof(tempstring)); f4.write(tempstring, strlen(tempstring)); Changed_f4 = TRUE; } else if (Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag == 0) { // write out entry for change list
SafeCopy(tempstring,myPath,sizeof(tempstring)); f4.write(tempstring, strlen(tempstring)); Changed_f4 = TRUE; }
if (Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag == 1) { // write out entry for localization (list of files in binaries dir outside of cab)
SafeCopy(tempstring,pmyfilename,sizeof(tempstring)); f5.write(tempstring, strlen(tempstring)); Changed_f5 = TRUE; }
}
// Check if this file has the rename stuff set and additional info there,
// don't write the \n until past this part..
if (_stricmp(Flat_GlobalArray_Main[i0].INF_Rename_To,"") == 0) { // write out the filename!
// print out the filename
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, Flat_GlobalArray_Main[i0].DDF_Renamed) == 0) { SafeCopy(tempstring,Flat_GlobalArray_Main[i0].Filename_Name,sizeof(tempstring)); if (!g_bChangeListOnly) { f.write (tempstring, strlen(tempstring)); } // append on overwrite all the time
// notice the two commas!
//f.write (",,4",3);
} else { // rename to:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].Filename_Name,sizeof(tempstring)); if (!g_bChangeListOnly) { f.write (tempstring, strlen(tempstring)); } // rename from:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].DDF_Renamed,sizeof(tempstring)); if (!g_bChangeListOnly) { f.write (",",1); f.write (tempstring, strlen(tempstring)); // append on overwrite all the time
//f.write (",4",2);
} } } else { // the rename flag was set and the filename is in there.
// format: rename to, rename from
if (!g_bChangeListOnly) {
// rename to:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].INF_Rename_To,sizeof(tempstring)); f.write (tempstring, strlen(tempstring));
// rename from:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].DDF_Renamed,sizeof(tempstring)); f.write (",",1); f.write (tempstring, strlen(tempstring));
// append on overwrite all the time
//f.write (",4",2);
} } }
// ok, now it's kool to write this part.
f.write("\n", 1); f3.write("\n", 1); if (Changed_f4) { f4.write("\n", 1); } if (Changed_f5) { f5.write("\n", 1); } }
if (!g_bChangeListOnly) { f.close(); f3.close(); } f4.close(); f5.close(); } else { // Produce .inf file for use without anything else!!!
// no need corresponding .ddf file for these!!!
// ----------------------------------------
// Produce the top half -- the sections
// ------------------------------------
strcpy(last_section, " "); for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { strcpy(this_section, Flat_GlobalArray_Main[i0].INF_Sections);
// For each new section change.
if (_stricmp(this_section, last_section) != 0) { if (!g_bChangeListOnly) { // print out new section stuff
f.write("\n", 1); sprintf(tempstring, "[%s]\n", this_section); f.write (tempstring, strlen(tempstring)); }
strcpy(last_section, this_section); }
#ifdef USENEW
if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) { // Check if this file has the rename stuff set and additional info there,
// don't write the \n until past this part..
if (_stricmp(Flat_GlobalArray_Main[i0].INF_Rename_To,"") == 0) { // write out the filename!
// print out the filename
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, Flat_GlobalArray_Main[i0].DDF_Renamed) == 0) { if (!g_bChangeListOnly) { SafeCopy(tempstring, Flat_GlobalArray_Main[i0].Filename_Name, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (tempstring, strlen(tempstring)); // append on overwrite all the time
// notice the two commas!
//f.write (",,4",3);
}
} else { if (!g_bChangeListOnly) { // rename to:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].Filename_Name, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (tempstring, strlen(tempstring));
// rename from:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].DDF_Renamed, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (",",1); f.write (tempstring, strlen(tempstring)); // append on overwrite all the time
//f.write (",4",2);
} } } else { if (!g_bChangeListOnly) { // the rename flag was set and the filename is in there.
// format: rename to, rename from
// rename to:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].INF_Rename_To, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (tempstring, strlen(tempstring));
// rename from:
SafeCopy(tempstring, Flat_GlobalArray_Main[i0].DDF_Renamed, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (",",1); f.write (tempstring, strlen(tempstring)); // append on overwrite all the time
//f.write (",4",2);
} } } #else
if (!g_bChangeListOnly) { // write out the filename!
// like this: filename.txt, inetsrv\test\test\filename.txt
SafeCopy(tempstring,Flat_GlobalArray_Main[i0].Filename_Name, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (tempstring, strlen(tempstring)); SafeCopy(tempstring, ",", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); strcpy(tempstring,Flat_GlobalArray_Main[i0].Filename_Full, sizeof(tempstring)/sizeof(tempstring[0]) ); f.write (tempstring, strlen(tempstring)); } #endif
if (!g_bChangeListOnly) { f.write("\n", 1); } }
// Produce the bottom half -- the sections
// ------------------------------------
// use f2 for some other batch processing.
if (!g_bChangeListOnly) { f2.open(g_szLSTOutput, ios::out);
//[SourceDisksNames]
//; file names and associated disks
//; diskid = description,tagfile,unused,subdir
//0="Setup Files","",0
f.write("\n\n", 2); SafeCopy(tempstring, "[SourceDisksNames]\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";Filenames and asociated disks\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";diskid = description,tagfile,unused,subdir\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #ifdef USENEW
FillGlobalUniqueDirList(); //0="Setup Files","",inetsrv
//1="Setup Files","",inetsrv\help
//2="Setup Files","",inetsrv\help\testing
int i9; for( i9 = 0; i9 < Flat_GlobalUniqueDirList_total;i9++) { // REmove trailing slash character Flat_GlobalUniqueDirList[i9])
char tempdir[_MAX_PATH]; char *temppointer = NULL; SafeCopy(tempdir, Flat_GlobalUniqueDirList[i9], sizeof(tempstring)/sizeof(tempstring[0]) ); temppointer = strrchr(tempdir, '\\'); if (temppointer) { (*temppointer) = '\0';}
sprintf(tempstring, "%d=\"Setup Files\",,,%s\n", i9, tempdir); f.write(tempstring, strlen(tempstring)); } #else
SafeCopy(tempstring, "0 = \"Setup Files\", \"\",0, \"\"\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, "\n\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #endif
//[SourceDisksNames.x86]
//; file names and associated disks
//; diskid = description,tagfile,unused,subdir
//0="Setup Files","",0
f.write("\n\n", 2); SafeCopy(tempstring, "[SourceDisksNames.x86]\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";Filenames and asociated disks\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";diskid = description,tagfile,unused,subdir\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #ifdef USENEW
FillGlobalUniqueDirList(); //0="Setup Files","",inetsrv
//1="Setup Files","",inetsrv\help
//2="Setup Files","",inetsrv\help\testing
for(i9 = 0; i9 < Flat_GlobalUniqueDirList_total;i9++) { // REmove trailing slash character Flat_GlobalUniqueDirList[i9])
char tempdir[_MAX_PATH]; char *temppointer = NULL; SafeCopy(tempdir, Flat_GlobalUniqueDirList[i9], sizeof(tempstring)/sizeof(tempstring[0]) ); temppointer = strrchr(tempdir, '\\'); if (temppointer) { (*temppointer) = '\0';}
sprintf(tempstring, "%d=\"Setup Files\",,,%s\n", i9, tempdir); f.write(tempstring, strlen(tempstring)); } #else
SafeCopy(tempstring, "0 = \"Setup Files\", \"\",0, \"\",\i386\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, "\n\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #endif
//[SourceDisksNames.Alpha]
//; file names and associated disks
//; diskid = description,tagfile,unused,subdir
//0="Setup Files","",0
f.write("\n\n", 2); SafeCopy(tempstring, "[SourceDisksNames.Alpha]\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";Filenames and asociated disks\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, ";diskid = description,tagfile,unused,subdir\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #ifdef USENEW
FillGlobalUniqueDirList(); //0="Setup Files","",inetsrv
//1="Setup Files","",inetsrv\help
//2="Setup Files","",inetsrv\help\testing
for(i9 = 0; i9 < Flat_GlobalUniqueDirList_total;i9++) { // REmove trailing slash character Flat_GlobalUniqueDirList[i9])
char tempdir[_MAX_PATH]; char *temppointer = NULL; SafeCopy(tempdir, Flat_GlobalUniqueDirList[i9], sizeof(tempstring)/sizeof(tempstring[0]) ); temppointer = strrchr(tempdir, '\\'); if (temppointer) { (*temppointer) = '\0';}
sprintf(tempstring, "%d=\"Setup Files\",,,%s\n", i9, tempdir); f.write(tempstring, strlen(tempstring)); } #else
SafeCopy(tempstring, "0 = \"Setup Files\", \"\",0, \"\",\Alpha\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, "\n\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); #endif
//; filename_on_source = diskid,subdir,size,checksum,spare,spare
//[SourceDisksFiles]
//_default.pif = 1,,1024,,,,,1,3
SafeCopy(tempstring, "; filename_on_source = diskid,subdir,size,checksum,spare,spare\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring)); SafeCopy(tempstring, "[SourceDisksFiles]\n", sizeof(tempstring)/sizeof(tempstring[0]) ); f.write(tempstring, strlen(tempstring));
for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { // filename and directory
// filename.txt = 0,subdirectory
//sprintf(tempstring, "%s = 0\n", Flat_GlobalArray_Main[i0].Filename_Full);
#ifdef USENEW
if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) { // Check if this file has the rename stuff set and additional info there,
// don't write the \n until past this part..
if (_stricmp(Flat_GlobalArray_Main[i0].INF_Rename_To,"") == 0) { // write out the filename!
// print out the filename
//[SourceDisksFiles]
//..\test1\cfw.pdb=2,,2
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, Flat_GlobalArray_Main[i0].DDF_Renamed) == 0) { int indexmatch = GlobalUniqueDirReturnMyIndexMatch(Flat_GlobalArray_Main[i0].Filename_Path); sprintf(tempstring, "%s=%d", Flat_GlobalArray_Main[i0].Filename_Name, indexmatch); f.write (tempstring, strlen(tempstring)); } else { // rename from:
int indexmatch = GlobalUniqueDirReturnMyIndexMatch(Flat_GlobalArray_Main[i0].Filename_Path); sprintf(tempstring, "%s=%d", Flat_GlobalArray_Main[i0].DDF_Renamed,indexmatch); f.write (tempstring, strlen(tempstring)); } } else { // the rename flag was set and the filename is in there.
// rename from:
int indexmatch = GlobalUniqueDirReturnMyIndexMatch(Flat_GlobalArray_Main[i0].Filename_Path); sprintf(tempstring, "%s=%d", Flat_GlobalArray_Main[i0].DDF_Renamed,indexmatch); f.write (tempstring, strlen(tempstring)); } } f.write("\n", 1); #else
sprintf(tempstring, "%s\n", Flat_GlobalArray_Main[i0].Filename_Full); f.write(tempstring, strlen(tempstring)); #endif
//if (strcmp(Flat_GlobalArray_Main[i0].Filename_Path, "") == 0)
// {sprintf(tempstring, "%s;.\n", Flat_GlobalArray_Main[i0].Filename_Full);}
//else
// {sprintf(tempstring, "%s;%s\n", Flat_GlobalArray_Main[i0].Filename_Full, Flat_GlobalArray_Main[i0].Filename_Path);}
//sprintf(tempstring, "%s\\%s;%s\n", g_szCurrentDir,Flat_GlobalArray_Main[i0].Filename_Full,Flat_GlobalArray_Main[i0].Filename_Full);
sprintf(tempstring, "%s\\%s\n", g_szCurrentDir,Flat_GlobalArray_Main[i0].Filename_Full); f2.write(tempstring, strlen(tempstring)); } f2.close(); } f.close(); } return; }
//-------------------------------------------------------------------
// purpose: ok, loop thru the array and create the ddf details...
//-------------------------------------------------------------------
void Flat_Create_Output_DDF(void) { fstream f; char thefilename[255]; int i0; int i1; int i2; int i3;
char last_cab[50]; char last_sourcedir[255]; char this_cab[50]; char this_sourcedir[255];
char tempstring[255];
// used for list of all cab's
char tempcablist[20][255]; int tempcablist_nextuse; int tempcablist_total; int found; char temp_cab[50];
// loop thru all globalarray stuff and get all the cab filenames and stick into the tempcablist.
tempcablist_nextuse = 0; tempcablist_total = 0; for(i1=0;i1<Flat_GlobalArrayIndex_Main.total;i1++) { found=FALSE; if (Flat_DoWeIncludeThisFileCheck(i1) == TRUE) { strcpy(temp_cab, Flat_GlobalArray_Main[i1].CabFileName); // loop thru array to see if it's already there.
for(i2=0;i2<tempcablist_total;i2++) { if (_stricmp(tempcablist[i2], temp_cab) == 0) {found=TRUE;} } if (found==FALSE) { // add it
strcpy(tempcablist[tempcablist_nextuse],temp_cab); tempcablist_nextuse++; tempcablist_total++; } } }
// ok, create our little output file...
f.open(g_szDDFOutput, ios::out); strcpy(last_cab, "0"); strcpy(last_sourcedir, "-"); for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { strcpy(this_cab, Flat_GlobalArray_Main[i0].CabFileName); strcpy(this_sourcedir, Flat_GlobalArray_Main[i0].INF_Sections); _splitpath( Flat_GlobalArray_Main[i0].Filename_Full, NULL, this_sourcedir, NULL, NULL); if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) {
// For each Cab Type...
if (_stricmp(this_cab, last_cab) != 0) {
// Check if it is the first time!
if (_stricmp(last_cab, "0") == 0) { strcpy(tempstring, "\n;***** LAYOUT SECTION (Generated) ***** \n"); f.write (tempstring, strlen(tempstring)); // print out all the cabinet names
// loop thru the list of cabinet names and print them out.
for(i2=0;i2<tempcablist_total;i2++) { sprintf(tempstring, " .Set CabinetName%d=%s\n", i2+1, tempcablist[i2]); f.write (tempstring, strlen(tempstring)); } f.write("\n", 1);
// Set Generate INF=on!!!!
strcpy(tempstring, ".Set GenerateInf=On\n"); f.write (tempstring, strlen(tempstring)); f.write("\n", 1);
// Do files which don't get included into the cab files..
strcpy(tempstring, ";*** Files not to include in Cab.\n"); f.write (tempstring, strlen(tempstring)); // Set source
// list files.
char last_filepath[255]; char this_filepath[255];
strcpy(g_non_cablist_temp[0].Filename_Name, ""); g_non_cablist_temp_nextuse = 0; g_non_cablist_temp_total = 0; int itexists;
for(i3=0;i3<Flat_GlobalArrayIndex_Main.total;i3++) { // check if this entry has the ddf_excludefromcab flag set.
if (Flat_GlobalArray_Main[i3].DDF_Exclude_From_Cab_Flag) { // add only if not already there...
itexists = FALSE; for (int i6=0;i6<g_non_cablist_temp_total;i6++) { if (_stricmp(g_non_cablist_temp[i6].Filename_Name,Flat_GlobalArray_Main[i3].Filename_Name)==0) {itexists = TRUE;} }
if (itexists == FALSE) { // Add to our temporary array...
g_non_cablist_temp[g_non_cablist_temp_nextuse].NTS_x86_flag = Flat_GlobalArray_Main[i3].NTS_x86_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].NTW_x86_flag = Flat_GlobalArray_Main[i3].NTW_x86_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].Win95_flag = Flat_GlobalArray_Main[i3].Win95_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].Win98_flag = Flat_GlobalArray_Main[i3].Win98_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].NTS_alpha_flag = Flat_GlobalArray_Main[i3].NTS_alpha_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].NTW_alpha_flag = Flat_GlobalArray_Main[i3].NTW_alpha_flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].Other_os_flag = Flat_GlobalArray_Main[i3].Other_os_flag; strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].CabFileName,Flat_GlobalArray_Main[i3].CabFileName); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].INF_Sections,Flat_GlobalArray_Main[i3].INF_Sections); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].Filename_Full,Flat_GlobalArray_Main[i3].Filename_Full); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].Filename_Name,Flat_GlobalArray_Main[i3].Filename_Name); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].Filename_Path,Flat_GlobalArray_Main[i3].Filename_Path); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].DDF_Renamed,Flat_GlobalArray_Main[i3].DDF_Renamed); strcpy(g_non_cablist_temp[g_non_cablist_temp_nextuse].INF_Rename_To,Flat_GlobalArray_Main[i3].INF_Rename_To); g_non_cablist_temp[g_non_cablist_temp_nextuse].DDF_Exclude_From_Cab_Flag = Flat_GlobalArray_Main[i3].DDF_Exclude_From_Cab_Flag;
g_non_cablist_temp[g_non_cablist_temp_nextuse].Do_Not_Show_Error_Flag = Flat_GlobalArray_Main[i3].Do_Not_Show_Error_Flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].Do_Not_Include_file_if_cabEmpty_Flag = Flat_GlobalArray_Main[i3].Do_Not_Include_file_if_cabEmpty_Flag; g_non_cablist_temp[g_non_cablist_temp_nextuse].FileName_Size = Flat_GlobalArray_Main[i3].FileName_Size; g_non_cablist_temp[g_non_cablist_temp_nextuse].FileWasNotActuallyFoundToExist = Flat_GlobalArray_Main[i3].FileWasNotActuallyFoundToExist; g_non_cablist_temp[g_non_cablist_temp_nextuse].GetFromSlipStreamDisk = Flat_GlobalArray_Main[i3].GetFromSlipStreamDisk;
/*
if (Flat_GlobalArray_Main[i3].FileWasNotActuallyFoundToExist) { printf(Flat_GlobalArray_Main[i3].Filename_Full); printf(". HEY..\n"); } */
g_non_cablist_temp_nextuse++; g_non_cablist_temp_total++; } } }
// sort the array
int offset, inorder, isort, jsort, niterate, resultsort; //, i0sort;
//FileReadLine tempentrysort[MAX_ARRAY_SMALL];
FileReadLine tempentrysort; niterate = g_non_cablist_temp_total; offset=niterate; do{ offset = (8 * offset) /11; offset = (offset == 0) ? 1 : offset; inorder = TRUE; for (isort=0,jsort=offset;isort < (niterate - offset);isort++,jsort++) { resultsort = _stricmp(g_non_cablist_temp[isort].Filename_Path, g_non_cablist_temp[jsort].Filename_Path); if (resultsort > 0) { inorder = FALSE;
// do the swap
// move into temp
tempentrysort = g_non_cablist_temp[isort];
// move into original
g_non_cablist_temp[isort] = g_non_cablist_temp[jsort];
// move temp into other
g_non_cablist_temp[jsort] = tempentrysort;
/* weird to stuff..
// do the swap
// move into temp
for (i0sort=0;i0sort<MAX_ARRAY_SMALL;i0sort++) { tempentrysort[i0sort] = g_non_cablist_temp[isort]; //strcpy(tempentrysort[i0sort].thestring,(g_non_cablist_temp[isort].thecol[i0sort].thestring));
} // move into original
for (i0sort=0;i0sort<MAX_ARRAY_SMALL;i0sort++) { // move into original
Flat_GlobalArray_Main[isort] = g_non_cablist_temp[jsort]; //strcpy( Flat_GlobalArray_Main[isort].thecol[i0sort].thestring, g_non_cablist_temp[jsort].thecol[i0sort].thestring);
} // move temp into other
for (i0sort=0;i0sort<MAX_ARRAY_SMALL;i0sort++) { g_non_cablist_temp[jsort] = tempentrysort[i0sort]; //strcpy(g_non_cablist_temp[jsort].thecol[i0sort].thestring, tempentrysort[i0sort].thestring);
} */ } } } while (!(offset == 1 && inorder == TRUE));
SafeCopy(tempstring, ".Set Compress=OFF\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring)); SafeCopy(tempstring, ".Set Cabinet=OFF\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring));
// loop thru our new array, and output stuff
strcpy(last_filepath,"0"); for (int i5=0;i5<g_non_cablist_temp_total;i5++) { SafeCopy(this_filepath, g_non_cablist_temp[i5].Filename_Path,sizeof(this_filepath));
if (_stricmp(last_filepath, this_filepath) != 0) { // take the dir and write it out
f.write("\n", 1); sprintf(tempstring, ".Set SourceDir=%s\n", this_filepath); f.write (tempstring, strlen(tempstring)); SafeCopy(last_filepath, this_filepath,sizeof(last_filepath)); }
if (g_non_cablist_temp[i5].FileWasNotActuallyFoundToExist) { printf(g_non_cablist_temp[i5].Filename_Full); printf(". FileWasNotActuallyFoundToExist.skip write to ddf..\n"); g_iGlobalReturnCode = FALSE; } else { // print out the filename
if (_stricmp(g_non_cablist_temp[i5].Filename_Name, g_non_cablist_temp[i5].DDF_Renamed) == 0) {SafeCopy(tempstring,g_non_cablist_temp[i5].Filename_Name,sizeof(tempstring));} else { SafeCopy(tempstring,g_non_cablist_temp[i5].Filename_Name,sizeof(tempstring)); SafeCat(tempstring," ",sizeof(tempstring)); SafeCat(tempstring,g_non_cablist_temp[i5].DDF_Renamed,sizeof(tempstring)); } f.write (tempstring, strlen(tempstring));
// files which are outside of the cab should have the unique flag set.
// of cource, because they are all in the same place!!
// check if this is one of those "special" files which
// come from a service pack.
if (g_non_cablist_temp[i5].GetFromSlipStreamDisk == 0) { strcpy(tempstring, "\t/unique=yes"); } else { sprintf(tempstring,"\t/unique=yes /cab#=%d", g_iSlipStreamDiskID); } f.write (tempstring, strlen(tempstring)); f.write("\n", 1); } }
f.write("\n", 1);
// Files which do get included in the Cab
SafeCopy(tempstring, ";*** Files to include in Cabs.\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring));
f.write(";\n", 2); sprintf(tempstring, "; Cab File = %s\n", this_cab); f.write (tempstring, strlen(tempstring)); f.write(";\n", 2);
// Set cabinet on and compress on.
SafeCopy(tempstring, ".Set Cabinet=on\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring)); SafeCopy(tempstring, ".Set Compress=on\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring));
} else { f.write("\n;\n", 3); sprintf(tempstring, "; Cab File = %s\n", this_cab); f.write (tempstring, strlen(tempstring)); f.write(";\n", 2); // Write new stuff for every new cabinet
SafeCopy(tempstring, ".Set Cabinet=off\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring)); SafeCopy(tempstring, ".Set Cabinet=on\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring)); SafeCopy(tempstring, ".New Cabinet\n",sizeof(tempstring)); f.write (tempstring, strlen(tempstring)); }
SafeCopy(last_cab, this_cab,sizeof(last_cab)); }
// Copy over the filename
// don't copy over if the file should not be
// included in the the cab file.
//if (_stricmp(Flat_GlobalArray_Main[i0].thecol[COL_DDF_EXCLUDEFROMCAB].thestring,"true") != 0)
if (!(Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag)) { // don't copy over if the same file, in the same directory for the same cab file
// exists already. this could happen if they want the same file in different
// sections....
if (Flat_DDFDoesThisFileCabAlreadyExists(i0) == FALSE) { //if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) {
// For each new directory change
if (_stricmp(this_sourcedir, last_sourcedir) != 0) { // print out new section stuff
f.write("\n", 1); sprintf(tempstring, ".Set SourceDir=%s\n", this_sourcedir); f.write (tempstring, strlen(tempstring));
SafeCopy(last_sourcedir, this_sourcedir,sizeof(last_sourcedir)); }
// write out the filename!
SafeCopy(thefilename, Flat_GlobalArray_Main[i0].Filename_Name,sizeof(thefilename));
if (_stricmp(Flat_GlobalArray_Main[i0].Filename_Name, Flat_GlobalArray_Main[i0].DDF_Renamed) == 0) { // Check for spaces
if (strchr(Flat_GlobalArray_Main[i0].Filename_Name, ' ') != NULL) { SafeCopy(thefilename, "\"",sizeof(thefilename)); SafeCat(thefilename,Flat_GlobalArray_Main[i0].Filename_Name,sizeof(thefilename)); SafeCat(thefilename, "\"",sizeof(thefilename)); } else {SafeCopy(thefilename,Flat_GlobalArray_Main[i0].Filename_Name,sizeof(thefilename));} } else { // Check for spaces
if (strchr(Flat_GlobalArray_Main[i0].Filename_Name, ' ') != NULL) { SafeCopy(thefilename, "\"",sizeof(thefilename)); SafeCat(thefilename,Flat_GlobalArray_Main[i0].Filename_Name,sizeof(thefilename)); SafeCat(thefilename, "\"",sizeof(thefilename)); } else { SafeCopy(thefilename,Flat_GlobalArray_Main[i0].Filename_Name,sizeof(thefilename)); } SafeCat(thefilename," ",sizeof(thefilename));
// check for spaces
if (strchr(Flat_GlobalArray_Main[i0].DDF_Renamed, ' ') != NULL) { SafeCopy(thefilename, "\"",sizeof(thefilename)); SafeCat(thefilename,Flat_GlobalArray_Main[i0].DDF_Renamed,sizeof(thefilename)); SafeCat(thefilename, "\"",sizeof(thefilename)); } else { SafeCat(thefilename,Flat_GlobalArray_Main[i0].DDF_Renamed,sizeof(thefilename)); } }
f.write (thefilename, strlen(thefilename));
// Check if this file has the unique flag set.
// don't write the \n until past this part..
/*if (_stricmp(Flat_GlobalArray_Main[i0].thecol[COL_DDF_UNIQUE].thestring,"true")) == 0)
{ strcpy(tempstring, "\t/unique=yes"); f.write (tempstring, strlen(tempstring)); } */ // ok, now it's kool to write this part.
f.write ("\n", 1); //}
} } } } f.close(); return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
int Flat_Create_Output_ERR(void) { int i0; fstream f; char filename_only[255]; char szPath[_MAX_PATH]; char tempstring[MAX_STRING];
// Get the path
GetModuleFileName(NULL, szPath, _MAX_PATH); // split up this path
_splitpath( szPath, NULL, NULL, filename_only, NULL);
strcat(filename_only, ".ERR");
// if there are any errors to report...
if (Flat_GlobalArrayIndex_Err.total <= 0) {return FALSE;}
// open the file
f.open(filename_only, ios::out);
// loop thru the errors and print out the errors
for( i0 = 0; i0 < Flat_GlobalArrayIndex_Err.total;i0++) { strcpy(tempstring, (char*)Flat_GlobalArray_Err[i0]); f.write (tempstring, strlen(tempstring)); f.write("\n", 1); } f.close(); return TRUE; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_GlobalArray_Add_Err(char theentry[]) { g_iGlobalReturnCode = FALSE;
// lets add it
strcpy(Flat_GlobalArray_Err[Flat_GlobalArrayIndex_Err.nextuse], theentry);
// increment counter to array
// increment next use space
++Flat_GlobalArrayIndex_Err.total; ++Flat_GlobalArrayIndex_Err.nextuse; return; }
//-------------------------------------------------------------------
// purpose:
//-------------------------------------------------------------------
void Flat_GlobalArray_Print_Err(void) { int i0; for( i0 = 0; i0 < Flat_GlobalArrayIndex_Err.total;i0++) { printf (Flat_GlobalArray_Err[i0]); printf ("\n"); } return; }
//-------------------------------------------------------------------
// purpose:
// the problem with regular strtok2 is that it will
// skip stuff like ",,," and ignore all the blanks in
// between to get to the next token. this strtok2 function
// was written to over come that. so that strtok2 works like
// you think it would.
//-------------------------------------------------------------------
char * __cdecl strtok2 (char * string,const char * control) { //unsigned char *str;
//const unsigned char *ctrl = control;
//unsigned char map[32];
char *str; const char *ctrl = control; char map[32]; int count;
static char *nextoken;
/* Clear control map */ for (count = 0; count < 32; count++) map[count] = 0;
/* Set bits in delimiter table */ do { map[*ctrl >> 3] |= (1 << (*ctrl & 7)); } while (*ctrl++);
/* Initialize str. If string is NULL, set str to the saved
* pointer (i.e., continue breaking tokens out of the string * from the last strtok2 call) */ if (string) str = string; else str = nextoken;
/* Find beginning of token (skip over leading delimiters). Note that
* there is no token iff this loop sets str to point to the terminal * null (*str == '\0') */ /*
while ( (map[*str >> 3] & (1 << (*str & 7) ) ) && *str ) str++; */
string = str;
/* Find the end of the token. If it is not the end of the string,
* put a null there. */ for ( ; *str ; str++ ) if ( map[*str >> 3] & (1 << (*str & 7)) ) { *str++ = '\0'; break; }
/* Update nextoken (or the corresponding field in the per-thread data
* structure */ nextoken = str;
/* Determine if a token has been found. */ if ( string == str ) return NULL; else return string; }
int RemoveAllSpaces(LPSTR & thetempstring) { int iReturn = FALSE; int j = 0; char thevalue[1024]; char tempstring2[1024];
strcpy(tempstring2, thetempstring); // strset(thevalue, '\0');
strcpy(thevalue, "");
for (int i=0;i < (int) strlen(tempstring2);i++) { if (tempstring2[i] == ' ') { iReturn = TRUE; } else { thevalue[j] = tempstring2[i]; thevalue[j+1] = '\0'; j++; } } if (iReturn == TRUE) {strcpy(thetempstring, thevalue);}
return iReturn; }
int Flat_DoWeIncludeThisFileCheck(int processeduptill) { //return TRUE;
int iReturn = FALSE; int i0 = 0; int TheCount = 0;
char CompareTo_cab[100];
if (Flat_GlobalArray_Main[processeduptill].Do_Not_Include_file_if_cabEmpty_Flag != 1) {return TRUE;}
// Grab the cabfilename
strcpy(CompareTo_cab, Flat_GlobalArray_Main[processeduptill].CabFileName); for( i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { if (i0 != processeduptill) { if (Flat_GlobalArray_Main[i0].Do_Not_Include_file_if_cabEmpty_Flag != 1) { if (_stricmp(Flat_GlobalArray_Main[i0].CabFileName, CompareTo_cab) == 0) { ++TheCount; break; } } } }
if (TheCount > 0){iReturn = TRUE;}
return iReturn; }
void Global_TotalCabFileSize_Compute(void) { char szTheCabFileName[50] = ""; int MyFileSize = 0; int TheNextUse = 0; int iTheFlag = FALSE; int iIndexToUse = 0;
// Go thru the whole list and add everything up
for( int i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { if (Flat_DoWeIncludeThisFileCheck(i0) == TRUE) { if (!(Flat_GlobalArray_Main[i0].DDF_Exclude_From_Cab_Flag)) {
iIndexToUse = Flat_GlobalArrayIndex_CabSizes.nextuse;
TheNextUse = 0; // lets add it if not already there.
while (TheNextUse < Flat_GlobalArrayIndex_CabSizes.total) { if (_stricmp(Flat_GlobalArray_CabSizes[TheNextUse].CabFileName, Flat_GlobalArray_Main[i0].CabFileName) == 0) { iIndexToUse = TheNextUse; iTheFlag = TRUE; break; } TheNextUse++; }
if (iTheFlag == TRUE) { // copy over the filename
strcpy(Flat_GlobalArray_CabSizes[iIndexToUse].CabFileName, Flat_GlobalArray_Main[i0].CabFileName);
// Get the size
Flat_GlobalArray_CabSizes[iIndexToUse].TotalFileSize = Flat_GlobalArray_CabSizes[iIndexToUse].TotalFileSize + Flat_GlobalArray_Main[i0].FileName_Size; Flat_GlobalArray_CabSizes[iIndexToUse].TotalFiles++; } else { iIndexToUse = Flat_GlobalArrayIndex_CabSizes.nextuse;
// copy over the filename
strcpy(Flat_GlobalArray_CabSizes[iIndexToUse].CabFileName, Flat_GlobalArray_Main[i0].CabFileName);
// Get the size
Flat_GlobalArray_CabSizes[iIndexToUse].TotalFileSize = Flat_GlobalArray_CabSizes[iIndexToUse].TotalFileSize + Flat_GlobalArray_Main[i0].FileName_Size; Flat_GlobalArray_CabSizes[iIndexToUse].TotalFiles++;
++Flat_GlobalArrayIndex_CabSizes.total; ++Flat_GlobalArrayIndex_CabSizes.nextuse; } } } } }
void Global_TotalCabFileSize_Print(void) { int i0; char stempstring[100];
for( i0 = 0; i0 < Flat_GlobalArrayIndex_CabSizes.total;i0++) { sprintf(stempstring, "%s: Filecount=%d, Size=%d\n",Flat_GlobalArray_CabSizes[i0].CabFileName, Flat_GlobalArray_CabSizes[i0].TotalFiles, Flat_GlobalArray_CabSizes[i0].TotalFileSize); printf(stempstring); } printf("\n"); return; }
// Returns the count of the "\" characters in the string
//
int ReturnDirLevelCount(char *DirectoryTree) { int TheCount = 0; char szTemp[_MAX_PATH]; _tcscpy(szTemp, DirectoryTree); char *p = szTemp; while (*p) { if (*p == '\\') {TheCount++;} p = _tcsinc(p); }
return TheCount; }
void FillGlobalUniqueDirList() { // used to keep a list of unique directory names.
// loop thru the whole structure and pull out all the unique directory names.
for( int i0 = 0; i0 < Flat_GlobalArrayIndex_Main.total;i0++) { // check if entries are the same.
if (FALSE == GlobalUniqueDirChkIfAlreadyThere(Flat_GlobalArray_Main[i0].Filename_Path)) { // Not there yet. so let's add it
strcpy(Flat_GlobalUniqueDirList[Flat_GlobalUniqueDirList_nextuse], Flat_GlobalArray_Main[i0].Filename_Path);
// increment counter to array
// increment next use space
++Flat_GlobalUniqueDirList_total; ++Flat_GlobalUniqueDirList_nextuse; } } return; }
int GlobalUniqueDirChkIfAlreadyThere(char *TheStringToCheck) { int iReturn = FALSE;
for( int i0 = 0; i0 < Flat_GlobalUniqueDirList_total;i0++) { if (_stricmp(Flat_GlobalUniqueDirList[i0], TheStringToCheck) == 0) { iReturn = TRUE; goto isItAlreadyThere_Exit; } }
isItAlreadyThere_Exit: return iReturn; }
int GlobalUniqueDirReturnMyIndexMatch(char *TheStringToCheck) { int iReturn = 0;
for( int i0 = 0; i0 < Flat_GlobalUniqueDirList_total;i0++) { if (_stricmp(Flat_GlobalUniqueDirList[i0], TheStringToCheck) == 0) { iReturn = i0; goto GlobalUniqueDirReturnMyIndexMatch_Exit; } }
GlobalUniqueDirReturnMyIndexMatch_Exit: return iReturn; }
//***************************************************************************
//* NAME: StripWhitespace *
//* SYNOPSIS: Strips spaces and tabs from both sides of given string. *
//***************************************************************************
LPSTR StripWhitespaceA( LPSTR pszString ) { LPSTR pszTemp = NULL;
if ( pszString == NULL ) { return NULL; }
while ( *pszString == ' ' || *pszString == '\t' ) { pszString += 1; }
// Catch case where string consists entirely of whitespace or empty string.
if ( *pszString == '\0' ) { return pszString; }
pszTemp = pszString;
pszString += lstrlenA(pszString) - 1;
while ( *pszString == ' ' || *pszString == '\t' ) { *pszString = '\0'; pszString -= 1; }
return pszTemp; }
|