ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/ezxml.c
(Generate patch)

Comparing ray/src/common/ezxml.c (file contents):
Revision 2.4 by greg, Sat Jun 11 01:04:08 2011 UTC vs.
Revision 2.9 by schorsch, Sun Mar 6 01:13:17 2016 UTC

# Line 25 | Line 25 | static const char RCSid[] = "$Id$";
25   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26   */
27  
28 + #if defined(_WIN32) || defined(_WIN64)
29 + #define EZXML_NOMMAP
30 + #endif
31 +
32   #include <stdlib.h>
33   #include <stdio.h>
34   #include <stdarg.h>
# Line 38 | Line 42 | static const char RCSid[] = "$Id$";
42   #include <sys/stat.h>
43   #include "ezxml.h"
44  
45 < #ifdef _WIN32
42 < #include <io.h>
43 < #define read            _read
44 < #define open            _open
45 < #define close           _close  
46 < #endif
45 > #include "platform.h"
46  
47   #define EZXML_WS   "\t\r\n "  /* whitespace */
48   #define EZXML_ERRL 128        /* maximum error string length */
# Line 74 | Line 73 | ezxml_t ezxml_child(ezxml_t xml, const char *name)
73      return xml;
74   }
75  
76 + /* returns the given tag's character content or empty string if none */
77 + char *ezxml_txt(ezxml_t xml)
78 + {
79 +        if (xml == NULL)
80 +                return "";
81 +        return xml->txt;
82 + }
83 +
84   /* returns the Nth tag with the same name in the same subsection or NULL if not */
85   /* found */
86   ezxml_t ezxml_idx(ezxml_t xml, int idx)
# Line 170 | Line 177 | char *ezxml_decode(char *s, char **ent, char t)
177      char *e, *r = s, *m = s;
178      long b, c, d, l;
179  
180 <    for (; *s; s++) { /* normalize line endings */
181 <        while (*s == '\r') {
182 <            *(s++) = '\n';
183 <            if (*s == '\n') memmove(s, (s + 1), strlen(s));
184 <        }
185 <    }
180 >    for (; *s; s++)     /* normalize line endings */
181 >        if (*s == '\r') {
182 >            char *s2 = s+1;
183 >            do {
184 >                while (*s2 == '\r')
185 >                    ++s2;
186 >                *s++ = *s2;
187 >            } while (*s2++);
188 >            break;
189 >        }
190      
191      for (s = r; ; ) {
192          while (*s && *s != '&' && (*s != '%' || t != '%') && !isspace(*s)) s++;
# Line 370 | Line 381 | short ezxml_internal_dtd(ezxml_root_t root, char *s, s
381              if (*(s = t + strcspn(t, EZXML_WS ">")) == '>') continue;
382              else *s = '\0'; /* null terminate tag name */
383              for (i = 0; root->attr[i] && strcmp(n, root->attr[i][0]); i++);
384 <
385 <            while (*(n = ++s + strspn(s, EZXML_WS)) && *n != '>') {
384 >            ++s;
385 >            while (*(n = s + strspn(s, EZXML_WS)) && *n != '>') {
386                  if (*(s = n + strcspn(n, EZXML_WS))) *s = '\0'; /* attr name */
387                  else { ezxml_err(root, t, "malformed <!ATTLIST"); break; }
388  
# Line 412 | Line 423 | short ezxml_internal_dtd(ezxml_root_t root, char *s, s
423                  root->attr[i][j + 1] = (v) ? ezxml_decode(v, root->ent, *c)
424                                             : NULL;
425                  root->attr[i][j] = n; /* attribute name  */
426 +                ++s;
427              }
428          }
429          else if (! strncmp(s, "<!--", 4)) s = strstr(s + 4, "-->"); /* comments */
# Line 917 | Line 929 | ezxml_t ezxml_add_child(ezxml_t xml, const char *name,
929   ezxml_t ezxml_set_txt(ezxml_t xml, const char *txt)
930   {
931      if (! xml) return NULL;
932 +    if (txt == xml->txt) return xml;
933      if (xml->flags & EZXML_TXTM) free(xml->txt); /* existing txt was malloced */
934      xml->flags &= ~EZXML_TXTM;
935      xml->txt = (char *)txt;
936      return xml;
937 + }
938 +
939 + /* add text to the current character content, allocating memory as needed (GW) */
940 + ezxml_t ezxml_add_txt(ezxml_t xml, const char *txt)
941 + {
942 +        int     len;
943 +        if (! xml) return NULL;
944 +        if (!*txt) return xml;
945 +        len = strlen(xml->txt) + strlen(txt) + 1;
946 +        if (xml->flags & EZXML_TXTM) {
947 +                xml->txt = (char *)realloc(xml->txt, len);
948 +        } else {
949 +                xml->txt = strcpy((char *)malloc(len), xml->txt);
950 +                xml->flags |= EZXML_TXTM;
951 +        }
952 +        strcat(xml->txt, txt);
953 +        return xml;
954   }
955  
956   /* Sets the given tag attribute or adds a new attribute if not found. A value */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines