1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/* Copyright 2018-2018 University Corporation for Atmospheric
Research/Unidata. */
#include <stdlib.h>
#include <string.h>
#include "ncxml.h"
#include "ezxml.h"
#ifndef nulldup
#define nulldup(s) ((s)?strdup(s):NULL)
#endif
static int ncxml_initialized = 0;
void
ncxml_initialize(void)
{
ncxml_initialized = 1;
}
void
ncxml_finalize(void)
{
ncxml_initialized = 0;
}
ncxml_doc_t
ncxml_parse(char* contents, size_t len)
{
return (ncxml_t)ezxml_parse_str(contents,len);
}
void
ncxml_free(ncxml_doc_t doc0)
{
ezxml_t doc = (ezxml_t)doc0;
ezxml_free(doc);
}
ncxml_t
ncxml_root(ncxml_doc_t doc0)
{
ezxml_t doc = (ezxml_t)doc0;
return (ncxml_t)doc;
}
const char*
ncxml_name(ncxml_t xml0)
{
ezxml_t xml = (ezxml_t)xml0;
return (xml?xml->name:NULL);
}
char*
ncxml_attr(ncxml_t xml0, const char* key)
{
ezxml_t xml = (ezxml_t)xml0;
return nulldup(ezxml_attr(xml,key));
}
ncxml_t
ncxml_child(ncxml_t xml0, const char* name)
{
ezxml_t xml = (ezxml_t)xml0;
return (ncxml_t)ezxml_child(xml,name);
}
ncxml_t
ncxml_next(ncxml_t xml0, const char* name)
{
ezxml_t xml = (ezxml_t)xml0;
(void)name; /* unused */
return (ncxml_t)ezxml_next(xml);
}
char*
ncxml_text(ncxml_t xml0)
{
ezxml_t xml = (ezxml_t)xml0;
return (xml?strdup(xml->txt):strdup(""));
}
/* Nameless versions of child and next */
ncxml_t
ncxml_child_first(ncxml_t xml0)
{
ezxml_t xml = (ezxml_t)xml0;
return (xml?xml->child:NULL);
}
ncxml_t
ncxml_child_next(ncxml_t xml0)
{
ezxml_t xml = (ezxml_t)xml0;
return (xml?xml->ordered:NULL);
}
int
ncxml_attr_pairs(ncxml_t xml0, char*** pairsp)
{
char** pairs = NULL;
ezxml_t xml = (ezxml_t)xml0;
if(xml) {
/* First count */
int i,count = 0;
const char** p = (const char**)xml->attr;
for(count=0;*p;p+=2)
count++; /* pair count */
pairs = (char**)malloc(sizeof(char*)*((2*count)+1));
if(pairs == NULL) return 0;
p = (const char**)xml->attr;
for(i=0;*p;p+=2,i+=2) {
pairs[i] = strdup(p[0]);
pairs[i+1] = strdup(p[1]);
}
pairs[2*count] = NULL;
if(pairsp) *pairsp = pairs;
return 1;
}
return 0;
}
|