]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
fix a seldom sound related segfault
[xonotic/darkplaces.git] / common.c
index ad5f5abb686fc4348cbf1666f09da73e8623dfd1..028014bc7420a96b24d7cf232b73f497af7a4cb8 100644 (file)
--- a/common.c
+++ b/common.c
@@ -33,6 +33,7 @@ cvar_t cmdline = {0, "cmdline","0", "contains commandline the engine was launche
 char com_token[MAX_INPUTLINE];
 int com_argc;
 const char **com_argv;
+int com_selffd = -1;
 
 gamemode_t gamemode;
 const char *gamename;
@@ -1420,13 +1421,13 @@ int COM_CheckParm (const char *parm)
 
 typedef struct gamemode_info_s
 {
-       const char* prog_name;
-       const char* cmdline;
-       const char* gamename;
-       const char* gamedirname1;
-       const char* gamedirname2;
-       const char* gamescreenshotname;
-       const char* gameuserdirname;
+       const char* prog_name; // not null
+       const char* cmdline; // not null
+       const char* gamename; // not null
+       const char* gamedirname1; // not null
+       const char* gamedirname2; // null
+       const char* gamescreenshotname; // not nul
+       const char* gameuserdirname; // not null
 } gamemode_info_t;
 
 static const gamemode_info_t gamemode_info [GAME_COUNT] =
@@ -1507,12 +1508,16 @@ static const gamemode_info_t gamemode_info [GAME_COUNT] =
 // GAME_STEELSTORM
 // COMMANDLINEOPTION: Game: -steelstorm runs the game Steel Storm
 { "steelstorm",                                "-steelstorm",          "Steel-Storm",          "gamedata",             NULL,                   "ss",                   "steelstorm" },
+// GAME_STRAPBOMB
+// COMMANDLINEOPTION: Game: -strapbomb runs the game Strap-on-bomb Car
+{ "strapbomb",                         "-strapbomb",           "Strap-on-bomb Car",            "id1",          NULL,                   "strap",                        "strapbomb" },
 };
 
 void COM_InitGameType (void)
 {
        char name [MAX_OSPATH];
        unsigned int i;
+       int t;
 
        FS_StripExtension (com_argv[0], name, sizeof (name));
        COM_ToLowerString (name, name, sizeof (name));
@@ -1539,6 +1544,17 @@ void COM_InitGameType (void)
        gamedirname2 = gamemode_info[gamemode].gamedirname2;
        gamescreenshotname = gamemode_info[gamemode].gamescreenshotname;
        gameuserdirname = gamemode_info[gamemode].gameuserdirname;
+
+       if((t = COM_CheckParm("-customgamename")) && t + 1 < com_argc)
+               gamename = com_argv[t+1];
+       if((t = COM_CheckParm("-customgamedirname1")) && t + 1 < com_argc)
+               gamedirname1 = com_argv[t+1];
+       if((t = COM_CheckParm("-customgamedirname2")) && t + 1 < com_argc)
+               gamedirname2 = *com_argv[t+1] ? com_argv[t+1] : NULL;
+       if((t = COM_CheckParm("-customgamescreenshotname")) && t + 1 < com_argc)
+               gamescreenshotname = com_argv[t+1];
+       if((t = COM_CheckParm("-customgameuserdirname")) && t + 1 < com_argc)
+               gameuserdirname = com_argv[t+1];
 }
 
 
@@ -2212,3 +2228,31 @@ void FindFraction(double val, int *num, int *denom, int denomMax)
                }
        }
 }
+
+// decodes an XPM from C syntax
+char **XPM_DecodeString(const char *in)
+{
+       static char *tokens[257];
+       static char lines[257][512];
+       size_t line = 0;
+
+       // skip until "{" token
+       while(COM_ParseToken_QuakeC(&in, false) && strcmp(com_token, "{"));
+
+       // now, read in succession: string, comma-or-}
+       while(COM_ParseToken_QuakeC(&in, false))
+       {
+               tokens[line] = lines[line];
+               strlcpy(lines[line++], com_token, sizeof(lines[0]));
+               if(!COM_ParseToken_QuakeC(&in, false))
+                       return NULL;
+               if(!strcmp(com_token, "}"))
+                       break;
+               if(strcmp(com_token, ","))
+                       return NULL;
+               if(line >= sizeof(tokens) / sizeof(tokens[0]))
+                       return NULL;
+       }
+
+       return tokens;
+}