aboutsummaryrefslogtreecommitdiffstats
path: root/QW/qwfwd/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'QW/qwfwd/misc.c')
-rw-r--r--QW/qwfwd/misc.c452
1 files changed, 452 insertions, 0 deletions
diff --git a/QW/qwfwd/misc.c b/QW/qwfwd/misc.c
new file mode 100644
index 0000000..0359a39
--- /dev/null
+++ b/QW/qwfwd/misc.c
@@ -0,0 +1,452 @@
+#include "master.h"
+
+int com_argc;
+char **com_argv;
+
+/*
+================
+COM_CheckParm
+
+Returns the position (1 to argc-1) in the program's argument list
+where the given parameter apears, or 0 if not present
+================
+*/
+int COM_CheckParm (char *parm)
+{
+ int i;
+
+ for (i=1 ; i<com_argc ; i++)
+ {
+ if (!com_argv[i])
+ continue; // NEXTSTEP sometimes clears appkit vars.
+ if (!strcmp (parm,com_argv[i]))
+ return i;
+ }
+
+ return 0;
+}
+
+char *AdrToString (netadr_t a)
+{
+ static char s[64];
+
+ sprintf (s, "%i.%i.%i.%i:%i",
+ a.sin_addr.S_un.S_un_b.s_b1,
+ a.sin_addr.S_un.S_un_b.s_b2,
+ a.sin_addr.S_un.S_un_b.s_b3,
+ a.sin_addr.S_un.S_un_b.s_b4,
+ ntohs(a.sin_port));
+
+ return s;
+}
+
+netadr_t StringToAdr (char *s)
+{
+ netadr_t a;
+ int b1, b2, b3, b4, p;
+
+ b1 = b2 = b3 = b4 = p = 0;
+ sscanf (s, "%i.%i.%i.%i:%i", &b1, &b2, &b3, &b4, &p);
+
+ a.sin_addr.S_un.S_un_b.s_b1 = b1;
+ a.sin_addr.S_un.S_un_b.s_b2 = b2;
+ a.sin_addr.S_un.S_un_b.s_b3 = b3;
+ a.sin_addr.S_un.S_un_b.s_b4 = b4;
+ a.sin_port = ntohs(p);
+
+ return a;
+}
+
+qboolean CompareAdr (netadr_t a, netadr_t b)
+{
+ if (a.sin_addr.s_addr == b.sin_addr.s_addr
+ && a.sin_port == b.sin_port)
+ return true;
+ return false;
+}
+
+
+void mprintf (char *msg, ...)
+{
+ va_list argptr;
+
+ va_start (argptr, msg);
+ vprintf (msg, argptr);
+ vfprintf (logfile, msg, argptr);
+ va_end (argptr);
+
+}
+
+int msg_readcount;
+char *MSG_ReadString (void)
+{
+ char *start;
+
+ start = packet_data + msg_readcount;
+
+ for ( ; msg_readcount < packet_length ; msg_readcount++)
+ if (packet_data[msg_readcount] == '\n'
+ || packet_data[msg_readcount] == 0)
+ break;
+
+ packet_data[msg_readcount] = 0;
+ msg_readcount++;
+
+ return start;
+}
+
+/*
+=====================================================================
+
+ COMMAND LINES
+
+=====================================================================
+*/
+
+#define MAX_ARGS 32
+#define MAX_ARG_LENGTH 1024
+int cmd_argc;
+char cmd_argv[MAX_ARGS][MAX_ARG_LENGTH];
+
+char com_token[1024];
+/*
+==============
+COM_Parse
+
+Parse a token out of a string
+==============
+*/
+char *COM_Parse (char *data)
+{
+ int c;
+ int len;
+
+ len = 0;
+ com_token[0] = 0;
+
+ if (!data)
+ return NULL;
+
+// skip whitespace
+skipwhite:
+ while ( (c = *data) <= ' ')
+ {
+ if (c == 0)
+ return NULL; // end of file;
+ data++;
+ }
+
+// skip // comments
+ if (c=='/' && data[1] == '/')
+ {
+ while (*data && *data != '\n')
+ data++;
+ goto skipwhite;
+ }
+
+
+// handle quoted strings specially
+ if (c == '\"')
+ {
+ data++;
+ while (1)
+ {
+ c = *data++;
+ if (c=='\"' || !c)
+ {
+ com_token[len] = 0;
+ return data;
+ }
+ com_token[len] = c;
+ len++;
+ }
+ }
+
+// parse a regular word
+ do
+ {
+ com_token[len] = c;
+ data++;
+ len++;
+ c = *data;
+ } while (c>32);
+
+ com_token[len] = 0;
+ return data;
+}
+
+/*
+============
+Cmd_Argc
+============
+*/
+int Cmd_Argc (void)
+{
+ return cmd_argc;
+}
+
+/*
+============
+Cmd_Argv
+============
+*/
+char *Cmd_Argv (int arg)
+{
+ if ( (unsigned)arg >= cmd_argc )
+ return "";
+ return cmd_argv[arg];
+}
+
+/*
+============
+Cmd_TokenizeString
+
+Parses the given string into command line tokens.
+============
+*/
+void Cmd_TokenizeString (char *text)
+{
+ cmd_argc = 0;
+
+ while (1)
+ {
+// skip whitespace up to a /n
+ while (*text && *text <= ' ')
+ {
+ text++;
+ }
+
+ if (!*text)
+ return;
+
+ text = COM_Parse (text);
+ if (!text)
+ return;
+
+ if (cmd_argc < MAX_ARGS)
+ {
+ strcpy (cmd_argv[cmd_argc], com_token);
+ cmd_argc++;
+ }
+ }
+
+}
+
+
+/*
+=====================================================================
+
+ INFO STRINGS
+
+=====================================================================
+*/
+
+/*
+===============
+Info_ValueForKey
+
+Searches the string (userinfo or masterinfo) for the given
+key and returns the associated value, or an empty string.
+===============
+*/
+char *Info_ValueForKey (char *s, char *key)
+{
+ char pkey[512];
+ static char value[512];
+ char *o;
+
+ if (*s == '\\')
+ s++;
+ while (1)
+ {
+ o = pkey;
+ while (*s != '\\')
+ {
+ if (!*s)
+ return "";
+ *o++ = *s++;
+ }
+ *o = 0;
+ s++;
+
+ o = value;
+ while (*s != '\\' && *s)
+ {
+ if (!*s)
+ return "";
+ *o++ = *s++;
+ }
+ *o = 0;
+
+ if (!strcmp (key, pkey) )
+ return value;
+
+ if (!*s)
+ return "";
+ s++;
+ }
+}
+
+void Info_RemoveKey (char *s, char *key)
+{
+ char *start;
+ char pkey[512];
+ char value[512];
+ char *o;
+
+ if (strstr (key, "\\"))
+ {
+ printf ("Can't use a key with a \\\n");
+ return;
+ }
+
+ while (1)
+ {
+ start = s;
+ if (*s == '\\')
+ s++;
+ o = pkey;
+ while (*s != '\\')
+ {
+ if (!*s)
+ return;
+ *o++ = *s++;
+ }
+ *o = 0;
+ s++;
+
+ o = value;
+ while (*s != '\\' && *s)
+ {
+ if (!*s)
+ return;
+ *o++ = *s++;
+ }
+ *o = 0;
+
+ if (!strcmp (key, pkey) )
+ {
+ strcpy (start, s); // remove this part
+ return;
+ }
+
+ if (!*s)
+ return;
+ }
+
+}
+
+void Info_RemovePrefixedKeys (char *start, char prefix)
+{
+ char *s;
+ char pkey[512];
+ char value[512];
+ char *o;
+
+ s = start;
+ while (1)
+ {
+ if (*s == '\\')
+ s++;
+ o = pkey;
+ while (*s != '\\')
+ {
+ if (!*s)
+ return;
+ *o++ = *s++;
+ }
+ *o = 0;
+ s++;
+
+ o = value;
+ while (*s != '\\' && *s)
+ {
+ if (!*s)
+ return;
+ *o++ = *s++;
+ }
+ *o = 0;
+
+ if (pkey[0] == prefix)
+ {
+ Info_RemoveKey (start, pkey);
+ s = start;
+ }
+
+ if (!*s)
+ return;
+ }
+
+}
+
+void Info_SetValueForKey (char *s, char *key, char *value)
+{
+ char new[512];
+
+ if (strstr (key, "\\") || strstr (value, "\\") )
+ {
+ printf ("Can't use keys or values with a \\\n");
+ return;
+ }
+ if (strstr (key, "\"") || strstr (value, "\"") )
+ {
+ printf ("Can't use keys or values with a \\\n");
+ return;
+ }
+
+ Info_RemoveKey (s, key);
+ if (!value || !strlen(value))
+ return;
+
+ sprintf (new, "\\%s\\%s", key, value);
+
+ if (strlen(new) + strlen(s) > MAX_INFO_STRING)
+ {
+ printf ("Info string length exceeded\n");
+ return;
+ }
+ strcat (s, new);
+}
+
+void Info_Print (char *s)
+{
+ char key[512];
+ char value[512];
+ char *o;
+ int l;
+
+ if (*s == '\\')
+ s++;
+ while (*s)
+ {
+ o = key;
+ while (*s && *s != '\\')
+ *o++ = *s++;
+
+ l = o - key;
+ if (l < 20)
+ {
+ memset (o, ' ', 20-l);
+ key[20] = 0;
+ }
+ else
+ *o = 0;
+ printf ("%s", key);
+
+ if (!*s)
+ {
+ printf ("MISSING VALUE\n");
+ return;
+ }
+
+ o = value;
+ s++;
+ while (*s && *s != '\\')
+ *o++ = *s++;
+ *o = 0;
+
+ if (*s)
+ s++;
+ printf ("%s\n", value);
+ }
+}