]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
consolidated many mempools to make memlist more readable (and very slightly reduce...
[xonotic/darkplaces.git] / common.c
index 671d549845dcc7ae117f2a258a36517279b7ae84..74d26067a8d79d74a3f1dca692b7ba59940da51b 100644 (file)
--- a/common.c
+++ b/common.c
@@ -40,7 +40,7 @@ const char **com_argv;
 #define CMDLINE_LENGTH 1024
 char com_cmdline[CMDLINE_LENGTH];
 
-int gamemode;
+gamemode_t gamemode;
 const char *gamename;
 const char *gamedirname1;
 const char *gamedirname2;
@@ -491,25 +491,6 @@ float MSG_ReadAngle (int protocol)
 
 //===========================================================================
 
-void SZ_Alloc (sizebuf_t *buf, int startsize, const char *name)
-{
-       if (startsize < 256)
-               startsize = 256;
-       buf->mempool = Mem_AllocPool(name, 0, NULL);
-       buf->data = Mem_Alloc(buf->mempool, startsize);
-       buf->maxsize = startsize;
-       buf->cursize = 0;
-}
-
-
-void SZ_Free (sizebuf_t *buf)
-{
-       Mem_FreePool(&buf->mempool);
-       buf->data = NULL;
-       buf->maxsize = 0;
-       buf->cursize = 0;
-}
-
 void SZ_Clear (sizebuf_t *buf)
 {
        buf->cursize = 0;
@@ -640,7 +621,11 @@ int COM_ParseToken(const char **datapointer, int returnnewline)
 
 // skip whitespace
 skipwhite:
-       for (;*data <= ' ' && (*data != '\n' || !returnnewline);data++)
+       // line endings:
+       // UNIX: \n
+       // Mac: \r
+       // Windows: \r\n
+       for (;*data <= ' ' && ((*data != '\n' && *data != '\r') || !returnnewline);data++)
        {
                if (*data == 0)
                {
@@ -650,10 +635,14 @@ skipwhite:
                }
        }
 
+       // handle Windows line ending
+       if (data[0] == '\r' && data[1] == '\n')
+               data++;
+
        if (data[0] == '/' && data[1] == '/')
        {
                // comment
-               while (*data && *data != '\n')
+               while (*data && *data != '\n' && *data != '\r')
                        data++;
                goto skipwhite;
        }
@@ -684,7 +673,7 @@ skipwhite:
                com_token[len] = 0;
                *datapointer = data+1;
                return true;
-       } 
+       }
        else if (*data == '\'')
        {
                // quoted string
@@ -703,7 +692,15 @@ skipwhite:
                com_token[len] = 0;
                *datapointer = data+1;
                return true;
-       }       
+       }
+       else if (*data == '\r')
+       {
+               // translate Mac line ending to UNIX
+               com_token[len++] = '\n';
+               com_token[len] = 0;
+               *datapointer = data;
+               return true;
+       }
        else if (*data == '\n' || *data == '{' || *data == '}' || *data == ')' || *data == '(' || *data == ']' || *data == '[' || *data == '\'' || *data == ':' || *data == ',' || *data == ';')
        {
                // single character
@@ -767,7 +764,7 @@ skipwhite:
        if (*data == '/' && data[1] == '/')
        {
                // comment
-               while (*data && *data != '\n')
+               while (*data && *data != '\n' && *data != '\r')
                        data++;
                goto skipwhite;
        }
@@ -937,19 +934,19 @@ static const gamemode_info_t gamemode_info [] =
 // COMMANDLINEOPTION: Game: -teu runs The Evil Unleashed (this option is obsolete as they are not using darkplaces)
 { "teu",                       "-teu",                 "TheEvilUnleashed",             "baseteu",      NULL,                   "teu",                  "teu" },
 // GAME_BATTLEMECH
-// COMMANDLINEOPTION: Game: -battlemech runs the multiplayer topdown deathmatch game BattleMech 
+// COMMANDLINEOPTION: Game: -battlemech runs the multiplayer topdown deathmatch game BattleMech
 { "battlemech",                "-battlemech",  "Battlemech",                   "base",         NULL,                   "battlemech",   "battlemech" },
 // GAME_ZYMOTIC
 // COMMANDLINEOPTION: Game: -zymotic runs the singleplayer game Zymotic
 { "zymotic",           "-zymotic",             "Zymotic",                              "data",         NULL,                   "zymotic",              "zymotic" },
 // GAME_FNIGGIUM
-// COMMANDLINEOPTION: Game: -fniggium runs the post apocalyptic melee RPG Fniggium 
+// COMMANDLINEOPTION: Game: -fniggium runs the post apocalyptic melee RPG Fniggium
 { "fniggium",          "-fniggium",    "Fniggium",                             "data",         NULL,                   "fniggium",             "fniggium" },
 // GAME_SETHERAL
-// COMMANDLINEOPTION: Game: -setheral runs the multiplayer game Setheral 
+// COMMANDLINEOPTION: Game: -setheral runs the multiplayer game Setheral
 { "setheral",          "-setheral",    "Setheral",                             "data",         NULL,                   "setheral",             "setheral" },
 // GAME_SOM
-// COMMANDLINEOPTION: Game: -som runs the multiplayer game Son Of Man 
+// COMMANDLINEOPTION: Game: -som runs the multiplayer game Son Of Man
 { "som",                       "-som",                 "Son of Man",                   "id1",          "sonofman",             "som",                  "darkplaces" },
 // GAME_TENEBRAE
 // COMMANDLINEOPTION: Game: -tenebrae runs the graphics test mod known as Tenebrae (some features not implemented)
@@ -966,6 +963,9 @@ static const gamemode_info_t gamemode_info [] =
 // GAME_NETHERWORLD
 // COMMANDLINEOPTION: Game: -netherworld runs the game Netherworld: Dark Masters
 { "netherworld",       "-netherworld", "Dark Masters",                 "id1",          "netherworld",  "nw",                   "darkplaces"},
+// GAME_THEHUNTED
+// COMMANDLINEOPTION: Game: -netherworld runs the game The Hunted
+{ "thehunted",         "-thehunted",   "The Hunted",                   "thdata",       NULL,                   "th",                   "thehunted"},
 };
 
 void COM_InitGameType (void)
