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>