| /* Copyright (c) 2013 Yoran Heling |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to |
| permit persons to whom the Software is furnished to do so, subject to |
| the following conditions: |
| |
| The above copyright notice and this permission notice shall be included |
| in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #include <assert.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include <assert.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| |
| #if defined(STRLEN) |
| static void xmlbench(const char *buf, size_t bufsize) { |
| size_t l = strlen(buf); |
| assert(l == bufsize); |
| } |
| |
| |
| #elif defined(YXML) |
| #include <yxml.h> |
| static void xmlbench(const char *buf, size_t bufsize) { |
| yxml_t x[1]; |
| char *stack = malloc(4096); |
| yxml_init(x, stack, 4096); |
| yxml_ret_t r; |
| do { |
| r = yxml_parse(x, *buf); |
| buf++; |
| } while(*buf && r >= 0); |
| if(r >= 0) |
| r = yxml_eof(x); |
| /*printf("t%03lu l%03u b%03lu: %c %d", x->total, x->line, x->byte, *buf, r);*/ |
| assert(!*buf && r == YXML_OK); |
| } |
| |
| |
| #elif defined(EXPAT) |
| #include <expat.h> |
| static void xmlbench(const char *buf, size_t bufsize) { |
| XML_Parser p = XML_ParserCreate(NULL); |
| int r = XML_Parse(p, buf, bufsize, 1); |
| assert(r != XML_STATUS_ERROR); |
| XML_ParserFree(p); |
| } |
| |
| |
| #elif defined(LIBXML2) |
| #include <libxml/xmlreader.h> |
| static void xmlbench(const char *buf, size_t bufsize) { |
| xmlTextReaderPtr p = xmlReaderForMemory(buf, bufsize, NULL, NULL, 0); |
| while(xmlTextReaderRead(p) == 1) |
| ; |
| xmlFreeTextReader(p); |
| } |
| |
| |
| #elif defined(MXML) |
| #include <mxml.h> |
| static void sax_cb(mxml_node_t *node, mxml_sax_event_t event, void *data) { |
| static int i; |
| /* Only retain the root node, to make sure that we don't get NULL. */ |
| if(event == MXML_SAX_ELEMENT_OPEN && !i) { |
| mxmlRetain(node); |
| i=1; |
| } |
| } |
| static void xmlbench(const char *buf, size_t bufsize) { |
| mxml_node_t *n = mxmlSAXLoadString(NULL, buf, MXML_NO_CALLBACK, sax_cb, NULL); |
| assert(n); |
| } |
| |
| |
| #else |
| #error No idea what to bench |
| #endif |
| |
| |
| int main(int argc, char **argv) { |
| struct stat st; |
| ssize_t r; |
| |
| assert(argc == 2); |
| r = stat(argv[1], &st); |
| assert(!r); |
| |
| char *buf = malloc(st.st_size+1); |
| assert(buf); |
| |
| int fd = open(argv[1], O_RDONLY); |
| assert(fd > 0); |
| |
| ssize_t rd = read(fd, buf, st.st_size); |
| assert(rd == st.st_size); |
| buf[st.st_size] = 0; |
| close(fd); |
| |
| xmlbench(buf, st.st_size); |
| return 0; |
| } |
| |
| /* vim: set noet sw=4 ts=4: */ |