Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

289 lines
7.7 KiB

/****************************************************************************
* Author: Aaron Lee
* Purpose: do a directory minus a bunch of other directories
******************************************************************************/
#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"
#define MAX_ARRAY_SIZE 5000
#define ALL_FILES 0xff
struct arrayrow
{
long total;
long nextuse;
} GlobalMinusArrayIndex, GlobalFileInputMinusListIndex;
char GlobalMinusArray[MAX_ARRAY_SIZE][_MAX_FNAME];
char GlobalFileInputMinusList[MAX_ARRAY_SIZE][_MAX_FNAME];
// Globals
char g_szinput_filename_full[_MAX_PATH];
char g_szinput_filename[_MAX_FNAME];
// prototypes
int __cdecl main(int ,char *argv[]);
void Do_Process(void);
void aFileToMinus(char * TheFileToMinus);
int GlobalMinusArray_Add(char * FileNameToAdd);
void GlobalMinusArray_Fill(void);
void GlobalMinusArray_Print(void);
int GlobalMinusArray_Check(char * FileNameToCheck);
void ShowHelp(void);
//-------------------------------------------------------------------
// purpose: main
//-------------------------------------------------------------------
int __cdecl main(int argc,char *argv[])
{
int argno = 0;
int nflags = 0;
char filename_dir[_MAX_PATH];
char filename_only[_MAX_FNAME];
char filename_ext[_MAX_EXT];
filename_only[0]='\0';
// process command line arguments
for(argno=1; argno<argc; argno++)
{
if ( argv[argno][0] == '-' || argv[argno][0] == '/' )
{
nflags++;
switch (argv[argno][1])
{
case 'm':
aFileToMinus(&argv[argno][2]);
break;
case '?':
goto exit_with_help;
break;
}
} // if switch character found
else
{
if ( *filename_only == '\0' )
{
// if no arguments, then
// get the filename_dir and put it into
strcpy(g_szinput_filename_full, argv[argno]);
filename_dir[0] = '\0';
// split up this path
_splitpath( g_szinput_filename_full, NULL, filename_dir, filename_only, filename_ext);
strcat(filename_only, filename_ext);
strcpy(g_szinput_filename,filename_only);
// if we're missing dir, then get it.
if (*filename_dir == '\0')
{
// Get current directory
TCHAR szCurrentDir[_MAX_PATH];
GetCurrentDirectory( _MAX_PATH, szCurrentDir);
// stick it into our variable
strcpy(filename_dir, szCurrentDir);
strcpy(g_szinput_filename_full, szCurrentDir);
strcat(g_szinput_filename_full, "\\");
strcat(g_szinput_filename_full, filename_only);
}
}
else
{
// Additional filenames (or arguments without a "-" or "/" preceding)
//goto exit_with_help;
// should be the section to execute.
}
} // non-switch char found
} // for all arguments
if ( *filename_only == '\0')
{
printf("Too few arguments, argc=%d\n\n",argc);
goto exit_with_help;
}
// run the function to do everything
Do_Process();
return TRUE;
exit_with_help:
ShowHelp();
return FALSE;
}
void aFileToMinus(char * TheFileToMinus)
{
// blankout the array values if any.
GlobalFileInputMinusList[GlobalFileInputMinusListIndex.nextuse][0]= '\0';
// move info into global array
strcpy(GlobalFileInputMinusList[GlobalFileInputMinusListIndex.nextuse],TheFileToMinus);
// increment counter to array
// increment next use space
++GlobalFileInputMinusListIndex.total;
++GlobalFileInputMinusListIndex.nextuse;
return;
}
void ShowHelp()
{
printf("\n");
printf("DirMinus - does a dir minus other files\n");
printf("----------------------------------------\n");
printf(" Usage: Dir *.* -m*.cab -mFilename.exe\n");
printf("----------------------------------------\n");
return;
}
void Do_Process(void)
{
// Get stuff that we want to minus out into a huge array
GlobalMinusArray_Fill();
//GlobalMinusArray_Print();
// Ok now, loop thru the directory and lookup each entry
// in our globalminusarray, if it's there, then don't print it out!
int attr;
char filename_dir[_MAX_PATH];
char filename_only[_MAX_FNAME];
long hFile;
finddata datareturn;
if (!(g_szinput_filename)) {return;}
// Get the filename portion
_splitpath( g_szinput_filename, NULL, filename_dir, filename_only, NULL);
attr= 0;
if (strcmp(filename_only, "*.*") == 0)
{attr=ALL_FILES;}
InitStringTable(STRING_TABLE_SIZE);
if ( FindFirst(g_szinput_filename, attr, &hFile, &datareturn) )
{
// check if it's a sub dir
if (!( datareturn.attrib & _A_SUBDIR))
{
// is This Entry in our minus list?
if (GlobalMinusArray_Check(datareturn.name) == FALSE)
{
// print it out
printf(datareturn.name);
printf ("\n");
}
}
while(FindNext(attr, hFile, &datareturn))
{
// check if it's a sub dir
if (!(datareturn.attrib & _A_SUBDIR))
// is This Entry in our minus list?
if (GlobalMinusArray_Check(datareturn.name) == FALSE)
{
// print it out
printf(datareturn.name);
printf ("\n");
}
}
} // we didn't find the specified file.
EndStringTable();
return;
}
void GlobalMinusArray_Fill(void)
{
int outerindex;
int attr;
char filename_dir[_MAX_PATH];
char filename_only[_MAX_FNAME];
long hFile;
finddata datareturn;
if (!(GlobalFileInputMinusList[0][0])) {return;}
for( outerindex = 0; outerindex < GlobalFileInputMinusListIndex.total;outerindex++)
{
// Get the filename portion
_splitpath( GlobalFileInputMinusList[outerindex], NULL, filename_dir, filename_only, NULL);
attr= 0;
if (strcmp(filename_only, "*.*") == 0)
{attr=ALL_FILES;}
InitStringTable(STRING_TABLE_SIZE);
if ( FindFirst(GlobalFileInputMinusList[outerindex], attr, &hFile, &datareturn) )
{
// check if it's a sub dir
if (!( datareturn.attrib & _A_SUBDIR))
{
// ok we found one.
// now take this entry and try to add it to the global array!!!
GlobalMinusArray_Add(datareturn.name);
}
while(FindNext(attr, hFile, &datareturn))
{
// check if it's a sub dir
if (!(datareturn.attrib & _A_SUBDIR))
{
// ok we found one.
// now take this entry and try to add it to the global array!!!
GlobalMinusArray_Add(datareturn.name);
}
}
} // we didn't find the specified file.
}
EndStringTable();
}
int GlobalMinusArray_Add(char * FileNameToAdd)
{
// blankout the array values if any.
GlobalMinusArray[GlobalMinusArrayIndex.nextuse][0] = '\0';
// move info into global array
strcpy(GlobalMinusArray[GlobalMinusArrayIndex.nextuse],FileNameToAdd);
// increment counter to array
// increment next use space
++GlobalMinusArrayIndex.total;
++GlobalMinusArrayIndex.nextuse;
return TRUE;
}
void GlobalMinusArray_Print(void)
{
int i0;
for( i0 = 0; i0 < GlobalMinusArrayIndex.total;i0++)
{
printf("-");
printf(GlobalMinusArray[i0]);
printf("\n");
}
return;
}
int GlobalMinusArray_Check(char * FileNameToCheck)
{
int i0;
for( i0 = 0; i0 < GlobalMinusArrayIndex.total;i0++)
{
if (_stricmp(GlobalMinusArray[i0], FileNameToCheck) == 0)
{return TRUE;}
}
return FALSE;
}