1/* MiniUPnP project
2 * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
3 *
4 * Copyright (c) 2006, Thomas Bernard
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *     * Redistributions of source code must retain the above copyright
10 *       notice, this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above copyright
12 *       notice, this list of conditions and the following disclaimer in the
13 *       documentation and/or other materials provided with the distribution.
14 *     * The name of the author may not be used to endorse or promote products
15 *       derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29#include <stdlib.h>
30#include <string.h>
31#include <stdio.h>
32
33#include "upnpreplyparse.h"
34#include "minixml.h"
35
36static void
37NameValueParserStartElt(void * d, const char * name, int l)
38{
39    struct NameValueParserData * data = (struct NameValueParserData *)d;
40    if(l>63)
41        l = 63;
42    memcpy(data->curelt, name, l);
43    data->curelt[l] = '\0';
44
45    /* store root element */
46    if(!data->head.lh_first)
47    {
48        struct NameValue * nv;
49        nv = malloc(sizeof(struct NameValue)+l+1);
50        strcpy(nv->name, "rootElement");
51        memcpy(nv->value, name, l);
52        nv->value[l] = '\0';
53        LIST_INSERT_HEAD(&(data->head), nv, entries);
54    }
55}
56
57static void
58NameValueParserGetData(void * d, const char * datas, int l)
59{
60    struct NameValueParserData * data = (struct NameValueParserData *)d;
61    struct NameValue * nv;
62    if(l>1975)
63        l = 1975;
64    nv = malloc(sizeof(struct NameValue)+l+1);
65    strncpy(nv->name, data->curelt, 64);
66    nv->name[63] = '\0';
67    memcpy(nv->value, datas, l);
68    nv->value[l] = '\0';
69    LIST_INSERT_HEAD(&(data->head), nv, entries);
70}
71
72void
73ParseNameValue(const char * buffer, int bufsize,
74                    struct NameValueParserData * data, uint32_t flags)
75{
76    struct xmlparser parser;
77    LIST_INIT(&(data->head));
78    /* init xmlparser object */
79    parser.xmlstart = buffer;
80    parser.xmlsize = bufsize;
81    parser.data = data;
82    parser.starteltfunc = NameValueParserStartElt;
83    parser.endeltfunc = 0;
84    parser.datafunc = NameValueParserGetData;
85    parser.attfunc = 0;
86    parser.flags = flags;
87    parsexml(&parser);
88}
89
90void
91ClearNameValueList(struct NameValueParserData * pdata)
92{
93    struct NameValue * nv;
94    while((nv = pdata->head.lh_first) != NULL)
95    {
96        LIST_REMOVE(nv, entries);
97        free(nv);
98    }
99}
100
101char *
102GetValueFromNameValueList(struct NameValueParserData * pdata,
103                          const char * Name)
104{
105    struct NameValue * nv;
106    char * p = NULL;
107    for(nv = pdata->head.lh_first;
108        (nv != NULL) && (p == NULL);
109        nv = nv->entries.le_next)
110    {
111        if(strcmp(nv->name, Name) == 0)
112            p = nv->value;
113    }
114    return p;
115}
116
117/* debug all-in-one function
118 * do parsing then display to stdout */
119#ifdef DEBUG
120void
121DisplayNameValueList(char * buffer, int bufsize)
122{
123    struct NameValueParserData pdata;
124    struct NameValue * nv;
125    ParseNameValue(buffer, bufsize, &pdata, 0);
126    for(nv = pdata.head.lh_first;
127        nv != NULL;
128        nv = nv->entries.le_next)
129    {
130        printf("%s = %s\n", nv->name, nv->value);
131    }
132    ClearNameValueList(&pdata);
133}
134#endif
135
136