2014-03-15 16:59:03 +00:00
|
|
|
// SONIC ROBO BLAST 2
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
|
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
2021-05-07 15:45:56 +00:00
|
|
|
// Copyright (C) 1999-2021 by Sonic Team Junior.
|
2014-03-15 16:59:03 +00:00
|
|
|
//
|
|
|
|
// This program is free software distributed under the
|
|
|
|
// terms of the GNU General Public License, version 2.
|
|
|
|
// See the 'LICENSE' file for more details.
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/// \file m_argv.c
|
|
|
|
/// \brief Command line arguments
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "doomdef.h"
|
|
|
|
#include "command.h"
|
|
|
|
#include "m_argv.h"
|
2019-11-18 20:39:41 +00:00
|
|
|
#include "m_misc.h"
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
/** \brief number of arg
|
|
|
|
*/
|
|
|
|
INT32 myargc;
|
|
|
|
|
|
|
|
/** \brief string table
|
|
|
|
*/
|
|
|
|
char **myargv;
|
|
|
|
|
2018-11-23 19:12:48 +00:00
|
|
|
/** \brief did we alloc myargv ourselves?
|
|
|
|
*/
|
|
|
|
boolean myargmalloc = false;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
/** \brief founded the parm
|
|
|
|
*/
|
|
|
|
static INT32 found;
|
|
|
|
|
2020-03-21 06:36:39 +00:00
|
|
|
/** \brief Parses a server URL (such as srb2://127.0.0.1) as may be passed to the game via a web browser, etc.
|
|
|
|
|
|
|
|
\return the contents of the URL after the protocol (a server to join), or NULL if not found
|
|
|
|
*/
|
|
|
|
const char *M_GetUrlProtocolArg(void)
|
|
|
|
{
|
|
|
|
INT32 i;
|
2020-03-21 12:47:29 +00:00
|
|
|
const size_t len = strlen(SERVER_URL_PROTOCOL);
|
2020-03-21 06:36:39 +00:00
|
|
|
|
|
|
|
for (i = 1; i < myargc; i++)
|
|
|
|
{
|
2020-03-21 12:47:29 +00:00
|
|
|
if (strlen(myargv[i]) > len && !strnicmp(myargv[i], SERVER_URL_PROTOCOL, len))
|
2020-03-21 06:36:39 +00:00
|
|
|
{
|
2020-03-21 12:47:29 +00:00
|
|
|
return &myargv[i][len];
|
2020-03-21 06:36:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
/** \brief The M_CheckParm function
|
|
|
|
|
|
|
|
\param check Checks for the given parameter in the program's command line arguments.
|
|
|
|
|
|
|
|
\return number (1 to argc-1) or 0 if not present
|
|
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
INT32 M_CheckParm(const char *check)
|
|
|
|
{
|
|
|
|
INT32 i;
|
|
|
|
|
|
|
|
for (i = 1; i < myargc; i++)
|
|
|
|
{
|
|
|
|
if (!strcasecmp(check, myargv[i]))
|
|
|
|
{
|
|
|
|
found = i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
found = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief the M_IsNextParm
|
|
|
|
|
|
|
|
\return true if there is an available next parameter
|
|
|
|
*/
|
|
|
|
|
|
|
|
boolean M_IsNextParm(void)
|
|
|
|
{
|
|
|
|
if (found > 0 && found + 1 < myargc && myargv[found+1][0] != '-' && myargv[found+1][0] != '+')
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief the M_GetNextParm function
|
|
|
|
|
|
|
|
\return the next parameter after a M_CheckParm, NULL if not found
|
|
|
|
use M_IsNextParm to verify there is a parameter
|
|
|
|
*/
|
|
|
|
const char *M_GetNextParm(void)
|
|
|
|
{
|
|
|
|
if (M_IsNextParm())
|
|
|
|
{
|
|
|
|
found++;
|
|
|
|
return myargv[found];
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief the M_PushSpecialParameters function
|
|
|
|
push all parameters beginning with '+'
|
|
|
|
*/
|
|
|
|
void M_PushSpecialParameters(void)
|
|
|
|
{
|
|
|
|
INT32 i;
|
|
|
|
for (i = 1; i < myargc; i++)
|
|
|
|
{
|
|
|
|
if (myargv[i][0] == '+')
|
|
|
|
{
|
2020-01-18 08:23:47 +00:00
|
|
|
COM_BufAddText(&myargv[i][1]);
|
2014-03-15 16:59:03 +00:00
|
|
|
i++;
|
|
|
|
|
|
|
|
// get the parameters of the command too
|
|
|
|
for (; i < myargc && myargv[i][0] != '+' && myargv[i][0] != '-'; i++)
|
|
|
|
{
|
2020-01-18 08:23:47 +00:00
|
|
|
COM_BufAddText(va(" \"%s\"", myargv[i]));
|
2014-03-15 16:59:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// push it
|
2020-01-18 08:23:47 +00:00
|
|
|
COM_BufAddText("\n");
|
2014-03-15 16:59:03 +00:00
|
|
|
i--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// \brief max args
|
|
|
|
#define MAXARGVS 256
|
|
|
|
|
|
|
|
/** \brief the M_FindResponseFile function
|
|
|
|
Find a response file
|
|
|
|
*/
|
|
|
|
void M_FindResponseFile(void)
|
|
|
|
{
|
|
|
|
INT32 i;
|
|
|
|
|
|
|
|
for (i = 1; i < myargc; i++)
|
|
|
|
if (myargv[i][0] == '@')
|
|
|
|
{
|
|
|
|
FILE *handle;
|
|
|
|
INT32 k, pindex, indexinfile;
|
|
|
|
long size;
|
|
|
|
boolean inquote = false;
|
|
|
|
UINT8 *infile;
|
|
|
|
char *file;
|
|
|
|
char *moreargs[20];
|
|
|
|
char *firstargv;
|
|
|
|
|
|
|
|
// read the response file into memory
|
|
|
|
handle = fopen(&myargv[i][1], "rb");
|
|
|
|
if (!handle)
|
|
|
|
I_Error("Response file %s not found", &myargv[i][1]);
|
|
|
|
|
|
|
|
CONS_Printf(M_GetText("Found response file %s\n"), &myargv[i][1]);
|
|
|
|
fseek(handle, 0, SEEK_END);
|
|
|
|
size = ftell(handle);
|
|
|
|
fseek(handle, 0, SEEK_SET);
|
|
|
|
file = malloc(size);
|
|
|
|
if (!file)
|
|
|
|
I_Error("No more free memory for the response file");
|
|
|
|
if (fread(file, size, 1, handle) != 1)
|
2019-11-18 20:39:41 +00:00
|
|
|
I_Error("Couldn't read response file because %s", M_FileError(handle));
|
2014-03-15 16:59:03 +00:00
|
|
|
fclose(handle);
|
|
|
|
|
|
|
|
// keep all the command line arguments following @responsefile
|
|
|
|
for (pindex = 0, k = i+1; k < myargc; k++)
|
|
|
|
moreargs[pindex++] = myargv[k];
|
|
|
|
|
|
|
|
firstargv = myargv[0];
|
|
|
|
myargv = malloc(sizeof (char *) * MAXARGVS);
|
|
|
|
if (!myargv)
|
|
|
|
{
|
|
|
|
free(file);
|
|
|
|
I_Error("Not enough memory to read response file");
|
|
|
|
}
|
2018-11-23 19:12:48 +00:00
|
|
|
myargmalloc = true; // mark as having been allocated by us
|
2014-03-15 16:59:03 +00:00
|
|
|
memset(myargv, 0, sizeof (char *) * MAXARGVS);
|
|
|
|
myargv[0] = firstargv;
|
|
|
|
|
|
|
|
infile = (UINT8 *)file;
|
|
|
|
indexinfile = k = 0;
|
|
|
|
indexinfile++; // skip past argv[0]
|
|
|
|
do
|
|
|
|
{
|
|
|
|
inquote = infile[k] == '"';
|
|
|
|
if (inquote) // strip enclosing double-quote
|
|
|
|
k++;
|
|
|
|
myargv[indexinfile++] = (char *)&infile[k];
|
|
|
|
while (k < size && ((inquote && infile[k] != '"')
|
|
|
|
|| (!inquote && infile[k] > ' ')))
|
|
|
|
{
|
|
|
|
k++;
|
|
|
|
}
|
|
|
|
infile[k] = 0;
|
|
|
|
while (k < size && (infile[k] <= ' '))
|
|
|
|
k++;
|
|
|
|
} while (k < size);
|
|
|
|
|
|
|
|
for (k = 0; k < pindex; k++)
|
|
|
|
myargv[indexinfile++] = moreargs[k];
|
|
|
|
myargc = indexinfile;
|
|
|
|
|
|
|
|
// display arguments
|
2018-06-17 03:44:28 +00:00
|
|
|
CONS_Printf(M_GetText("%d command-line args:\n"), myargc-1); // -1 so @ don't actually get counted for
|
2014-03-15 16:59:03 +00:00
|
|
|
for (k = 1; k < myargc; k++)
|
|
|
|
CONS_Printf("%s\n", myargv[k]);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|