Annotation of quakeworld/qwfwd/misc.c, revision 1.1.1.1

1.1       root        1: #include "master.h"
                      2: 
                      3: int            com_argc;
                      4: char   **com_argv;
                      5: 
                      6: /*
                      7: ================
                      8: COM_CheckParm
                      9: 
                     10: Returns the position (1 to argc-1) in the program's argument list
                     11: where the given parameter apears, or 0 if not present
                     12: ================
                     13: */
                     14: int COM_CheckParm (char *parm)
                     15: {
                     16:        int             i;
                     17:        
                     18:        for (i=1 ; i<com_argc ; i++)
                     19:        {
                     20:                if (!com_argv[i])
                     21:                        continue;               // NEXTSTEP sometimes clears appkit vars.
                     22:                if (!strcmp (parm,com_argv[i]))
                     23:                        return i;
                     24:        }
                     25:                
                     26:        return 0;
                     27: }
                     28: 
                     29: char   *AdrToString (netadr_t a)
                     30: {
                     31:        static  char    s[64];
                     32:        
                     33:        sprintf (s, "%i.%i.%i.%i:%i",
                     34:                a.sin_addr.S_un.S_un_b.s_b1,
                     35:                a.sin_addr.S_un.S_un_b.s_b2,
                     36:                a.sin_addr.S_un.S_un_b.s_b3,
                     37:                a.sin_addr.S_un.S_un_b.s_b4,
                     38:                ntohs(a.sin_port));
                     39: 
                     40:        return s;
                     41: }
                     42: 
                     43: netadr_t       StringToAdr (char *s)
                     44: {
                     45:        netadr_t                a;
                     46:        int                     b1, b2, b3, b4, p;
                     47:        
                     48:        b1 = b2 = b3 = b4 = p = 0;
                     49:        sscanf (s, "%i.%i.%i.%i:%i", &b1, &b2, &b3, &b4, &p);
                     50:        
                     51:        a.sin_addr.S_un.S_un_b.s_b1 = b1;
                     52:        a.sin_addr.S_un.S_un_b.s_b2 = b2;
                     53:        a.sin_addr.S_un.S_un_b.s_b3 = b3;
                     54:        a.sin_addr.S_un.S_un_b.s_b4 = b4;
                     55:        a.sin_port = ntohs(p);
                     56: 
                     57:        return a;
                     58: }
                     59: 
                     60: qboolean       CompareAdr (netadr_t a, netadr_t b)
                     61: {
                     62:        if (a.sin_addr.s_addr == b.sin_addr.s_addr 
                     63:        && a.sin_port == b.sin_port)
                     64:                return true;
                     65:        return false;
                     66: }
                     67: 
                     68: 
                     69: void   mprintf (char *msg, ...)
                     70: {
                     71:        va_list argptr;
                     72:        
                     73:        va_start (argptr, msg);
                     74:        vprintf (msg, argptr);
                     75:        vfprintf (logfile, msg, argptr);
                     76:        va_end (argptr);
                     77:                
                     78: }
                     79: 
                     80: int    msg_readcount;
                     81: char   *MSG_ReadString (void)
                     82: {
                     83:        char    *start;
                     84:        
                     85:        start = packet_data + msg_readcount;
                     86:        
                     87:        for ( ; msg_readcount < packet_length ; msg_readcount++)
                     88:                if (packet_data[msg_readcount] == '\n'
                     89:                || packet_data[msg_readcount] == 0)
                     90:                        break;
                     91:        
                     92:        packet_data[msg_readcount] = 0;
                     93:        msg_readcount++;
                     94:        
                     95:        return start;
                     96: }
                     97: 
                     98: /*
                     99: =====================================================================
                    100: 
                    101:   COMMAND LINES
                    102: 
                    103: =====================================================================
                    104: */
                    105: 
                    106: #define        MAX_ARGS        32
                    107: #define        MAX_ARG_LENGTH  1024
                    108: int            cmd_argc;
                    109: char   cmd_argv[MAX_ARGS][MAX_ARG_LENGTH];
                    110: 
                    111: char           com_token[1024];
                    112: /*
                    113: ==============
                    114: COM_Parse
                    115: 
                    116: Parse a token out of a string
                    117: ==============
                    118: */
                    119: char *COM_Parse (char *data)
                    120: {
                    121:        int             c;
                    122:        int             len;
                    123:        
                    124:        len = 0;
                    125:        com_token[0] = 0;
                    126:        
                    127:        if (!data)
                    128:                return NULL;
                    129:                
                    130: // skip whitespace
                    131: skipwhite:
                    132:        while ( (c = *data) <= ' ')
                    133:        {
                    134:                if (c == 0)
                    135:                        return NULL;                    // end of file;
                    136:                data++;
                    137:        }
                    138:        
                    139: // skip // comments
                    140:        if (c=='/' && data[1] == '/')
                    141:        {
                    142:                while (*data && *data != '\n')
                    143:                        data++;
                    144:                goto skipwhite;
                    145:        }
                    146:        
                    147: 
                    148: // handle quoted strings specially
                    149:        if (c == '\"')
                    150:        {
                    151:                data++;
                    152:                while (1)
                    153:                {
                    154:                        c = *data++;
                    155:                        if (c=='\"' || !c)
                    156:                        {
                    157:                                com_token[len] = 0;
                    158:                                return data;
                    159:                        }
                    160:                        com_token[len] = c;
                    161:                        len++;
                    162:                }
                    163:        }
                    164: 
                    165: // parse a regular word
                    166:        do
                    167:        {
                    168:                com_token[len] = c;
                    169:                data++;
                    170:                len++;
                    171:                c = *data;
                    172:        } while (c>32);
                    173:        
                    174:        com_token[len] = 0;
                    175:        return data;
                    176: }
                    177: 
                    178: /*
                    179: ============
                    180: Cmd_Argc
                    181: ============
                    182: */
                    183: int            Cmd_Argc (void)
                    184: {
                    185:        return cmd_argc;
                    186: }
                    187: 
                    188: /*
                    189: ============
                    190: Cmd_Argv
                    191: ============
                    192: */
                    193: char   *Cmd_Argv (int arg)
                    194: {
                    195:        if ( (unsigned)arg >= cmd_argc )
                    196:                return "";
                    197:        return cmd_argv[arg];   
                    198: }
                    199: 
                    200: /*
                    201: ============
                    202: Cmd_TokenizeString
                    203: 
                    204: Parses the given string into command line tokens.
                    205: ============
                    206: */
                    207: void Cmd_TokenizeString (char *text)
                    208: {      
                    209:        cmd_argc = 0;
                    210:        
                    211:        while (1)
                    212:        {
                    213: // skip whitespace up to a /n
                    214:                while (*text && *text <= ' ')
                    215:                {
                    216:                        text++;
                    217:                }
                    218:                
                    219:                if (!*text)
                    220:                        return;
                    221:        
                    222:                text = COM_Parse (text);
                    223:                if (!text)
                    224:                        return;
                    225: 
                    226:                if (cmd_argc < MAX_ARGS)
                    227:                {
                    228:                        strcpy (cmd_argv[cmd_argc], com_token);
                    229:                        cmd_argc++;
                    230:                }
                    231:        }
                    232:        
                    233: }
                    234: 
                    235: 
                    236: /*
                    237: =====================================================================
                    238: 
                    239:   INFO STRINGS
                    240: 
                    241: =====================================================================
                    242: */
                    243: 
                    244: /*
                    245: ===============
                    246: Info_ValueForKey
                    247: 
                    248: Searches the string (userinfo or masterinfo) for the given
                    249: key and returns the associated value, or an empty string.
                    250: ===============
                    251: */
                    252: char *Info_ValueForKey (char *s, char *key)
                    253: {
                    254:        char    pkey[512];
                    255:        static  char value[512];
                    256:        char    *o;
                    257:        
                    258:        if (*s == '\\')
                    259:                s++;
                    260:        while (1)
                    261:        {
                    262:                o = pkey;
                    263:                while (*s != '\\')
                    264:                {
                    265:                        if (!*s)
                    266:                                return "";
                    267:                        *o++ = *s++;
                    268:                }
                    269:                *o = 0;
                    270:                s++;
                    271: 
                    272:                o = value;
                    273:                while (*s != '\\' && *s)
                    274:                {
                    275:                        if (!*s)
                    276:                                return "";
                    277:                        *o++ = *s++;
                    278:                }
                    279:                *o = 0;
                    280: 
                    281:                if (!strcmp (key, pkey) )
                    282:                        return value;
                    283: 
                    284:                if (!*s)
                    285:                        return "";
                    286:                s++;
                    287:        }
                    288: }
                    289: 
                    290: void Info_RemoveKey (char *s, char *key)
                    291: {
                    292:        char    *start;
                    293:        char    pkey[512];
                    294:        char    value[512];
                    295:        char    *o;
                    296: 
                    297:        if (strstr (key, "\\"))
                    298:        {
                    299:                printf ("Can't use a key with a \\\n");
                    300:                return;
                    301:        }
                    302: 
                    303:        while (1)
                    304:        {
                    305:                start = s;
                    306:                if (*s == '\\')
                    307:                        s++;
                    308:                o = pkey;
                    309:                while (*s != '\\')
                    310:                {
                    311:                        if (!*s)
                    312:                                return;
                    313:                        *o++ = *s++;
                    314:                }
                    315:                *o = 0;
                    316:                s++;
                    317: 
                    318:                o = value;
                    319:                while (*s != '\\' && *s)
                    320:                {
                    321:                        if (!*s)
                    322:                                return;
                    323:                        *o++ = *s++;
                    324:                }
                    325:                *o = 0;
                    326: 
                    327:                if (!strcmp (key, pkey) )
                    328:                {
                    329:                        strcpy (start, s);      // remove this part
                    330:                        return;
                    331:                }
                    332: 
                    333:                if (!*s)
                    334:                        return;
                    335:        }
                    336: 
                    337: }
                    338: 
                    339: void Info_RemovePrefixedKeys (char *start, char prefix)
                    340: {
                    341:        char    *s;
                    342:        char    pkey[512];
                    343:        char    value[512];
                    344:        char    *o;
                    345: 
                    346:        s = start;
                    347: 
                    348:        while (1)
                    349:        {
                    350:                if (*s == '\\')
                    351:                        s++;
                    352:                o = pkey;
                    353:                while (*s != '\\')
                    354:                {
                    355:                        if (!*s)
                    356:                                return;
                    357:                        *o++ = *s++;
                    358:                }
                    359:                *o = 0;
                    360:                s++;
                    361: 
                    362:                o = value;
                    363:                while (*s != '\\' && *s)
                    364:                {
                    365:                        if (!*s)
                    366:                                return;
                    367:                        *o++ = *s++;
                    368:                }
                    369:                *o = 0;
                    370: 
                    371:                if (pkey[0] == prefix)
                    372:                {
                    373:                        Info_RemoveKey (start, pkey);
                    374:                        s = start;
                    375:                }
                    376: 
                    377:                if (!*s)
                    378:                        return;
                    379:        }
                    380: 
                    381: }
                    382: 
                    383: void Info_SetValueForKey (char *s, char *key, char *value)
                    384: {
                    385:        char    new[512];
                    386: 
                    387:        if (strstr (key, "\\") || strstr (value, "\\") )
                    388:        {
                    389:                printf ("Can't use keys or values with a \\\n");
                    390:                return;
                    391:        }
                    392:        if (strstr (key, "\"") || strstr (value, "\"") )
                    393:        {
                    394:                printf ("Can't use keys or values with a \\\n");
                    395:                return;
                    396:        }
                    397: 
                    398:        Info_RemoveKey (s, key);
                    399:        if (!value || !strlen(value))
                    400:                return;
                    401: 
                    402:        sprintf (new, "\\%s\\%s", key, value);
                    403: 
                    404:        if (strlen(new) + strlen(s) > MAX_INFO_STRING)
                    405:        {
                    406:                printf ("Info string length exceeded\n");
                    407:                return;
                    408:        }
                    409:        strcat (s, new);
                    410: }
                    411: 
                    412: void Info_Print (char *s)
                    413: {
                    414:        char    key[512];
                    415:        char    value[512];
                    416:        char    *o;
                    417:        int             l;
                    418: 
                    419:        if (*s == '\\')
                    420:                s++;
                    421:        while (*s)
                    422:        {
                    423:                o = key;
                    424:                while (*s && *s != '\\')
                    425:                        *o++ = *s++;
                    426: 
                    427:                l = o - key;
                    428:                if (l < 20)
                    429:                {
                    430:                        memset (o, ' ', 20-l);
                    431:                        key[20] = 0;
                    432:                }
                    433:                else
                    434:                        *o = 0;
                    435:                printf ("%s", key);
                    436: 
                    437:                if (!*s)
                    438:                {
                    439:                        printf ("MISSING VALUE\n");
                    440:                        return;
                    441:                }
                    442: 
                    443:                o = value;
                    444:                s++;
                    445:                while (*s && *s != '\\')
                    446:                        *o++ = *s++;
                    447:                *o = 0;
                    448: 
                    449:                if (*s)
                    450:                        s++;
                    451:                printf ("%s\n", value);
                    452:        }
                    453: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.