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
4.4 KiB
289 lines
4.4 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Replace
|
|
|
|
Abstract:
|
|
|
|
This module contains the definition for the REPLACE class, which
|
|
implements the DOS5-compatible Replace utility.
|
|
|
|
Author:
|
|
|
|
Ramon Juan San Andres (ramonsa) 01-May-1990
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#if !defined( _REPLACE_ )
|
|
|
|
#define _REPLACE_
|
|
|
|
|
|
#include "object.hxx"
|
|
#include "keyboard.hxx"
|
|
#include "program.hxx"
|
|
|
|
//
|
|
// Exit codes
|
|
//
|
|
#define EXIT_NORMAL 0
|
|
#define EXIT_FILE_NOT_FOUND 2
|
|
#define EXIT_PATH_NOT_FOUND 3
|
|
#define EXIT_ACCESS_DENIED 5
|
|
#define EXIT_NO_MEMORY 8
|
|
#define EXIT_COMMAND_LINE_ERROR 11
|
|
#define EXIT_INVALID_DRIVE 15
|
|
|
|
|
|
//
|
|
// Forward references
|
|
//
|
|
DECLARE_CLASS( ARRAY );
|
|
DECLARE_CLASS( FSN_DIRECTORY );
|
|
DECLARE_CLASS( FSNODE );
|
|
DECLARE_CLASS( KEYBOARD );
|
|
DECLARE_CLSSS( PATH );
|
|
DECLARE_CLASS( WSTRING );
|
|
|
|
DECLARE_CLASS( REPLACE );
|
|
|
|
class REPLACE : public PROGRAM {
|
|
|
|
public:
|
|
|
|
DECLARE_CONSTRUCTOR( REPLACE );
|
|
|
|
NONVIRTUAL
|
|
~REPLACE (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Initialize (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
DoReplace (
|
|
);
|
|
|
|
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
AbortIfCtrlC(
|
|
VOID
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
AddFiles (
|
|
IN OUT PFSN_DIRECTORY DestinationDirectory
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
CheckArgumentConsistency (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
CopyTheFile (
|
|
IN PCPATH SrcPath,
|
|
IN PCPATH DstPath
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
CtrlCHandler (
|
|
IN ULONG CtrlType
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
DeallocateThings (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
DisplayMessageAndExit (
|
|
IN MSGID MsgId,
|
|
IN PCWSTRING String,
|
|
IN ULONG ExitCode
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
ExitWithError(
|
|
IN DWORD ErrorCode
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
GetArgumentsCmd(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
GetDirectoryAndPattern(
|
|
IN PPATH Path,
|
|
OUT PFSN_DIRECTORY *Directory,
|
|
OUT PWSTRING *Pattern
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
GetDirectory(
|
|
IN PCPATH Path,
|
|
OUT PFSN_DIRECTORY *Directory
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PARRAY
|
|
GetFileArray(
|
|
IN PFSN_DIRECTORY Directory,
|
|
IN PWSTRING Pattern
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
InitializeThings (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
ParseArguments(
|
|
IN PWSTRING CmdLine,
|
|
OUT PARRAY ArgArray
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
Prompt (
|
|
IN MSGID MessageId,
|
|
IN PCPATH Path
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PWSTRING
|
|
QueryMessageString (
|
|
IN MSGID MsgId
|
|
);
|
|
|
|
NONVIRTUAL
|
|
BOOLEAN
|
|
ReplaceFiles (
|
|
IN OUT PFSN_DIRECTORY DestinationDirectory
|
|
);
|
|
|
|
STATIC
|
|
BOOLEAN
|
|
Replacer (
|
|
IN PVOID This,
|
|
IN OUT PFSNODE DirectoryNode,
|
|
IN PPATH DummyPath
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
SetArguments(
|
|
);
|
|
//
|
|
// Command-line things
|
|
//
|
|
PPATH _SourcePath;
|
|
PPATH _DestinationPath;
|
|
BOOLEAN _AddSwitch;
|
|
BOOLEAN _PromptSwitch;
|
|
BOOLEAN _ReadOnlySwitch;
|
|
BOOLEAN _SubdirSwitch;
|
|
BOOLEAN _CompareTimeSwitch;
|
|
BOOLEAN _WaitSwitch;
|
|
|
|
//
|
|
// Counter of Added/Replaced files
|
|
//
|
|
ULONG _FilesAdded;
|
|
ULONG _FilesReplaced;
|
|
|
|
//
|
|
// Source directory and corresponding filename pattern
|
|
//
|
|
PFSN_DIRECTORY _SourceDirectory;
|
|
PWSTRING _Pattern;
|
|
|
|
//
|
|
// Array of files in source directory
|
|
//
|
|
PARRAY _FilesInSrc;
|
|
|
|
//
|
|
// Buffers to hold strings in PSTR form
|
|
//
|
|
LPWSTR _PathString1;
|
|
ULONG _PathString1Size;
|
|
LPWSTR _PathString2;
|
|
ULONG _PathString2Size;
|
|
|
|
//
|
|
// The keyboard
|
|
//
|
|
PKEYBOARD _Keyboard;
|
|
|
|
DSTRING _AddPattern;
|
|
DSTRING _PromptPattern;
|
|
DSTRING _ReadOnlyPattern;
|
|
DSTRING _SubdirPattern;
|
|
DSTRING _CompareTimePattern;
|
|
DSTRING _WaitPattern;
|
|
DSTRING _HelpPattern;
|
|
|
|
DSTRING _Switches;
|
|
DSTRING _MultipleSwitch;
|
|
|
|
|
|
};
|
|
|
|
INLINE
|
|
VOID
|
|
REPLACE::AbortIfCtrlC (
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Aborts the program if Ctrl-C was hit.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
{
|
|
if ( _Keyboard->GotABreak() ) {
|
|
exit( EXIT_PATH_NOT_FOUND );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
#endif // _REPLACE_
|