diff options
Diffstat (limited to 'QW/qwfwd/misc.c')
| -rw-r--r-- | QW/qwfwd/misc.c | 452 |
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);
+ }
+}
|
