Annotation of embedaddon/miniupnpc/upnpreplyparse.c, revision 1.1

1.1     ! misho       1: /* $Id: upnpreplyparse.c,v 1.11 2011/02/07 16:17:06 nanard Exp $ */
        !             2: /* MiniUPnP project
        !             3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
        !             4:  * (c) 2006-2011 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:        if(strcmp(data->curelt, "NewPortListing") == 0)
        !            31:        {
        !            32:                /* specific case for NewPortListing which is a XML Document */
        !            33:                data->portListing = malloc(l + 1);
        !            34:                if(!data->portListing)
        !            35:                {
        !            36:                        /* malloc error */
        !            37:                        return;
        !            38:                }
        !            39:                memcpy(data->portListing, datas, l);
        !            40:                data->portListing[l] = '\0';
        !            41:                data->portListingLength = l;
        !            42:        }
        !            43:        else
        !            44:        {
        !            45:                /* standard case. Limited to 63 chars strings */
        !            46:            nv = malloc(sizeof(struct NameValue));
        !            47:            if(l>63)
        !            48:                l = 63;
        !            49:            strncpy(nv->name, data->curelt, 64);
        !            50:                nv->name[63] = '\0';
        !            51:            memcpy(nv->value, datas, l);
        !            52:            nv->value[l] = '\0';
        !            53:            LIST_INSERT_HEAD( &(data->head), nv, entries);
        !            54:        }
        !            55: }
        !            56: 
        !            57: void
        !            58: ParseNameValue(const char * buffer, int bufsize,
        !            59:                struct NameValueParserData * data)
        !            60: {
        !            61:     struct xmlparser parser;
        !            62:     LIST_INIT(&(data->head));
        !            63:        data->portListing = NULL;
        !            64:        data->portListingLength = 0;
        !            65:     /* init xmlparser object */
        !            66:     parser.xmlstart = buffer;
        !            67:     parser.xmlsize = bufsize;
        !            68:     parser.data = data;
        !            69:     parser.starteltfunc = NameValueParserStartElt;
        !            70:     parser.endeltfunc = 0;
        !            71:     parser.datafunc = NameValueParserGetData;
        !            72:        parser.attfunc = 0;
        !            73:     parsexml(&parser);
        !            74: }
        !            75: 
        !            76: void
        !            77: ClearNameValueList(struct NameValueParserData * pdata)
        !            78: {
        !            79:     struct NameValue * nv;
        !            80:        if(pdata->portListing)
        !            81:        {
        !            82:                free(pdata->portListing);
        !            83:                pdata->portListing = NULL;
        !            84:                pdata->portListingLength = 0;
        !            85:        }
        !            86:     while((nv = pdata->head.lh_first) != NULL)
        !            87:     {
        !            88:         LIST_REMOVE(nv, entries);
        !            89:         free(nv);
        !            90:     }
        !            91: }
        !            92: 
        !            93: char * 
        !            94: GetValueFromNameValueList(struct NameValueParserData * pdata,
        !            95:                           const char * Name)
        !            96: {
        !            97:     struct NameValue * nv;
        !            98:     char * p = NULL;
        !            99:     for(nv = pdata->head.lh_first;
        !           100:         (nv != NULL) && (p == NULL);
        !           101:         nv = nv->entries.le_next)
        !           102:     {
        !           103:         if(strcmp(nv->name, Name) == 0)
        !           104:             p = nv->value;
        !           105:     }
        !           106:     return p;
        !           107: }
        !           108: 
        !           109: #if 0
        !           110: /* useless now that minixml ignores namespaces by itself */
        !           111: char *
        !           112: GetValueFromNameValueListIgnoreNS(struct NameValueParserData * pdata,
        !           113:                                   const char * Name)
        !           114: {
        !           115:        struct NameValue * nv;
        !           116:        char * p = NULL;
        !           117:        char * pname;
        !           118:        for(nv = pdata->head.lh_first;
        !           119:            (nv != NULL) && (p == NULL);
        !           120:                nv = nv->entries.le_next)
        !           121:        {
        !           122:                pname = strrchr(nv->name, ':');
        !           123:                if(pname)
        !           124:                        pname++;
        !           125:                else
        !           126:                        pname = nv->name;
        !           127:                if(strcmp(pname, Name)==0)
        !           128:                        p = nv->value;
        !           129:        }
        !           130:        return p;
        !           131: }
        !           132: #endif
        !           133: 
        !           134: /* debug all-in-one function 
        !           135:  * do parsing then display to stdout */
        !           136: #ifdef DEBUG
        !           137: void
        !           138: DisplayNameValueList(char * buffer, int bufsize)
        !           139: {
        !           140:     struct NameValueParserData pdata;
        !           141:     struct NameValue * nv;
        !           142:     ParseNameValue(buffer, bufsize, &pdata);
        !           143:     for(nv = pdata.head.lh_first;
        !           144:         nv != NULL;
        !           145:         nv = nv->entries.le_next)
        !           146:     {
        !           147:         printf("%s = %s\n", nv->name, nv->value);
        !           148:     }
        !           149:     ClearNameValueList(&pdata);
        !           150: }
        !           151: #endif
        !           152: 

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