ref: b4c6a7ee10270801b4e26063ad3a1919e0d0f104
dir: /QW/qwfwd/misc.c/
#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); } }