]> git.ozlabs.org Git - ccan/commitdiff
ttxml: Passes Valgrind now
authorDaniel Burke <dan.p.burke@gmail.com>
Mon, 5 Sep 2011 07:38:46 +0000 (17:08 +0930)
committerDaniel Burke <dan.p.burke@gmail.com>
Mon, 5 Sep 2011 07:38:46 +0000 (17:08 +0930)
Removed the last references of the old buffering method. Should be
stable now. Time to write some proper testing.

ccan/ttxml/ttxml.c

index 791ced7cd4e65273d4eea06027acc2f8b74d24f1..f9d00ef4b63f61bf63294baf8d523cd9640f8545 100644 (file)
@@ -9,7 +9,6 @@
 \r
 #define BUFFER 3264\r
 \r
-\r
 #define XML_LETTER     1\r
 #define XML_NUMBER     2\r
 #define XML_SPACE      4\r
@@ -62,10 +61,8 @@ void xml_free(XmlNode *target)
        free(target);\r
 }\r
 \r
-/* raise flags if we have a character of special meaning\r
- *\r
+/* Raise flags if we have a character of special meaning.\r
  * This is where I've hidden the switch statements :-p\r
- *\r
  */\r
 int is_special(char item)\r
 {\r
@@ -88,14 +85,17 @@ int is_special(char item)
        return 128;\r
 }\r
 \r
-/* Refresh the buffer, expects not to be called when EOF */\r
+/* Refresh the buffer, if possible */\r
 static void xml_read_file(XMLBUF *xml)\r
 {\r
        int size;\r
        \r
+       if(xml->eof)return;\r
+         \r
        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
@@ -117,7 +117,11 @@ static char xml_read_byte(XMLBUF *xml)
        xml->read_index++;\r
        if(xml->read_index >= xml->len)\r
        {\r
-               if(xml->eof)return ret;\r
+               if(xml->eof)\r
+               {\r
+                 xml->read_index = xml->len;\r
+                 return ret;\r
+               }\r
                xml->read_index = 0 ;\r
                xml_read_file(xml);\r
        }\r
@@ -128,8 +132,7 @@ static char xml_read_byte(XMLBUF *xml)
 /* skip over bytes matching the is_special mask */\r
 static void xml_skip( XMLBUF *xml, int mask)\r
 {\r
-       printf("just called\n");\r
-       while( is_special(xml_peek(xml)) & mask && xml->len )\r
+       while( is_special(xml_peek(xml)) & mask && !(xml->eof && xml->read_index >= xml->len) )\r
                xml_read_byte(xml);\r
 }\r
 \r
@@ -337,12 +340,11 @@ XmlNode* xml_load(const char * filename)
 \r
        xml.buf = malloc(BUFFER+1);\r
        xml.buf[BUFFER]=0;\r
+       xml.len = BUFFER;\r
        if(!xml.buf)\r
                goto xml_load_fail_malloc_buf;\r
        \r
-       xml.len = fread(xml.buf, 1, BUFFER, xml.fptr);\r
-       if(xml.len < BUFFER)\r
-               xml.eof = 1;\r
+       xml_read_file(&xml);\r
 \r
        ret = xml_parse(&xml);\r
 \r
@@ -407,8 +409,7 @@ void xp(XmlNode *x, int level, int max)
 int main(int argc, char *argv[])\r
 {\r
        XmlNode *x, *tmp;\r
-       int i;\r
-\r
+       \r
        if(!argv[1])\r
        {\r
                printf("USAGE: %s name\n\t reads name where name is an XML file.\n",\r
@@ -417,7 +418,7 @@ int main(int argc, char *argv[])
        }\r
 \r
 #ifdef PROFILE\r
-       for(i=0; i<1000; i++)\r
+       for(int i=0; i<1000; i++)\r
        {\r
 #endif\r
                x = xml_load(argv[1]);\r
@@ -435,10 +436,6 @@ int main(int argc, char *argv[])
        }\r
 #endif\r
 \r
-       \r
-//     tmp = xml_find(x, "geometry");\r
-//     xp(x, 1, 6);\r
-//     printf("Happily free.\n");\r
        return 0;\r
 }\r
 #endif\r