ttxml: modified it to use a smaller buffer during testing
authorDaniel Burke <dan.p.burke@gmail.com>
Mon, 5 Sep 2011 09:24:03 +0000 (18:54 +0930)
committerDaniel Burke <dan.p.burke@gmail.com>
Mon, 5 Sep 2011 09:24:03 +0000 (18:54 +0930)
ccan/ttxml/_info
ccan/ttxml/test/run.c
ccan/ttxml/test/test.xml2
ccan/ttxml/test/test.xml3
ccan/ttxml/test/test.xml4
ccan/ttxml/ttxml.c
ccan/ttxml/ttxml.h

index 9bf0ddbcdebe9adb688670ec343145a591912cd9..3ec45207bff73e09531ab160284e18bc9d7dcbe6 100644 (file)
@@ -6,6 +6,26 @@
  *
  * This parses an XML file into a convenient data structure.
  *
+ * Example:
+ * #include <ccan/ttxml/ttxml.h>
+ * #include <stdio.h>
+ *
+ * int main(int argc, char *argv[])
+ * {
+ *     XmlNode *xml, *tmp;
+ *
+ *     xml = xml_load("./test/test.xml2");
+ *     if(!xml)return 1;
+ *
+ *     tmp = xml_find(xml, "childnode");
+ *
+ *     printf("%s: %s\n", xml->name, xml_attr(tmp, "attribute"));
+ *
+ *     xml_free(xml);
+ *
+ *     return 0;
+ * }
+ *
  * License: GPL
  * Author: Daniel Burke <dan.p.burke@gmail.com>
  */
index 682bf35db53e4913783d614df9b14439eeeba9d5..539e6d09c749ec4026030aa47d143203ed212dc7 100644 (file)
@@ -1,5 +1,8 @@
 #include <ccan/ttxml/ttxml.h>
 /* Include the C files directly. */
+
+#define BUFFER 40      /* use a stupidly small buffer to stomp out bugs */
+
 #include <ccan/ttxml/ttxml.c>
 #include <ccan/tap/tap.h>
 
@@ -35,41 +38,13 @@ static int test_load(const char * filename)
        return 1;
 }
 
