Annotation of embedaddon/miniupnpd/upnpreplyparse.c, revision 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>