353 lines
14 KiB
C++
353 lines
14 KiB
C++
/*
|
|
** Command & Conquer Generals Zero Hour(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
//======================================================================================
|
|
//
|
|
// @@@@@ @@ @ @@@@ @@@@ @@@@ @@ @ @@@@ @@@@ @@@@@ @@@@@ @@@@ @@ @
|
|
// @@ @ @@ @ @@ @ @@ @ @@ @ @@@ @ @@ @ @@ @ @@ @ @@ @ @@ @ @@ @
|
|
// @@@@@ @@ @ @@ @@ @@@@@@ @@ @ @ @@@@ @@@@ @@@@@ @@@@@ @@@@@@ @@
|
|
// @@ @ @@ @ @@ @ @@ @ @@ @ @@ @@ @@ @ @@ @ @@ @ @@ @ @@ @ @@
|
|
// @@@@@ @@@@ @@@@ @@@@ @@ @ @@ @ @@@@ @@@@ @@ @ @@@@@ @@ @ @@
|
|
//
|
|
// Copyright (c) 1998, 1999 Westwood Studios -- CONFIDENTIAL
|
|
//
|
|
// ArgC_ArgV.cpp
|
|
//
|
|
//======================================================================================
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// INCLUDES
|
|
//-----------------------------------------------------------------------------
|
|
#define STRICT
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "args.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// GLOBALS
|
|
//-----------------------------------------------------------------------------
|
|
|
|
Command_Line_Arguments *Args = NULL;
|
|
|
|
//*****************************************************************************
|
|
// COMMAND_LINE_ARGUMENTS::COMMAND_LINE_ARGUMENTS -- Constructor.
|
|
//
|
|
// INPUT: HINSTANCE hInstance
|
|
// LPSTR lpszCmdLine
|
|
//
|
|
// OUTPUT: none.
|
|
//
|
|
// WARNINGS: none.
|
|
//
|
|
// HISTORY:
|
|
// 09/01/1997 ML/MG : Created.
|
|
//=============================================================================
|
|
|
|
Command_Line_Arguments::Command_Line_Arguments (
|
|
HINSTANCE current_instance_handle,
|
|
LPTSTR windows_command_line_string )
|
|
{
|
|
//--------------------------------------------------------------------------
|
|
// debug checks...
|
|
//--------------------------------------------------------------------------
|
|
assert( windows_command_line_string != NULL );
|
|
|
|
//--------------------------------------------------------------------------
|
|
// reset all class data
|
|
//--------------------------------------------------------------------------
|
|
memset( ArgV, 0, sizeof( ArgV ) );
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Store the program name in ArgV[ 0 ].
|
|
//--------------------------------------------------------------------------
|
|
GetModuleFileName( current_instance_handle, ArgV[ 0 ], MAX_ARGUMENT_LENGTH );
|
|
|
|
const char * ptr = windows_command_line_string;
|
|
bool potentially_forever = true;
|
|
|
|
ArgC = 1;
|
|
|
|
while( potentially_forever ) {
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Find the next non-whitespace character in the string.
|
|
//-----------------------------------------------------------------------
|
|
while ( *ptr == ' ' ) {
|
|
++ ptr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// If we're at the end of the string, quit.
|
|
//-----------------------------------------------------------------------
|
|
if ( *ptr == '\0' ) {
|
|
break;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Store a command-line argument.
|
|
//-----------------------------------------------------------------------
|
|
int i = 0;
|
|
|
|
if ( *ptr == '"' ) {
|
|
|
|
//--------------------------------------------------------------------
|
|
// Skip the opening quotation mark.
|
|
//--------------------------------------------------------------------
|
|
++ ptr;
|
|
|
|
//--------------------------------------------------------------------
|
|
// Collect characters until another quotation mark is encountered.
|
|
//--------------------------------------------------------------------
|
|
while ( *ptr != '\0' && *ptr != '"' ) {
|
|
if ( i < MAX_ARGUMENT_LENGTH - 1 ) {
|
|
ArgV [ ArgC ][ i ] = *ptr;
|
|
++ i;
|
|
}
|
|
++ ptr;
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// Skip the closing quotation mark.
|
|
//--------------------------------------------------------------------
|
|
if ( *ptr == '"' ) {
|
|
++ ptr;
|
|
}
|
|
|
|
} else {
|
|
|
|
//--------------------------------------------------------------------
|
|
// Collect characters until a whitespace character is encountered.
|
|
//--------------------------------------------------------------------
|
|
while ( *ptr != '\0' && *ptr != ' ' ) {
|
|
if ( i < MAX_ARGUMENT_LENGTH - 1 ) {
|
|
ArgV [ ArgC ][ i ] = *ptr;
|
|
++ i;
|
|
}
|
|
++ ptr;
|
|
}
|
|
}
|
|
|
|
ArgV [ ArgC ][ i ] = '\0';
|
|
++ ArgC;
|
|
}
|
|
}
|
|
|
|
//*****************************************************************************
|
|
// COMMAND_LINE_ARGUMENTS::COMMAND_LINE_ARGUMENTS -- Constructor.
|
|
//
|
|
// INPUT: HINSTANCE hInstance
|
|
//
|
|
// OUTPUT: none.
|
|
//
|
|
// WARNINGS: none.
|
|
//
|
|
// HISTORY:
|
|
// 09/01/1997 ML/MG : Created.
|
|
//=============================================================================
|
|
|
|
Command_Line_Arguments::Command_Line_Arguments ( HINSTANCE current_instance_handle )
|
|
{
|
|
|
|
char * windows_command_line_string = GetCommandLine();
|
|
|
|
//--------------------------------------------------------------------------
|
|
// debug checks...
|
|
//--------------------------------------------------------------------------
|
|
assert( windows_command_line_string != NULL );
|
|
|
|
//--------------------------------------------------------------------------
|
|
// reset all class data
|
|
//--------------------------------------------------------------------------
|
|
memset( ArgV, 0, sizeof( ArgV ) );
|
|
|
|
const char * ptr = windows_command_line_string;
|
|
bool potentially_forever = true;
|
|
|
|
ArgC = 1;
|
|
|
|
while( potentially_forever ) {
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Find the next non-whitespace character in the string.
|
|
//-----------------------------------------------------------------------
|
|
while ( *ptr == ' ' ) {
|
|
++ ptr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// If we're at the end of the string, quit.
|
|
//-----------------------------------------------------------------------
|
|
if ( *ptr == '\0' ) {
|
|
break;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Store a command-line argument.
|
|
//-----------------------------------------------------------------------
|
|
int i = 0;
|
|
|
|
if ( *ptr == '"' ) {
|
|
|
|
//--------------------------------------------------------------------
|
|
// Skip the opening quotation mark.
|
|
//--------------------------------------------------------------------
|
|
++ ptr;
|
|
|
|
//--------------------------------------------------------------------
|
|
// Collect characters until another quotation mark is encountered.
|
|
//--------------------------------------------------------------------
|
|
while ( *ptr != '\0' && *ptr != '"' ) {
|
|
if ( i < MAX_ARGUMENT_LENGTH - 1 ) {
|
|
ArgV [ ArgC ][ i ] = *ptr;
|
|
++ i;
|
|
}
|
|
++ ptr;
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// Skip the closing quotation mark.
|
|
//--------------------------------------------------------------------
|
|
if ( *ptr == '"' ) {
|
|
++ ptr;
|
|
}
|
|
|
|
} else {
|
|
|
|
//--------------------------------------------------------------------
|
|
// Collect characters until a whitespace character is encountered.
|
|
//--------------------------------------------------------------------
|
|
while ( *ptr != '\0' && *ptr != ' ' ) {
|
|
if ( i < MAX_ARGUMENT_LENGTH - 1 ) {
|
|
ArgV [ ArgC ][ i ] = *ptr;
|
|
++ i;
|
|
}
|
|
++ ptr;
|
|
}
|
|
}
|
|
|
|
ArgV [ ArgC ][ i ] = '\0';
|
|
++ ArgC;
|
|
}
|
|
}
|
|
|
|
//*****************************************************************************
|
|
// COMMAND_LINE_ARGUMENTS::~COMMAND_LINE_ARGUMENTS -- Destructor.
|
|
//
|
|
// INPUT: HINSTANCE hInstance
|
|
// LPSTR lpszCmdLine
|
|
//
|
|
// OUTPUT: none.
|
|
//
|
|
// WARNINGS: none.
|
|
//
|
|
// HISTORY:
|
|
// 09/01/1997 ML/MG : Created.
|
|
//=============================================================================
|
|
|
|
Command_Line_Arguments::~Command_Line_Arguments ( void )
|
|
{
|
|
//--------------------------------------------------------------------------
|
|
// reset all data...
|
|
//--------------------------------------------------------------------------
|
|
ArgC = -1;
|
|
memset( ArgV, 0, sizeof( ArgV ) );
|
|
}
|
|
|
|
//*****************************************************************************
|
|
// COMMAND_LINE_ARGUMENTS::GET_ARGC -- Return ArgC.
|
|
//
|
|
// INPUT: none.
|
|
//
|
|
// OUTPUT: int ArgC.
|
|
//
|
|
// WARNINGS: none.
|
|
//
|
|
// HISTORY:
|
|
// 09/01/1997 ML/MG : Created.
|
|
//=============================================================================
|
|
|
|
int Command_Line_Arguments::Get_argc ( void )
|
|
{
|
|
//--------------------------------------------------------------------------
|
|
// debug checks - make sure we at least have the application name
|
|
//--------------------------------------------------------------------------
|
|
assert( ArgC >= 1 );
|
|
|
|
//--------------------------------------------------------------------------
|
|
// return how many string parameters there are in the "argv" list
|
|
//--------------------------------------------------------------------------
|
|
return( ArgC );
|
|
}
|
|
|
|
//*****************************************************************************
|
|
// COMMAND_LINE_ARGUMENTS::GET_ARGV -- Return ArgV.
|
|
//
|
|
// INPUT: none.
|
|
//
|
|
// OUTPUT: int ArgV.
|
|
//
|
|
// WARNINGS: none.
|
|
//
|
|
// HISTORY:
|
|
// 09/01/1997 ML/MG : Created.
|
|
//=============================================================================
|
|
|
|
const char *Command_Line_Arguments::Get_argv ( int argument_index )
|
|
{
|
|
//--------------------------------------------------------------------------
|
|
// debug checks - make sure we at least have the application name
|
|
//--------------------------------------------------------------------------
|
|
assert( argument_index >= 0 );
|
|
assert( argument_index < MAX_COMMAND_LINE_ARGUMENTS );
|
|
assert( argument_index < ArgC );
|
|
assert( ArgC >= 1 );
|
|
|
|
//--------------------------------------------------------------------------
|
|
// return
|
|
//--------------------------------------------------------------------------
|
|
return( ArgV[ argument_index ] );
|
|
}
|
|
|
|
void Command_Line_Arguments::Set_argv( int argument_index, char *arg )
|
|
{
|
|
if( arg == NULL || *arg == '\0' ) {
|
|
return;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
// debug checks - make sure we at least have the application name
|
|
//--------------------------------------------------------------------------
|
|
assert( argument_index >= 0 );
|
|
assert( argument_index < MAX_COMMAND_LINE_ARGUMENTS );
|
|
assert( argument_index < ArgC );
|
|
assert( ArgC >= 1 );
|
|
|
|
if (( argument_index >= 0 ) &&
|
|
( argument_index < MAX_COMMAND_LINE_ARGUMENTS ) &&
|
|
( argument_index < ArgC )) {
|
|
|
|
strcpy( ArgV[ argument_index ], arg );
|
|
}
|
|
}
|
|
|
|
|