290 lines
4.1 KiB
C++
290 lines
4.1 KiB
C++
/*++
|
||
|
||
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_
|