Annotation of embedaddon/miniupnpd/upnpreplyparse.c, revision 1.1.1.1

1.1       misho       1: /* $Id: upnpreplyparse.c,v 1.10 2008/02/21 13:05:27 nanard Exp $ */
                      2: /* MiniUPnP project
                      3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
                      4:  * (c) 2006 Thomas Bernard 
                      5:  * This software is subject to the conditions detailed
                      6:  * in the LICENCE file provided within the distribution */
                      7: 
                      8: #include <stdlib.h>
                      9: #include <string.h>
                     10: #include <stdio.h>
                     11: 
                     12: #include "upnpreplyparse.h"
                     13: #include "minixml.h"
                     14: 
                     15: static void
                     16: NameValueParserStartElt(void * d, const char * name, int l)
                     17: {
                     18:     struct NameValueParserData * data = (struct NameValueParserData *)d;
                     19:     if(l>63)
                     20:         l = 63;
                     21:     memcpy(data->curelt, name, l);
                     22:     data->curelt[l] = '\0';
                     23: }
                     24: 
                     25: static void
                     26: NameValueParserGetData(void * d, const char * datas, int l)
                     27: {
                     28:     struct NameValueParserData * data = (struct NameValueParserData *)d;
                     29:     struct NameValue * nv;
                     30:     nv = malloc(sizeof(struct NameValue));
                     31:     if(l>63)
                     32:         l = 63;
                     33:     strncpy(nv->name, data->curelt, 64);
                     34:        nv->name[63] = '\0';
                     35:     memcpy(nv->value, datas, l);
                     36:     nv->value[l] = '\0';
                     37:     LIST_INSERT_HEAD( &(data->head), nv, entries);
                     38: }
                     39: 
                     40: void
                     41: ParseNameValue(const char * buffer, int bufsize,
                     42:                     struct NameValueParserData * data)
                     43: {
                     44:     struct xmlparser parser;
                     45:     LIST_INIT(&(data->head));
                     46:     /* init xmlparser object */
                     47:     parser.xmlstart = buffer;
                     48:     parser.xmlsize = bufsize;
                     49:     parser.data = data;
                     50:     parser.starteltfunc = NameValueParserStartElt;
                     51:     parser.endeltfunc = 0;
                     52:     parser.datafunc = NameValueParserGetData;
                     53:        parser.attfunc = 0;
                     54:     parsexml(&parser);
                     55: }
                     56: 
                     57: void
                     58: ClearNameValueList(struct NameValueParserData * pdata)
                     59: {
                     60:     struct NameValue * nv;
                     61:     while((nv = pdata->head.lh_first) != NULL)
                     62:     {
                     63:         LIST_REMOVE(nv, entries);
                     64:         free(nv);
                     65:     }
                     66: }
                     67: 
                     68: char * 
                     69: GetValueFromNameValueList(struct NameValueParserData * pdata,
                     70:                           const char * Name)
                     71: {
                     72:     struct NameValue * nv;
                     73:     char * p = NULL;
                     74:     for(nv = pdata->head.lh_first;
                     75:         (nv != NULL) && (p == NULL);
                     76:         nv = nv->entries.le_next)
                     77:     {
                     78:         if(strcmp(nv->name, Name) == 0)
                     79:             p = nv->value;
                     80:     }
                     81:     return p;
                     82: }
                     83: 
                     84: #if 0
                     85: /* useless now that minixml ignores namespaces by itself */
                     86: char *
                     87: GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
                     88:                                   const char * Name)
                     89: {
                     90:        struct NameValue * nv;
                     91:        char * p = NULL;
                     92:        char * pname;
                     93:        for(nv = pdata->head.lh_first;
                     94:            (nv != NULL) && (p == NULL);
                     95:                nv = nv->entries.le_next)
                     96:        {
                     97:                pname = strrchr(nv->name, ':');
                     98:                if(pname)
                     99:                        pname++;
                    100:                else
                    101:                        pname = nv->name;
                    102:                if(strcmp(pname, Name)==0)
                    103:                        p = nv->value;
                    104:        }
                    105:        return p;
                    106: }
                    107: #endif
                    108: 
                    109: /* debug all-in-one function 
                    110:  * do parsing then display to stdout */
                    111: #ifdef DEBUG
                    112: void
                    113: DisplayNameValueList(char * buffer, int bufsize)
                    114: {
                    115:     struct NameValueParserData pdata;
                    116:     struct NameValue * nv;
                    117:     ParseNameValue(buffer, bufsize, &pdata);
                    118:     for(nv = pdata.head.lh_first;
                    119:         nv != NULL;
                    120:         nv = nv->entries.le_next)
                    121:     {
                    122:         printf("%s = %s\n", nv->name, nv->value);
                    123:     }
                    124:     ClearNameValueList(&pdata);
                    125: }
                    126: #endif
                    127: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>