-static int test_find(void)
-{
-       char *ctmp;
-       XmlNode *xtmp, *xml = xml_load("./test/test.xml2");
-       if(!xml)return 0;
-
-       xp(xml, 0, 20);
-
-
-       xtmp = xml_find(xml, "one");
-       if(!xtmp)
-       {
-               printf("Failed to find node\n");        
-               return 0;
-       }
-       printf("node is...\n");
-       xp(xtmp, 0, 20);
-
-       ctmp = xml_attr(xtmp, "barfoo");
-       if(!ctmp)
-       {
-               printf("Failed to find attribute\n");
-               return 0;
-       }
-
-       return 1;
-}
-
 int main(void)
 {
        XmlNode *x, *t;
        /* This is how many tests you plan to run */
-       plan_tests(13);
+       plan_tests(12);
 
-       ok1(x = xml_load("./test/test.xml2"));
+       ok1(x = xml_load("./test/test.xml1"));
        ok1(!xml_find(x, "Doesn't Exist"));
        ok1(t = xml_find(x, "one"));
        ok1(xml_find(t, "two"));
@@ -79,11 +54,10 @@ int main(void)
        xml_free(x);
        /* Simple thing we expect to succeed */
        ok1(!test_load("does not exist")); /* A file that doesn't exist */
-       ok1(test_load("./test/test.xml")); /* A very large xml file. */
-       ok1(test_load("./test/test.xml2")); /* A basic xml file. */
-       ok1(test_load("./test/test.xml3")); /* Very small well-formed xml file. */
-       ok1(test_load("./test/test.xml4")); /* Smallest well-formed xml file. */
-       ok1(test_load("./test/test.xml5")); /* A single unclosed tag. */
+       ok1(test_load("./test/test.xml1")); /* A basic xml file. */
+       ok1(test_load("./test/test.xml2")); /* Very small well-formed xml file. */
+       ok1(test_load("./test/test.xml3")); /* Smallest well-formed xml file. */
+       ok1(test_load("./test/test.xml4")); /* A single unclosed tag. */
        /* Same, with an explicit description of the test. */
 //     ok(some_test(), "%s with no args should return 1", "some_test")
        /* How to print out messages for debugging. */
index b87c39eac087d18f61cbaa624412a3c40becb0f1..bf8ae7b6b029eb4a436130e502d79b00365ec627 100644 (file)
@@ -1,9 +1 @@
-<xmlthisisaverylongtagnameIhopeitmesseswithyourstuff>\r
-       foobar\r
-       <one foobar barfoo="Hello \"World\"!" foo=bar>\r
-               <two/>\r
-       \r
-       </one>\r
-       <one></one>\r
-       <one></one>\r
-</xml>\r
+<xml/><one barfoo3></one></xml>\r
index ded336e68af89cd16cfa533e8eb5b0ff6e9c19f8..86378fe9ea01796562be09c0ae67546bd54a578b 100644 (file)
@@ -1 +1 @@
-<xml/><one barfoo></one></xml>\r
+<xmltag/>\r
index 86378fe9ea01796562be09c0ae67546bd54a578b..8d59ed40055f6f6aa225f60435ede1ddb0081123 100644 (file)
@@ -1 +1 @@
-<xmltag/>\r
+<xmltag>\r
index 4e1cbbd4d2bac4841fcc0a631570ef9cbde95742..5a0d457d33644d5ac23ec585f57c75a3c3a079d3 100644 (file)
@@ -6,8 +6,10 @@
 \r
 #include "ttxml.h"\r
 \r
-\r
+#ifndef BUFFER\r
 #define BUFFER 3264\r
+#endif\r
+\r
 \r
 #define XML_LETTER     1\r
 #define XML_NUMBER     2\r
@@ -33,7 +35,7 @@ typedef struct XMLBUF
 \r
 \r
 /* Allocate a new XmlNode */\r
-XmlNode* xml_new(char * name)\r
+static XmlNode* xml_new(char * name)\r
 {\r
        XmlNode * ret = malloc(sizeof(XmlNode));\r
        if(!ret)return NULL;\r
@@ -95,7 +97,6 @@ static void xml_read_file(XMLBUF *xml)
        size = fread( xml->buf, 1, xml->len, xml->fptr);\r
        if( size != xml->len )\r
        {\r
-               printf("Buffer reduction\n");\r
                xml->len = size;\r
                xml->buf[size]=0;\r
                xml->eof = 1;\r
@@ -333,10 +334,7 @@ XmlNode* xml_load(const char * filename)
        xml.read_index = 0;\r
        xml.fptr = fopen(filename, "rb");\r
        if(!xml.fptr)\r
-       {\r
-               printf("Opening file failed\n");\r
                return NULL;\r
-       }\r
 \r
        xml.buf = malloc(BUFFER+1);\r
        xml.buf[BUFFER]=0;\r
@@ -384,59 +382,3 @@ char* xml_attr(XmlNode *x, const char *name)
 }\r
 \r
 \r
-#ifdef TEST\r
-/* print out the heirarchy of an XML file, useful for debugging */\r
-void xp(XmlNode *x, int level, int max)\r
-{\r
-       int i;\r
-       char text[] = "text";\r
-       char *name = text;\r
-       if(level > max)return;\r
-       if(!x)return;\r
-       if(x->name)name = x->name;\r
-       for(i=0; i<level; i++)printf("    ");\r
-       printf("%s:", name);\r
-       if(x->name)\r
-       for(i=0; i<x->nattrib; i++)\r
-               printf("%s=\"%s\",", x->attrib[i*2], x->attrib[i*2+1]);\r
-       else printf("%s", x->attrib[0]);\r
-       printf("\n");\r
-       if(x->child)xp(x->child, level+1, max);\r
-       if(x->next)xp(x->next, level, max);\r
-}\r
-\r
-\r
-int main(int argc, char *argv[])\r
-{\r
-       XmlNode *x, *tmp;\r
-       \r
-       if(!argv[1])\r
-       {\r
-               printf("USAGE: %s name\n\t reads name where name is an XML file.\n",\r
-                               argv[0]);\r
-               return 1;\r
-       }\r
-\r
-#ifdef PROFILE\r
-       for(int i=0; i<1000; i++)\r
-       {\r
-#endif\r
-               x = xml_load(argv[1]);\r
-\r
-               if(!x)\r
-               {\r
-                       printf("Failed to load.\n");\r
-                       return 2;\r
-               }\r
-#ifndef PROFILE\r
-               xp(x, 1, 20);\r
-#endif\r
-               xml_free(x);\r
-#ifdef PROFILE\r
-       }\r
-#endif\r
-\r
-       return 0;\r
-}\r
-#endif\r
-\r
index 4b5017771ca8b3829cc595b9c8ca0305c9373a8e..33cb64fe977add4d6b67ef60f4deedc00d618f18 100644 (file)
@@ -1,4 +1,36 @@
+#ifndef CCAN_TTXML_H
+#define CCAN_TTXML_H
 
+/**
+ * ttxml - tiny XML library for parsing (trusted!) XML documents.
+ *
+ * This parses an XML file into a convenient data structure.
+ *
+ * Example:
+ * #include <ccan/ttxml/ttxml.h>
+ * #include <stdio.h>
+ *
+ * int main(int argc, char *argv[])
+ * {
+ *     XmlNode *xml, *tmp;
+ *
+ *     xml = xml_load("./test/test.xml2");
+ *     if(!xml)return 1;
+ *
+ *     tmp = xml_find(xml, "childnode");
+ *
+ *     printf("%s: %s\n", xml->name, xml_attr(tmp, "attribute"));
+ *
+ *     xml_free(xml);
+ *
+ *     return 0;
+ * }
+ *
+ * License: GPL
+ * Author: Daniel Burke <dan.p.burke@gmail.com>
+ */
+
+/* Every node is one of these */
 typedef struct XmlNode {
        char * name;
        char ** attrib;
@@ -7,10 +39,19 @@ typedef struct XmlNode {
        struct XmlNode * next;
 } XmlNode;
 
+/* It's all pretty straight forward except for the attrib.
+ *
+ * Attrib is an array of char*, that is 2x the size of nattrib.
+ * Each pair of char* points to the attribute name & the attribute value,
+ * if present.
+ *
+ * If it's a text node, then name = "text", and attrib[1] = the body of text.
+ * This is the only case where there will be an attribute with a null name.
+ */
 
-XmlNode* xml_new(char * name);
 XmlNode* xml_load(const char * filename);
 void xml_free(XmlNode *target);
 char* xml_attr(XmlNode *x, const char *name);
 XmlNode * xml_find(XmlNode *xml, const char *name);
 
+#endif /* CCAN_TTXML_H */