summaryrefslogtreecommitdiffstats
path: root/private/utils/ulib/src/program.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/utils/ulib/src/program.cxx453
1 files changed, 453 insertions, 0 deletions
diff --git a/private/utils/ulib/src/program.cxx b/private/utils/ulib/src/program.cxx
new file mode 100644
index 000000000..7d00baef3
--- /dev/null
+++ b/private/utils/ulib/src/program.cxx
@@ -0,0 +1,453 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ program.cxx
+
+Abstract:
+
+Author:
+
+ David J. Gilman (davegi) 02-Mar-1991
+
+Environment:
+
+ ULIB, User Mode
+
+--*/
+
+#include <pch.cxx>
+
+#define _ULIB_MEMBER_
+
+#include "ulib.hxx"
+#include "path.hxx"
+#include "program.hxx"
+#include "system.hxx"
+
+
+DEFINE_EXPORTED_CONSTRUCTOR( PROGRAM, OBJECT, ULIB_EXPORT );
+
+ULIB_EXPORT
+PROGRAM::~PROGRAM (
+ )
+{
+
+}
+
+ULIB_EXPORT
+BOOLEAN
+PROGRAM::Initialize (
+ IN MSGID UsageMsg,
+ IN MSGID FatalMsg,
+ IN ULONG FatalLevel
+ )
+
+/*++
+
+Routine Description:
+
+ Initializes a PROGRAM object.
+
+Arguments:
+
+ UsageMsg - Supplies usage (help) message id.
+ FatalMsg - Supplies default fatal message id.
+ FatalLevel - Supplies default fatal exit level.
+
+Return Value:
+
+ BOOLEAN - Returns TRUE if object initialized,
+ FALSE otherwise.
+
+
+--*/
+
+{
+
+ //
+ // Get standard streams.
+ //
+ _Standard_Input = Standard_Input_Stream;
+ _Standard_Output = Standard_Output_Stream;
+ _Standard_Error = Standard_Error_Stream;
+
+ //
+ // Initialize the message object
+ //
+ if ( _Standard_Output &&
+ _Standard_Input &&
+ _Message.Initialize( _Standard_Output, _Standard_Input, _Standard_Error ) ) {
+
+ //
+ // Initialize message ids and error levels
+
+ _UsageMsg = UsageMsg;
+ _FatalMsg = FatalMsg;
+ _FatalLevel = FatalLevel;
+
+ return TRUE;
+
+ }
+
+ _Standard_Input = NULL;
+ _Standard_Output = NULL;
+ _Standard_Error = NULL;
+ return FALSE;
+}
+
+ULIB_EXPORT
+BOOLEAN
+PROGRAM::DisplayMessage (
+ IN MSGID Message,
+ IN MESSAGE_TYPE Type
+ ) CONST
+
+/*++
+
+Routine Description:
+
+ Displays a message
+
+Arguments:
+
+ Message - Supplies the message id of the message to display
+ Type - Supplies the type of message
+
+Return Value:
+
+ BOOLEAN - Returns TRUE if message displayed,
+ FALSE otherwise.
+
+
+--*/
+
+{
+ return DisplayMessage( Message, Type, NULL );
+}
+
+ULIB_EXPORT
+BOOLEAN
+PROGRAM::DisplayMessage (
+ IN MSGID Message,
+ IN MESSAGE_TYPE Type,
+ IN PSTR Format,
+ IN ...
+ ) CONST
+
+/*++
+
+Routine Description:
+
+ Displays a message with arguments
+
+
+Arguments:
+
+ Message - Supplies the message id of the message to display
+ Type - Supplies the message type
+ Format - Supplies a format string
+ ... - Supplies list of arguments
+
+Return Value:
+
+ BOOLEAN - Returns TRUE if message displayed,
+ FALSE otherwise.
+
+--*/
+
+{
+
+ va_list Arguments;
+ BOOLEAN Status;
+
+ if ( ((PPROGRAM) this)->_Message.Set( Message, Type ) ) {
+
+ if ( !Format ) {
+
+ return ((PPROGRAM) this)->_Message.Display( "" );
+
+ } else {
+
+ va_start( Arguments, Format );
+ Status = ((PPROGRAM) this)->_Message.DisplayV( Format, Arguments );
+ va_end( Arguments );
+ return Status;
+ }
+ }
+
+ return FALSE;
+
+}
+
+ULIB_EXPORT
+VOID
+PROGRAM::ExitProgram (
+ ULONG Level
+ )
+{
+ ExitProcess( Level );
+}
+
+ULIB_EXPORT
+PSTREAM
+PROGRAM::GetStandardInput (
+ )
+
+/*++
+
+Routine Description
+
+ Obtains the standard input stream
+
+Arguments:
+
+ None
+
+Return Value:
+
+ PSTREAM - Returns the standard input stream
+
+--*/
+
+{
+
+ return _Standard_Input;
+
+}
+
+ULIB_EXPORT
+PSTREAM
+PROGRAM::GetStandardOutput (
+ )
+
+/*++
+
+Routine Description
+
+ Obtains the standard output stream
+
+Arguments:
+
+ None
+
+Return Value:
+
+ PSTREAM - Returns the standard output stream
+
+--*/
+
+{
+
+ return _Standard_Output;
+
+}
+
+
+ULIB_EXPORT
+PSTREAM
+PROGRAM::GetStandardError (
+ )
+
+/*++
+
+Routine Description
+
+ Obtains the standard error stream
+
+Arguments:
+
+ None
+
+Return Value:
+
+ PSTREAM - Returns the standard error stream
+
+--*/
+
+{
+
+ return _Standard_Error;
+
+}
+
+
+ULIB_EXPORT
+VOID
+PROGRAM::Fatal (
+ ) CONST
+
+/*++
+
+Routine Description
+
+ Displays the default fatal message and exits with the default
+ fatal error level.
+
+Arguments:
+
+ None
+
+Return Value:
+
+ None
+
+--*/
+
+{
+
+ Fatal( _FatalLevel, _FatalMsg, NULL );
+
+}
+
+ULIB_EXPORT
+VOID
+PROGRAM::Fatal (
+ IN ULONG ErrorLevel,
+ IN MSGID Message,
+ IN PSTR Format,
+ IN ...
+ ) CONST
+
+/*++
+
+Routine Description:
+
+ Displays a message (with arguments) and exits with the specified
+ error level.
+
+Arguments:
+
+ ErrorLevel - Supplies the error level to exit with.
+ Message - Supplies the id of the message to display
+ Format - Supplies the format string
+ ... - Supply pointers to the arguments
+
+Return Value:
+
+ None
+
+--*/
+
+{
+ va_list Arguments;
+
+ if ( ((PPROGRAM) this)->_Message.Set( Message, ERROR_MESSAGE ) ) {
+
+ if ( !Format ) {
+
+ ((PPROGRAM) this)->_Message.Display( "" );
+
+ } else {
+
+ va_start( Arguments, Format );
+ ((PPROGRAM) this)->_Message.DisplayV( Format, Arguments );
+
+ }
+ }
+
+ ExitProcess( ErrorLevel );
+}
+
+ULIB_EXPORT
+VOID
+PROGRAM::Usage (
+ ) CONST
+
+/*++
+
+Routine Description:
+
+ Displays the usage (help) message and exits with an error level of
+ zero.
+
+Arguments:
+
+ None
+
+Return Value:
+
+ None
+
+--*/
+
+{
+ ((PPROGRAM) this)->_Message.Set( _UsageMsg, NORMAL_MESSAGE );
+ ((PPROGRAM) this)->_Message.Display();
+
+ ExitProcess( 0 );
+}
+
+PPATH
+PROGRAM::QueryImagePath (
+ )
+
+/*++
+
+Routine Description:
+
+ Queries the path to the program image (executable file)
+
+Arguments:
+
+ None
+
+Return Value:
+
+ PPATH - Returns a canonicalized path to the program image.
+
+--*/
+
+{
+ WSTR PathName[ MAX_PATH ];
+ PPATH Path;
+
+ if (( GetModuleFileName( NULL, PathName, MAX_PATH ) != 0 ) &&
+ (( Path = NEW PATH ) != NULL ) &&
+ Path->Initialize( PathName, TRUE )) {
+
+ return Path;
+
+ }
+
+ return NULL;
+}
+
+
+ULIB_EXPORT
+VOID
+PROGRAM::ValidateVersion (
+ IN MSGID InvalidVersionMsg,
+ IN ULONG ErrorLevel
+ ) CONST
+
+/*++
+
+Routine Description:
+
+ Validates the version, and if the version is invalid, exits the
+ program.
+
+Arguments:
+
+ InvalidVersionMsg - Supplies id of message to display if the
+ version number is incorrect.
+
+ ErrorLevel - Supplies the error level with which to exit
+ if the version number is incorrect.
+
+Return Value:
+
+ None (Only returns if is correct version).
+
+
+--*/
+
+{
+ if ( !SYSTEM::IsCorrectVersion() ) {
+
+ Fatal( ErrorLevel, InvalidVersionMsg, "" );
+ }
+}