@@ -1051,13 +1051,54 @@ char *va(const char *format, ...)
        s = string[stringindex];
        stringindex = (stringindex + 1) & 7;
        va_start (argptr, format);
-       vsnprintf (s, sizeof (string[0]), format,argptr);
+       dpvsnprintf (s, sizeof (string[0]), format,argptr);
        va_end (argptr);
 
        return s;
 }
 
 
+//======================================
+
+// snprintf and vsnprintf are NOT portable. Use their DP counterparts instead
+
+#undef snprintf
+#undef vsnprintf
+
+#ifdef WIN32
+# define snprintf _snprintf
+# define vsnprintf _vsnprintf
+#endif
+
+
+int dpsnprintf (char *buffer, size_t buffersize, const char *format, ...)
+{
+       va_list args;
+       int result;
+
+       va_start (args, format);
+       result = dpvsnprintf (buffer, buffersize, format, args);
+       va_end (args);
+
+       return result;
+}
+
+
+int dpvsnprintf (char *buffer, size_t buffersize, const char *format, va_list args)
+{
+       int result;
+
+       result = vsnprintf (buffer, buffersize, format, args);
+       if (result < 0 || (size_t)result >= buffersize)
+       {
+               buffer[buffersize - 1] = '\0';
+               return -1;
+       }
+
+       return result;
+}
+
+
 //======================================
 
 void COM_ToLowerString (const char *in, char *out, size_t size_out)
@@ -1111,13 +1152,13 @@ int COM_ReadAndTokenizeLine(const char **text, char **argv, int maxargc, char *t
        commentprefixlength = 0;
        if (commentprefix)
                commentprefixlength = strlen(commentprefix);
-       while (*l && *l != '\n')
+       while (*l && *l != '\n' && *l != '\r')
        {
                if (*l > ' ')
                {
                        if (commentprefixlength && !strncmp(l, commentprefix, commentprefixlength))
                        {
-                               while (*l && *l != '\n')
+                               while (*l && *l != '\n' && *l != '\r')
                                        l++;
                                break;
                        }
@@ -1152,6 +1193,12 @@ int COM_ReadAndTokenizeLine(const char **text, char **argv, int maxargc, char *t
                else
                        l++;
        }
+       // line endings:
+       // UNIX: \n
+       // Mac: \r
+       // Windows: \r\n
+       if (*l == '\r')
+               l++;
        if (*l == '\n')
                l++;
        *text = l;