From b189d0d2fb0c91c3ee843c1bd4667bf904a4bf16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederico=20Gon=C3=A7alves?= Date: Mon, 29 Nov 2010 00:41:08 +0000 Subject: [PATCH 1/5] Branch entrega --- Makefile | 8 +- bindings/Makefile | 14 - bindings/helpers.c | 45 - bindings/helpers.h | 32 - bindings/python/Makefile | 22 - bindings/python/libxmlquery.i | 41 - bindings/python/test.py | 9 - bindings/python/xmlquery.py | 118 - documentation/Makefile | 138 -- .../_theme/nature/static/nature.css_t | 238 -- .../_theme/nature/static/pygments.css | 54 - documentation/_theme/nature/theme.conf | 4 - documentation/applications/shell.rst | 87 - documentation/commit.sh | 12 - documentation/conf.py | 257 --- .../data_structures/datastructures.rst | 856 ------- documentation/dom.rst | 373 ---- documentation/index.rst | 30 - documentation/macros.h.rst | 95 - documentation/parser/parser.rst | 94 - documentation/querying.rst | 102 - documentation/tutorial/tutorial.rst | 196 -- main.c | 135 -- profiling/Makefile | 3 - profiling/com_remove_dups_e_quick_sort.gprof | 741 ------- profiling/com_remove_dups_e_quick_sort.massif | 1958 ----------------- profiling/dom_size.c | 71 - profiling/sem_remove_dups_e_quick_sort.gprof | 765 ------- profiling/sem_remove_dups_e_quick_sort.massif | 1140 ---------- test.xml | 37 - 30 files changed, 2 insertions(+), 7673 deletions(-) delete mode 100644 bindings/Makefile delete mode 100644 bindings/helpers.c delete mode 100644 bindings/helpers.h delete mode 100644 bindings/python/Makefile delete mode 100644 bindings/python/libxmlquery.i delete mode 100644 bindings/python/test.py delete mode 100644 bindings/python/xmlquery.py delete mode 100644 documentation/Makefile delete mode 100644 documentation/_theme/nature/static/nature.css_t delete mode 100644 documentation/_theme/nature/static/pygments.css delete mode 100644 documentation/_theme/nature/theme.conf delete mode 100644 documentation/applications/shell.rst delete mode 100755 documentation/commit.sh delete mode 100644 documentation/conf.py delete mode 100644 documentation/data_structures/datastructures.rst delete mode 100644 documentation/dom.rst delete mode 100644 documentation/index.rst delete mode 100644 documentation/macros.h.rst delete mode 100644 documentation/parser/parser.rst delete mode 100644 documentation/querying.rst delete mode 100644 documentation/tutorial/tutorial.rst delete mode 100644 main.c delete mode 100644 profiling/Makefile delete mode 100644 profiling/com_remove_dups_e_quick_sort.gprof delete mode 100644 profiling/com_remove_dups_e_quick_sort.massif delete mode 100644 profiling/dom_size.c delete mode 100644 profiling/sem_remove_dups_e_quick_sort.gprof delete mode 100644 profiling/sem_remove_dups_e_quick_sort.massif delete mode 100644 test.xml diff --git a/Makefile b/Makefile index 41d6c9d..7b3d32c 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,8 @@ DOM_SRC = ./dom PARSER_SRC = ./parser STRUCTS = ./data_structures SELECTORS = ./selectors -OUT = dom_parser -all: exec so +all: so object_code: make -C $(DOM_SRC) all @@ -14,15 +13,12 @@ object_code: make -C $(STRUCTS) all make -C $(SELECTORS) all -exec: object_code - $(CC) $(CFLAGS) -o $(OUT) $(PARSER_SRC)/*.o $(DOM_SRC)/*.o $(STRUCTS)/*.o $(SELECTORS)/*.o main.c - clean: make -C $(DOM_SRC) clean make -C $(PARSER_SRC) clean make -C $(STRUCTS) clean make -C $(SELECTORS) clean - rm -rf *~ *.o $(OUT) libxmlquery.so + rm -rf *~ *.o libxmlquery.so so: object_code $(CC) $(CFLAGS) $(PARSER_SRC)/*.o $(DOM_SRC)/*.o $(STRUCTS)/*.o $(SELECTORS)/*.o -shared -o libxmlquery.so \ No newline at end of file diff --git a/bindings/Makefile b/bindings/Makefile deleted file mode 100644 index bc38a30..0000000 --- a/bindings/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -include ../Makefile.inc - -PYTHON = ./python - -all: helpers.o - make -C $(PYTHON) all - -helpers.o: helpers.c helpers.h - $(CC) $(CFLAGS) -c helpers.c - -clean: - make -C $(PYTHON) clean - rm helpers.o - diff --git a/bindings/helpers.c b/bindings/helpers.c deleted file mode 100644 index 1ef263c..0000000 --- a/bindings/helpers.c +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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 "../include/node.h" -#include "../include/lxq_parser.h" -#include "../include/query_runner.h" -#include "../include/serialize.h" - -dom_node* internal_parse_xml_file(char* filename){ - return parse_dom(filename)->root; -} - -char* node_to_xml_string(dom_node* root){ - return node_to_string(root, XML); -} - -int list_size(struct generic_list_s* l){ - return l->count; -} - -dom_node* get_dom_node_at(struct generic_list_s* l, int p){ - return (dom_node*)get_element_at(l, p); -} - diff --git a/bindings/helpers.h b/bindings/helpers.h deleted file mode 100644 index 3c3ba06..0000000 --- a/bindings/helpers.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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. - -*/ - -#ifndef __HELPERS_H__ -#define __HELPERS_H__ - -extern dom_node* internal_parse_xml_file(char* filename); -extern char* node_to_xml_string(dom_node* root); - -#endif - diff --git a/bindings/python/Makefile b/bindings/python/Makefile deleted file mode 100644 index 2baf2d6..0000000 --- a/bindings/python/Makefile +++ /dev/null @@ -1,22 +0,0 @@ - -SO = pyxmlquery.so - -all: _libxmlquery.so - -libxmlquery.py libxmlquery_wrap.c: libxmlquery.i - swig -python libxmlquery.i - -libxmlquery_wrap.o: libxmlquery_wrap.c - gcc -c -fpic libxmlquery_wrap.c -I/usr/include/python2.6 - -../../libxmlquery.so: - make -C ../.. so - -_libxmlquery.so: libxmlquery_wrap.o ../../libxmlquery.so ../helpers.o - gcc -shared ../../libxmlquery.so libxmlquery_wrap.o ../helpers.o -o _libxmlquery.so - -../helpers.o: ../helpers.c ../helpers.h - -clean: - rm -rf libxmlquery.py libxmlquery_wrap.c libxmlquery_wrap.o _libxmlquery.so - diff --git a/bindings/python/libxmlquery.i b/bindings/python/libxmlquery.i deleted file mode 100644 index 57ef847..0000000 --- a/bindings/python/libxmlquery.i +++ /dev/null @@ -1,41 +0,0 @@ - -%module libxmlquery -%{ -/* Put headers and other declarations here */ -#include "../../include/node.h" -%} - -extern void set_namespace(dom_node* node, char* namespace); -extern void set_name(dom_node* node, char* name); -extern void set_value(dom_node* node, char* value); -extern void set_parent(dom_node* node, dom_node* parent); - -extern char* get_namespace(dom_node* node); -extern char* get_name(dom_node* node); -extern char* get_value(dom_node* node); - -extern void prepend_child(dom_node* parent, dom_node* child); -extern void append_child(dom_node* parent, dom_node* child); -extern void append_children(dom_node* parent, struct generic_list_s* children); -extern void add_attribute(dom_node* node, dom_node* attribute); - -extern dom_node* new_element_node(char* name); -extern dom_node* new_text_node(char* text); -extern dom_node* new_attribute(char* name, char* value); -extern dom_node* new_cdata(char* cdata_text); - -extern dom_node* get_child_at(dom_node* parent, int index); -extern struct generic_list_s* get_children(dom_node* node); -extern dom_node* get_attribute_by_name(dom_node* node, char* attr_name); - -extern dom_node* delete_attribute(dom_node* node, char* name); - -//query_runner -extern struct generic_list_s* query(char* q, dom_node*); - -//helpers -extern dom_node* internal_parse_xml_file(char* filename); -extern char* node_to_xml_string(dom_node* root); -extern int list_size(struct generic_list_s* l); -extern dom_node* get_dom_node_at(struct generic_list_s* l, int p); - diff --git a/bindings/python/test.py b/bindings/python/test.py deleted file mode 100644 index 77156f0..0000000 --- a/bindings/python/test.py +++ /dev/null @@ -1,9 +0,0 @@ -import xmlquery - -xml = xmlquery.parse_xml("../../test.xml") -c = xml.query("description") -#c[1].name = "banana" - -for n in c: - print n.__repr__() - diff --git a/bindings/python/xmlquery.py b/bindings/python/xmlquery.py deleted file mode 100644 index 7bada3c..0000000 --- a/bindings/python/xmlquery.py +++ /dev/null @@ -1,118 +0,0 @@ -import libxmlquery as lxq -import collections - -def parse_xml(filename): - if not isinstance(filename, str): raise TypeError - return NodeWrapper(lxq.internal_parse_xml_file(filename)) - - -class NodeList: - def __init__(self, listptr): - self._list = listptr - - def __len__(self): - return lxq.list_size(self._list) - - def __getitem__(self, key): - if isinstance(key, int): - if 0 <= key < len(self): return NodeWrapper(lxq.get_dom_node_at(self._list, key)) - elif -len(self) <= key < 0: return NodeWrapper(lxq.get_dom_node_at(self._list, len(self) + key)) - else: raise IndexError - elif isinstance(key, slice): - if key.start == None: start = 0 - if key.stop == None: stop = len(self) - if key.step == None: step = 1; - if key.step == 0: raise ValueError("Step value cannot be 0") - return lxq.slice_list(self._list, start, stop, step) - else: raise TypeError - - def __contains__(self, item): - if not isinstance(item, Node): return False - return not lxq.get_element_pos(self._list, item._node) == -1 - - -class Node: - def __init__(self, name, namespace=None): - self._node = lxq.new_element_node(name, namespace) - self._python_owner = True - - def query(self, q): - if not isinstance(q, str): raise TypeError - if not q or q[0] != "@": q = "@" + q - return NodeList(lxq.query(q, self._node)) - - def __getattr__(self, name): - if name in self.__dict__: return self.__dict__[name] - elif name == 'name': return lxq.get_name(self._node) - elif name == 'namespace': return lxq.get_namespace(self._node) - elif name == 'children': return NodeList(lxq.get_children(self._node)) - elif name == 'attributes': return AttributeMap(self._node) - else: raise AttributeError - - def __setattr__(self, name, value): - if name == 'name': lxq.set_name(self._node, value) - elif name == 'namespace': lxq.set_namespace(self._node, value) - elif name == 'children': raise AttributeError("Attribute 'children' is read only") - elif name == 'attributes': raise AttributeError("Attribute 'attributes' is read only") - else: self.__dict__[name] = value - - def __str__(self): - return lxq.node_to_xml_string(self._node)[:-1] - - def __repr__(self): - name = self.name - if self.namespace: name = self.namespace + self.name - return "<" + name + " .../>" - -# def __del__(self): -# if self._python_owner: -# lxq.destroy_dom_node(self._node) -# self._node = None - - -class NodeWrapper(Node): - def __init__(self, node_ptr): - self._node = node_ptr - self.python_owner = False - - -class AttributeMap: - def __init__(self, nodeptr): - self._node = nodeptr - - def __contains__(self, item): - if not isinstance(item, str): return False - return not lxq.get_attribute_by_name(nodeptr, item) == None - - def __get_item__(self, name): - if not isinstance(name, str): raise TypeError - r = lxq.get_attribute_by_name(nodeptr, name) - if r: return r - else: raise KeyError - - def __set_item__(self, name, value): - if not (isinstance(name, str) and isinstance(value, str)): - raise TypeError - attr = lxq.new_attribute(name, value) - lxq.add_attribute(self._node, attr) - -#class Attribute: -# def __init__(self, name, value): -# self._node = lxq.new_attribute(name, value) -# self._python_owner = True -# -# def __getattr__(self, name): -# if name == 'name': return lxq.get_name(self._node) -# elif name == 'value': return lxq.get_value(self._node) -# else: raise AttributeError -# -# def __setattr__(self, name, value) -# if name == 'name': lxq.set_name(self._node, value) -# elif name == 'value': lxq.set_value(self._node, value) -# else: raise AttributeError -# -# def __del__(self): -# if self._python_owner: -# lxq.destroy_dom_node(self._node) -# self._node = None - diff --git a/documentation/Makefile b/documentation/Makefile deleted file mode 100644 index b388161..0000000 --- a/documentation/Makefile +++ /dev/null @@ -1,138 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -gh_pages: html - mv $(BUILDDIR)/html/_static $(BUILDDIR)/html/lxq_static - mv $(BUILDDIR)/html/_sources $(BUILDDIR)/html/lxq_sources - find $(BUILDDIR)/html -type f | xargs sed -ri 's/"(\.\.\/)*_static/"\1lxq_static/' - find $(BUILDDIR)/html -type f | xargs sed -ri 's/"(\.\.\/)*_sources/"\1lxq_sources/' - ./commit.sh - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/libxmlquery.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/libxmlquery.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/libxmlquery" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/libxmlquery" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - make -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." - diff --git a/documentation/_theme/nature/static/nature.css_t b/documentation/_theme/nature/static/nature.css_t deleted file mode 100644 index 4252a8d..0000000 --- a/documentation/_theme/nature/static/nature.css_t +++ /dev/null @@ -1,238 +0,0 @@ -/** - * Sphinx stylesheet -- default theme - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: Arial, sans-serif; - font-size: 100%; - background-color: #111111; - color: #555555; - margin: 0; - padding: 0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 300px; -} - -hr{ - border: 1px solid #B1B4B6; -} - -div.document { - background-color: #fafafa; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 1em 30px 30px 30px; - font-size: 0.9em; -} - -div.footer { - color: #555; - width: 100%; - padding: 13px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #444444; -} - -div.related { - /*background-color: #6BA81E;*/ - background-color: #444; - line-height: 36px; - color: #ffffff; - text-shadow: #666 -1px -1px 0; - font-size: 1.1em; -} - -div.related a { - color: #fff; -} - -div.related .right { - font-size: 0.9em; -} - -div.sphinxsidebar { - font-size: 0.9em; - line-height: 1.5em; - width: 300px; -} - -div.sphinxsidebarwrapper{ - padding: 20px 0; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Arial, sans-serif; - color: #444; - font-size: 1.2em; - font-weight: bold; - margin: 0; - padding: 5px 10px; - text-shadow: 1px 1px 0 white -} - -div.sphinxsidebar h3 a { - color: #444444; -} - -div.sphinxsidebar p { - color: #888888; - padding: 5px 20px; - margin: 0.5em 0px; -} - -div.sphinxsidebar p.topless { -} - -div.sphinxsidebar ul { - margin: 10px 10px 10px 20px; - padding: 0; - color: #000000; -} - -div.sphinxsidebar a { - color: #444444; -} - -div.sphinxsidebar a:hover { - color: #E32E00; -} - -div.sphinxsidebar input { - border: 1px solid #cccccc; - font-family: sans-serif; - font-size: 1.1em; - padding: 0.15em 0.3em; -} - -div.sphinxsidebar input[type=text]{ - margin-left: 20px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #005B81; - text-decoration: none; -} - -a:hover { - color: #E32E00; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Arial, sans-serif; - font-weight: normal; - color: #212224; - margin: 30px 0px 10px 0px; - padding: 5px 0 5px 0px; - text-shadow: 0px 1px 0 white; - border-bottom: 1px solid #C8D5E3; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 150%; } -div.body h3 { font-size: 120%; } -div.body h4 { font-size: 110%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li { - line-height: 1.8em; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.highlight{ - background-color: white; -} - -div.note { - background-color: #eeeeee; - border: 1px solid #cccccc; -} - -div.seealso { - background-color: #ffffcc; - border: 1px solid #ffff66; -} - -div.topic { - background-color: #fafafa; - border-width: 0; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #ff6666; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 10px; - background-color: #fafafa; - color: #222222; - line-height: 1.5em; - font-size: 1.1em; - margin: 1.5em 0 1.5em 0; - -webkit-box-shadow: 0px 0px 4px #d8d8d8; - -moz-box-shadow: 0px 0px 4px #d8d8d8; - box-shadow: 0px 0px 4px #d8d8d8; -} - -tt { - color: #222222; - padding: 1px 2px; - font-size: 1.2em; - font-family: monospace; -} - -#table-of-contents ul { - padding-left: 2em; -} - diff --git a/documentation/_theme/nature/static/pygments.css b/documentation/_theme/nature/static/pygments.css deleted file mode 100644 index 652b761..0000000 --- a/documentation/_theme/nature/static/pygments.css +++ /dev/null @@ -1,54 +0,0 @@ -.c { color: #999988; font-style: italic } /* Comment */ -.k { font-weight: bold } /* Keyword */ -.o { font-weight: bold } /* Operator */ -.cm { color: #999988; font-style: italic } /* Comment.Multiline */ -.cp { color: #999999; font-weight: bold } /* Comment.preproc */ -.c1 { color: #999988; font-style: italic } /* Comment.Single */ -.gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ -.ge { font-style: italic } /* Generic.Emph */ -.gr { color: #aa0000 } /* Generic.Error */ -.gh { color: #999999 } /* Generic.Heading */ -.gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ -.go { color: #111 } /* Generic.Output */ -.gp { color: #555555 } /* Generic.Prompt */ -.gs { font-weight: bold } /* Generic.Strong */ -.gu { color: #aaaaaa } /* Generic.Subheading */ -.gt { color: #aa0000 } /* Generic.Traceback */ -.kc { font-weight: bold } /* Keyword.Constant */ -.kd { font-weight: bold } /* Keyword.Declaration */ -.kp { font-weight: bold } /* Keyword.Pseudo */ -.kr { font-weight: bold } /* Keyword.Reserved */ -.kt { color: #445588; font-weight: bold } /* Keyword.Type */ -.m { color: #009999 } /* Literal.Number */ -.s { color: #bb8844 } /* Literal.String */ -.na { color: #008080 } /* Name.Attribute */ -.nb { color: #999999 } /* Name.Builtin */ -.nc { color: #445588; font-weight: bold } /* Name.Class */ -.no { color: #ff99ff } /* Name.Constant */ -.ni { color: #800080 } /* Name.Entity */ -.ne { color: #990000; font-weight: bold } /* Name.Exception */ -.nf { color: #990000; font-weight: bold } /* Name.Function */ -.nn { color: #555555 } /* Name.Namespace */ -.nt { color: #000080 } /* Name.Tag */ -.nv { color: purple } /* Name.Variable */ -.ow { font-weight: bold } /* Operator.Word */ -.mf { color: #009999 } /* Literal.Number.Float */ -.mh { color: #009999 } /* Literal.Number.Hex */ -.mi { color: #009999 } /* Literal.Number.Integer */ -.mo { color: #009999 } /* Literal.Number.Oct */ -.sb { color: #bb8844 } /* Literal.String.Backtick */ -.sc { color: #bb8844 } /* Literal.String.Char */ -.sd { color: #bb8844 } /* Literal.String.Doc */ -.s2 { color: #bb8844 } /* Literal.String.Double */ -.se { color: #bb8844 } /* Literal.String.Escape */ -.sh { color: #bb8844 } /* Literal.String.Heredoc */ -.si { color: #bb8844 } /* Literal.String.Interpol */ -.sx { color: #bb8844 } /* Literal.String.Other */ -.sr { color: #808000 } /* Literal.String.Regex */ -.s1 { color: #bb8844 } /* Literal.String.Single */ -.ss { color: #bb8844 } /* Literal.String.Symbol */ -.bp { color: #999999 } /* Name.Builtin.Pseudo */ -.vc { color: #ff99ff } /* Name.Variable.Class */ -.vg { color: #ff99ff } /* Name.Variable.Global */ -.vi { color: #ff99ff } /* Name.Variable.Instance */ -.il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/documentation/_theme/nature/theme.conf b/documentation/_theme/nature/theme.conf deleted file mode 100644 index 1cc4004..0000000 --- a/documentation/_theme/nature/theme.conf +++ /dev/null @@ -1,4 +0,0 @@ -[theme] -inherit = basic -stylesheet = nature.css -pygments_style = tango diff --git a/documentation/applications/shell.rst b/documentation/applications/shell.rst deleted file mode 100644 index 9ab43fa..0000000 --- a/documentation/applications/shell.rst +++ /dev/null @@ -1,87 +0,0 @@ -.. highlight:: c - -Shell -===== - -The shell application is the most simplest application we've created to demonstrate the features of our querying engine. It has a simple interface and its purpose -is to load xml files, print them and query them. - -Compiling -^^^^^^^^^ - -Compiling the shell is very easy. You just type make and it'll generate a binary called *shell*. - -Running -^^^^^^^ - -After compiling the shell application, you just need to run the binary file *shell* without any arguments. - -Interaction -^^^^^^^^^^^ - -After running the application, you'll be presented with a banner and a prompt. You can begin by typing *help* to see which commands it supports. - -As an example:: - - ############################################################################ - # # - # ll iii bbb xx xx mm mm ll qqqq uu uu eeeee rrrr yy yy # - # ll i bb b xx xx mmm mmm ll qq qq uu uu ee rr rr yy yy # - # ll i bbb xxx mmmmmmm ll qq qq uu uu eeee rrrr yyy # - # ll i bb b xx xx mm m mm ll qq qq uu uu ee rr rr yyy # - # llll iii bbb xx xx mm mm llll qqqq q uuuuuu eeeee rr rr yyy # - # # - ############################################################################ - - >>> help - gdb: - Call gdb for a given program - Usage:gdb - load: - Load an xml file into a variable. - Usage: load - - help: - Print this help message - - query: - Query an existing xml document - Usage:query "" - - quit: - Exit from shell - - print_xml: - Print a loaded document into xml format - Usage: print_xml - >>> - -From here you can deduce what commands we implemented. The *gdb* command is there just for development convenience. A typical interaction would be:: - - ############################################################################ - # # - # ll iii bbb xx xx mm mm ll qqqq uu uu eeeee rrrr yy yy # - # ll i bb b xx xx mmm mmm ll qq qq uu uu ee rr rr yy yy # - # ll i bbb xxx mmmmmmm ll qq qq uu uu eeee rrrr yyy # - # ll i bb b xx xx mm m mm ll qq qq uu uu ee rr rr yyy # - # llll iii bbb xx xx mm mm llll qqqq q uuuuuu eeeee rr rr yyy # - # # - ############################################################################ - - >>> load ../test.xml doc - XML ../test.xml loaded and stored in doc - >>> query doc "@title" - Node: - - RSS Example - - - Node: - - Item Example - - - >>> quit - exiting... - -This example shows how to load and query a document. diff --git a/documentation/commit.sh b/documentation/commit.sh deleted file mode 100755 index 3220f5d..0000000 --- a/documentation/commit.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -BUILDDIR=_build - -git clone -b gh-pages git@github.com:nullable/libxmlquery.git /tmp/gh_pages -cp -r $BUILDDIR/html/* /tmp/gh_pages/ -pushd /tmp/gh_pages -git add . -git commit -m 'Auto-commit by make gh_pages target' -git push origin gh-pages:gh-pages -popd -rm -rf /tmp/gh_pages \ No newline at end of file diff --git a/documentation/conf.py b/documentation/conf.py deleted file mode 100644 index 03d0565..0000000 --- a/documentation/conf.py +++ /dev/null @@ -1,257 +0,0 @@ -# -*- coding: utf-8 -*- -# -# libxmlquery documentation build configuration file, created by -# sphinx-quickstart on Fri Nov 5 15:13:45 2010. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'libxmlquery' -copyright = u'2010, Frederico Gonçalves, Vasco Fernandes' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '0.1' -# The full version, including alpha/beta/rc tags. -release = '0.1.4' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'nature' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = ['_theme'] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'libxmlquerydoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -# The paper size ('letter' or 'a4'). -#latex_paper_size = 'letter' - -# The font size ('10pt', '11pt' or '12pt'). -#latex_font_size = '10pt' - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'libxmlquery.tex', u'libxmlquery Documentation', - u'Frederico Gonçalves, Vasco Fernandes', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Additional stuff for the LaTeX preamble. -#latex_preamble = '' - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'libxmlquery', u'libxmlquery Documentation', - [u'Frederico Gonçalves, Vasco Fernandes'], 1) -] - - -# -- Options for Epub output --------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = u'libxmlquery' -epub_author = u'Frederico Gonçalves, Vasco Fernandes' -epub_publisher = u'Frederico Gonçalves, Vasco Fernandes' -epub_copyright = u'2010, Frederico Gonçalves, Vasco Fernandes' - -# The language of the text. It defaults to the language option -# or en if the language is not set. -#epub_language = '' - -# The scheme of the identifier. Typical schemes are ISBN or URL. -#epub_scheme = '' - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -#epub_identifier = '' - -# A unique identification for the text. -#epub_uid = '' - -# HTML files that should be inserted before the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_pre_files = [] - -# HTML files shat should be inserted after the pages created by sphinx. -# The format is a list of tuples containing the path and title. -#epub_post_files = [] - -# A list of files that should not be packed into the epub file. -#epub_exclude_files = [] - -# The depth of the table of contents in toc.ncx. -#epub_tocdepth = 3 - -# Allow duplicate toc entries. -#epub_tocdup = True - diff --git a/documentation/data_structures/datastructures.rst b/documentation/data_structures/datastructures.rst deleted file mode 100644 index e17a276..0000000 --- a/documentation/data_structures/datastructures.rst +++ /dev/null @@ -1,856 +0,0 @@ -.. highlight:: c - -=============== -Data Structures -=============== - -Generic List ------------- - -Generic array list optimized for fast access. This structure is defined in stack.h and implemented in stack.c. It can act as a stack, queue or random access list. Although they seem different, the datastructure is the same and every function of one type can be used in another. This means that you can have a random access list and start poping out elements as though it was a stack. - -.. c:type:: struct generic_list_s -.. c:type:: list - -This structure defines the random access list. Its structure definition is:: - - typedef struct generic_list_s{ - struct list_bucket** array; - int32_t start; - int32_t count; - int32_t capacity; - } list; - -As you can see this is just a list backed up by an array of :c:type:`struct list_bucket`. These buckets are defined as follows: - -.. c:type:: struct list_bucket - -:: - - struct list_bucket - { - int16_t type; - void* element; - }; - -Finally, notice that the stack and queue type are just typedefs of :c:type:`list`. - -:: - - typedef struct generic_list_s stack; - typedef struct generic_list_s queue; - -The next sections will show how to use these types. - -Function description -^^^^^^^^^^^^^^^^^^^^ - -.. c:function:: uint8_t generic_list_is_empty(struct generic_list_s* l) - - :c:member:`l` The generic list to check if is empty. - - This function checks if the generic list is empty. It return an integer bigger than 0 if true, or 0 if false. - -.. c:function:: int32_t generic_list_get_count(struct generic_list_s* l) - - :c:member:`l` The generic list to obtain the count of elements. - - This function return the number of elements in the generic list. - -.. c:function:: struct generic_list_s *new_generic_list(int32_t initial) - - :c:member:`initial` Initial capcity for a generic list. - - This function returns a generic list with a given initial capacity. Capacity dictates how much space the list will take. You don't need to - worry about reallocation, but consider using small values for capacity when you know that the list will not grow that much. - -.. c:function:: stack* new_stack(int32_t initial) - - :c:member:`initial` Initial capcity for a stack. - - This function is just an alias for :c:func:`new_generic_list`. - -.. c:function:: queue* new_queue(int32_t initial) - - :c:member:`initial` Initial capcity for a queue. - - This function is just an alias for :c:func:`new_generic_list`. - -.. c:function:: void* set_element_with_type_at(list *l, void* obj, int16_t type, int32_t pos) - - :c:member:`l` List where to set the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - :c:member:`pos` The position of the element to be set. - - This function sets an already exiting element to a new one. A pointer to the old one is returned so the user can free the space used by it. - -.. c:function:: void* set_element_at(list *l, void* obj, int32_t pos) - - :c:member:`l` List where to set the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`pos` The position of the element to be set. - - This function does exactly the same as :c:func:`set_element_with_type_at`, but without the type feature. - -.. c:function:: void insert_element_with_type_at(list* l, void* obj, int16_t type, int32_t pos) - - :c:member:`l` List where to insert the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - :c:member:`pos` The position of the element to be set. - - This function inserts an element at a given position with a given type. The list will be resized if necessary. - -.. c:function:: void insert_element_at(list* l, void* obj, int32_t pos) - - :c:member:`l` List where to insert the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`pos` The position of the element to be set. - - This function does exactly the same thing as :c:func:`insert_element_with_type_at`, but without the type feature. - -.. c:function:: void sorted_insert_element_with_type(list* l, void* obj, int16_t type, int(*compare)(void* o1, int16_t type1, void* o2, int16_t type2)) - - :c:member:`l` List where to insert the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - :c:member:`compare` A function pointer to a function that compares elements in the list. - - This function inserts an element into a list in sorted order, according to the function pointer passed as an argument. - -.. c:function:: void append_element(list* l, void* obj, int16_t type) - - :c:member:`l` List where to append the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - This function inserts an element at the end of the list. - -.. c:function:: void prepend_element(list* l, void* obj, int16_t type) - - :c:member:`l` List where to prepend the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - This function inserts an element at the beginning of the list. - -.. c:function:: void add_element_with_type(list* l, void* obj, int16_t type) - - :c:member:`l` List where to add the element. - - :c:member:`obj` New element to store in the list. - - :c:member:`type` The type of the new element. - - This function adds an element to a list. It differs from :c:func:`prepend_element` and :c:func:`append_element` in the sense that the user doesn't need to know - Where the element will be added. - -.. c:function:: void add_element(list* l, void* obj) - - :c:member:`l` List where to add the element. - - :c:member:`obj` New element to store in the list. - - This function is exactly the same as :c:func:`add_element_with_type`, but without the type feature. - -.. c:function:: void* get_element_at(const list* l, int32_t pos) - - :c:member:`l` List from where to get the element. - - :c:member:`pos` The element's position. - - This function returns the element stored at the given position. - -.. c:function:: void* get_element_and_type_at(const list* l, int32_t pos, int16_t* type) - - :c:member:`l` List from where to get the element. - - :c:member:`pos` The element's position. - - :c:member:`type` An address to store the elements type. - - This function does the same as :c:func:`get_element_at`, but it also returns the element's type. This is stored in a location passed as the third argument - to this function. - -.. c:function:: int get_element_pos(const list* l, void* el) - - :c:member:`l` List from where to get the element's position. - - :c:member:`el` The element to look for in the list. - - This function returns the position of the element passed as an argument. If no element is found, then -1 is returned. - -.. c:function:: int32_t remove_element(list *l, void* obj) - - :c:member:`l` List from where to remove the element. - - :c:member:`obj` The element to be removed. - - This function removes the first occurrence of a given element from a list. If the element doesn't exist then nothing will happen. - -.. c:function:: int32_t remove_all(list *l, void* obj) - - :c:member:`l` List from where to remove the element. - - :c:member:`obj` The element to be removed. - - This function removes all occurrences of a given element from a list. If no element is found then nothing will happen. - -.. c:function:: void* remove_element_at(list* l, int32_t pos) - - :c:member:`l` List from where to remove the element. - - :c:member:`pos` Position of the element to be removed. - - This function removes the element at a given position from a list. - -.. c:function:: void enqueue_with_type(queue* q, void* obj, int16_t type) - - :c:member:`q` Queue where to enqueue the element. - - :c:member:`obj` Element to enqueue. - - :c:member:`type` The type of the element being enqueued. - - This function enqueues an element with a given type in a given queue. - -.. c:function:: void enqueue(queue* q, void* obj) - - :c:member:`q` Queue where to enqueue the element. - - :c:member:`obj` Element to enqueue. - - This function is the same as :c:func:`enqueue_with_type`, but without the type feature. - -.. c:function:: void* dequeue(queue* q) - - :c:member:`q` Queue from where to dequeue an element. - - This function dequeues an element from a given queue. If no element is present, then NULL is returned. - -.. c:function:: void push_stack_type(stack* s, void* obj, int16_t type) - - :c:member:`s` Stack where to push the element. - - :c:member:`obj` Element to push onto the stack. - - :c:member:`type` The type of the element being push. - - This function pushes an element with a given type onto a given stack. - -.. c:function:: void push_stack(stack* s, void* obj) - - :c:member:`s` Stack where to push the element. - - :c:member:`obj` Element to push onto the stack. - - This function is the same as :c:func:`push_stack_type`, but without the type feature. - -.. c:function:: void* pop_stack(stack* s) - - :c:member:`s` Stack from where to pop an element. - - This function pops an element from a given stack. If no element is present, NULL is returned. - -.. c:function:: list* remove_duplicates(list* l) - - :c:member:`l` List from where to remove duplicate elements. - - This function removes duplicate values based on their memory address. - -.. c:function:: int16_t peek_element_type_at(list* l, int32_t pos) - - :c:member:`l` List from where to peek an element's type. - - :c:member:`pos` The element's position in the list. - - This function lets you see which type the element at a given position has. If no element is in that position the program will exit. - -.. c:function:: int16_t peek_stack_type(stack *s) - - :c:member:`s` Stack from where to peek the element's type. - - This function is the same as :c:func:`peek_element_type_at`, but it applies only to stacks. This means that it will only check the element at the head of the stack. - -.. c:function:: int16_t peek_queue_type(queue *s) - - :c:member:`s` Queue from where to peek the element's type. - - This function is the same as :c:func:`peek_stack_type`. However, it applies only to queues. - -.. c:function:: struct generic_list_s *merge_lists(struct generic_list_s *l1, struct generic_list_s *l2) - - :c:member:`l1` Any list. - - :c:member:`l2` Any list. - - This function merges two list onto a single one. The list l2 will be append to l1. Beware that the input lists will be destroyed. The merged list is returned. If - both lists are NULL, then NULL is returned. - -.. c:function:: struct generic_list_s *duplicate_generic_list(const struct generic_list_s*) - - :c:member:`s` List to be duplicated. - - This function allocates and fills a new list with the same values as the given list. Only the buckets are duplicated, the elements on the list stay exactly the same. - -.. c:function:: void destroy_generic_list(struct generic_list_s *s) - - :c:member:`s` List to be destroyed - - This function destroys a given list. Only the buckets get destroyed, the elements must be detroyed by the user. - - Example:: - - #include - #include - #include "stack.h" - - int main(){ - list* l = new_generic_list(2); - int *a, *b; - - a = (int*) malloc(sizeof(int)); - b = (int*) malloc(sizeof(int)); - if(!a || !b){ - printf("malloc failed\n"); - return -1; - } - - *a = 9; - *b = 7; - - append_element(l, a, 0); - append_element(l, b, 0); - - generic_list_iterator* it = new_generic_list_iterator(l); - while(generic_list_iterator_has_next(it)){ - int *c = (int*) generic_list_iterator_next(it); - free(c); - } - destroy_generic_list_iterator(it); - - destroy_generic_list(l); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: generic_list_iterator* new_generic_list_iterator(struct generic_list_s* s) - - :c:member:`s` List to be iterated. - - This function creates an iterator for the given list. - -.. c:function:: uint8_t generic_list_iterator_has_next(generic_list_iterator* i) - - :c:member:`i` A list iterator. - - This function checks if there are elements still to be iterated. If not 0 is returned, otherwise a value different from 0 is returned. - -.. c:function:: void* generic_list_iterator_next(generic_list_iterator* i) - - :c:member:`i` A list iterator - - This function returns an element from the list and advances the iterator to the next position. - -.. c:function:: void destroy_generic_list_iterator(generic_list_iterator* i) - - :c:member:`i` A list iterator - - This function frees a list iterator. - -Generic Red Black Tree ----------------------- -The file rbtree.c contains the source code for a generic red black tree. This data structure is capable of storing any kind of data and its defined in rbtree.h as: - -.. c:type:: tree_root -.. c:type:: struct sroot - -:: - - typedef struct sroot{ - struct stree_node* root; - void* (*key)(struct stree_node* node); - int64_t (*compare)(void* keyA, void* keyB); - }tree_root; - -There are two things to notice here. First, this is only the root of the tree and points to the first tree_node of the rbtree. Second, it contains two function pointers. The first points to a function, which receives a :c:type:`tree_node` and should return a **pointer** to that node's key. The second is a pointer to a compare function, which compares two keys and should return: - -- A negative integer if the first key is smaller than the second. -- 0 if the keys are the same. -- A positive integer if the first key is bigger than the second. - -The compare function must be: - -- Reflexive: Given an object a. compare(a, a) should always return 0. -- Symetric: Given two identical objects a and b, if compare(a,b) returns 0, then compare(b,a) must return 0. -- Transitive: Given three objects a, b, c. If compare(a,b) returns 0, and compare(b,c) returns 0, then compare(a,c) must return 0. -- Consistent: Multiple invocations of compare on the same objects in the same other, must return always the same value. - -These properties should hold even if objects aren't equal. - -The compare and key function pointers must be provided by the user. Why do we need these pointers? Because the data stored in the rbtree can be anything, but we still need to know how to sort it. Nevertheless, if you wish to use this data structure as a container and don't care how things are sorted, you can always use the method :c:func:`new_simple_rbtree`. - -Each node in an rbtree is called a tree_node and is defined in rbtree.h as: - -.. c:type:: tree_node -.. c:type:: struct stree_node - -:: - - typedef struct stree_node{ - void* node; - - uint8_t color; - - struct stree_node* parent; - struct stree_node* left; - struct stree_node* right; - }tree_node; - -There's not much to say about this structure, the only thing relevant is the field ``node``, which is used to store the actual data. The other fields are used to keep the rbtree intact. - -Finally, there's one more structure, which is defined in rbtree.h as: - -.. c:type:: tree_iterator -.. c:type:: struct siterator - -:: - - typedef struct siterator{ - struct stree_node* current; - }tree_iterator; - -As the name implies, this structure is an iterator to the tree nodes. - -As a final note, remember that we provide functions to destroy our structures, but the actual data must be destroyed by you. Do not use iterators for this purpose. - -Function description -^^^^^^^^^^^^^^^^^^^^ - -.. c:function:: tree_root* new_simple_rbtree() - - This function creates an rbtree, which sorts the data acording to its memory pointer. This function should be used when you just want the rbtree to behave as a container, - but you still need O(log(n)) when accessing the data. Keep in mind that in order to retreive the stored data, you need to know it's memory pointer. - - The return value is a tree_root structure. - -.. c:function:: tree_root* new_rbtree(void* (*key_function_pointer)(struct stree_node* node), int64_t (*compare_function_pointer)(void* keyA, void* keyB)) - - :c:member:`key_function_pointer` A function that should return the address of the node's key. - - :c:member:`compare_function_pointer` A function that should compare two keys and return values as described above. It receives the addresses of each key. - - This function creates an rbtree, which sorts the data according to the given functions. The following example shows how to create an rbtree to store integers. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void* rb_tree_insert(tree_root* root, void* node) - - :c:member:`root` A pointer to the tree root where to insert the data represented by ``node``. - - :c:member:`node` A pointer to the data, which will be inserted in the tree. - - As the name implies this function inserts data into the rbtree. In the eventuality that the inserted value is already in the tree, it will be replaced and a pointer to the older value is returned. This is done so the user can free the space stored by that data. The following example shows how to insert integers in an rbtree. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10, d = 6; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - int older = *((int *) rb_tree_insert(rbtree, &d)); - - //don't free older because it was "alloched" by the compiler. - printf("Found a %d already stored in the tree.\n", older); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void* rb_tree_delete(tree_root* root, void* key) - - :c:member:`root` A pointer to the tree root where to delete the data with key pointed by ``key``. - - :c:member:`key` A pointer to the key of the node to be deleted. - - This function deletes a node from an rbtree. If a node with a key equal to the one pointed by ``key`` does not exist, NULL will be return. However, if such a node is found, then a pointer to the data is returned. This is done so the user can free the space used by that data. The following example shows how to use this function on an rbtree that stores integers. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - int d = 10, stored; - stored = *((int *) rb_tree_delete(rbtree, &d)); - - //don't free stored because it was "alloched" by the compiler. - printf("Found a %d stored in the tree.\n", stored); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - - - -.. c:function:: void* search_rbtree(tree_root root, void* key) - - :c:member:`root` The root of the tree where to perform the search. - - :c:member:`key` A pointer to the key of the node to be searched. - - This function searchs an rbtree for a node. It returns NULL if nothing is found, or the data stored in the tree with a key equal to the value pointed by ``key``. The following example shows how to search a tree that stores integers. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - int d = 10, stored; - stored = *((int *) search_rbtree(*rbtree, &d)); - - printf("Found a %d stored in the tree.\n", stored); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void destroy_rbtree(tree_root* root) - - :c:member:`root` A pointer to the tree to be destroyed. - - This function destroys an rbtree. Note that this doesn't free the user stored data. The following example shows how to use this in a tree that stores integers. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - destroy_rbtree(rbtree); - //We do not need to free the stored data because it was "alloched" by the compiler. - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - - Notice that running the command - - .. code-block:: bash - - valgrind --show-reachable=yes --leak-check=full ./test - - produces the ouput:: - - ==1188== HEAP SUMMARY: - ==1188== in use at exit: 0 bytes in 0 blocks - ==1188== total heap usage: 4 allocs, 4 frees, 72 bytes allocated - ==1188== - ==1188== All heap blocks were freed -- no leaks are possible - - Which means that there are no memory leaks and you should always use this function to free the space stored by any rbtree you use. - -.. c:function:: tree_iterator* new_tree_iterator(tree_root* root) - - :c:member:`root` A pointer to a tree root, which the iteration will be performed. - - This function creates an iterator to an rbtree. Note that when you create an iterator, you should not insert or delete nodes from the tree before the iteration is over. Otherwise, the behaviour of the program will be unpredictable. It returns pointer to the created iterator. The following example shows how to create an iterator for a tree that stores integers. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - tree_iterator* it = new_tree_iterator(rbtree); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: uint8_t tree_iterator_has_next(tree_iterator* it) - - :c:member:`it` A tree iterator created by calling :c:func:`new_tree_iterator`. - - This function returns 1 if there are more elements in the tree to be iterated. The following code shows a simple usage of this function. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - tree_iterator* it = new_tree_iterator(rbtree); - - if(tree_iterator_has_next(it)) - printf("There are still elements to be iterated.\n"); - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void* tree_iterator_next(tree_iterator* it) - - :c:member:`it` A tree iterator created by calling :c:func:`new_tree_iterator`. - - This functions returns the current element pointed by iterator ``it`` and advances to the next element in the iteration. This function should be used with :c:func:`tree_iterator_has_next`. Note that there is **no** guaranty about the order of iteration. The following code shows how to use it. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - tree_iterator* it = new_tree_iterator(rbtree); - - while(tree_iterator_has_next(it)){ - int d = *((int *) tree_iterator_next(it)); - printf("%d\n", d); - } - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void destroy_iterator(tree_iterator* it) - - :c:member:`it` A tree iterator created by calling :c:func:`new_tree_iterator`. - - This function frees the iterator pointed by ``it``. The following example shows how to use it. - - Example:: - - #include - #include "rbtree.h" - - void* key_address(tree_node* node){ - return node->node; - } - - int64_t compare_integers(void* keyA, void* keyB){ - return *((int *) keyA) - *((int *) keyB); - } - - int main(){ - tree_root* rbtree = new_rbtree(& key_address, & compare_integers); - int a = 9, b = 6, c = 10; - - rb_tree_insert(rbtree, &a); - rb_tree_insert(rbtree, &b); - rb_tree_insert(rbtree, &c); - - tree_iterator* it = new_tree_iterator(rbtree); - - while(tree_iterator_has_next(it)){ - int d = *((int *) tree_iterator_next(it)); - printf("%d\n", d); - } - destroy_iterator(it); - - destroy_rbtree(rbtree); - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - - .. code-block:: bash - - valgrind --show-reachable=yes --leak-check=full ./test - - produces the ouput:: - - ==4432== HEAP SUMMARY: - ==4432== in use at exit: 0 bytes in 0 blocks - ==4432== total heap usage: 5 allocs, 5 frees, 76 bytes allocated - ==4432== - ==4432== All heap blocks were freed -- no leaks are possible - - Which means that there are no memory leaks and you should always use this function when iterating. diff --git a/documentation/dom.rst b/documentation/dom.rst deleted file mode 100644 index a5387b8..0000000 --- a/documentation/dom.rst +++ /dev/null @@ -1,373 +0,0 @@ -.. highlight:: c - -===================== -Document Object Model -===================== - -DOM ---- - -After the parsing of the xml is done, a DOM structure is created and -can be accessed through a global variable denominated ``lxq_document``. -Bear in mind that this variable is dependent of the current parser. -In other words, if the parser module changes, then the variable name -may also change. - -The DOM structure is a tree, where each node is an xml element. Since -the input xml has already been validated we know it has only one root -, so the document variable will point to a single node in the dom -tree, the root node (This can be accessed through document->root, but we really recommend the use of :c:func:`get_doc_root`). - -The dom structure provides flexible and extendable xml document -handling. It has the capability to add, remove and modify elements in -the xml. - -Data types -^^^^^^^^^^ -.. c:type:: dom_node -.. c:type:: struct snode - -The structure definition for a dom node is in the file node.h. - -:: - - typedef struct snode{ - enum node_type type; - - char* namespace; - char* name; - char* value; - - struct sroot* attributes; - - struct snode* parent; - - struct generic_list_s* children; - }dom_node; - -This structure is used to store any kind of entity in an xml file. It can be an element, attribute, cdata or text node. In order to control these different kind of entities, the :c:type:`dom_node` has an enumerate field. This field is called :c:type:`node_type` . - -.. c:type:: node_type - -This enum is defined as:: - - enum node_type { - ATTRIBUTE, - ELEMENT, - TEXT_NODE, - CDATA - }; - -Each enum represents a different kind of xml entity. - -.. c:type:: doc -.. c:type:: struct sdoc - -Finally, a document is a structure that points to two dom nodes - The root of the dom tree and the root of the xml declaration tree. Lets look at its definition. - -:: - - typedef struct sdoc{ - struct snode* root; - struct snode* xml_declaration; - }doc; - -Suppose we have the following xml file - -.. code-block:: xml - - - - ... - - -When this xml is parsed, a :c:type:`doc` is created with the field ``xml_declaration`` pointing to a tree that parsed '' and the ``root`` field pointing to a tree that parsed the rest of the document. - -Function description -^^^^^^^^^^^^^^^^^^^^ -.. c:function:: char* set_namespace(dom_node* node, char* namespace) - - :c:member:`node` The node whose namespace will be set. - - :c:member:`namespace` The namespace to set. - - This function sets the namespace of the given node. If the node already contained a namespace, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: char* set_name(dom_node* node, char* name) - - :c:member:`node` The node whose name will be set. - - :c:member:`name` The name to set. - - This function sets the name of the given node. If the node already contained a name, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: char* set_value(dom_node* node, char* value) - - :c:member:`node` The node whose value will be set. - - :c:member:`value` The value to set. - - This function sets the value of the given node. If the node already contained a value, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: dom_node* set_doc_root(doc* document, struct snode* root) - - :c:member:`doc` The document whose root will be set. - - :c:member:`root` The root to set. - - This function sets the root of the given document. If the document already contained a root, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: dom_node* set_xml_declaration(doc* document, struct snode* vers) - - :c:member:`doc` The document whose xml declaration will be set. - - :c:member:`vers` The xml declaration to set. - - This function sets the xml declaration of the given document. If the document already contained an xml declaration, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: void set_parent(dom_node* node, dom_node* parent) - - :c:member:`node` The node whose parent will be set. - - :c:member:`parent` The parent to set. - - This function sets the parent of the given node. If the node already contained a parent, a pointer to it will be returned. Otherwise, NULL is returned. - -.. c:function:: char* get_namespace(dom_node* node) - - :c:member:`node` The node from which the namespace will be returned. - - This functions returns the namespace of the given node, or NULL if the node doesn't contain any. - -.. c:function:: char* get_name(dom_node* node) - - :c:member:`node` The node from which the names will be returned. - - This functions returns the names of the given node, or NULL if the node doesn't contain any. - -.. c:function:: char* get_value(dom_node* node) - - :c:member:`node` The node from which the value will be returned. - - This functions returns the value of the given node, or NULL if the node doesn't contain any. - -.. c:function:: dom_node* get_xml_declaration(doc* document) - - :c:member:`document` The document from which the xml declaration tree will be returned. - - This functions returns the dom node at the root of the xml declaration tree, or NULL if there isn't any. - -.. c:function:: dom_node* get_doc_root(doc* document) - - :c:member:`document` The document from which the dom tree will be returned. - - This functions returns the dom node at the root of the dom tree, or NULL if there isn't any. - -.. c:function:: void prepend_child(dom_node* parent, dom_node* child) - - :c:member:`parent` The parent node to whom the child will be prepended. - - :c:member:`child` The child to be prepended. - - This function inserts a dom node at the head of the children's list of the dom node given as first argument. - -.. c:function:: void append_child(dom_node* parent, dom_node* child) - - :c:member:`parent` The parent node to whom the child will be appended. - - :c:member:`child` The child to be appended. - - This function inserts a dom node at the end of the children's list of the dom node given as first argument. - -.. c:function:: void append_children(dom_node* parent, struct generic_list_s* children) - - :c:member:`parent` The parent node to whom the children list will be appended. - - :c:member:`children` The children list to be appended. - - This functions calls :c:func:`append_child` for each node in the children's list, passed as the second argument. - -.. c:function:: void add_attribute(dom_node* node, dom_node* attribute) - - :c:member:`node` The node to whom the attribute will be added. - - :c:member:`attribute` The attribute to add to the node. - - This function adds an attribute to the node given as the first argument. - -.. c:function:: doc* new_document(struct snode* xml_declaration) - - :c:member:`xml_declaration` The declaration tree of the document. Can be NULL. - - This function creates a new document with the given xml declaration. - -.. c:function:: dom_node* new_element_node(char* name) - - :c:member:`name` The name of the new element node. - - This function creates a new element node with the given name. The name should correspond to an xml tag. - -.. c:function:: dom_node* new_text_node(char* text) - - :c:member:`text` The text in the xml document. - - This function creates a new text node and stores the given text in the value field of the dom node. - -.. c:function:: dom_node* new_attribute(char* name, char* value) - - :c:member:`name` The name of the attribute. - - :c:member:`value` The value of the attribute. - - This function creates a new attribute with the given name and value. - -.. c:function:: dom_node* new_cdata(char* cdata_text) - - :c:member:`cdata_text` The cdata text in the xml document. - - This function creates a new cdata node and stores the text in the value field. - -.. c:function:: dom_node* get_child_at(dom_node* parent, int index) - - :c:member:`parent` The node from which the child will be returned. - - :c:member:`index` The index of the child beggining at 0. - - This function returns the nth child of the parent node. If no child is found, NULL will be returned. - -.. c:function:: struct generic_list_s* get_children(dom_node* node) - - :c:member:`node` The node from which the children will be returned. - - This function returns a pointer to the node's children. Be aware that this function only returns nodes directly below the given argument. If you want the other ones too, consider using :c:func:`get_descedants`. - -.. c:function:: struct generic_list_s* get_descendants(dom_node* node) - - :c:member:`node` The node from which the descedants will be returned. - - This function returns the descendants of the node. This differs from :c:func:`get_children` because it returns all nodes below the given argument. - -.. c:function:: struct generic_list_s* get_text_nodes(doc* root) - - :c:member:`root` The document root of the xml. - - This function traverses the entire dom tree and returns all text nodes in it. - -.. c:function:: dom_node* get_attribute_by_name(dom_node* node, char* attr_name) - - :c:member:`node` The node from whom the attribute will be returned. - - :c:member:`attr_name` The name of the attribute. - - This function returns the attribute with the given name, or NULL if there isn't any. - -.. c:function:: struct generic_list_s* get_elements_by_name(doc* root, char* name) - - :c:member:`root` The document root of the xml. - - :c:member:`name` The name of the elements to search. - - This function traverses the entire dom tree and returns all element with the given name. - -.. c:function:: dom_node* delete_attribute(dom_node* node, char* name) - - :c:member:`node` The node from whom the attribute will be removed. - - :c:member:`name` The name of the attribute to remove. - - This function deletes the attribute with the given name from the given node. If the node doesn't contain an attribute with the given name, then nothing will happen. - -.. c:function:: void remove_node(doc* root, dom_node* node) - - :c:member:`root` The root of the xml document. - - :c:member:`node` The node to remove from the dom tree. - - This function removes the given node from the given dom tree. Be carefull because it also removes all nodes below the given node. This doesn't free the given node, so you should keep the pointer to it and free it yourself. - -.. c:function:: void destroy_dom_node(dom_node* n) - - :c:member:`n` The dom node to be destroyed. - - This function should be used with caution. This frees the space associated with the given dom node, but it also frees all nodes below it. A simple way to clean the dom tree keeping only the document structure is to pass the root node to this function as follows:: - - #include "node.h" - #include "lxq_parser.h" - - int main(){ - doc* document = parse_dom("xml_file.xml"); - //clean the tree but keep my doc structure and xml declaration intact. - destroy_dom_node(get_doc_root(document)); - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: void destroy_dom_tree(doc* root) - - :c:member:`root` The document to be destroyed. - - This function does exactly the same thing as :c:func:`destroy_dom_node` but it also frees the space associated with the document structure. As an example consider:: - - #include "node.h" - #include "lxq_parser.h" - - int main(){ - doc* document = parse_dom("xml_file.xml"); - destroy_dom_tree(document); - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - - If you use a memory leak checker you'll notice that there are no leaks, so this actually destroys all nodes. - -============= -Serialize DOM -============= - -This section explains how to serialize a DOM tree into a string. Currently we support three different types of output format: - -- XML - print the DOM tree as XML format. -- JSON - print the DOM tree as JavaScript Object Notation format. -- YAML - print the DOM tree as YAML Ain't Markup Language format. - -To do this we've defined an enumerate as:: - - typedef enum{ - XML=0, - JSON=1, - YAML=2 - } serialization_type; - -The serializarion is done throw the function: - -.. c:function:: char* node_to_string(dom_node* root, serialization_type t) - - :c:member:`root` The root of the tree to serialize onto a string. Can be any part of the DOM tree. - - :c:member:`t` The type of serialization to do. Must be one of XML, JSON, YAML. - - The following example shows how to serialize a document onto JSON format. If another one is desired you can change the type of serialization:: - - #include - #include "include/node.h" - #include "include/serialize.h" - #include "include/lxq_parser.h" - - int main(int argc, char** argv){ - doc* document = parse_xml("some.xml"); - char* json; - json = node_to_string(get_doc_root(document), JSON); - printf("%s", json); - free(json); - return 0; - } diff --git a/documentation/index.rst b/documentation/index.rst deleted file mode 100644 index 3b0527c..0000000 --- a/documentation/index.rst +++ /dev/null @@ -1,30 +0,0 @@ -.. libxmlquery documentation master file, created by - sphinx-quickstart on Fri Nov 5 15:13:45 2010. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -.. highlight:: c - -libxmlquery documentation -========================= - -**libxmlquery** is a colection of C functions to help **parse**, **create** and -**query** xml documents. - -If you are new to **libxmlquery** start by reading the -:doc:`Tutorial `. - -.. toctree:: - :maxdepth: 2 - - tutorial/tutorial - parser/parser - dom - querying - data_structures/datastructures - macros.h - bindings - applications/shell - -You may also find specific object documentation in the :ref:`genindex`. - diff --git a/documentation/macros.h.rst b/documentation/macros.h.rst deleted file mode 100644 index fff1dd9..0000000 --- a/documentation/macros.h.rst +++ /dev/null @@ -1,95 +0,0 @@ -.. highlight:: c - -============== -Special Macros -============== - -The file macros.h contains macros used all over our project. These macros were made to ease our pain in coding some things. This page describes and shows how to use them - -alloc ------ - -This section describes the macro - -.. c:macro:: alloc - -Ever get tired of calling malloc and check if the return address is a valid address, and if not print an error message and exit? The :c:macro:`alloc` macro can do all of this for you. It depends on the function :c:func:`__alloc`: - -.. c:function:: static inline void* __alloc(void* x) - -It is defined as:: - - #define alloc(type, how_many) \ - (type *) __alloc(malloc(how_many * sizeof(type))); - - static inline void* __alloc(void* x){ - if(x) - return x; - log(F,"malloc failed."); - exit(1); - return 0; - } - -The key to this macro resides in the :c:func:`__alloc` function. It receives the address returned by :c:func:`malloc` and checks if it is valid. If not, then a :c:macro:`log` message is printed and :c:func:`exit` function is called. The following example shows how to use this function to allocate an array of 100 characters:: - - #include - #include "macros.h" - - int main(){ - char* buffer = alloc(char, 100); - return 0; - } - -You may compile it with - - .. code-block:: bash - - gcc -o test -I - -Notice that you won't even have to bother with casting it to the right type. - -log ---- - -This section describes the macro - -.. c:macro:: log - -Ever filled your code with :c:func:`printf` functions to debug it? And when you're done with it needed to erase them? The :c:macro:`log` adds proper debug messages and doesn't need to be removed when the code is functional. Let's look at its definition:: - - #ifdef DEBUG - #include - #define log(level, format, ...) \ - do{ \ - fprintf(stderr, "%s %s:%d: ", level, __FILE__, __LINE__); \ - fprintf(stderr, format, ## __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - }while(0) - #else - #define log(level, str, ...) - #endif - - #define I "INFO" - #define W "WARNNING" - #define E "ERROR" - #define F "FATAL ERROR" - -First note the macros for I, W, E, F at the bottom. These are merely alias for the level of severity, you may use any other. The :c:macro:`log` macro prints messages to the ``stderr`` and is able to format strings according to :c:func:`printf` format options. Consider this example:: - - #include "macros.h" - - int main(){ - log(I, "Printing info\n"); - return 0; - } - -If we compile and run this example with the option :command:`-DDEBUG` we'll get the following output - - .. code-block:: bash - - Printing info - -If such option is not passed to the compiler, them no output will be shown. This happens because the macro is not created. What this means is that you can actually fill the code with logging messages and debug it, and when you're done just compile it without :command:`-DDEBUG` . The result is a binary file that doesn't contain code related to debug messages, thus is smaller than the debug version. However, if you need to debug it again, you can always recompile it with the debug flag. - -Notice that file name and line number are printed as well, which helps you pin-point the location of the print and check what may have been the cause of the problem. - diff --git a/documentation/parser/parser.rst b/documentation/parser/parser.rst deleted file mode 100644 index dffd706..0000000 --- a/documentation/parser/parser.rst +++ /dev/null @@ -1,94 +0,0 @@ -.. highlight:: c - -============= -Parser Module -============= - -The parser module is currently done with the flex lib and yacc. This forced us to merge the xml and query parser onto a single lexer file. - -Be aware that the parser is not thread safe and because it uses global variables, xmls and queries have to be parsed one at a time. - -Our implementation is divided into 3 files - parser.l, parser.y and lxq_parser.c. The parser.l file has all the lexer code. The parser.y defines the yacc grammar and a couple of functions explained in the next section. The lxq_parser.c defines two functions which are front ends to the parser and through where all parsing should be done. - -If for some reason your program exits without priting any message, you should recompile libxmlquery with ``-DDEBUG``, which may report extra error messages. - -Function description -^^^^^^^^^^^^^^^^^^^^ - -.. c:function:: void parse_file(char* filename) - - :c:member:`filename` The name of the file to be parsed - - This function maps the file in memory and parses it. The parsed structure is accessible through ``lxq_document``, which is a global variable declared in parser.y. If you need to parse an xml, we strongly recommend that you use :c:func:`parse_dom` . - -.. c:function:: void parse_string(const char* str) - - :c:member:`str` The string to be parsed. - - This function parses the input string and stores the result in ``lxq_selected_elements``. If you need to parse a query, we stringly recommend that you use :c:func:`parse_query` . - -.. c:function:: doc* parse_xml(char* filename) - - :c:member:`filename` The name of the xml file to be parsed. - - This function parses an xml file, copying the result from :c:func:`parse_file` to another location so you can parse as many xml files as possible. If an error occurs, this function returns NULL. - - The following example shows how to use this function to parse an xml. - - Example:: - - #include - #include "serialize.h" - #include "lxq_parser.h" - - int main(){ - doc* document = parse_xml("xml_file.xml"); - char* parsed = node_to_string(get_doc_root(document), XML); - - printf("%s", parsed); - free(parsed); - - if(document != NULL) - destroy_dom_tree(document); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I - -.. c:function:: doc* parse_xml_from_string(char* xmlstring) - - :c:member:`xmlstring` The the xml string to be parsed. - - This function parses an xml string, copying the result from :c:func:`parse_string` to another location so you can parse as many xml strings as possible. If an error occurs, this function returns NULL. - - The following example shows how to use this function to parse an xml string. - - Example:: - - #include - #include "serialize.h" - #include "lxq_parser.h" - - int main(){ - doc* document = parse_xml_from_string(" "); - char* parsed = node_to_string(get_doc_root(document), XML); - - printf("%s", parsed); - free(parsed); - - if(document != NULL) - destroy_dom_tree(document); - - return 0; - } - - You may compile it with - - .. code-block:: bash - - gcc -o test -I diff --git a/documentation/querying.rst b/documentation/querying.rst deleted file mode 100644 index 5920c4c..0000000 --- a/documentation/querying.rst +++ /dev/null @@ -1,102 +0,0 @@ -.. highlight:: c - -======== -Querying -======== - -Querying xml nodes to provide quick *random* access to inner nodes is -implemented through `CSS3 selectors `_. - -.. note:: - `CSS `_ stands for - cascading style sheets, it is primarily used for styling (x)html documents - as method to separate content from presentation. - -The CSS3 selectors specification is a `W3C `_ proposed -recomendation widely implemented by most modern browsers, it has also been used, -in its current and earlier forms (CSS and CSS2), by web developers for over 13 -years. - -The W3C recomendation does not tie CSS rules to the presentation of of (x)html -documents, in fact it does define it as a query language capable of selecting -xml/html nodes. With the rise in popularity of AJAX technologies several -javascript libraries became widely used, these libraries (most notabily -`JQuery `_) first proposed the utilization of CSS rules -not only for presentation but also to help manipulation and transversion of the -DOM. - -This library embraces CSS rules as a better/simpler alternative to manual -transversion as well as other W3C recomendations such as -`XPath `_ and -`XQuery `_. - - -Selectors ---------- - -The function `xmlquery_query` is defined to help filter and match nodes in the -:doc:`DOM tree `: - -.. c:function:: generic_list* xmlquery_query(const char* pattern, dom_node* root) - - :c:member:`pattern` Query pattern to apply to XML document. - - :c:member:`root` A root of a DOM tree where to begin the query. - - This function applies a query to a given DOM tree and returns a list of elements. - -Introduction -^^^^^^^^^^^^ - -Node selection is implemented as a **pattern string** to be matched against a -:doc:`DOM tree `. The pattern string matches some number of nodes that are -then returned as a flat list. - -A pattern example: - -.. code-block:: css - - foo - -this simple pattern matches all nodes named `foo`. Upon matching the DOM tree -with this pattern, a reference to every node named `foo` would be returned. -Independent of their position in the tree. Returned references may be -manipulated, rearanged or deleted. - - -Pattern strings match dom nodes in three different realms, according to the node -name (as we've seen), according to the node attributes and according to -*pseudo-filters*, a special kind of selectors aware of the node context. - -.. code-block:: css - - foo[attr='bar']:only-child - -A more complex selector, this selector will match nodes with the name *foo*, -with an attribute named *attr* with the value *bar*, and the node must also be -the *only child* of its parent node. - - -Custom pseudo-filters -^^^^^^^^^^^^^^^^^^^^^ - -We've created some new features. We added the possibility of making *custom pseudo-filters*. -*Custom pseudo-filters* provide a way for the user to define their own filters, which can be -chained with other query operators. - -To create a *custom pseudo-filter* you just need to define a function with the one of the following signatures:: - - int simple_filter(dom_node* node); - int complex_filter(dom_node* node, list* args); - -The first one creates a filter that doesn't take any arguments. If you want to design a filter that takes arguments, you must use the second signature. - -After defining your filter you need to register them. You do this by calling: - -.. c:function:: void register_simple_custom_filter(const char* name, int (*filter)(dom_node* node)) - -.. c:function:: void register_custom_filter(const char* name, int (*filter)(dom_node* node, list* args)) - -The first function registers a simple filter, while the second registers a complex one. - -When you're done with this you can call your filters just like a CSS3 *pseudo-filter*. diff --git a/documentation/tutorial/tutorial.rst b/documentation/tutorial/tutorial.rst deleted file mode 100644 index aabfdbe..0000000 --- a/documentation/tutorial/tutorial.rst +++ /dev/null @@ -1,196 +0,0 @@ -.. highlight:: c - -======== -Tutorial -======== - -In this tutorial you'll learn how to parse, query and manipulate XML files. We're going to use the test.xml document, which is an RSS Feed and has the content: - -.. code-block:: xml - - - - - - RSS Example - This is an example of an RSS feed - http://www.domain.com/link.htm - Mon, 28 Aug 2006 11:12:55 -0400 - Tue, 29 Aug 2006 09:00:00 -0400 - - - Item Example - This is an example of an Item - http://www.domain.com/link.htm - 1102345 - Tue, 29 Aug 2006 09:00:00 -0400 - - - - - -Every example in this tutorial must be compile as: - - .. code-block:: bash - - gcc -I ./libxmlquery.so - -Lets begin with parsing. The below code shows how to parse the above XML:: - - #include "node.h" - #include "lxq_parser.h" - - doc* global_document = NULL; - - void read_file(){ - global_document = parse_xml("test.xml"); - } - - void cleanup(){ - if(global_document) - destroy_dom_tree(global_document); - } - - int main(int argc, char** argv){ - read_file(); - cleanup(); - return 0; - } - -Ok so this is a pretty simple file. We're creating a DOM tree of the above XML document and then cleaning it up. However, this is not a really helpfull example. Lets try to add -the capability of querying the document through the program arguments:: - - #include - #include "node.h" - #include "lxq_parser.h" - #include "query_runner.h" - - doc* global_document = NULL; - - void read_file(){ - global_document = parse_xml("test.xml"); - } - - void cleanup(){ - if(global_document) - destroy_dom_tree(global_document); - } - - int main(int argc, char** argv){ - //check if we have exactly 1 argument - if(argc != 2){ - printf("Usage: %s \"query\"\n", argv[0]); - return -1; - } - - read_file(); - - query(argv[1], get_doc_root(global_document)); - - cleanup(); - return 0; - } - -Go ahead and run it with - - .. code-block:: bash - - ./a.out "@/ti..e/" - -It will search the document for all elements that begin with "ti", have any two characters following it and end with "e". - -However, we're able to see the output. Lets add that feature:: - - #include - #include "node.h" - #include "lxq_parser.h" - #include "query_runner.h" - #include "stack.h" - #include "serialize.h" - - doc* global_document = NULL; - - void read_file(){ - global_document = parse_xml("test.xml"); - } - - void cleanup(){ - if(global_document) - destroy_dom_tree(global_document); - } - - int main(int argc, char** argv){ - //check if we have exactly 1 argument - if(argc != 2){ - printf("Usage: %s \"query\"\n", argv[0]); - return -1; - } - - read_file(); - - list *result = query(argv[1], get_doc_root(global_document)); - - generic_list_iterator* i = new_generic_list_iterator(result); - while(generic_list_iterator_has_next(i)){ - dom_node* el = (dom_node*) generic_list_iterator_next(i); - char* output = node_to_string(el, XML); - printf("%s\n", output); - free(output); - } - destroy_generic_list_iterator(i); - - cleanup(); - return 0; - } - -Try it with the same query as before and then try to retrieve the element "title" for the "item" title with: - - .. code-block:: bash - - ./a.out "@/i.../>/ti..e/" - -Ok we're able to retrieve any thing from our RSS Feed. But now, we want to change the title of the element "item" to "no-title". Let's do it:: - - #include - #include "node.h" - #include "lxq_parser.h" - #include "query_runner.h" - #include "stack.h" - #include "serialize.h" - - doc* global_document = NULL; - - void read_file(){ - global_document = parse_xml("test.xml"); - } - - void cleanup(){ - if(global_document) - destroy_dom_tree(global_document); - } - - int main(int argc, char** argv){ - read_file(); - - list *result = query("@item>title", get_doc_root(global_document)); - - generic_list_iterator* i = new_generic_list_iterator(result); - while(generic_list_iterator_has_next(i)){ - dom_node* el = (dom_node*) generic_list_iterator_next(i); - //get the node which has the title - dom_node* text_node = get_child_at(el, 0); - char* old = set_value(text_node, "no-title"); - if(old) - free(old); - } - destroy_generic_list_iterator(i); - - char* output = node_to_string(get_doc_root(global_document), XML); - printf("%s\n", output); - free(output); - - cleanup(); - return 0; - } - -This concludes the tutorial. We've shown how to parse, query and manipulate XML documents. diff --git a/main.c b/main.c deleted file mode 100644 index aa345e2..0000000 --- a/main.c +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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 -#include -#include "include/node.h" -#include "include/serialize.h" -#include "include/lxq_parser.h" -#include "include/stack.h" -#include "include/query_runner.h" -#include "include/node.h" - -void dump(char* array, int offset, int size){ - for(; offset < size; offset++) - printf("%c", array[offset]); - putchar('\n'); -} - -int alberto(dom_node* alberto, list* l){ - return 1; -} - -int main(int argc, char** argv){ - - // char* cha = node_to_string(document->root, JSON); - - //output_xml(document); - //printf("%s", cha); - - //free(cha); - - if(argc != 3){ - printf("usage: %s \"xml_file\" \"query\"\n", argv[0]); - return 0; - } - register_custom_filter("alberto", &alberto); - doc* document = parse_xml(argv[1]); - - //printf("%s", node_to_string(document->root, XML)); - - //bdom* b = serialize_dom_doc(document); - - // dump(b->bb->buffer, 0, b->bb->size); - //printf("size %d\n", b->bb->size); - - //destroy_bdom(b); - - list* result = query(argv[2],document->root); - - //printf("List size is %d\n", result->count); - int i; - char* cha; - - for(i=0; i < result->count; i++){ - dom_node* t = (dom_node*)get_element_at(result, i); - cha = node_to_string(t, XML); - printf("%s", cha); - free(cha); - } - // printf("Results: %d\n", result->count); - if(result) - destroy_generic_list(result); - /* - printf("\n\n\n==========================================================\n\n\n"); - cha = node_to_string(document->root, JSON); - printf("%s", cha); - - free(cha);*/ - if(document != NULL) - destroy_dom_tree(document); - - /*destroy_generic_list(result); - list* cenas = parse_query("@E"); - int i = 0; - for(; i < cenas->count; i++){ - free(get_element_at(cenas, i)); - } - destroy_generic_list(cenas);*/ - /* printf("\n\n\nAGORA DE UMA STRING\n"); - yy_scan_string("texto"); - yyparse(); - - printf("==========================================================\n"); - output_xml(document); */ - - /* int a, b, c, d, e; - - stack* s = new_stack(2); - - printf("pushing %p\n", &a); - push_stack(s, &a); - printf("pushing %p\n", &b); - push_stack(s, &b); - printf("pushing %p\n", &c); - push_stack(s, &c); - printf("pushing %p\n", &d); - push_stack(s, &d); - printf("pushing %p\n", &e); - push_stack(s, &e); - - printf("\n\n==poping==\n\n"); - - printf("poping %p\n", pop_stack(s)); - printf("poping %p\n", pop_stack(s)); - printf("poping %p\n", pop_stack(s)); - printf("poping %p\n", pop_stack(s)); - printf("poping %p\n", pop_stack(s)); - - destroy_stack(s);*/ - destroy_dictionary(); - destroy_custom_filters(); - return 0; -} - diff --git a/profiling/Makefile b/profiling/Makefile deleted file mode 100644 index 62e30cc..0000000 --- a/profiling/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -dom_size: - gcc -o dom_size dom_size.c ../libxmlquery.so - diff --git a/profiling/com_remove_dups_e_quick_sort.gprof b/profiling/com_remove_dups_e_quick_sort.gprof deleted file mode 100644 index b28386e..0000000 --- a/profiling/com_remove_dups_e_quick_sort.gprof +++ /dev/null @@ -1,741 +0,0 @@ -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls s/call s/call name - 94.49 17.50 17.50 1 17.50 17.50 __quicksort_generic_list_aux - 2.48 17.96 0.46 129625 0.00 0.00 merge_lists - 0.65 18.08 0.12 2303395 0.00 0.00 yylex - 0.59 18.19 0.11 1788810 0.00 0.00 append_element - 0.59 18.30 0.11 894017 0.00 0.00 remove_element_at - 0.49 18.39 0.09 1654457 0.00 0.00 get_element_and_type_at - 0.11 18.41 0.02 513002 0.00 0.00 destroy_dom_node - 0.11 18.43 0.02 390453 0.00 0.00 destroy_generic_list - 0.11 18.45 0.02 1 0.02 0.51 get_descendants - 0.11 18.47 0.02 1 0.02 17.55 remove_duplicates - 0.05 18.48 0.01 2513880 0.00 0.00 append_bytes_to_buffer - 0.05 18.49 0.01 628470 0.00 0.00 new_byte_buffer - 0.05 18.50 0.01 252176 0.00 0.00 new_tree_iterator - 0.05 18.51 0.01 251388 0.00 0.00 __dom_node_to_xml - 0.05 18.52 0.01 2 0.01 0.14 yyparse - 0.00 18.52 0.00 2569718 0.00 0.00 __alloc - 0.00 18.52 0.00 2560282 0.00 0.00 __alloc - 0.00 18.52 0.00 2388186 0.00 0.00 append_string_to_buffer - 0.00 18.52 0.00 1654457 0.00 0.00 get_element_at - 0.00 18.52 0.00 1275029 0.00 0.00 add_element - 0.00 18.52 0.00 1256940 0.00 0.00 __alloc - 0.00 18.52 0.00 894016 0.00 0.00 pop_stack - 0.00 18.52 0.00 894016 0.00 0.00 push_stack - 0.00 18.52 0.00 772251 0.00 0.00 new_element_node - 0.00 18.52 0.00 763602 0.00 0.00 key - 0.00 18.52 0.00 757313 0.00 0.00 tree_iterator_has_next - 0.00 18.52 0.00 642626 0.00 0.00 get_name - 0.00 18.52 0.00 632407 0.00 0.00 __alloc - 0.00 18.52 0.00 513780 0.00 0.00 append_child - 0.00 18.52 0.00 505137 0.00 0.00 tree_iterator_next - 0.00 18.52 0.00 502776 0.00 0.00 append_buffer_to_buffer - 0.00 18.52 0.00 502776 0.00 0.00 destroy_byte_buffer - 0.00 18.52 0.00 390454 0.00 0.00 new_generic_list - 0.00 18.52 0.00 383375 0.00 0.00 get_namespace - 0.00 18.52 0.00 383375 0.00 0.00 set_namespace - 0.00 18.52 0.00 381801 0.00 0.00 compare - 0.00 18.52 0.00 253749 0.00 0.00 add_attribute - 0.00 18.52 0.00 253749 0.00 0.00 new_attribute - 0.00 18.52 0.00 253749 0.00 0.00 new_rbtree_node - 0.00 18.52 0.00 253749 0.00 0.00 rb_tree_insert - 0.00 18.52 0.00 253749 0.00 0.00 rb_tree_insert_fixup - 0.00 18.52 0.00 252176 0.00 0.00 destroy_iterator - 0.00 18.52 0.00 251388 0.00 0.00 __attribute_to_xml - 0.00 18.52 0.00 129626 0.00 0.00 set_name - 0.00 18.52 0.00 129625 0.00 0.00 append_children - 0.00 18.52 0.00 129625 0.00 0.00 get_children - 0.00 18.52 0.00 127266 0.00 0.00 new_text_node - 0.00 18.52 0.00 126482 0.00 0.00 __destroy_rbtree - 0.00 18.52 0.00 126482 0.00 0.00 destroy_rbtree - 0.00 18.52 0.00 126482 0.00 0.00 new_rbtree - 0.00 18.52 0.00 125694 0.00 0.00 __node_list_to_xml - 0.00 18.52 0.00 125694 0.00 0.00 node_to_string - 0.00 18.52 0.00 13612 0.00 0.00 refactor_generic_list - 0.00 18.52 0.00 4 0.00 0.00 new_stack - 0.00 18.52 0.00 4 0.00 0.00 yy_load_buffer_state - 0.00 18.52 0.00 4 0.00 0.00 yyalloc - 0.00 18.52 0.00 4 0.00 0.00 yydestruct - 0.00 18.52 0.00 4 0.00 0.00 yyfree - 0.00 18.52 0.00 3 0.00 0.00 yy_get_next_buffer - 0.00 18.52 0.00 2 0.00 0.00 __alloc - 0.00 18.52 0.00 2 0.00 0.00 yy_delete_buffer - 0.00 18.52 0.00 2 0.00 0.00 yy_init_globals - 0.00 18.52 0.00 2 0.00 0.00 yy_scan_buffer - 0.00 18.52 0.00 2 0.00 0.00 yy_switch_to_buffer - 0.00 18.52 0.00 2 0.00 0.00 yyensure_buffer_stack - 0.00 18.52 0.00 2 0.00 0.00 yylex_destroy - 0.00 18.52 0.00 2 0.00 0.00 yywrap - 0.00 18.52 0.00 1 0.00 0.00 __alloc - 0.00 18.52 0.00 1 0.00 0.00 __alloc - 0.00 18.52 0.00 1 0.00 17.50 __quicksort_generic_list - 0.00 18.52 0.00 1 0.00 0.00 add_element_with_type - 0.00 18.52 0.00 1 0.00 0.00 dequeue - 0.00 18.52 0.00 1 0.00 0.00 destroy_dom_tree - 0.00 18.52 0.00 1 0.00 0.00 destroy_selector - 0.00 18.52 0.00 1 0.00 0.00 enqueue_with_type - 0.00 18.52 0.00 1 0.00 0.02 filter_nodes_by_name - 0.00 18.52 0.00 1 0.00 0.02 filter_nodes_by_selector - 0.00 18.52 0.00 1 0.00 0.00 new_document - 0.00 18.52 0.00 1 0.00 0.00 new_queue - 0.00 18.52 0.00 1 0.00 0.00 new_selector - 0.00 18.52 0.00 1 0.00 0.25 parse_dom - 0.00 18.52 0.00 1 0.00 0.14 parse_file - 0.00 18.52 0.00 1 0.00 0.14 parse_query - 0.00 18.52 0.00 1 0.00 0.14 parse_string - 0.00 18.52 0.00 1 0.00 0.00 peek_queue_type - 0.00 18.52 0.00 1 0.00 18.22 query - 0.00 18.52 0.00 1 0.00 0.00 rebase_generic_list - 0.00 18.52 0.00 1 0.00 0.00 set_doc_root - 0.00 18.52 0.00 1 0.00 0.00 set_xml_declaration - 0.00 18.52 0.00 1 0.00 0.00 yy_get_previous_state - - % the percentage of the total running time of the -time program used by this function. - -cumulative a running sum of the number of seconds accounted - seconds for by this function and those listed above it. - - self the number of seconds accounted for by this -seconds function alone. This is the major sort for this - listing. - -calls the number of times this function was invoked, if - this function is profiled, else blank. - - self the average number of milliseconds spent in this -ms/call function per call, if this function is profiled, - else blank. - - total the average number of milliseconds spent in this -ms/call function and its descendents per call, if this - function is profiled, else blank. - -name the name of the function. This is the minor sort - for this listing. The index shows the location of - the function in the gprof listing. If the index is - in parenthesis it shows where it would appear in - the gprof listing if it were to be printed. - - Call graph (explanation follows) - - -granularity: each sample hit covers 4 byte(s) for 0.05% of 18.52 seconds - -index % time self children called name - -[1] 100.0 0.00 18.52 main [1] - 0.00 18.22 1/1 query [2] - 0.00 0.25 1/1 parse_dom [9] - 0.00 0.04 125694/125694 node_to_string [22] - 0.00 0.01 125694/1654457 get_element_at [18] - 0.00 0.00 1/1 destroy_dom_tree [36] ------------------------------------------------ - 0.00 18.22 1/1 main [1] -[2] 98.4 0.00 18.22 1 query [2] - 0.02 17.53 1/1 remove_duplicates [3] - 0.02 0.49 1/1 get_descendants [6] - 0.00 0.14 1/1 parse_query [11] - 0.00 0.02 1/1 filter_nodes_by_selector [27] - 0.00 0.00 1/129625 merge_lists [7] - 0.00 0.00 1/1 dequeue [37] - 0.00 0.00 1/1 destroy_selector [38] - 0.00 0.00 1/1275029 add_element [19] - 0.00 0.00 1/390453 destroy_generic_list [29] - 0.00 0.00 1/390454 new_generic_list [48] - 0.00 0.00 1/1 peek_queue_type [80] ------------------------------------------------ - 0.02 17.53 1/1 query [2] -[3] 94.8 0.02 17.53 1 remove_duplicates [3] - 0.00 17.50 1/1 __quicksort_generic_list [4] - 0.00 0.02 377080/1654457 get_element_at [18] - 0.00 0.01 125694/1275029 add_element [19] - 0.00 0.00 1/390453 destroy_generic_list [29] - 0.00 0.00 1/390454 new_generic_list [48] - 0.00 0.00 1/1 rebase_generic_list [81] ------------------------------------------------ - 0.00 17.50 1/1 remove_duplicates [3] -[4] 94.5 0.00 17.50 1 __quicksort_generic_list [4] - 17.50 0.00 1/1 __quicksort_generic_list_aux [5] ------------------------------------------------ - 200662 __quicksort_generic_list_aux [5] - 17.50 0.00 1/1 __quicksort_generic_list [4] -[5] 94.5 17.50 0.00 1+200662 __quicksort_generic_list_aux [5] - 200662 __quicksort_generic_list_aux [5] ------------------------------------------------ - 129624 get_descendants [6] - 0.02 0.49 1/1 query [2] -[6] 2.7 0.02 0.49 1+129624 get_descendants [6] - 0.46 0.01 129624/129625 merge_lists [7] - 0.00 0.01 256890/1654457 get_element_at [18] - 0.00 0.01 129624/1275029 add_element [19] - 0.00 0.00 129625/129625 get_children [59] - 0.00 0.00 129625/390454 new_generic_list [48] - 129624 get_descendants [6] ------------------------------------------------ - 0.00 0.00 1/129625 query [2] - 0.46 0.01 129624/129625 get_descendants [6] -[7] 2.5 0.46 0.01 129625 merge_lists [7] - 0.01 0.00 131196/390453 destroy_generic_list [29] - 0.00 0.00 1571/390454 new_generic_list [48] ------------------------------------------------ - 0.01 0.14 1/2 parse_file [12] - 0.01 0.14 1/2 parse_string [13] -[8] 1.5 0.01 0.27 2 yyparse [8] - 0.12 0.05 2303395/2303395 yylex [10] - 0.02 0.03 513000/513002 destroy_dom_node [21] - 0.00 0.03 129625/129625 append_children [26] - 0.00 0.02 256890/513780 append_child [25] - 0.01 0.00 129625/390453 destroy_generic_list [29] - 0.00 0.00 1/1 enqueue_with_type [40] - 0.00 0.00 772251/772251 new_element_node [41] - 0.00 0.00 642626/642626 get_name [44] - 0.00 0.00 383375/383375 get_namespace [49] - 0.00 0.00 383375/383375 set_namespace [50] - 0.00 0.00 253749/253749 add_attribute [52] - 0.00 0.00 253749/253749 new_attribute [53] - 0.00 0.00 129626/129626 set_name [58] - 0.00 0.00 127266/127266 new_text_node [60] - 0.00 0.00 4/4 yydestruct [67] - 0.00 0.00 2/4 new_stack [64] - 0.00 0.00 1/1 new_document [77] - 0.00 0.00 1/1 set_doc_root [82] - 0.00 0.00 1/1 new_queue [78] - 0.00 0.00 1/1 new_selector [79] ------------------------------------------------ - 0.00 0.25 1/1 main [1] -[9] 1.4 0.00 0.25 1 parse_dom [9] - 0.00 0.14 1/1 parse_file [12] - 0.00 0.11 894015/894016 pop_stack [16] - 0.00 0.00 1/390453 destroy_generic_list [29] - 0.00 0.00 1/4 new_stack [64] - 0.00 0.00 1/2 __alloc [178] ------------------------------------------------ - 0.12 0.05 2303395/2303395 yyparse [8] -[10] 0.9 0.12 0.05 2303395 yylex [10] - 0.00 0.05 894016/894016 push_stack [20] - 0.00 0.00 3/3 yy_get_next_buffer [69] - 0.00 0.00 2/4 yy_load_buffer_state [65] - 0.00 0.00 2/2 yywrap [76] - 0.00 0.00 1/1 yy_get_previous_state [84] ------------------------------------------------ - 0.00 0.14 1/1 query [2] -[11] 0.8 0.00 0.14 1 parse_query [11] - 0.00 0.14 1/1 parse_string [13] - 0.00 0.00 1/894016 pop_stack [16] - 0.00 0.00 1/390453 destroy_generic_list [29] - 0.00 0.00 1/4 new_stack [64] - 0.00 0.00 1/2 __alloc [178] ------------------------------------------------ - 0.00 0.14 1/1 parse_dom [9] -[12] 0.8 0.00 0.14 1 parse_file [12] - 0.01 0.14 1/2 yyparse [8] - 0.00 0.00 1/2 yy_scan_buffer [72] - 0.00 0.00 1/2 yy_delete_buffer [70] - 0.00 0.00 1/2 yylex_destroy [75] ------------------------------------------------ - 0.00 0.14 1/1 parse_query [11] -[13] 0.8 0.00 0.14 1 parse_string [13] - 0.01 0.14 1/2 yyparse [8] - 0.00 0.00 1/1 __alloc [179] - 0.00 0.00 1/2 yy_scan_buffer [72] - 0.00 0.00 1/2 yylex_destroy [75] - 0.00 0.00 1/2 yy_delete_buffer [70] ------------------------------------------------ - 0.00 0.00 1/894017 dequeue [37] - 0.11 0.00 894016/894017 pop_stack [16] -[14] 0.6 0.11 0.00 894017 remove_element_at [14] ------------------------------------------------ - 0.00 0.00 1/1788810 add_element_with_type [39] - 0.03 0.00 513780/1788810 append_child [25] - 0.08 0.00 1275029/1788810 add_element [19] -[15] 0.6 0.11 0.00 1788810 append_element [15] - 0.00 0.00 1788810/2569718 __alloc [173] - 0.00 0.00 13612/13612 refactor_generic_list [63] ------------------------------------------------ - 0.00 0.00 1/894016 parse_query [11] - 0.00 0.11 894015/894016 parse_dom [9] -[16] 0.6 0.00 0.11 894016 pop_stack [16] - 0.11 0.00 894016/894017 remove_element_at [14] ------------------------------------------------ - 0.09 0.00 1654457/1654457 get_element_at [18] -[17] 0.5 0.09 0.00 1654457 get_element_and_type_at [17] ------------------------------------------------ - 0.00 0.01 125694/1654457 __node_list_to_xml [35] - 0.00 0.01 125694/1654457 main [1] - 0.00 0.01 255319/1654457 filter_nodes_by_name [28] - 0.00 0.01 256890/1654457 append_children [26] - 0.00 0.01 256890/1654457 get_descendants [6] - 0.00 0.01 256890/1654457 destroy_dom_node [21] - 0.00 0.02 377080/1654457 remove_duplicates [3] -[18] 0.5 0.00 0.09 1654457 get_element_at [18] - 0.09 0.00 1654457/1654457 get_element_and_type_at [17] ------------------------------------------------ - 0.00 0.00 1/1275029 query [2] - 0.00 0.01 125694/1275029 remove_duplicates [3] - 0.00 0.01 125694/1275029 filter_nodes_by_name [28] - 0.00 0.01 129624/1275029 get_descendants [6] - 0.00 0.05 894016/1275029 push_stack [20] -[19] 0.4 0.00 0.08 1275029 add_element [19] - 0.08 0.00 1275029/1788810 append_element [15] ------------------------------------------------ - 0.00 0.05 894016/894016 yylex [10] -[20] 0.3 0.00 0.05 894016 push_stack [20] - 0.00 0.05 894016/1275029 add_element [19] ------------------------------------------------ - 510639 destroy_dom_node [21] - 0.00 0.00 2/513002 destroy_dom_tree [36] - 0.02 0.03 513000/513002 yyparse [8] -[21] 0.2 0.02 0.03 513002+510639 destroy_dom_node [21] - 0.00 0.01 256890/1654457 get_element_at [18] - 0.01 0.00 129625/390453 destroy_generic_list [29] - 0.01 0.00 126482/252176 new_tree_iterator [32] - 0.00 0.00 380231/757313 tree_iterator_has_next [43] - 0.00 0.00 253749/505137 tree_iterator_next [45] - 0.00 0.00 126482/252176 destroy_iterator [57] - 0.00 0.00 126482/126482 destroy_rbtree [61] - 510639 destroy_dom_node [21] ------------------------------------------------ - 0.00 0.04 125694/125694 main [1] -[22] 0.2 0.00 0.04 125694 node_to_string [22] - 0.01 0.03 125694/125694 __dom_node_to_xml [24] - 0.00 0.00 125694/2513880 append_bytes_to_buffer [30] ------------------------------------------------ -[23] 0.2 0.01 0.03 125694+251388 [23] - 0.01 0.02 251388 __dom_node_to_xml [24] - 0.00 0.01 125694 __node_list_to_xml [35] ------------------------------------------------ - 125694 __node_list_to_xml [35] - 0.01 0.03 125694/125694 node_to_string [22] -[24] 0.2 0.01 0.02 251388 __dom_node_to_xml [24] - 0.00 0.01 251388/251388 __attribute_to_xml [34] - 0.00 0.00 125694/252176 new_tree_iterator [32] - 0.00 0.00 1131246/2388186 append_string_to_buffer [33] - 0.00 0.00 251388/628470 new_byte_buffer [31] - 0.00 0.00 377082/502776 append_buffer_to_buffer [46] - 0.00 0.00 377082/502776 destroy_byte_buffer [47] - 0.00 0.00 377082/757313 tree_iterator_has_next [43] - 0.00 0.00 251388/505137 tree_iterator_next [45] - 0.00 0.00 125694/252176 destroy_iterator [57] - 125694 __node_list_to_xml [35] ------------------------------------------------ - 0.00 0.02 256890/513780 yyparse [8] - 0.00 0.02 256890/513780 append_children [26] -[25] 0.2 0.00 0.03 513780 append_child [25] - 0.03 0.00 513780/1788810 append_element [15] - 0.00 0.00 129625/390454 new_generic_list [48] ------------------------------------------------ - 0.00 0.03 129625/129625 yyparse [8] -[26] 0.2 0.00 0.03 129625 append_children [26] - 0.00 0.02 256890/513780 append_child [25] - 0.00 0.01 256890/1654457 get_element_at [18] - 0.00 0.00 129625/390454 new_generic_list [48] ------------------------------------------------ - 0.00 0.02 1/1 query [2] -[27] 0.1 0.00 0.02 1 filter_nodes_by_selector [27] - 0.00 0.02 1/1 filter_nodes_by_name [28] - 0.00 0.00 1/390453 destroy_generic_list [29] ------------------------------------------------ - 0.00 0.02 1/1 filter_nodes_by_selector [27] -[28] 0.1 0.00 0.02 1 filter_nodes_by_name [28] - 0.00 0.01 255319/1654457 get_element_at [18] - 0.00 0.01 125694/1275029 add_element [19] - 0.00 0.00 1/390454 new_generic_list [48] ------------------------------------------------ - 0.00 0.00 1/390453 parse_dom [9] - 0.00 0.00 1/390453 parse_query [11] - 0.00 0.00 1/390453 remove_duplicates [3] - 0.00 0.00 1/390453 filter_nodes_by_selector [27] - 0.00 0.00 1/390453 query [2] - 0.00 0.00 2/390453 destroy_selector [38] - 0.01 0.00 129625/390453 yyparse [8] - 0.01 0.00 129625/390453 destroy_dom_node [21] - 0.01 0.00 131196/390453 merge_lists [7] -[29] 0.1 0.02 0.00 390453 destroy_generic_list [29] ------------------------------------------------ - 0.00 0.00 125694/2513880 node_to_string [22] - 0.01 0.00 2388186/2513880 append_string_to_buffer [33] -[30] 0.1 0.01 0.00 2513880 append_bytes_to_buffer [30] ------------------------------------------------ - 0.00 0.00 125694/628470 __node_list_to_xml [35] - 0.00 0.00 251388/628470 __dom_node_to_xml [24] - 0.00 0.00 251388/628470 __attribute_to_xml [34] -[31] 0.1 0.01 0.00 628470 new_byte_buffer [31] - 0.00 0.00 1256940/1256940 __alloc [175] ------------------------------------------------ - 0.00 0.00 125694/252176 __dom_node_to_xml [24] - 0.01 0.00 126482/252176 destroy_dom_node [21] -[32] 0.1 0.01 0.00 252176 new_tree_iterator [32] - 0.00 0.00 252176/632407 __alloc [176] ------------------------------------------------ - 0.00 0.00 1131246/2388186 __dom_node_to_xml [24] - 0.00 0.01 1256940/2388186 __attribute_to_xml [34] -[33] 0.1 0.00 0.01 2388186 append_string_to_buffer [33] - 0.01 0.00 2388186/2513880 append_bytes_to_buffer [30] ------------------------------------------------ - 0.00 0.01 251388/251388 __dom_node_to_xml [24] -[34] 0.0 0.00 0.01 251388 __attribute_to_xml [34] - 0.00 0.01 1256940/2388186 append_string_to_buffer [33] - 0.00 0.00 251388/628470 new_byte_buffer [31] ------------------------------------------------ - 125694 __dom_node_to_xml [24] -[35] 0.0 0.00 0.01 125694 __node_list_to_xml [35] - 0.00 0.01 125694/1654457 get_element_at [18] - 0.00 0.00 125694/628470 new_byte_buffer [31] - 0.00 0.00 125694/502776 append_buffer_to_buffer [46] - 0.00 0.00 125694/502776 destroy_byte_buffer [47] - 125694 __dom_node_to_xml [24] ------------------------------------------------ - 0.00 0.00 1/1 main [1] -[36] 0.0 0.00 0.00 1 destroy_dom_tree [36] - 0.00 0.00 2/513002 destroy_dom_node [21] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[37] 0.0 0.00 0.00 1 dequeue [37] - 0.00 0.00 1/894017 remove_element_at [14] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[38] 0.0 0.00 0.00 1 destroy_selector [38] - 0.00 0.00 2/390453 destroy_generic_list [29] ------------------------------------------------ - 0.00 0.00 1/1 enqueue_with_type [40] -[39] 0.0 0.00 0.00 1 add_element_with_type [39] - 0.00 0.00 1/1788810 append_element [15] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [8] -[40] 0.0 0.00 0.00 1 enqueue_with_type [40] - 0.00 0.00 1/1 add_element_with_type [39] ------------------------------------------------ - 0.00 0.00 772251/772251 yyparse [8] -[41] 0.0 0.00 0.00 772251 new_element_node [41] - 0.00 0.00 1544502/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 763602/763602 rb_tree_insert [55] -[42] 0.0 0.00 0.00 763602 key [42] ------------------------------------------------ - 0.00 0.00 377082/757313 __dom_node_to_xml [24] - 0.00 0.00 380231/757313 destroy_dom_node [21] -[43] 0.0 0.00 0.00 757313 tree_iterator_has_next [43] ------------------------------------------------ - 0.00 0.00 642626/642626 yyparse [8] -[44] 0.0 0.00 0.00 642626 get_name [44] ------------------------------------------------ - 0.00 0.00 251388/505137 __dom_node_to_xml [24] - 0.00 0.00 253749/505137 destroy_dom_node [21] -[45] 0.0 0.00 0.00 505137 tree_iterator_next [45] ------------------------------------------------ - 0.00 0.00 125694/502776 __node_list_to_xml [35] - 0.00 0.00 377082/502776 __dom_node_to_xml [24] -[46] 0.0 0.00 0.00 502776 append_buffer_to_buffer [46] ------------------------------------------------ - 0.00 0.00 125694/502776 __node_list_to_xml [35] - 0.00 0.00 377082/502776 __dom_node_to_xml [24] -[47] 0.0 0.00 0.00 502776 destroy_byte_buffer [47] ------------------------------------------------ - 0.00 0.00 1/390454 new_queue [78] - 0.00 0.00 1/390454 remove_duplicates [3] - 0.00 0.00 1/390454 filter_nodes_by_name [28] - 0.00 0.00 1/390454 query [2] - 0.00 0.00 4/390454 new_stack [64] - 0.00 0.00 1571/390454 merge_lists [7] - 0.00 0.00 129625/390454 append_child [25] - 0.00 0.00 129625/390454 append_children [26] - 0.00 0.00 129625/390454 get_descendants [6] -[48] 0.0 0.00 0.00 390454 new_generic_list [48] - 0.00 0.00 780908/2569718 __alloc [173] ------------------------------------------------ - 0.00 0.00 383375/383375 yyparse [8] -[49] 0.0 0.00 0.00 383375 get_namespace [49] ------------------------------------------------ - 0.00 0.00 383375/383375 yyparse [8] -[50] 0.0 0.00 0.00 383375 set_namespace [50] ------------------------------------------------ - 0.00 0.00 381801/381801 rb_tree_insert [55] -[51] 0.0 0.00 0.00 381801 compare [51] ------------------------------------------------ - 0.00 0.00 253749/253749 yyparse [8] -[52] 0.0 0.00 0.00 253749 add_attribute [52] - 0.00 0.00 253749/253749 rb_tree_insert [55] - 0.00 0.00 126482/126482 new_rbtree [62] ------------------------------------------------ - 0.00 0.00 253749/253749 yyparse [8] -[53] 0.0 0.00 0.00 253749 new_attribute [53] - 0.00 0.00 761247/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 253749/253749 rb_tree_insert [55] -[54] 0.0 0.00 0.00 253749 new_rbtree_node [54] - 0.00 0.00 253749/632407 __alloc [176] ------------------------------------------------ - 0.00 0.00 253749/253749 add_attribute [52] -[55] 0.0 0.00 0.00 253749 rb_tree_insert [55] - 0.00 0.00 763602/763602 key [42] - 0.00 0.00 381801/381801 compare [51] - 0.00 0.00 253749/253749 new_rbtree_node [54] - 0.00 0.00 253749/253749 rb_tree_insert_fixup [56] ------------------------------------------------ - 0.00 0.00 253749/253749 rb_tree_insert [55] -[56] 0.0 0.00 0.00 253749 rb_tree_insert_fixup [56] ------------------------------------------------ - 0.00 0.00 125694/252176 __dom_node_to_xml [24] - 0.00 0.00 126482/252176 destroy_dom_node [21] -[57] 0.0 0.00 0.00 252176 destroy_iterator [57] ------------------------------------------------ - 0.00 0.00 129626/129626 yyparse [8] -[58] 0.0 0.00 0.00 129626 set_name [58] ------------------------------------------------ - 0.00 0.00 129625/129625 get_descendants [6] -[59] 0.0 0.00 0.00 129625 get_children [59] ------------------------------------------------ - 0.00 0.00 127266/127266 yyparse [8] -[60] 0.0 0.00 0.00 127266 new_text_node [60] - 0.00 0.00 254532/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 126482/126482 destroy_dom_node [21] -[61] 0.0 0.00 0.00 126482 destroy_rbtree [61] - 0.00 0.00 126482/126482 __destroy_rbtree [177] ------------------------------------------------ - 0.00 0.00 126482/126482 add_attribute [52] -[62] 0.0 0.00 0.00 126482 new_rbtree [62] - 0.00 0.00 126482/632407 __alloc [176] ------------------------------------------------ - 0.00 0.00 13612/13612 append_element [15] -[63] 0.0 0.00 0.00 13612 refactor_generic_list [63] ------------------------------------------------ - 0.00 0.00 1/4 parse_dom [9] - 0.00 0.00 1/4 parse_query [11] - 0.00 0.00 2/4 yyparse [8] -[64] 0.0 0.00 0.00 4 new_stack [64] - 0.00 0.00 4/390454 new_generic_list [48] ------------------------------------------------ - 0.00 0.00 2/4 yylex [10] - 0.00 0.00 2/4 yy_switch_to_buffer [73] -[65] 0.0 0.00 0.00 4 yy_load_buffer_state [65] ------------------------------------------------ - 0.00 0.00 2/4 yyensure_buffer_stack [74] - 0.00 0.00 2/4 yy_scan_buffer [72] -[66] 0.0 0.00 0.00 4 yyalloc [66] ------------------------------------------------ - 0.00 0.00 4/4 yyparse [8] -[67] 0.0 0.00 0.00 4 yydestruct [67] ------------------------------------------------ - 0.00 0.00 2/4 yy_delete_buffer [70] - 0.00 0.00 2/4 yylex_destroy [75] -[68] 0.0 0.00 0.00 4 yyfree [68] ------------------------------------------------ - 0.00 0.00 3/3 yylex [10] -[69] 0.0 0.00 0.00 3 yy_get_next_buffer [69] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [12] - 0.00 0.00 1/2 parse_string [13] -[70] 0.0 0.00 0.00 2 yy_delete_buffer [70] - 0.00 0.00 2/4 yyfree [68] ------------------------------------------------ - 0.00 0.00 2/2 yylex_destroy [75] -[71] 0.0 0.00 0.00 2 yy_init_globals [71] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [12] - 0.00 0.00 1/2 parse_string [13] -[72] 0.0 0.00 0.00 2 yy_scan_buffer [72] - 0.00 0.00 2/4 yyalloc [66] - 0.00 0.00 2/2 yy_switch_to_buffer [73] ------------------------------------------------ - 0.00 0.00 2/2 yy_scan_buffer [72] -[73] 0.0 0.00 0.00 2 yy_switch_to_buffer [73] - 0.00 0.00 2/2 yyensure_buffer_stack [74] - 0.00 0.00 2/4 yy_load_buffer_state [65] ------------------------------------------------ - 0.00 0.00 2/2 yy_switch_to_buffer [73] -[74] 0.0 0.00 0.00 2 yyensure_buffer_stack [74] - 0.00 0.00 2/4 yyalloc [66] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [12] - 0.00 0.00 1/2 parse_string [13] -[75] 0.0 0.00 0.00 2 yylex_destroy [75] - 0.00 0.00 2/4 yyfree [68] - 0.00 0.00 2/2 yy_init_globals [71] ------------------------------------------------ - 0.00 0.00 2/2 yylex [10] -[76] 0.0 0.00 0.00 2 yywrap [76] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [8] -[77] 0.0 0.00 0.00 1 new_document [77] - 0.00 0.00 1/2560282 __alloc [174] - 0.00 0.00 1/1 set_xml_declaration [83] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [8] -[78] 0.0 0.00 0.00 1 new_queue [78] - 0.00 0.00 1/390454 new_generic_list [48] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [8] -[79] 0.0 0.00 0.00 1 new_selector [79] - 0.00 0.00 1/1 __alloc [180] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[80] 0.0 0.00 0.00 1 peek_queue_type [80] ------------------------------------------------ - 0.00 0.00 1/1 remove_duplicates [3] -[81] 0.0 0.00 0.00 1 rebase_generic_list [81] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [8] -[82] 0.0 0.00 0.00 1 set_doc_root [82] ------------------------------------------------ - 0.00 0.00 1/1 new_document [77] -[83] 0.0 0.00 0.00 1 set_xml_declaration [83] ------------------------------------------------ - 0.00 0.00 1/1 yylex [10] -[84] 0.0 0.00 0.00 1 yy_get_previous_state [84] ------------------------------------------------ - 0.00 0.00 780908/2569718 new_generic_list [48] - 0.00 0.00 1788810/2569718 append_element [15] -[173] 0.0 0.00 0.00 2569718 __alloc [173] ------------------------------------------------ - 0.00 0.00 1/2560282 new_document [77] - 0.00 0.00 254532/2560282 new_text_node [60] - 0.00 0.00 761247/2560282 new_attribute [53] - 0.00 0.00 1544502/2560282 new_element_node [41] -[174] 0.0 0.00 0.00 2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 1256940/1256940 new_byte_buffer [31] -[175] 0.0 0.00 0.00 1256940 __alloc [175] ------------------------------------------------ - 0.00 0.00 126482/632407 new_rbtree [62] - 0.00 0.00 252176/632407 new_tree_iterator [32] - 0.00 0.00 253749/632407 new_rbtree_node [54] -[176] 0.0 0.00 0.00 632407 __alloc [176] ------------------------------------------------ - 507498 __destroy_rbtree [177] - 0.00 0.00 126482/126482 destroy_rbtree [61] -[177] 0.0 0.00 0.00 126482+507498 __destroy_rbtree [177] - 507498 __destroy_rbtree [177] ------------------------------------------------ - 0.00 0.00 1/2 parse_dom [9] - 0.00 0.00 1/2 parse_query [11] -[178] 0.0 0.00 0.00 2 __alloc [178] ------------------------------------------------ - 0.00 0.00 1/1 parse_string [13] -[179] 0.0 0.00 0.00 1 __alloc [179] ------------------------------------------------ - 0.00 0.00 1/1 new_selector [79] -[180] 0.0 0.00 0.00 1 __alloc [180] ------------------------------------------------ - - This table describes the call tree of the program, and was sorted by - the total amount of time spent in each function and its children. - - Each entry in this table consists of several lines. The line with the - index number at the left hand margin lists the current function. - The lines above it list the functions that called this function, - and the lines below it list the functions this one called. - This line lists: - index A unique number given to each element of the table. - Index numbers are sorted numerically. - The index number is printed next to every function name so - it is easier to look up where the function in the table. - - % time This is the percentage of the `total' time that was spent - in this function and its children. Note that due to - different viewpoints, functions excluded by options, etc, - these numbers will NOT add up to 100%. - - self This is the total amount of time spent in this function. - - children This is the total amount of time propagated into this - function by its children. - - called This is the number of times the function was called. - If the function called itself recursively, the number - only includes non-recursive calls, and is followed by - a `+' and the number of recursive calls. - - name The name of the current function. The index number is - printed after it. If the function is a member of a - cycle, the cycle number is printed between the - function's name and the index number. - - - For the function's parents, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the function into this parent. - - children This is the amount of time that was propagated from - the function's children into this parent. - - called This is the number of times this parent called the - function `/' the total number of times the function - was called. Recursive calls to the function are not - included in the number after the `/'. - - name This is the name of the parent. The parent's index - number is printed after it. If the parent is a - member of a cycle, the cycle number is printed between - the name and the index number. - - If the parents of the function cannot be determined, the word - `' is printed in the `name' field, and all the other - fields are blank. - - For the function's children, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the child into the function. - - children This is the amount of time that was propagated from the - child's children to the function. - - called This is the number of times the function called - this child `/' the total number of times the child - was called. Recursive calls by the child are not - listed in the number after the `/'. - - name This is the name of the child. The child's index - number is printed after it. If the child is a - member of a cycle, the cycle number is printed - between the name and the index number. - - If there are any cycles (circles) in the call graph, there is an - entry for the cycle-as-a-whole. This entry shows who called the - cycle (as parents) and the members of the cycle (as children.) - The `+' recursive calls entry shows the number of function calls that - were internal to the cycle, and the calls entry for each member shows, - for that member, how many times it was called from other members of - the cycle. - - -Index by function name - - [178] __alloc (macros.h) [40] enqueue_with_type [2] query - [179] __alloc (macros.h) [28] filter_nodes_by_name [55] rb_tree_insert - [174] __alloc (macros.h) [27] filter_nodes_by_selector [56] rb_tree_insert_fixup (rbtree.c) - [175] __alloc (macros.h) [59] get_children [81] rebase_generic_list (stack.c) - [176] __alloc (macros.h) [6] get_descendants [63] refactor_generic_list (stack.c) - [173] __alloc (macros.h) [17] get_element_and_type_at [3] remove_duplicates - [180] __alloc (macros.h) [18] get_element_at [14] remove_element_at - [34] __attribute_to_xml [44] get_name [82] set_doc_root - [177] __destroy_rbtree (rbtree.c) [49] get_namespace [58] set_name - [24] __dom_node_to_xml [42] key [50] set_namespace - [35] __node_list_to_xml [7] merge_lists [83] set_xml_declaration - [4] __quicksort_generic_list [53] new_attribute [43] tree_iterator_has_next - [5] __quicksort_generic_list_aux [31] new_byte_buffer [45] tree_iterator_next - [52] add_attribute [77] new_document [70] yy_delete_buffer - [19] add_element [41] new_element_node [69] yy_get_next_buffer (lex.yy.c) - [39] add_element_with_type [48] new_generic_list [84] yy_get_previous_state (lex.yy.c) - [46] append_buffer_to_buffer [78] new_queue [71] yy_init_globals (lex.yy.c) - [30] append_bytes_to_buffer [62] new_rbtree [65] yy_load_buffer_state (lex.yy.c) - [25] append_child [54] new_rbtree_node (rbtree.c) [72] yy_scan_buffer - [26] append_children [79] new_selector [73] yy_switch_to_buffer - [15] append_element [64] new_stack [66] yyalloc - [33] append_string_to_buffer [60] new_text_node [67] yydestruct (y.tab.c) - [51] compare [32] new_tree_iterator [74] yyensure_buffer_stack (lex.yy.c) - [37] dequeue [22] node_to_string [68] yyfree - [47] destroy_byte_buffer [9] parse_dom [10] yylex - [21] destroy_dom_node [12] parse_file [75] yylex_destroy - [36] destroy_dom_tree [11] parse_query [8] yyparse - [29] destroy_generic_list [13] parse_string [76] yywrap - [57] destroy_iterator [80] peek_queue_type [23] - [61] destroy_rbtree [16] pop_stack - [38] destroy_selector [20] push_stack diff --git a/profiling/com_remove_dups_e_quick_sort.massif b/profiling/com_remove_dups_e_quick_sort.massif deleted file mode 100644 index 22587d6..0000000 --- a/profiling/com_remove_dups_e_quick_sort.massif +++ /dev/null @@ -1,1958 +0,0 @@ --------------------------------------------------------------------------------- -Command: ./dom_parser really_big.xml @segment -Massif arguments: --time-unit=B --massif-out-file=stats.massif -ms_print arguments: stats.massif --------------------------------------------------------------------------------- - - - MB -98.74^ # - | # - | # - | ::# - | : # - | @: #: - | @: #: - | @@: #: :@::::::::::::::::::::::::@:::::::@:::@:::::@::::@::::: - | @@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@::::: - | @@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@ - | @@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@ - | @@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@ - | @@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@ - | @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@: - | @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@: - | @@@@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@: - | @ @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@: - | :@ @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@:: - | :@ @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@:: - | :@ @@@@@: #:::@::::::::::::::::::::::::@:::: : @:::@:::::@::::@:::::@:: - 0 +----------------------------------------------------------------------->GB - 0 1.290 - -Number of snapshots: 91 - Detailed snapshots: [3, 4, 5, 6, 7, 8, 10 (peak), 14, 39, 47, 55, 65, 75, 85] - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 0 0 0 0 0 0 - 1 10,298,352 5,045,456 3,205,383 1,840,073 0 - 2 32,043,984 15,745,712 10,047,334 5,698,378 0 - 3 57,505,768 27,777,784 17,388,133 10,389,651 0 -62.60% (17,388,133B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.93% (3,036,707B) 0x40B14AE: strdup (strdup.c:43) -| ->04.97% (1,381,441B) 0x8049150: yylex (parser.l:24) -| | ->04.97% (1,381,441B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.97% (1,381,441B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.97% (1,381,441B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.97% (1,381,441B) 0x8051749: main (main.c:30) -| | -| ->03.56% (990,239B) 0x80491E2: yylex (parser.l:32) -| | ->03.56% (990,239B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.56% (990,239B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.56% (990,239B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.56% (990,239B) 0x8051749: main (main.c:30) -| | -| ->01.40% (390,209B) 0x8049238: yylex (parser.l:37) -| | ->01.40% (390,209B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.40% (390,209B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.40% (390,209B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.40% (390,209B) 0x8051749: main (main.c:30) -| | -| ->00.99% (274,818B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.84% (2,456,096B) 0x804FB2B: append_element (stack.c:147) -| ->06.87% (1,908,272B) 0x804FC8C: add_element (stack.c:180) -| | ->06.87% (1,908,272B) 0x805021C: push_stack (stack.c:311) -| | ->03.94% (1,094,304B) 0x80491FE: yylex (parser.l:32) -| | | ->03.94% (1,094,304B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.94% (1,094,304B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.94% (1,094,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.94% (1,094,304B) 0x8051749: main (main.c:30) -| | | -| | ->01.95% (542,184B) 0x8049254: yylex (parser.l:37) -| | | ->01.95% (542,184B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.95% (542,184B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.95% (542,184B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.95% (542,184B) 0x8051749: main (main.c:30) -| | | -| | ->00.98% (271,784B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.97% (547,824B) 0x804CAD3: append_child (node.c:112) -| ->01.96% (544,696B) 0x804CD2D: append_children (node.c:151) -| | ->01.96% (544,696B) 0x804B668: yyparse (parser.y:169) -| | ->01.96% (544,696B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.96% (544,696B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.96% (544,696B) 0x8051749: main (main.c:30) -| | -| ->00.01% (3,128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.91% (2,198,528B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.91% (2,198,464B) 0x804CCFD: append_children (node.c:148) -| | ->07.91% (2,198,464B) 0x804B668: yyparse (parser.y:169) -| | ->07.91% (2,198,464B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.91% (2,198,464B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.91% (2,198,464B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.83% (1,897,644B) 0x804CECF: new_attribute (node.c:192) -| ->06.83% (1,897,644B) 0x804B8C1: yyparse (parser.y:222) -| ->06.83% (1,897,644B) 0x804AFCA: parse_file (parser.y:67) -| ->06.83% (1,897,644B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.83% (1,897,644B) 0x8051749: main (main.c:30) -| -->04.97% (1,381,441B) 0x804CE69: new_text_node (node.c:183) -| ->04.97% (1,381,441B) 0x804B7BD: yyparse (parser.y:196) -| ->04.97% (1,381,441B) 0x804AFCA: parse_file (parser.y:67) -| ->04.97% (1,381,441B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.97% (1,381,441B) 0x8051749: main (main.c:30) -| -->04.88% (1,355,440B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.88% (1,355,440B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.88% (1,355,440B) 0x804CBDC: add_attribute (node.c:132) -| ->04.88% (1,355,440B) 0x804B89B: yyparse (parser.y:218) -| ->04.88% (1,355,440B) 0x804AFCA: parse_file (parser.y:67) -| ->04.88% (1,355,440B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.88% (1,355,440B) 0x8051749: main (main.c:30) -| -->04.70% (1,306,368B) 0x804F716: refactor_generic_list (stack.c:59) -| ->04.70% (1,306,368B) 0x804FB1F: append_element (stack.c:144) -| ->03.77% (1,048,576B) 0x804FC8C: add_element (stack.c:180) -| | ->03.77% (1,048,576B) 0x805021C: push_stack (stack.c:311) -| | ->03.77% (1,048,576B) 0x8049254: yylex (parser.l:37) -| | | ->03.77% (1,048,576B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.77% (1,048,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.77% (1,048,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.77% (1,048,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.93% (257,792B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.48% (966,420B) 0x804CD8F: new_element_node (node.c:164) -| ->03.48% (966,280B) 0x804B874: yyparse (parser.y:215) -| | ->03.48% (966,280B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.48% (966,280B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.48% (966,280B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.42% (951,244B) 0x804CE2F: new_text_node (node.c:178) -| ->03.42% (951,244B) 0x804B7BD: yyparse (parser.y:196) -| ->03.42% (951,244B) 0x804AFCA: parse_file (parser.y:67) -| ->03.42% (951,244B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.42% (951,244B) 0x8051749: main (main.c:30) -| -->01.99% (552,144B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.99% (552,080B) 0x804CCFD: append_children (node.c:148) -| | ->01.99% (552,080B) 0x804B668: yyparse (parser.y:169) -| | ->01.99% (552,080B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.99% (552,080B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.99% (552,080B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.59% (440,617B) 0x804CF10: new_attribute (node.c:197) -| ->01.59% (440,617B) 0x804B8C1: yyparse (parser.y:222) -| ->01.59% (440,617B) 0x804AFCA: parse_file (parser.y:67) -| ->01.59% (440,617B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.59% (440,617B) 0x8051749: main (main.c:30) -| -->01.46% (405,576B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.46% (405,576B) 0x804CBC1: add_attribute (node.c:131) -| ->01.46% (405,576B) 0x804B89B: yyparse (parser.y:218) -| ->01.46% (405,576B) 0x804AFCA: parse_file (parser.y:67) -| ->01.46% (405,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.46% (405,576B) 0x8051749: main (main.c:30) -| -->01.40% (390,209B) 0x804CF47: new_attribute (node.c:199) -| ->01.40% (390,209B) 0x804B8C1: yyparse (parser.y:222) -| ->01.40% (390,209B) 0x804AFCA: parse_file (parser.y:67) -| ->01.40% (390,209B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.40% (390,209B) 0x8051749: main (main.c:30) -| -->00.18% (49,699B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 4 83,931,400 40,770,808 25,711,261 15,059,547 0 -63.06% (25,711,261B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.77% (4,391,496B) 0x40B14AE: strdup (strdup.c:43) -| ->04.90% (1,996,346B) 0x8049150: yylex (parser.l:24) -| | ->04.90% (1,996,346B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.90% (1,996,346B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.90% (1,996,346B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.90% (1,996,346B) 0x8051749: main (main.c:30) -| | -| ->03.51% (1,432,668B) 0x80491E2: yylex (parser.l:32) -| | ->03.51% (1,432,668B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.51% (1,432,668B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.51% (1,432,668B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.51% (1,432,668B) 0x8051749: main (main.c:30) -| | -| ->01.39% (564,854B) 0x8049238: yylex (parser.l:37) -| | ->01.39% (564,854B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.39% (564,854B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.39% (564,854B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.39% (564,854B) 0x8051749: main (main.c:30) -| | -| ->00.98% (397,628B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.72% (3,553,432B) 0x804FB2B: append_element (stack.c:147) -| ->06.77% (2,760,808B) 0x804FC8C: add_element (stack.c:180) -| | ->06.77% (2,760,808B) 0x805021C: push_stack (stack.c:311) -| | ->03.88% (1,583,248B) 0x80491FE: yylex (parser.l:32) -| | | ->03.88% (1,583,248B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.88% (1,583,248B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.88% (1,583,248B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.88% (1,583,248B) 0x8051749: main (main.c:30) -| | | -| | ->01.92% (784,360B) 0x8049254: yylex (parser.l:37) -| | | ->01.92% (784,360B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.92% (784,360B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.92% (784,360B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.92% (784,360B) 0x8051749: main (main.c:30) -| | | -| | ->00.96% (393,200B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.94% (792,624B) 0x804CAD3: append_child (node.c:112) -| ->01.94% (789,616B) 0x804CD2D: append_children (node.c:151) -| | ->01.94% (789,616B) 0x804B668: yyparse (parser.y:169) -| | ->01.94% (789,616B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.94% (789,616B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.94% (789,616B) 0x8051749: main (main.c:30) -| | -| ->00.01% (3,008B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.80% (3,181,120B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.80% (3,181,056B) 0x804CCFD: append_children (node.c:148) -| | ->07.80% (3,181,056B) 0x804B668: yyparse (parser.y:169) -| | ->07.80% (3,181,056B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.80% (3,181,056B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.80% (3,181,056B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.73% (2,745,260B) 0x804CECF: new_attribute (node.c:192) -| ->06.73% (2,745,260B) 0x804B8C1: yyparse (parser.y:222) -| ->06.73% (2,745,260B) 0x804AFCA: parse_file (parser.y:67) -| ->06.73% (2,745,260B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.73% (2,745,260B) 0x8051749: main (main.c:30) -| -->06.06% (2,470,656B) 0x804F716: refactor_generic_list (stack.c:59) -| ->06.06% (2,470,656B) 0x804FB1F: append_element (stack.c:144) -| ->05.14% (2,097,152B) 0x804FC8C: add_element (stack.c:180) -| | ->05.14% (2,097,152B) 0x805021C: push_stack (stack.c:311) -| | ->05.14% (2,097,152B) 0x804916C: yylex (parser.l:24) -| | | ->05.14% (2,097,152B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->05.14% (2,097,152B) 0x804AFCA: parse_file (parser.y:67) -| | | ->05.14% (2,097,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->05.14% (2,097,152B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.92% (373,504B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.90% (1,996,346B) 0x804CE69: new_text_node (node.c:183) -| ->04.90% (1,996,346B) 0x804B7BD: yyparse (parser.y:196) -| ->04.90% (1,996,346B) 0x804AFCA: parse_file (parser.y:67) -| ->04.90% (1,996,346B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.90% (1,996,346B) 0x8051749: main (main.c:30) -| -->04.81% (1,960,880B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.81% (1,960,880B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.81% (1,960,880B) 0x804CBDC: add_attribute (node.c:132) -| ->04.81% (1,960,880B) 0x804B89B: yyparse (parser.y:218) -| ->04.81% (1,960,880B) 0x804AFCA: parse_file (parser.y:67) -| ->04.81% (1,960,880B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.81% (1,960,880B) 0x8051749: main (main.c:30) -| -->03.43% (1,398,264B) 0x804CD8F: new_element_node (node.c:164) -| ->03.43% (1,398,124B) 0x804B874: yyparse (parser.y:215) -| | ->03.43% (1,398,124B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.43% (1,398,124B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.43% (1,398,124B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.38% (1,376,200B) 0x804CE2F: new_text_node (node.c:178) -| ->03.38% (1,376,200B) 0x804B7BD: yyparse (parser.y:196) -| ->03.38% (1,376,200B) 0x804AFCA: parse_file (parser.y:67) -| ->03.38% (1,376,200B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.38% (1,376,200B) 0x8051749: main (main.c:30) -| -->01.96% (798,912B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.96% (798,848B) 0x804CCFD: append_children (node.c:148) -| | ->01.96% (798,848B) 0x804B668: yyparse (parser.y:169) -| | ->01.96% (798,848B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.96% (798,848B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.96% (798,848B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.56% (637,426B) 0x804CF10: new_attribute (node.c:197) -| ->01.56% (637,426B) 0x804B8C1: yyparse (parser.y:222) -| ->01.56% (637,426B) 0x804AFCA: parse_file (parser.y:67) -| ->01.56% (637,426B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.56% (637,426B) 0x8051749: main (main.c:30) -| -->01.44% (586,716B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.44% (586,716B) 0x804CBC1: add_attribute (node.c:131) -| ->01.44% (586,716B) 0x804B89B: yyparse (parser.y:218) -| ->01.44% (586,716B) 0x804AFCA: parse_file (parser.y:67) -| ->01.44% (586,716B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.44% (586,716B) 0x8051749: main (main.c:30) -| -->01.39% (564,854B) 0x804CF47: new_attribute (node.c:199) -| ->01.39% (564,854B) 0x804B8C1: yyparse (parser.y:222) -| ->01.39% (564,854B) 0x804AFCA: parse_file (parser.y:67) -| ->01.39% (564,854B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.39% (564,854B) 0x8051749: main (main.c:30) -| -->00.12% (49,699B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 5 101,842,064 49,258,544 30,898,351 18,360,193 0 -62.73% (30,898,351B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.88% (5,358,853B) 0x40B14AE: strdup (strdup.c:43) -| ->04.95% (2,436,266B) 0x8049150: yylex (parser.l:24) -| | ->04.95% (2,436,266B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.95% (2,436,266B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.95% (2,436,266B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.95% (2,436,266B) 0x8051749: main (main.c:30) -| | -| ->03.55% (1,747,992B) 0x80491E2: yylex (parser.l:32) -| | ->03.55% (1,747,992B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.55% (1,747,992B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.55% (1,747,992B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.55% (1,747,992B) 0x8051749: main (main.c:30) -| | -| ->01.40% (689,428B) 0x8049238: yylex (parser.l:37) -| | ->01.40% (689,428B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.40% (689,428B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.40% (689,428B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.40% (689,428B) 0x8051749: main (main.c:30) -| | -| ->00.98% (485,167B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.80% (4,335,520B) 0x804FB2B: append_element (stack.c:147) -| ->06.84% (3,368,408B) 0x804FC8C: add_element (stack.c:180) -| | ->06.84% (3,368,408B) 0x805021C: push_stack (stack.c:311) -| | ->03.92% (1,931,728B) 0x80491FE: yylex (parser.l:32) -| | | ->03.92% (1,931,728B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.92% (1,931,728B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.92% (1,931,728B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.92% (1,931,728B) 0x8051749: main (main.c:30) -| | | -| | ->01.94% (956,944B) 0x8049254: yylex (parser.l:37) -| | | ->01.94% (956,944B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.94% (956,944B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.94% (956,944B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.94% (956,944B) 0x8051749: main (main.c:30) -| | | -| | ->00.97% (479,736B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.96% (967,112B) 0x804CAD3: append_child (node.c:112) -| ->01.95% (962,776B) 0x804CD2D: append_children (node.c:151) -| | ->01.95% (962,776B) 0x804B668: yyparse (parser.y:169) -| | ->01.95% (962,776B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.95% (962,776B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.95% (962,776B) 0x8051749: main (main.c:30) -| | -| ->00.01% (4,336B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.88% (3,881,536B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.88% (3,881,408B) 0x804CCFD: append_children (node.c:148) -| | ->07.88% (3,881,408B) 0x804B668: yyparse (parser.y:169) -| | ->07.88% (3,881,408B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.88% (3,881,408B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.88% (3,881,408B) 0x8051749: main (main.c:30) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.80% (3,349,304B) 0x804CECF: new_attribute (node.c:192) -| ->06.80% (3,349,304B) 0x804B8C1: yyparse (parser.y:222) -| ->06.80% (3,349,304B) 0x804AFCA: parse_file (parser.y:67) -| ->06.80% (3,349,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.80% (3,349,304B) 0x8051749: main (main.c:30) -| -->05.18% (2,551,936B) 0x804F716: refactor_generic_list (stack.c:59) -| ->05.18% (2,551,936B) 0x804FB1F: append_element (stack.c:144) -| ->04.26% (2,097,152B) 0x804FC8C: add_element (stack.c:180) -| | ->04.26% (2,097,152B) 0x805021C: push_stack (stack.c:311) -| | ->04.26% (2,097,152B) 0x804916C: yylex (parser.l:24) -| | | ->04.26% (2,097,152B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->04.26% (2,097,152B) 0x804AFCA: parse_file (parser.y:67) -| | | ->04.26% (2,097,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->04.26% (2,097,152B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.92% (454,784B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.95% (2,436,266B) 0x804CE69: new_text_node (node.c:183) -| ->04.95% (2,436,266B) 0x804B7BD: yyparse (parser.y:196) -| ->04.95% (2,436,266B) 0x804AFCA: parse_file (parser.y:67) -| ->04.95% (2,436,266B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.95% (2,436,266B) 0x8051749: main (main.c:30) -| -->04.86% (2,392,360B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.86% (2,392,360B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.86% (2,392,360B) 0x804CBDC: add_attribute (node.c:132) -| ->04.86% (2,392,360B) 0x804B89B: yyparse (parser.y:218) -| ->04.86% (2,392,360B) 0x804AFCA: parse_file (parser.y:67) -| ->04.86% (2,392,360B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.86% (2,392,360B) 0x8051749: main (main.c:30) -| -->03.46% (1,706,068B) 0x804CD8F: new_element_node (node.c:164) -| ->03.46% (1,705,928B) 0x804B874: yyparse (parser.y:215) -| | ->03.46% (1,705,928B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.46% (1,705,928B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.46% (1,705,928B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.41% (1,679,076B) 0x804CE2F: new_text_node (node.c:178) -| ->03.41% (1,679,076B) 0x804B7BD: yyparse (parser.y:196) -| ->03.41% (1,679,076B) 0x804AFCA: parse_file (parser.y:67) -| ->03.41% (1,679,076B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.41% (1,679,076B) 0x8051749: main (main.c:30) -| -->01.98% (974,832B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.98% (974,752B) 0x804CCFD: append_children (node.c:148) -| | ->01.98% (974,752B) 0x804B668: yyparse (parser.y:169) -| | ->01.98% (974,752B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.98% (974,752B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.98% (974,752B) 0x8051749: main (main.c:30) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.58% (777,680B) 0x804CF10: new_attribute (node.c:197) -| ->01.58% (777,680B) 0x804B8C1: yyparse (parser.y:222) -| ->01.58% (777,680B) 0x804AFCA: parse_file (parser.y:67) -| ->01.58% (777,680B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.58% (777,680B) 0x8051749: main (main.c:30) -| -->01.45% (715,800B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.45% (715,800B) 0x804CBC1: add_attribute (node.c:131) -| ->01.45% (715,800B) 0x804B89B: yyparse (parser.y:218) -| ->01.45% (715,800B) 0x804AFCA: parse_file (parser.y:67) -| ->01.45% (715,800B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.45% (715,800B) 0x8051749: main (main.c:30) -| -->01.40% (689,428B) 0x804CF47: new_attribute (node.c:199) -| ->01.40% (689,428B) 0x804B8C1: yyparse (parser.y:222) -| ->01.40% (689,428B) 0x804AFCA: parse_file (parser.y:67) -| ->01.40% (689,428B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.40% (689,428B) 0x8051749: main (main.c:30) -| -->00.10% (49,692B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 6 117,384,272 56,626,032 35,400,591 21,225,441 0 -62.52% (35,400,591B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.95% (6,201,159B) 0x40B14AE: strdup (strdup.c:43) -| ->04.98% (2,821,216B) 0x8049150: yylex (parser.l:24) -| | ->04.98% (2,821,216B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.98% (2,821,216B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.98% (2,821,216B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.98% (2,821,216B) 0x8051749: main (main.c:30) -| | -| ->03.57% (2,021,190B) 0x80491E2: yylex (parser.l:32) -| | ->03.57% (2,021,190B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.57% (2,021,190B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.57% (2,021,190B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.57% (2,021,190B) 0x8051749: main (main.c:30) -| | -| ->01.41% (797,724B) 0x8049238: yylex (parser.l:37) -| | ->01.41% (797,724B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.41% (797,724B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.41% (797,724B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.41% (797,724B) 0x8051749: main (main.c:30) -| | -| ->00.99% (561,029B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.85% (5,013,064B) 0x804FB2B: append_element (stack.c:147) -| ->06.88% (3,894,768B) 0x804FC8C: add_element (stack.c:180) -| | ->06.88% (3,894,768B) 0x805021C: push_stack (stack.c:311) -| | ->03.94% (2,233,680B) 0x80491FE: yylex (parser.l:32) -| | | ->03.94% (2,233,680B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.94% (2,233,680B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.94% (2,233,680B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.94% (2,233,680B) 0x8051749: main (main.c:30) -| | | -| | ->01.95% (1,106,408B) 0x8049254: yylex (parser.l:37) -| | | ->01.95% (1,106,408B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.95% (1,106,408B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.95% (1,106,408B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.95% (1,106,408B) 0x8051749: main (main.c:30) -| | | -| | ->00.98% (554,680B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.97% (1,118,296B) 0x804CAD3: append_child (node.c:112) -| ->01.97% (1,114,328B) 0x804CD2D: append_children (node.c:151) -| | ->01.97% (1,114,328B) 0x804B668: yyparse (parser.y:169) -| | ->01.97% (1,114,328B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.97% (1,114,328B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.97% (1,114,328B) 0x8051749: main (main.c:30) -| | -| ->00.01% (3,968B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.93% (4,488,512B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.93% (4,488,448B) 0x804CCFD: append_children (node.c:148) -| | ->07.93% (4,488,448B) 0x804B668: yyparse (parser.y:169) -| | ->07.93% (4,488,448B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.93% (4,488,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.93% (4,488,448B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.84% (3,872,428B) 0x804CECF: new_attribute (node.c:192) -| ->06.84% (3,872,428B) 0x804B8C1: yyparse (parser.y:222) -| ->06.84% (3,872,428B) 0x804AFCA: parse_file (parser.y:67) -| ->06.84% (3,872,428B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.84% (3,872,428B) 0x8051749: main (main.c:30) -| -->04.98% (2,821,216B) 0x804CE69: new_text_node (node.c:183) -| ->04.98% (2,821,216B) 0x804B7BD: yyparse (parser.y:196) -| ->04.98% (2,821,216B) 0x804AFCA: parse_file (parser.y:67) -| ->04.98% (2,821,216B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.98% (2,821,216B) 0x8051749: main (main.c:30) -| -->04.88% (2,766,000B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.88% (2,766,000B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.88% (2,766,000B) 0x804CBDC: add_attribute (node.c:132) -| ->04.88% (2,766,000B) 0x804B89B: yyparse (parser.y:218) -| ->04.88% (2,766,000B) 0x804AFCA: parse_file (parser.y:67) -| ->04.88% (2,766,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.88% (2,766,000B) 0x8051749: main (main.c:30) -| -->04.63% (2,622,464B) 0x804F716: refactor_generic_list (stack.c:59) -| ->04.63% (2,622,464B) 0x804FB1F: append_element (stack.c:144) -| ->03.70% (2,097,152B) 0x804FC8C: add_element (stack.c:180) -| | ->03.70% (2,097,152B) 0x805021C: push_stack (stack.c:311) -| | ->03.70% (2,097,152B) 0x804916C: yylex (parser.l:24) -| | | ->03.70% (2,097,152B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.70% (2,097,152B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.70% (2,097,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.70% (2,097,152B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.93% (525,312B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.48% (1,972,936B) 0x804CD8F: new_element_node (node.c:164) -| ->03.48% (1,972,796B) 0x804B874: yyparse (parser.y:215) -| | ->03.48% (1,972,796B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.48% (1,972,796B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.48% (1,972,796B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.43% (1,941,380B) 0x804CE2F: new_text_node (node.c:178) -| ->03.43% (1,941,380B) 0x804B7BD: yyparse (parser.y:196) -| ->03.43% (1,941,380B) 0x804AFCA: parse_file (parser.y:67) -| ->03.43% (1,941,380B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.43% (1,941,380B) 0x8051749: main (main.c:30) -| -->01.99% (1,127,296B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.99% (1,127,232B) 0x804CCFD: append_children (node.c:148) -| | ->01.99% (1,127,232B) 0x804B668: yyparse (parser.y:169) -| | ->01.99% (1,127,232B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.99% (1,127,232B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.99% (1,127,232B) 0x8051749: main (main.c:30) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.59% (899,146B) 0x804CF10: new_attribute (node.c:197) -| ->01.59% (899,146B) 0x804B8C1: yyparse (parser.y:222) -| ->01.59% (899,146B) 0x804AFCA: parse_file (parser.y:67) -| ->01.59% (899,146B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.59% (899,146B) 0x8051749: main (main.c:30) -| -->01.46% (827,568B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.46% (827,568B) 0x804CBC1: add_attribute (node.c:131) -| ->01.46% (827,568B) 0x804B89B: yyparse (parser.y:218) -| ->01.46% (827,568B) 0x804AFCA: parse_file (parser.y:67) -| ->01.46% (827,568B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.46% (827,568B) 0x8051749: main (main.c:30) -| -->01.41% (797,724B) 0x804CF47: new_attribute (node.c:199) -| ->01.41% (797,724B) 0x804B8C1: yyparse (parser.y:222) -| ->01.41% (797,724B) 0x804AFCA: parse_file (parser.y:67) -| ->01.41% (797,724B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.41% (797,724B) 0x8051749: main (main.c:30) -| -->00.09% (49,698B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 7 142,478,080 69,533,024 44,073,175 25,459,849 0 -63.38% (44,073,175B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.69% (7,432,840B) 0x40B14AE: strdup (strdup.c:43) -| ->04.87% (3,385,886B) 0x8049150: yylex (parser.l:24) -| | ->04.87% (3,385,886B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.87% (3,385,886B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.87% (3,385,886B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.87% (3,385,886B) 0x8051749: main (main.c:30) -| | -| ->03.48% (2,419,850B) 0x80491E2: yylex (parser.l:32) -| | ->03.48% (2,419,850B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.48% (2,419,850B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.48% (2,419,850B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.48% (2,419,850B) 0x8051749: main (main.c:30) -| | -| ->01.37% (955,391B) 0x8049238: yylex (parser.l:37) -| | ->01.37% (955,391B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.37% (955,391B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.37% (955,391B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.37% (955,391B) 0x8051749: main (main.c:30) -| | -| ->00.97% (671,713B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.63% (6,001,824B) 0x804FB2B: append_element (stack.c:147) -| ->06.71% (4,662,920B) 0x804FC8C: add_element (stack.c:180) -| | ->06.71% (4,662,920B) 0x805021C: push_stack (stack.c:311) -| | ->03.85% (2,674,272B) 0x80491FE: yylex (parser.l:32) -| | | ->03.85% (2,674,272B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.85% (2,674,272B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.85% (2,674,272B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.85% (2,674,272B) 0x8051749: main (main.c:30) -| | | -| | ->01.90% (1,324,576B) 0x8049254: yylex (parser.l:37) -| | | ->01.90% (1,324,576B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.90% (1,324,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.90% (1,324,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.90% (1,324,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.96% (664,072B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.93% (1,338,904B) 0x804CAD3: append_child (node.c:112) -| ->01.92% (1,334,504B) 0x804CD2D: append_children (node.c:151) -| | ->01.92% (1,334,504B) 0x804B668: yyparse (parser.y:169) -| | ->01.92% (1,334,504B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.92% (1,334,504B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.92% (1,334,504B) 0x8051749: main (main.c:30) -| | -| ->00.01% (4,400B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.73% (5,374,208B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.73% (5,374,080B) 0x804CCFD: append_children (node.c:148) -| | ->07.73% (5,374,080B) 0x804B668: yyparse (parser.y:169) -| | ->07.73% (5,374,080B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.73% (5,374,080B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.73% (5,374,080B) 0x8051749: main (main.c:30) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.94% (4,822,528B) 0x804F716: refactor_generic_list (stack.c:59) -| ->06.94% (4,822,528B) 0x804FB1F: append_element (stack.c:144) -| ->06.03% (4,194,304B) 0x804FC8C: add_element (stack.c:180) -| | ->06.03% (4,194,304B) 0x805021C: push_stack (stack.c:311) -| | ->06.03% (4,194,304B) 0x80491FE: yylex (parser.l:32) -| | | ->06.03% (4,194,304B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->06.03% (4,194,304B) 0x804AFCA: parse_file (parser.y:67) -| | | ->06.03% (4,194,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->06.03% (4,194,304B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.90% (628,224B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.67% (4,636,016B) 0x804CECF: new_attribute (node.c:192) -| ->06.67% (4,636,016B) 0x804B8C1: yyparse (parser.y:222) -| ->06.67% (4,636,016B) 0x804AFCA: parse_file (parser.y:67) -| ->06.67% (4,636,016B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.67% (4,636,016B) 0x8051749: main (main.c:30) -| -->04.87% (3,385,886B) 0x804CE69: new_text_node (node.c:183) -| ->04.87% (3,385,886B) 0x804B7BD: yyparse (parser.y:196) -| ->04.87% (3,385,886B) 0x804AFCA: parse_file (parser.y:67) -| ->04.87% (3,385,886B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.87% (3,385,886B) 0x8051749: main (main.c:30) -| -->04.76% (3,311,440B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.76% (3,311,440B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.76% (3,311,440B) 0x804CBDC: add_attribute (node.c:132) -| ->04.76% (3,311,440B) 0x804B89B: yyparse (parser.y:218) -| ->04.76% (3,311,440B) 0x804AFCA: parse_file (parser.y:67) -| ->04.76% (3,311,440B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.76% (3,311,440B) 0x8051749: main (main.c:30) -| -->03.40% (2,362,164B) 0x804CD8F: new_element_node (node.c:164) -| ->03.40% (2,362,024B) 0x804B874: yyparse (parser.y:215) -| | ->03.40% (2,362,024B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.40% (2,362,024B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.40% (2,362,024B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.34% (2,324,252B) 0x804CE2F: new_text_node (node.c:178) -| ->03.34% (2,324,252B) 0x804B7BD: yyparse (parser.y:196) -| ->03.34% (2,324,252B) 0x804AFCA: parse_file (parser.y:67) -| ->03.34% (2,324,252B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.34% (2,324,252B) 0x8051749: main (main.c:30) -| -->01.94% (1,349,744B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.94% (1,349,664B) 0x804CCFD: append_children (node.c:148) -| | ->01.94% (1,349,664B) 0x804B668: yyparse (parser.y:169) -| | ->01.94% (1,349,664B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.94% (1,349,664B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.94% (1,349,664B) 0x8051749: main (main.c:30) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.55% (1,076,446B) 0x804CF10: new_attribute (node.c:197) -| ->01.55% (1,076,446B) 0x804B8C1: yyparse (parser.y:222) -| ->01.55% (1,076,446B) 0x804AFCA: parse_file (parser.y:67) -| ->01.55% (1,076,446B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.55% (1,076,446B) 0x8051749: main (main.c:30) -| -->01.42% (990,744B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.42% (990,744B) 0x804CBC1: add_attribute (node.c:131) -| ->01.42% (990,744B) 0x804B89B: yyparse (parser.y:218) -| ->01.42% (990,744B) 0x804AFCA: parse_file (parser.y:67) -| ->01.42% (990,744B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.42% (990,744B) 0x8051749: main (main.c:30) -| -->01.37% (955,391B) 0x804CF47: new_attribute (node.c:199) -| ->01.37% (955,391B) 0x804B8C1: yyparse (parser.y:222) -| ->01.37% (955,391B) 0x804AFCA: parse_file (parser.y:67) -| ->01.37% (955,391B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.37% (955,391B) 0x8051749: main (main.c:30) -| -->00.07% (49,692B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 8 166,112,224 80,728,640 50,917,611 29,811,029 0 -63.07% (50,917,611B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.79% (8,708,037B) 0x40B14AE: strdup (strdup.c:43) -| ->04.91% (3,965,134B) 0x8049150: yylex (parser.l:24) -| | ->04.91% (3,965,134B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.91% (3,965,134B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.91% (3,965,134B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.91% (3,965,134B) 0x8051749: main (main.c:30) -| | -| ->03.51% (2,835,951B) 0x80491E2: yylex (parser.l:32) -| | ->03.51% (2,835,951B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.51% (2,835,951B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.51% (2,835,951B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.51% (2,835,951B) 0x8051749: main (main.c:30) -| | -| ->01.39% (1,119,729B) 0x8049238: yylex (parser.l:37) -| | ->01.39% (1,119,729B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.39% (1,119,729B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.39% (1,119,729B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.39% (1,119,729B) 0x8051749: main (main.c:30) -| | -| ->00.98% (787,223B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.71% (7,033,848B) 0x804FB2B: append_element (stack.c:147) -| ->06.77% (5,464,704B) 0x804FC8C: add_element (stack.c:180) -| | ->06.77% (5,464,704B) 0x805021C: push_stack (stack.c:311) -| | ->03.88% (3,134,128B) 0x80491FE: yylex (parser.l:32) -| | | ->03.88% (3,134,128B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.88% (3,134,128B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.88% (3,134,128B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.88% (3,134,128B) 0x8051749: main (main.c:30) -| | | -| | ->01.92% (1,552,320B) 0x8049254: yylex (parser.l:37) -| | | ->01.92% (1,552,320B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.92% (1,552,320B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.92% (1,552,320B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.92% (1,552,320B) 0x8051749: main (main.c:30) -| | | -| | ->00.96% (778,256B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.94% (1,569,144B) 0x804CAD3: append_child (node.c:112) -| ->01.94% (1,563,720B) 0x804CD2D: append_children (node.c:151) -| | ->01.94% (1,563,720B) 0x804B668: yyparse (parser.y:169) -| | ->01.94% (1,563,720B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.94% (1,563,720B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.94% (1,563,720B) 0x8051749: main (main.c:30) -| | -| ->00.01% (5,424B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.80% (6,298,432B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.80% (6,298,304B) 0x804CCFD: append_children (node.c:148) -| | ->07.80% (6,298,304B) 0x804B668: yyparse (parser.y:169) -| | ->07.80% (6,298,304B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.80% (6,298,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.80% (6,298,304B) 0x8051749: main (main.c:30) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.73% (5,433,120B) 0x804CECF: new_attribute (node.c:192) -| ->06.73% (5,433,120B) 0x804B8C1: yyparse (parser.y:222) -| ->06.73% (5,433,120B) 0x804AFCA: parse_file (parser.y:67) -| ->06.73% (5,433,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.73% (5,433,120B) 0x8051749: main (main.c:30) -| -->06.11% (4,932,096B) 0x804F716: refactor_generic_list (stack.c:59) -| ->06.11% (4,932,096B) 0x804FB1F: append_element (stack.c:144) -| ->05.20% (4,194,304B) 0x804FC8C: add_element (stack.c:180) -| | ->05.20% (4,194,304B) 0x805021C: push_stack (stack.c:311) -| | ->05.20% (4,194,304B) 0x80491FE: yylex (parser.l:32) -| | | ->05.20% (4,194,304B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->05.20% (4,194,304B) 0x804AFCA: parse_file (parser.y:67) -| | | ->05.20% (4,194,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->05.20% (4,194,304B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.91% (737,792B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.91% (3,965,134B) 0x804CE69: new_text_node (node.c:183) -| ->04.91% (3,965,134B) 0x804B7BD: yyparse (parser.y:196) -| ->04.91% (3,965,134B) 0x804AFCA: parse_file (parser.y:67) -| ->04.91% (3,965,134B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.91% (3,965,134B) 0x8051749: main (main.c:30) -| -->04.81% (3,880,800B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.81% (3,880,800B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.81% (3,880,800B) 0x804CBDC: add_attribute (node.c:132) -| ->04.81% (3,880,800B) 0x804B89B: yyparse (parser.y:218) -| ->04.81% (3,880,800B) 0x804AFCA: parse_file (parser.y:67) -| ->04.81% (3,880,800B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.81% (3,880,800B) 0x8051749: main (main.c:30) -| -->03.43% (2,768,360B) 0x804CD8F: new_element_node (node.c:164) -| ->03.43% (2,768,220B) 0x804B874: yyparse (parser.y:215) -| | ->03.43% (2,768,220B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.43% (2,768,220B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.43% (2,768,220B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.37% (2,723,896B) 0x804CE2F: new_text_node (node.c:178) -| ->03.37% (2,723,896B) 0x804B7BD: yyparse (parser.y:196) -| ->03.37% (2,723,896B) 0x804AFCA: parse_file (parser.y:67) -| ->03.37% (2,723,896B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.37% (2,723,896B) 0x8051749: main (main.c:30) -| -->01.96% (1,581,856B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.96% (1,581,776B) 0x804CCFD: append_children (node.c:148) -| | ->01.96% (1,581,776B) 0x804B668: yyparse (parser.y:169) -| | ->01.96% (1,581,776B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.96% (1,581,776B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.96% (1,581,776B) 0x8051749: main (main.c:30) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.56% (1,261,527B) 0x804CF10: new_attribute (node.c:197) -| ->01.56% (1,261,527B) 0x804B8C1: yyparse (parser.y:222) -| ->01.56% (1,261,527B) 0x804AFCA: parse_file (parser.y:67) -| ->01.56% (1,261,527B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.56% (1,261,527B) 0x8051749: main (main.c:30) -| -->01.44% (1,161,084B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.44% (1,161,084B) 0x804CBC1: add_attribute (node.c:131) -| ->01.44% (1,161,084B) 0x804B89B: yyparse (parser.y:218) -| ->01.44% (1,161,084B) 0x804AFCA: parse_file (parser.y:67) -| ->01.44% (1,161,084B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.44% (1,161,084B) 0x8051749: main (main.c:30) -| -->01.39% (1,119,729B) 0x804CF47: new_attribute (node.c:199) -| ->01.39% (1,119,729B) 0x804B8C1: yyparse (parser.y:222) -| ->01.39% (1,119,729B) 0x804AFCA: parse_file (parser.y:67) -| ->01.39% (1,119,729B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.39% (1,119,729B) 0x8051749: main (main.c:30) -| -->00.06% (49,692B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 9 187,552,424 90,881,944 57,123,664 33,758,280 0 - 10 214,272,344 103,538,680 64,862,204 38,676,476 0 -62.65% (64,862,204B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->10.94% (11,323,700B) 0x40B14AE: strdup (strdup.c:43) -| ->04.97% (5,147,426B) 0x8049150: yylex (parser.l:24) -| | ->04.97% (5,147,426B) 0x804B370: yyparse (y.tab.c:1517) -| | ->04.97% (5,147,426B) 0x804AFCA: parse_file (parser.y:67) -| | ->04.97% (5,147,426B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->04.97% (5,147,426B) 0x8051749: main (main.c:30) -| | -| ->03.56% (3,682,036B) 0x80491E2: yylex (parser.l:32) -| | ->03.56% (3,682,036B) 0x804B370: yyparse (y.tab.c:1517) -| | ->03.56% (3,682,036B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.56% (3,682,036B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.56% (3,682,036B) 0x8051749: main (main.c:30) -| | -| ->01.42% (1,471,284B) 0x8049238: yylex (parser.l:37) -| | ->01.42% (1,471,284B) 0x804B370: yyparse (y.tab.c:1517) -| | ->01.42% (1,471,284B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.42% (1,471,284B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.42% (1,471,284B) 0x8051749: main (main.c:30) -| | -| ->00.99% (1,022,954B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.82% (9,131,080B) 0x804FB2B: append_element (stack.c:147) -| ->06.85% (7,092,984B) 0x804FC8C: add_element (stack.c:180) -| | ->06.85% (7,092,984B) 0x805021C: push_stack (stack.c:311) -| | ->03.93% (4,070,024B) 0x80491FE: yylex (parser.l:32) -| | | ->03.93% (4,070,024B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->03.93% (4,070,024B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.93% (4,070,024B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.93% (4,070,024B) 0x8051749: main (main.c:30) -| | | -| | ->01.94% (2,013,240B) 0x8049254: yylex (parser.l:37) -| | | ->01.94% (2,013,240B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->01.94% (2,013,240B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.94% (2,013,240B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.94% (2,013,240B) 0x8051749: main (main.c:30) -| | | -| | ->00.98% (1,009,720B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.97% (2,038,096B) 0x804CAD3: append_child (node.c:112) -| ->01.96% (2,030,560B) 0x804CD2D: append_children (node.c:151) -| | ->01.96% (2,030,560B) 0x804B668: yyparse (parser.y:169) -| | ->01.96% (2,030,560B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.96% (2,030,560B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.96% (2,030,560B) 0x8051749: main (main.c:30) -| | -| ->00.01% (7,536B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.91% (8,188,800B) 0x804F52E: new_generic_list (stack.c:18) -| ->07.91% (8,188,672B) 0x804CCFD: append_children (node.c:148) -| | ->07.91% (8,188,672B) 0x804B668: yyparse (parser.y:169) -| | ->07.91% (8,188,672B) 0x804AFCA: parse_file (parser.y:67) -| | ->07.91% (8,188,672B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->07.91% (8,188,672B) 0x8051749: main (main.c:30) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.81% (7,046,340B) 0x804CECF: new_attribute (node.c:192) -| ->06.81% (7,046,340B) 0x804B8C1: yyparse (parser.y:222) -| ->06.81% (7,046,340B) 0x804AFCA: parse_file (parser.y:67) -| ->06.81% (7,046,340B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->06.81% (7,046,340B) 0x8051749: main (main.c:30) -| -->04.97% (5,147,426B) 0x804CE69: new_text_node (node.c:183) -| ->04.97% (5,147,426B) 0x804B7BD: yyparse (parser.y:196) -| ->04.97% (5,147,426B) 0x804AFCA: parse_file (parser.y:67) -| ->04.97% (5,147,426B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.97% (5,147,426B) 0x8051749: main (main.c:30) -| -->04.96% (5,138,944B) 0x804F716: refactor_generic_list (stack.c:59) -| ->04.96% (5,138,944B) 0x804FB1F: append_element (stack.c:144) -| ->04.05% (4,194,304B) 0x804FC8C: add_element (stack.c:180) -| | ->04.05% (4,194,304B) 0x805021C: push_stack (stack.c:311) -| | ->04.05% (4,194,304B) 0x80491FE: yylex (parser.l:32) -| | | ->04.05% (4,194,304B) 0x804B370: yyparse (y.tab.c:1517) -| | | ->04.05% (4,194,304B) 0x804AFCA: parse_file (parser.y:67) -| | | ->04.05% (4,194,304B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->04.05% (4,194,304B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.91% (944,640B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.86% (5,033,100B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->04.86% (5,033,100B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->04.86% (5,033,100B) 0x804CBDC: add_attribute (node.c:132) -| ->04.86% (5,033,100B) 0x804B89B: yyparse (parser.y:218) -| ->04.86% (5,033,100B) 0x804AFCA: parse_file (parser.y:67) -| ->04.86% (5,033,100B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->04.86% (5,033,100B) 0x8051749: main (main.c:30) -| -->03.48% (3,599,568B) 0x804CD8F: new_element_node (node.c:164) -| ->03.48% (3,599,428B) 0x804B874: yyparse (parser.y:215) -| | ->03.48% (3,599,428B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.48% (3,599,428B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.48% (3,599,428B) 0x8051749: main (main.c:30) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.41% (3,534,020B) 0x804CE2F: new_text_node (node.c:178) -| ->03.41% (3,534,020B) 0x804B7BD: yyparse (parser.y:196) -| ->03.41% (3,534,020B) 0x804AFCA: parse_file (parser.y:67) -| ->03.41% (3,534,020B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->03.41% (3,534,020B) 0x8051749: main (main.c:30) -| -->01.99% (2,056,832B) 0x804F4F8: new_generic_list (stack.c:13) -| ->01.99% (2,056,752B) 0x804CCFD: append_children (node.c:148) -| | ->01.99% (2,056,752B) 0x804B668: yyparse (parser.y:169) -| | ->01.99% (2,056,752B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.99% (2,056,752B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.99% (2,056,752B) 0x8051749: main (main.c:30) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.58% (1,636,150B) 0x804CF10: new_attribute (node.c:197) -| ->01.58% (1,636,150B) 0x804B8C1: yyparse (parser.y:222) -| ->01.58% (1,636,150B) 0x804AFCA: parse_file (parser.y:67) -| ->01.58% (1,636,150B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.58% (1,636,150B) 0x8051749: main (main.c:30) -| -->01.45% (1,505,268B) 0x804E815: new_rbtree (rbtree.c:39) -| ->01.45% (1,505,268B) 0x804CBC1: add_attribute (node.c:131) -| ->01.45% (1,505,268B) 0x804B89B: yyparse (parser.y:218) -| ->01.45% (1,505,268B) 0x804AFCA: parse_file (parser.y:67) -| ->01.45% (1,505,268B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.45% (1,505,268B) 0x8051749: main (main.c:30) -| -->01.42% (1,471,284B) 0x804CF47: new_attribute (node.c:199) -| ->01.42% (1,471,284B) 0x804B8C1: yyparse (parser.y:222) -| ->01.42% (1,471,284B) 0x804AFCA: parse_file (parser.y:67) -| ->01.42% (1,471,284B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->01.42% (1,471,284B) 0x8051749: main (main.c:30) -| -->00.05% (49,692B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 11 239,036,848 81,380,368 53,242,658 28,137,710 0 - 12 253,528,040 66,889,176 43,632,735 23,256,441 0 - 13 278,965,120 67,539,984 44,097,571 23,442,413 0 - 14 301,667,296 67,789,248 44,270,511 23,518,737 0 -65.31% (44,270,511B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.37% (8,384,704B) 0x804F52E: new_generic_list (stack.c:18) -| ->12.18% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->12.18% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->12.18% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->12.18% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->12.18% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->00.19% (127,552B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.48% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.48% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.48% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.48% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.48% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.65% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.65% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.65% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.65% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.65% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.49% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.49% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.49% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.49% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.49% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.49% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.49% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.35% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.35% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.35% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.35% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.35% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.26% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.26% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.26% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.26% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.26% (3,563,448B) 0x8051749: main (main.c:30) -| -->03.41% (2,310,224B) 0x804FB2B: append_element (stack.c:147) -| ->03.03% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->03.03% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->03.03% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->03.03% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->03.03% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->03.03% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.38% (255,104B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.06% (2,074,048B) 0x804F4F8: new_generic_list (stack.c:13) -| ->03.06% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->03.06% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->03.06% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.06% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.06% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.43% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.43% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.43% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.43% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.43% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.24% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.24% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.24% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.24% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.24% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.24% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.19% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.19% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.19% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.19% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.19% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.78% (1,207,664B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.78% (1,207,664B) 0x804FB1F: append_element (stack.c:144) -| ->01.41% (952,576B) 0x804CAD3: append_child (node.c:112) -| | ->01.41% (952,576B) 0x804CD2D: append_children (node.c:151) -| | | ->01.41% (952,576B) 0x804B668: yyparse (parser.y:169) -| | | ->01.41% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.41% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.41% (952,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.38% (255,088B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.52% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.52% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.52% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.52% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.52% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.52% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 15 318,887,328 67,653,600 44,087,939 23,565,661 0 - 16 333,018,008 68,073,704 44,473,711 23,599,993 0 - 17 350,627,736 67,811,848 44,182,247 23,629,601 0 - 18 372,983,552 68,362,048 44,679,671 23,682,377 0 - 19 386,542,072 68,000,312 44,295,971 23,704,341 0 - 20 409,012,880 68,085,408 44,346,219 23,739,189 0 - 21 427,218,000 68,406,448 44,639,487 23,766,961 0 - 22 445,330,664 68,753,272 44,959,111 23,794,161 0 - 23 472,721,560 68,576,104 44,752,591 23,823,513 0 - 24 486,440,184 68,352,872 44,507,507 23,845,365 0 - 25 509,401,312 68,422,208 44,549,111 23,873,097 0 - 26 526,940,392 68,465,512 44,575,091 23,890,421 0 - 27 545,091,224 68,506,728 44,598,991 23,907,737 0 - 28 567,310,408 69,245,992 45,311,051 23,934,941 0 - 29 582,547,792 69,314,928 45,360,291 23,954,637 0 - 30 598,048,432 69,352,416 45,387,071 23,965,345 0 - 31 621,369,240 69,440,728 45,450,151 23,990,577 0 - 32 644,693,224 68,781,288 44,763,955 24,017,333 0 - 33 667,832,176 68,834,608 44,796,551 24,038,057 0 - 34 683,585,592 68,854,568 44,807,695 24,046,873 0 - 35 699,538,968 68,878,168 44,821,855 24,056,313 0 - 36 715,821,320 68,916,632 44,845,023 24,071,609 0 - 37 738,994,472 68,960,680 44,871,519 24,089,161 0 - 38 754,181,712 68,992,784 44,890,663 24,102,121 0 - 39 769,543,480 69,023,128 44,909,075 24,114,053 0 -65.06% (44,909,075B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.58% (8,682,372B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.96% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->11.96% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->11.96% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.96% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.96% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->00.62% (425,220B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.29% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.29% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.29% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.29% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.29% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.52% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.52% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.52% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.52% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.52% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.35% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.35% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.35% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.35% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.35% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.35% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.35% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.26% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.26% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.26% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.26% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.26% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.16% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.16% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.16% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.16% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.16% (3,563,448B) 0x8051749: main (main.c:30) -| -->04.21% (2,905,560B) 0x804FB2B: append_element (stack.c:147) -| ->02.98% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->02.98% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->02.98% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->02.98% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.98% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.98% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.23% (850,440B) 0x804FC8C: add_element (stack.c:180) -| ->01.23% (850,440B) 0x804D2F8: get_descendants (node.c:294) -| | ->01.23% (845,848B) 0x804D2CE: get_descendants (node.c:292) -| | | ->01.21% (836,648B) 0x804D2CE: get_descendants (node.c:292) -| | | | ->01.21% (836,648B) 0x8051577: query (query_runner.c:207) -| | | | ->01.21% (836,648B) 0x8051767: main (main.c:39) -| | | | -| | | ->00.01% (9,200B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.01% (4,592B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.00% (2,074,048B) 0x804F4F8: new_generic_list (stack.c:13) -| ->03.00% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->03.00% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->03.00% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.00% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.00% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.39% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.39% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.39% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.39% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.39% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.20% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.20% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.20% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.20% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.20% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.20% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.15% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.15% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.15% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.15% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.15% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.49% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.49% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.49% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.49% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.49% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.49% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.38% (953,224B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.38% (953,224B) 0x804FB1F: append_element (stack.c:144) -| ->01.38% (952,576B) 0x804CAD3: append_child (node.c:112) -| | ->01.38% (952,576B) 0x804CD2D: append_children (node.c:151) -| | | ->01.38% (952,576B) 0x804B668: yyparse (parser.y:169) -| | | ->01.38% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.38% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.38% (952,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (648B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 40 785,022,624 69,044,352 44,921,991 24,122,361 0 - 41 800,651,856 69,066,048 44,935,175 24,130,873 0 - 42 816,409,064 69,081,912 44,944,115 24,137,797 0 - 43 839,405,880 69,104,728 44,957,791 24,146,937 0 - 44 862,659,024 69,127,728 44,971,591 24,156,137 0 - 45 886,305,792 69,169,632 44,997,563 24,172,069 0 - 46 901,932,728 70,106,712 45,925,851 24,180,861 0 - 47 925,166,824 69,225,752 45,031,235 24,194,517 0 -65.05% (45,031,235B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.60% (8,722,604B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.93% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->11.93% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->11.93% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.93% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.93% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->00.67% (465,452B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.26% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.26% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.26% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.26% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.26% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.50% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.50% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.50% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.50% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.50% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.33% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.33% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.33% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.33% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.33% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.33% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.33% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.24% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.24% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.24% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.24% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.24% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.15% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.15% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.15% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.15% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.15% (3,563,448B) 0x8051749: main (main.c:30) -| -->04.31% (2,986,024B) 0x804FB2B: append_element (stack.c:147) -| ->02.97% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->02.97% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->02.97% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->02.97% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.97% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.97% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.34% (930,904B) 0x804FC8C: add_element (stack.c:180) -| ->01.34% (930,904B) 0x804D2F8: get_descendants (node.c:294) -| | ->01.34% (925,616B) 0x804D2CE: get_descendants (node.c:292) -| | | ->01.32% (915,024B) 0x804D2CE: get_descendants (node.c:292) -| | | | ->01.32% (915,024B) 0x8051577: query (query_runner.c:207) -| | | | ->01.32% (915,024B) 0x8051767: main (main.c:39) -| | | | -| | | ->00.02% (10,592B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.01% (5,288B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.00% (2,074,048B) 0x804F4F8: new_generic_list (stack.c:13) -| ->03.00% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->03.00% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->03.00% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->03.00% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->03.00% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.38% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.38% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.38% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.38% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.38% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.19% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.19% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.19% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.19% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.19% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.19% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.14% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.14% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.14% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.14% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.14% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.49% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.49% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.49% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.49% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.49% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.49% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.38% (954,688B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.38% (954,688B) 0x804FB1F: append_element (stack.c:144) -| ->01.38% (952,576B) 0x804CAD3: append_child (node.c:112) -| | ->01.38% (952,576B) 0x804CD2D: append_children (node.c:151) -| | | ->01.38% (952,576B) 0x804B668: yyparse (parser.y:169) -| | | ->01.38% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.38% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.38% (952,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (2,112B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 48 940,412,952 69,259,032 45,050,399 24,208,633 0 - 49 955,626,576 69,269,440 45,056,615 24,212,825 0 - 50 966,101,264 70,225,136 46,010,431 24,214,705 0 - 51 976,667,256 69,289,144 45,068,879 24,220,265 0 - 52 987,272,120 70,261,176 46,036,171 24,225,005 0 - 53 997,898,784 69,305,584 45,078,311 24,227,273 0 - 54 1,008,589,680 70,283,632 46,052,211 24,231,421 0 - 55 1,019,331,584 69,327,216 45,091,287 24,235,929 0 -65.04% (45,091,287B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.61% (8,743,304B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.91% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->11.91% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->11.91% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.91% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.91% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->00.70% (486,152B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.25% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.25% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.25% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.25% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.25% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.48% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.48% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.48% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.48% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.48% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.32% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.32% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.32% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.32% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.32% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.32% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.32% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.24% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.24% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.24% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.24% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.24% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.14% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.14% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.14% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.14% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.14% (3,563,448B) 0x8051749: main (main.c:30) -| -->04.37% (3,027,424B) 0x804FB2B: append_element (stack.c:147) -| ->02.96% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->02.96% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->02.96% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->02.96% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.96% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.96% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.40% (972,304B) 0x804FC8C: add_element (stack.c:180) -| ->01.40% (972,304B) 0x804D2F8: get_descendants (node.c:294) -| | ->01.39% (966,624B) 0x804D2CE: get_descendants (node.c:292) -| | | ->01.38% (955,248B) 0x804D2CE: get_descendants (node.c:292) -| | | | ->01.38% (955,248B) 0x8051577: query (query_runner.c:207) -| | | | ->01.38% (955,248B) 0x8051767: main (main.c:39) -| | | | -| | | ->00.02% (11,376B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.01% (5,680B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.99% (2,074,048B) 0x804F4F8: new_generic_list (stack.c:13) -| ->02.99% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->02.99% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->02.99% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->02.99% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->02.99% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.38% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.38% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.38% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.38% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.38% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.19% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.19% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.19% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.19% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.19% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.19% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.14% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.14% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.14% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.14% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.14% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.49% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.49% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.49% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.49% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.49% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.49% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.37% (952,640B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.37% (952,640B) 0x804FB1F: append_element (stack.c:144) -| ->01.37% (952,576B) 0x804CAD3: append_child (node.c:112) -| | ->01.37% (952,576B) 0x804CD2D: append_children (node.c:151) -| | | ->01.37% (952,576B) 0x804B668: yyparse (parser.y:169) -| | | ->01.37% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.37% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.37% (952,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 56 1,030,115,928 70,316,056 46,075,371 24,240,685 0 - 57 1,040,905,376 69,347,488 45,104,267 24,243,221 0 - 58 1,051,374,648 69,860,024 45,608,527 24,251,497 0 - 59 1,061,816,408 70,367,576 46,112,171 24,255,405 0 - 60 1,072,766,448 69,384,144 45,126,263 24,257,881 0 - 61 1,083,373,712 69,901,376 45,636,095 24,265,281 0 - 62 1,093,967,904 70,417,888 46,148,111 24,269,777 0 - 63 1,105,076,688 69,420,144 45,147,863 24,272,281 0 - 64 1,115,711,216 69,927,584 45,653,567 24,274,017 0 - 65 1,126,433,960 70,449,528 46,170,711 24,278,817 0 -65.54% (46,170,711B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.44% (8,764,744B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.72% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->11.72% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->11.72% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.72% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.72% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->00.72% (507,592B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.09% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.09% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.09% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.09% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.09% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.37% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.37% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.37% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.37% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.37% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.20% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.20% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.20% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.20% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.20% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.20% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.20% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.15% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.15% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.15% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.15% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.15% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.06% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.06% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.06% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.06% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.06% (3,563,448B) 0x8051749: main (main.c:30) -| -->04.36% (3,070,304B) 0x804FB2B: append_element (stack.c:147) -| ->02.92% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->02.92% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->02.92% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->02.92% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.92% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.92% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.44% (1,015,184B) 0x804FC8C: add_element (stack.c:180) -| ->01.44% (1,015,184B) 0x804D2F8: get_descendants (node.c:294) -| | ->01.43% (1,009,072B) 0x804D2CE: get_descendants (node.c:292) -| | | ->01.41% (996,832B) 0x804D2CE: get_descendants (node.c:292) -| | | | ->01.41% (996,832B) 0x8051577: query (query_runner.c:207) -| | | | ->01.41% (996,832B) 0x8051767: main (main.c:39) -| | | | -| | | ->00.02% (12,240B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.01% (6,112B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.94% (2,074,048B) 0x804F4F8: new_generic_list (stack.c:13) -| ->02.94% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->02.94% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->02.94% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->02.94% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->02.94% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.79% (1,967,744B) 0x804F716: refactor_generic_list (stack.c:59) -| ->02.79% (1,967,744B) 0x804FB1F: append_element (stack.c:144) -| ->01.44% (1,015,168B) 0x804FC8C: add_element (stack.c:180) -| | ->01.44% (1,015,168B) 0x804D2F8: get_descendants (node.c:294) -| | | ->01.44% (1,015,008B) 0x8051577: query (query_runner.c:207) -| | | | ->01.44% (1,015,008B) 0x8051767: main (main.c:39) -| | | | -| | | ->00.00% (160B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.35% (952,576B) 0x804CAD3: append_child (node.c:112) -| ->01.35% (952,576B) 0x804CD2D: append_children (node.c:151) -| | ->01.35% (952,576B) 0x804B668: yyparse (parser.y:169) -| | ->01.35% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | ->01.35% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->01.35% (952,576B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.34% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.34% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.34% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.34% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.34% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.15% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.15% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.15% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.15% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.15% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.15% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.11% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.11% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.11% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.11% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.11% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.46% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.46% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.46% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.46% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.46% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.46% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 66 1,136,744,160 70,479,488 46,192,111 24,287,377 0 - 67 1,148,028,264 69,458,728 45,170,243 24,288,485 0 - 68 1,158,441,824 69,482,048 45,185,003 24,297,045 0 - 69 1,168,853,208 69,488,360 45,188,035 24,300,325 0 - 70 1,179,151,568 71,471,552 46,957,343 24,514,209 0 - 71 1,189,449,960 69,944,696 45,675,509 24,269,187 0 - 72 1,199,748,336 69,944,624 45,675,471 24,269,153 0 - 73 1,210,046,704 69,944,512 45,675,341 24,269,171 0 - 74 1,220,345,080 69,944,712 45,675,515 24,269,197 0 - 75 1,230,643,440 69,944,544 45,675,365 24,269,179 0 -65.30% (45,675,365B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->13.29% (9,294,136B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.81% (8,257,152B) 0x804CCFD: append_children (node.c:148) -| | ->11.81% (8,257,152B) 0x804B668: yyparse (parser.y:169) -| | ->11.81% (8,257,152B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.81% (8,257,152B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.81% (8,257,152B) 0x8051749: main (main.c:30) -| | -| ->01.48% (1,036,984B) 0x8050862: remove_duplicates (stack.c:439) -| | ->01.48% (1,036,984B) 0x80516C7: query (query_runner.c:247) -| | ->01.48% (1,036,984B) 0x8051767: main (main.c:39) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.16% (7,104,972B) 0x804CECF: new_attribute (node.c:192) -| ->10.16% (7,104,972B) 0x804B8C1: yyparse (parser.y:222) -| ->10.16% (7,104,972B) 0x804AFCA: parse_file (parser.y:67) -| ->10.16% (7,104,972B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.16% (7,104,972B) 0x8051749: main (main.c:30) -| -->07.42% (5,188,706B) 0x804CE69: new_text_node (node.c:183) -| ->07.42% (5,188,706B) 0x804B7BD: yyparse (parser.y:196) -| ->07.42% (5,188,706B) 0x804AFCA: parse_file (parser.y:67) -| ->07.42% (5,188,706B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.42% (5,188,706B) 0x8051749: main (main.c:30) -| -->07.26% (5,074,980B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.26% (5,074,980B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.26% (5,074,980B) 0x804CBDC: add_attribute (node.c:132) -| ->07.26% (5,074,980B) 0x804B89B: yyparse (parser.y:218) -| ->07.26% (5,074,980B) 0x804AFCA: parse_file (parser.y:67) -| ->07.26% (5,074,980B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.26% (5,074,980B) 0x8051749: main (main.c:30) -| -->05.19% (3,629,528B) 0x804CD8F: new_element_node (node.c:164) -| ->05.19% (3,629,528B) 0x804B874: yyparse (parser.y:215) -| | ->05.19% (3,629,528B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.19% (3,629,528B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.19% (3,629,528B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.09% (3,563,448B) 0x804CE2F: new_text_node (node.c:178) -| ->05.09% (3,563,448B) 0x804B7BD: yyparse (parser.y:196) -| ->05.09% (3,563,448B) 0x804AFCA: parse_file (parser.y:67) -| ->05.09% (3,563,448B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.09% (3,563,448B) 0x8051749: main (main.c:30) -| -->04.38% (3,060,672B) 0x804FB2B: append_element (stack.c:147) -| ->02.94% (2,055,120B) 0x804CAD3: append_child (node.c:112) -| | ->02.94% (2,055,120B) 0x804CD2D: append_children (node.c:151) -| | | ->02.94% (2,055,120B) 0x804B668: yyparse (parser.y:169) -| | | ->02.94% (2,055,120B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.94% (2,055,120B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.94% (2,055,120B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.44% (1,005,552B) 0x804FC8C: add_element (stack.c:180) -| | ->01.44% (1,005,544B) 0x80508F4: remove_duplicates (stack.c:445) -| | | ->01.44% (1,005,544B) 0x80516C7: query (query_runner.c:247) -| | | ->01.44% (1,005,544B) 0x8051767: main (main.c:39) -| | | -| | ->00.00% (8B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.97% (2,074,016B) 0x804F4F8: new_generic_list (stack.c:13) -| ->02.97% (2,074,000B) 0x804CCFD: append_children (node.c:148) -| | ->02.97% (2,074,000B) 0x804B668: yyparse (parser.y:169) -| | ->02.97% (2,074,000B) 0x804AFCA: parse_file (parser.y:67) -| | ->02.97% (2,074,000B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->02.97% (2,074,000B) 0x8051749: main (main.c:30) -| | -| ->00.00% (16B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.36% (1,649,765B) 0x804CF10: new_attribute (node.c:197) -| ->02.36% (1,649,765B) 0x804B8C1: yyparse (parser.y:222) -| ->02.36% (1,649,765B) 0x804AFCA: parse_file (parser.y:67) -| ->02.36% (1,649,765B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.36% (1,649,765B) 0x8051749: main (main.c:30) -| -->02.17% (1,517,784B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.17% (1,517,784B) 0x804CBC1: add_attribute (node.c:131) -| ->02.17% (1,517,784B) 0x804B89B: yyparse (parser.y:218) -| ->02.17% (1,517,784B) 0x804AFCA: parse_file (parser.y:67) -| ->02.17% (1,517,784B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.17% (1,517,784B) 0x8051749: main (main.c:30) -| -->02.12% (1,483,582B) 0x804CF47: new_attribute (node.c:199) -| ->02.12% (1,483,582B) 0x804B8C1: yyparse (parser.y:222) -| ->02.12% (1,483,582B) 0x804AFCA: parse_file (parser.y:67) -| ->02.12% (1,483,582B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.12% (1,483,582B) 0x8051749: main (main.c:30) -| -->01.47% (1,031,498B) 0x40B14AE: strdup (strdup.c:43) -| ->01.47% (1,031,498B) 0x804C6EC: set_name (node.c:26) -| | ->01.47% (1,031,494B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.47% (1,031,494B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.47% (1,031,494B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.47% (1,031,494B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.36% (952,576B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.36% (952,576B) 0x804FB1F: append_element (stack.c:144) -| ->01.36% (952,576B) 0x804CAD3: append_child (node.c:112) -| | ->01.36% (952,576B) 0x804CD2D: append_children (node.c:151) -| | | ->01.36% (952,576B) 0x804B668: yyparse (parser.y:169) -| | | ->01.36% (952,576B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.36% (952,576B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.36% (952,576B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (49,702B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 76 1,240,941,816 69,944,536 45,675,357 24,269,179 0 - 77 1,251,240,248 69,944,392 45,675,271 24,269,121 0 - 78 1,261,538,648 69,944,728 45,675,559 24,269,169 0 - 79 1,271,837,128 69,944,392 45,675,271 24,269,121 0 - 80 1,282,135,488 69,944,624 45,675,443 24,269,181 0 - 81 1,292,433,864 69,944,392 45,675,271 24,269,121 0 - 82 1,302,732,320 69,944,704 45,675,543 24,269,161 0 - 83 1,313,030,672 69,944,480 45,675,325 24,269,155 0 - 84 1,323,329,032 68,467,672 44,712,080 23,755,592 0 - 85 1,333,627,392 58,758,400 38,381,577 20,376,823 0 -65.32% (38,381,577B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->13.47% (7,912,760B) 0x804F52E: new_generic_list (stack.c:18) -| ->11.70% (6,875,776B) 0x804CCFD: append_children (node.c:148) -| | ->11.70% (6,875,776B) 0x804B668: yyparse (parser.y:169) -| | ->11.70% (6,875,776B) 0x804AFCA: parse_file (parser.y:67) -| | ->11.70% (6,875,776B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->11.70% (6,875,776B) 0x8051749: main (main.c:30) -| | -| ->01.76% (1,036,984B) 0x8050862: remove_duplicates (stack.c:439) -| | ->01.76% (1,036,984B) 0x80516C7: query (query_runner.c:247) -| | ->01.76% (1,036,984B) 0x8051767: main (main.c:39) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.06% (5,912,788B) 0x804CECF: new_attribute (node.c:192) -| ->10.06% (5,912,788B) 0x804B8C1: yyparse (parser.y:222) -| ->10.06% (5,912,788B) 0x804AFCA: parse_file (parser.y:67) -| ->10.06% (5,912,788B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->10.06% (5,912,788B) 0x8051749: main (main.c:30) -| -->07.36% (4,325,865B) 0x804CE69: new_text_node (node.c:183) -| ->07.36% (4,325,865B) 0x804B7BD: yyparse (parser.y:196) -| ->07.36% (4,325,865B) 0x804AFCA: parse_file (parser.y:67) -| ->07.36% (4,325,865B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.36% (4,325,865B) 0x8051749: main (main.c:30) -| -->07.19% (4,223,420B) 0x804E776: new_rbtree_node (rbtree.c:15) -| ->07.19% (4,223,420B) 0x804EB44: rb_tree_insert (rbtree.c:146) -| ->07.19% (4,223,420B) 0x804CBDC: add_attribute (node.c:132) -| ->07.19% (4,223,420B) 0x804B89B: yyparse (parser.y:218) -| ->07.19% (4,223,420B) 0x804AFCA: parse_file (parser.y:67) -| ->07.19% (4,223,420B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->07.19% (4,223,420B) 0x8051749: main (main.c:30) -| -->05.14% (3,022,460B) 0x804CD8F: new_element_node (node.c:164) -| ->05.14% (3,022,460B) 0x804B874: yyparse (parser.y:215) -| | ->05.14% (3,022,460B) 0x804AFCA: parse_file (parser.y:67) -| | ->05.14% (3,022,460B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->05.14% (3,022,460B) 0x8051749: main (main.c:30) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.05% (2,965,788B) 0x804CE2F: new_text_node (node.c:178) -| ->05.05% (2,965,788B) 0x804B7BD: yyparse (parser.y:196) -| ->05.05% (2,965,788B) 0x804AFCA: parse_file (parser.y:67) -| ->05.05% (2,965,788B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->05.05% (2,965,788B) 0x8051749: main (main.c:30) -| -->04.63% (2,717,624B) 0x804FB2B: append_element (stack.c:147) -| ->02.91% (1,712,072B) 0x804CAD3: append_child (node.c:112) -| | ->02.91% (1,712,072B) 0x804CD2D: append_children (node.c:151) -| | | ->02.91% (1,712,072B) 0x804B668: yyparse (parser.y:169) -| | | ->02.91% (1,712,072B) 0x804AFCA: parse_file (parser.y:67) -| | | ->02.91% (1,712,072B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->02.91% (1,712,072B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.71% (1,005,552B) 0x804FC8C: add_element (stack.c:180) -| | ->01.71% (1,005,544B) 0x80508F4: remove_duplicates (stack.c:445) -| | | ->01.71% (1,005,544B) 0x80516C7: query (query_runner.c:247) -| | | ->01.71% (1,005,544B) 0x8051767: main (main.c:39) -| | | -| | ->00.00% (8B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.94% (1,727,120B) 0x804F4F8: new_generic_list (stack.c:13) -| ->02.94% (1,727,104B) 0x804CCFD: append_children (node.c:148) -| | ->02.94% (1,727,104B) 0x804B668: yyparse (parser.y:169) -| | ->02.94% (1,727,104B) 0x804AFCA: parse_file (parser.y:67) -| | ->02.94% (1,727,104B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | ->02.94% (1,727,104B) 0x8051749: main (main.c:30) -| | -| ->00.00% (16B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.34% (1,372,952B) 0x804CF10: new_attribute (node.c:197) -| ->02.34% (1,372,952B) 0x804B8C1: yyparse (parser.y:222) -| ->02.34% (1,372,952B) 0x804AFCA: parse_file (parser.y:67) -| ->02.34% (1,372,952B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.34% (1,372,952B) 0x8051749: main (main.c:30) -| -->02.15% (1,262,988B) 0x804E815: new_rbtree (rbtree.c:39) -| ->02.15% (1,262,988B) 0x804CBC1: add_attribute (node.c:131) -| ->02.15% (1,262,988B) 0x804B89B: yyparse (parser.y:218) -| ->02.15% (1,262,988B) 0x804AFCA: parse_file (parser.y:67) -| ->02.15% (1,262,988B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.15% (1,262,988B) 0x8051749: main (main.c:30) -| -->02.11% (1,238,223B) 0x804CF47: new_attribute (node.c:199) -| ->02.11% (1,238,223B) 0x804B8C1: yyparse (parser.y:222) -| ->02.11% (1,238,223B) 0x804AFCA: parse_file (parser.y:67) -| ->02.11% (1,238,223B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| ->02.11% (1,238,223B) 0x8051749: main (main.c:30) -| -->01.46% (858,813B) 0x40B14AE: strdup (strdup.c:43) -| ->01.46% (858,813B) 0x804C6EC: set_name (node.c:26) -| | ->01.46% (858,809B) 0x804B7FC: yyparse (parser.y:202) -| | | ->01.46% (858,809B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.46% (858,809B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.46% (858,809B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.35% (791,168B) 0x804F716: refactor_generic_list (stack.c:59) -| ->01.35% (791,168B) 0x804FB1F: append_element (stack.c:144) -| ->01.35% (791,168B) 0x804CAD3: append_child (node.c:112) -| | ->01.35% (791,168B) 0x804CD2D: append_children (node.c:151) -| | | ->01.35% (791,168B) 0x804B668: yyparse (parser.y:169) -| | | ->01.35% (791,168B) 0x804AFCA: parse_file (parser.y:67) -| | | ->01.35% (791,168B) 0x8048CA6: parse_dom (lxq_parser.c:20) -| | | ->01.35% (791,168B) 0x8051749: main (main.c:30) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.08% (49,608B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 86 1,343,925,752 49,048,904 32,050,794 16,998,110 0 - 87 1,354,224,120 39,340,264 25,720,869 13,619,395 0 - 88 1,364,522,480 29,629,680 19,390,511 10,239,169 0 - 89 1,374,820,840 19,920,408 13,058,080 6,862,328 0 - 90 1,385,119,216 10,208,304 6,724,624 3,483,680 0 diff --git a/profiling/dom_size.c b/profiling/dom_size.c deleted file mode 100644 index 6250238..0000000 --- a/profiling/dom_size.c +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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 -#include -#include "../include/node.h" -#include "../include/lxq_parser.h" -#include "../include/stack.h" -#include "../include/query_runner.h" -#include "../include/node.h" - -void get_size(dom_node* n, int *size){ - int i; - *size += sizeof(n); - switch(n->type){ - case CDATA: - case TEXT_NODE: - *size += strlen(n->value)*sizeof(char); - break; - case ATTRIBUTE: - *size += strlen(n->name)*sizeof(char); - *size += strlen(n->value)*sizeof(char); - break; - case ELEMENT: - if(n->children != NULL) - for(i = 0; i < n->children->count; i++){ get_size(get_element_at(n->children, i), size); } - - if(n->attributes != NULL){ - struct siterator *it = new_tree_iterator(n->attributes); - while(tree_iterator_has_next(it)){ get_size(tree_iterator_next(it), size); } - destroy_iterator(it); - } - *size += strlen(n->name)*sizeof(char); - if(n->namespace != NULL) *size += strlen(n->namespace)*sizeof(char); - break; - } -} - -int main(int argc, char** argv){ - if(argc != 2){ - printf("usage: %s \"xml_file\"\n", argv[0]); - return 0; - } - - doc* document = parse_xml(argv[1]); - int i = 0; - get_size(document->root, &i); - printf("%d kB\n", i / 1024); -} - diff --git a/profiling/sem_remove_dups_e_quick_sort.gprof b/profiling/sem_remove_dups_e_quick_sort.gprof deleted file mode 100644 index 4187003..0000000 --- a/profiling/sem_remove_dups_e_quick_sort.gprof +++ /dev/null @@ -1,765 +0,0 @@ -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls ms/call ms/call name - 35.82 0.24 0.24 129624 0.00 0.00 merge_lists - 14.93 0.34 0.10 894017 0.00 0.00 remove_element_at - 13.43 0.43 0.09 2303395 0.00 0.00 yylex - 11.94 0.51 0.08 1788810 0.00 0.00 append_element - 4.48 0.54 0.03 14448262 0.00 0.00 __pointer - 2.99 0.56 0.02 1403071 0.00 0.00 get_element_and_type_at - 2.99 0.58 0.02 126483 0.00 0.00 __destroy_rbtree - 1.49 0.59 0.01 7224131 0.00 0.00 __compare_by_pointer - 1.49 0.60 0.01 1403071 0.00 0.00 get_element_at - 1.49 0.61 0.01 513002 0.00 0.00 destroy_dom_node - 1.49 0.62 0.01 502776 0.00 0.00 destroy_byte_buffer - 1.49 0.63 0.01 390451 0.00 0.00 destroy_generic_list - 1.49 0.64 0.01 379443 0.00 0.00 rb_tree_insert - 1.49 0.65 0.01 252176 0.00 0.00 new_tree_iterator - 1.49 0.66 0.01 251388 0.00 0.00 __dom_node_to_xml - 1.49 0.67 0.01 1 10.00 10.00 new_simple_rbtree - 0.00 0.67 0.00 2569717 0.00 0.00 __alloc - 0.00 0.67 0.00 2560282 0.00 0.00 __alloc - 0.00 0.67 0.00 2513880 0.00 0.00 append_bytes_to_buffer - 0.00 0.67 0.00 2388186 0.00 0.00 append_string_to_buffer - 0.00 0.67 0.00 1275029 0.00 0.00 add_element - 0.00 0.67 0.00 1256940 0.00 0.00 __alloc - 0.00 0.67 0.00 894016 0.00 0.00 pop_stack - 0.00 0.67 0.00 894016 0.00 0.00 push_stack - 0.00 0.67 0.00 772251 0.00 0.00 new_element_node - 0.00 0.67 0.00 763602 0.00 0.00 key - 0.00 0.67 0.00 758102 0.00 0.00 __alloc - 0.00 0.67 0.00 757313 0.00 0.00 tree_iterator_has_next - 0.00 0.67 0.00 642626 0.00 0.00 get_name - 0.00 0.67 0.00 628470 0.00 0.00 new_byte_buffer - 0.00 0.67 0.00 513780 0.00 0.00 append_child - 0.00 0.67 0.00 505137 0.00 0.00 tree_iterator_next - 0.00 0.67 0.00 502776 0.00 0.00 append_buffer_to_buffer - 0.00 0.67 0.00 390453 0.00 0.00 new_generic_list - 0.00 0.67 0.00 383375 0.00 0.00 get_namespace - 0.00 0.67 0.00 383375 0.00 0.00 set_namespace - 0.00 0.67 0.00 381801 0.00 0.00 compare - 0.00 0.67 0.00 379443 0.00 0.00 new_rbtree_node - 0.00 0.67 0.00 379443 0.00 0.00 rb_tree_insert_fixup - 0.00 0.67 0.00 253749 0.00 0.00 add_attribute - 0.00 0.67 0.00 253749 0.00 0.00 new_attribute - 0.00 0.67 0.00 252176 0.00 0.00 destroy_iterator - 0.00 0.67 0.00 251388 0.00 0.00 __attribute_to_xml - 0.00 0.67 0.00 129626 0.00 0.00 set_name - 0.00 0.67 0.00 129625 0.00 0.00 append_children - 0.00 0.67 0.00 129625 0.00 0.00 get_children - 0.00 0.67 0.00 127266 0.00 0.00 new_text_node - 0.00 0.67 0.00 126483 0.00 0.00 destroy_rbtree - 0.00 0.67 0.00 126483 0.00 0.00 new_rbtree - 0.00 0.67 0.00 125695 0.00 0.00 generic_list_iterator_has_next - 0.00 0.67 0.00 125694 0.00 0.00 __node_list_to_xml - 0.00 0.67 0.00 125694 0.00 0.00 generic_list_iterator_next - 0.00 0.67 0.00 125694 0.00 0.00 node_to_string - 0.00 0.67 0.00 122708 0.00 0.00 left_rbrotate - 0.00 0.67 0.00 13629 0.00 0.00 refactor_generic_list - 0.00 0.67 0.00 935 0.00 0.00 right_rbrotate - 0.00 0.67 0.00 4 0.00 0.00 new_stack - 0.00 0.67 0.00 4 0.00 0.00 yy_load_buffer_state - 0.00 0.67 0.00 4 0.00 0.00 yyalloc - 0.00 0.67 0.00 4 0.00 0.00 yydestruct - 0.00 0.67 0.00 4 0.00 0.00 yyfree - 0.00 0.67 0.00 3 0.00 0.00 yy_get_next_buffer - 0.00 0.67 0.00 2 0.00 0.00 __alloc - 0.00 0.67 0.00 2 0.00 0.00 yy_delete_buffer - 0.00 0.67 0.00 2 0.00 0.00 yy_init_globals - 0.00 0.67 0.00 2 0.00 0.00 yy_scan_buffer - 0.00 0.67 0.00 2 0.00 0.00 yy_switch_to_buffer - 0.00 0.67 0.00 2 0.00 0.00 yyensure_buffer_stack - 0.00 0.67 0.00 2 0.00 0.00 yylex_destroy - 0.00 0.67 0.00 2 0.00 119.52 yyparse - 0.00 0.67 0.00 2 0.00 0.00 yywrap - 0.00 0.67 0.00 1 0.00 0.00 __alloc - 0.00 0.67 0.00 1 0.00 0.00 __alloc - 0.00 0.67 0.00 1 0.00 0.00 add_element_with_type - 0.00 0.67 0.00 1 0.00 0.00 dequeue - 0.00 0.67 0.00 1 0.00 0.00 destroy_dom_tree - 0.00 0.67 0.00 1 0.00 0.00 destroy_generic_list_iterator - 0.00 0.67 0.00 1 0.00 0.00 destroy_selector - 0.00 0.67 0.00 1 0.00 0.00 enqueue_with_type - 0.00 0.67 0.00 1 0.00 11.08 filter_nodes_by_name - 0.00 0.67 0.00 1 0.00 11.08 filter_nodes_by_selector - 0.00 0.67 0.00 1 0.00 254.65 get_descendants - 0.00 0.67 0.00 1 0.00 0.00 new_document - 0.00 0.67 0.00 1 0.00 0.00 new_generic_list_iterator - 0.00 0.67 0.00 1 0.00 0.00 new_queue - 0.00 0.67 0.00 1 0.00 0.00 new_selector - 0.00 0.67 0.00 1 0.00 219.52 parse_dom - 0.00 0.67 0.00 1 0.00 119.52 parse_file - 0.00 0.67 0.00 1 0.00 119.52 parse_query - 0.00 0.67 0.00 1 0.00 119.52 parse_string - 0.00 0.67 0.00 1 0.00 0.00 peek_queue_type - 0.00 0.67 0.00 1 0.00 420.12 query - 0.00 0.67 0.00 1 0.00 0.00 set_doc_root - 0.00 0.67 0.00 1 0.00 0.00 set_xml_declaration - 0.00 0.67 0.00 1 0.00 0.00 yy_get_previous_state - - % the percentage of the total running time of the -time program used by this function. - -cumulative a running sum of the number of seconds accounted - seconds for by this function and those listed above it. - - self the number of seconds accounted for by this -seconds function alone. This is the major sort for this - listing. - -calls the number of times this function was invoked, if - this function is profiled, else blank. - - self the average number of milliseconds spent in this -ms/call function per call, if this function is profiled, - else blank. - - total the average number of milliseconds spent in this -ms/call function and its descendents per call, if this - function is profiled, else blank. - -name the name of the function. This is the minor sort - for this listing. The index shows the location of - the function in the gprof listing. If the index is - in parenthesis it shows where it would appear in - the gprof listing if it were to be printed. - - Call graph (explanation follows) - - -granularity: each sample hit covers 4 byte(s) for 1.49% of 0.67 seconds - -index % time self children called name - -[1] 100.0 0.00 0.67 main [1] - 0.00 0.42 1/1 query [2] - 0.00 0.22 1/1 parse_dom [6] - 0.00 0.03 125694/125694 node_to_string [22] - 0.00 0.00 125694/1403071 get_element_at [19] - 0.00 0.00 1/1 destroy_dom_tree [38] ------------------------------------------------ - 0.00 0.42 1/1 main [1] -[2] 62.7 0.00 0.42 1 query [2] - 0.00 0.25 1/1 get_descendants [3] - 0.00 0.12 1/1 parse_query [8] - 0.00 0.01 125694/379443 rb_tree_insert [15] - 0.00 0.01 1/1 filter_nodes_by_selector [29] - 0.01 0.00 1/1 new_simple_rbtree [33] - 0.00 0.01 125695/1275029 add_element [14] - 0.00 0.00 125694/125694 generic_list_iterator_next [37] - 0.00 0.00 1/126483 destroy_rbtree [26] - 0.00 0.00 1/1 dequeue [39] - 0.00 0.00 1/1 destroy_selector [40] - 0.00 0.00 1/390451 destroy_generic_list [35] - 0.00 0.00 125695/125695 generic_list_iterator_has_next [64] - 0.00 0.00 1/390453 new_generic_list [52] - 0.00 0.00 1/1 peek_queue_type [86] - 0.00 0.00 1/1 new_generic_list_iterator [83] - 0.00 0.00 1/1 destroy_generic_list_iterator [81] ------------------------------------------------ - 129624 get_descendants [3] - 0.00 0.25 1/1 query [2] -[3] 38.0 0.00 0.25 1+129624 get_descendants [3] - 0.24 0.00 129624/129624 merge_lists [4] - 0.00 0.01 129624/1275029 add_element [14] - 0.00 0.00 256890/1403071 get_element_at [19] - 0.00 0.00 129625/129625 get_children [61] - 0.00 0.00 129625/390453 new_generic_list [52] - 129624 get_descendants [3] ------------------------------------------------ - 0.24 0.00 129624/129624 get_descendants [3] -[4] 36.3 0.24 0.00 129624 merge_lists [4] - 0.00 0.00 131195/390451 destroy_generic_list [35] - 0.00 0.00 1571/390453 new_generic_list [52] ------------------------------------------------ - 0.00 0.12 1/2 parse_file [9] - 0.00 0.12 1/2 parse_string [10] -[5] 35.7 0.00 0.24 2 yyparse [5] - 0.09 0.04 2303395/2303395 yylex [7] - 0.01 0.03 513000/513002 destroy_dom_node [16] - 0.00 0.03 253749/253749 add_attribute [18] - 0.00 0.02 129625/129625 append_children [28] - 0.00 0.01 256890/513780 append_child [23] - 0.00 0.00 129625/390451 destroy_generic_list [35] - 0.00 0.00 1/1 enqueue_with_type [42] - 0.00 0.00 772251/772251 new_element_node [45] - 0.00 0.00 642626/642626 get_name [48] - 0.00 0.00 383375/383375 get_namespace [53] - 0.00 0.00 383375/383375 set_namespace [54] - 0.00 0.00 253749/253749 new_attribute [58] - 0.00 0.00 129626/129626 set_name [60] - 0.00 0.00 127266/127266 new_text_node [62] - 0.00 0.00 4/4 yydestruct [71] - 0.00 0.00 2/4 new_stack [68] - 0.00 0.00 1/1 new_document [82] - 0.00 0.00 1/1 set_doc_root [87] - 0.00 0.00 1/1 new_queue [84] - 0.00 0.00 1/1 new_selector [85] ------------------------------------------------ - 0.00 0.22 1/1 main [1] -[6] 32.8 0.00 0.22 1 parse_dom [6] - 0.00 0.12 1/1 parse_file [9] - 0.00 0.10 894015/894016 pop_stack [12] - 0.00 0.00 1/390451 destroy_generic_list [35] - 0.00 0.00 1/4 new_stack [68] - 0.00 0.00 1/2 __alloc [178] ------------------------------------------------ - 0.09 0.04 2303395/2303395 yyparse [5] -[7] 19.4 0.09 0.04 2303395 yylex [7] - 0.00 0.04 894016/894016 push_stack [17] - 0.00 0.00 3/3 yy_get_next_buffer [73] - 0.00 0.00 2/4 yy_load_buffer_state [69] - 0.00 0.00 2/2 yywrap [80] - 0.00 0.00 1/1 yy_get_previous_state [89] ------------------------------------------------ - 0.00 0.12 1/1 query [2] -[8] 17.8 0.00 0.12 1 parse_query [8] - 0.00 0.12 1/1 parse_string [10] - 0.00 0.00 1/894016 pop_stack [12] - 0.00 0.00 1/390451 destroy_generic_list [35] - 0.00 0.00 1/4 new_stack [68] - 0.00 0.00 1/2 __alloc [178] ------------------------------------------------ - 0.00 0.12 1/1 parse_dom [6] -[9] 17.8 0.00 0.12 1 parse_file [9] - 0.00 0.12 1/2 yyparse [5] - 0.00 0.00 1/2 yy_scan_buffer [76] - 0.00 0.00 1/2 yy_delete_buffer [74] - 0.00 0.00 1/2 yylex_destroy [79] ------------------------------------------------ - 0.00 0.12 1/1 parse_query [8] -[10] 17.8 0.00 0.12 1 parse_string [10] - 0.00 0.12 1/2 yyparse [5] - 0.00 0.00 1/1 __alloc [179] - 0.00 0.00 1/2 yy_scan_buffer [76] - 0.00 0.00 1/2 yylex_destroy [79] - 0.00 0.00 1/2 yy_delete_buffer [74] ------------------------------------------------ - 0.00 0.00 1/894017 dequeue [39] - 0.10 0.00 894016/894017 pop_stack [12] -[11] 14.9 0.10 0.00 894017 remove_element_at [11] ------------------------------------------------ - 0.00 0.00 1/894016 parse_query [8] - 0.00 0.10 894015/894016 parse_dom [6] -[12] 14.9 0.00 0.10 894016 pop_stack [12] - 0.10 0.00 894016/894017 remove_element_at [11] ------------------------------------------------ - 0.00 0.00 1/1788810 add_element_with_type [41] - 0.02 0.00 513780/1788810 append_child [23] - 0.06 0.00 1275029/1788810 add_element [14] -[13] 11.9 0.08 0.00 1788810 append_element [13] - 0.00 0.00 1788810/2569717 __alloc [173] - 0.00 0.00 13629/13629 refactor_generic_list [66] ------------------------------------------------ - 0.00 0.01 125694/1275029 filter_nodes_by_name [30] - 0.00 0.01 125695/1275029 query [2] - 0.00 0.01 129624/1275029 get_descendants [3] - 0.00 0.04 894016/1275029 push_stack [17] -[14] 8.5 0.00 0.06 1275029 add_element [14] - 0.06 0.00 1275029/1788810 append_element [13] ------------------------------------------------ - 0.00 0.01 125694/379443 query [2] - 0.01 0.03 253749/379443 add_attribute [18] -[15] 7.5 0.01 0.04 379443 rb_tree_insert [15] - 0.03 0.00 14448262/14448262 __pointer [20] - 0.01 0.00 7224131/7224131 __compare_by_pointer [34] - 0.00 0.00 763602/763602 key [46] - 0.00 0.00 381801/381801 compare [55] - 0.00 0.00 379443/379443 new_rbtree_node [56] - 0.00 0.00 379443/379443 rb_tree_insert_fixup [57] ------------------------------------------------ - 510639 destroy_dom_node [16] - 0.00 0.00 2/513002 destroy_dom_tree [38] - 0.01 0.03 513000/513002 yyparse [5] -[16] 6.5 0.01 0.03 513002+510639 destroy_dom_node [16] - 0.00 0.02 126482/126483 destroy_rbtree [26] - 0.00 0.00 256890/1403071 get_element_at [19] - 0.01 0.00 126482/252176 new_tree_iterator [32] - 0.00 0.00 129625/390451 destroy_generic_list [35] - 0.00 0.00 380231/757313 tree_iterator_has_next [47] - 0.00 0.00 253749/505137 tree_iterator_next [50] - 0.00 0.00 126482/252176 destroy_iterator [59] - 510639 destroy_dom_node [16] ------------------------------------------------ - 0.00 0.04 894016/894016 yylex [7] -[17] 6.0 0.00 0.04 894016 push_stack [17] - 0.00 0.04 894016/1275029 add_element [14] ------------------------------------------------ - 0.00 0.03 253749/253749 yyparse [5] -[18] 5.0 0.00 0.03 253749 add_attribute [18] - 0.01 0.03 253749/379443 rb_tree_insert [15] - 0.00 0.00 126482/126483 new_rbtree [63] ------------------------------------------------ - 0.00 0.00 125694/1403071 __node_list_to_xml [36] - 0.00 0.00 125694/1403071 generic_list_iterator_next [37] - 0.00 0.00 125694/1403071 main [1] - 0.00 0.00 255319/1403071 filter_nodes_by_name [30] - 0.00 0.00 256890/1403071 append_children [28] - 0.00 0.00 256890/1403071 get_descendants [3] - 0.00 0.00 256890/1403071 destroy_dom_node [16] -[19] 4.5 0.01 0.02 1403071 get_element_at [19] - 0.02 0.00 1403071/1403071 get_element_and_type_at [25] ------------------------------------------------ - 0.03 0.00 14448262/14448262 rb_tree_insert [15] -[20] 4.5 0.03 0.00 14448262 __pointer [20] ------------------------------------------------ -[21] 4.1 0.01 0.02 125694+251388 [21] - 0.01 0.01 251388 __dom_node_to_xml [24] - 0.00 0.01 125694 __node_list_to_xml [36] ------------------------------------------------ - 0.00 0.03 125694/125694 main [1] -[22] 4.1 0.00 0.03 125694 node_to_string [22] - 0.01 0.02 125694/125694 __dom_node_to_xml [24] - 0.00 0.00 125694/2513880 append_bytes_to_buffer [43] ------------------------------------------------ - 0.00 0.01 256890/513780 yyparse [5] - 0.00 0.01 256890/513780 append_children [28] -[23] 3.4 0.00 0.02 513780 append_child [23] - 0.02 0.00 513780/1788810 append_element [13] - 0.00 0.00 129625/390453 new_generic_list [52] ------------------------------------------------ - 125694 __node_list_to_xml [36] - 0.01 0.02 125694/125694 node_to_string [22] -[24] 3.4 0.01 0.01 251388 __dom_node_to_xml [24] - 0.01 0.00 377082/502776 destroy_byte_buffer [31] - 0.00 0.00 125694/252176 new_tree_iterator [32] - 0.00 0.00 1131246/2388186 append_string_to_buffer [44] - 0.00 0.00 377082/502776 append_buffer_to_buffer [51] - 0.00 0.00 377082/757313 tree_iterator_has_next [47] - 0.00 0.00 251388/628470 new_byte_buffer [49] - 0.00 0.00 251388/505137 tree_iterator_next [50] - 0.00 0.00 251388/251388 __attribute_to_xml [177] - 0.00 0.00 125694/252176 destroy_iterator [59] - 125694 __node_list_to_xml [36] ------------------------------------------------ - 0.02 0.00 1403071/1403071 get_element_at [19] -[25] 3.0 0.02 0.00 1403071 get_element_and_type_at [25] ------------------------------------------------ - 0.00 0.00 1/126483 query [2] - 0.00 0.02 126482/126483 destroy_dom_node [16] -[26] 3.0 0.00 0.02 126483 destroy_rbtree [26] - 0.02 0.00 126483/126483 __destroy_rbtree [27] ------------------------------------------------ - 758886 __destroy_rbtree [27] - 0.02 0.00 126483/126483 destroy_rbtree [26] -[27] 3.0 0.02 0.00 126483+758886 __destroy_rbtree [27] - 758886 __destroy_rbtree [27] ------------------------------------------------ - 0.00 0.02 129625/129625 yyparse [5] -[28] 2.5 0.00 0.02 129625 append_children [28] - 0.00 0.01 256890/513780 append_child [23] - 0.00 0.00 256890/1403071 get_element_at [19] - 0.00 0.00 129625/390453 new_generic_list [52] ------------------------------------------------ - 0.00 0.01 1/1 query [2] -[29] 1.7 0.00 0.01 1 filter_nodes_by_selector [29] - 0.00 0.01 1/1 filter_nodes_by_name [30] - 0.00 0.00 1/390451 destroy_generic_list [35] ------------------------------------------------ - 0.00 0.01 1/1 filter_nodes_by_selector [29] -[30] 1.7 0.00 0.01 1 filter_nodes_by_name [30] - 0.00 0.01 125694/1275029 add_element [14] - 0.00 0.00 255319/1403071 get_element_at [19] - 0.00 0.00 1/390453 new_generic_list [52] ------------------------------------------------ - 0.00 0.00 125694/502776 __node_list_to_xml [36] - 0.01 0.00 377082/502776 __dom_node_to_xml [24] -[31] 1.5 0.01 0.00 502776 destroy_byte_buffer [31] ------------------------------------------------ - 0.00 0.00 125694/252176 __dom_node_to_xml [24] - 0.01 0.00 126482/252176 destroy_dom_node [16] -[32] 1.5 0.01 0.00 252176 new_tree_iterator [32] - 0.00 0.00 252176/758102 __alloc [176] ------------------------------------------------ - 0.01 0.00 1/1 query [2] -[33] 1.5 0.01 0.00 1 new_simple_rbtree [33] - 0.00 0.00 1/126483 new_rbtree [63] ------------------------------------------------ - 0.01 0.00 7224131/7224131 rb_tree_insert [15] -[34] 1.5 0.01 0.00 7224131 __compare_by_pointer [34] ------------------------------------------------ - 0.00 0.00 1/390451 parse_dom [6] - 0.00 0.00 1/390451 parse_query [8] - 0.00 0.00 1/390451 filter_nodes_by_selector [29] - 0.00 0.00 1/390451 query [2] - 0.00 0.00 2/390451 destroy_selector [40] - 0.00 0.00 129625/390451 yyparse [5] - 0.00 0.00 129625/390451 destroy_dom_node [16] - 0.00 0.00 131195/390451 merge_lists [4] -[35] 1.5 0.01 0.00 390451 destroy_generic_list [35] ------------------------------------------------ - 125694 __dom_node_to_xml [24] -[36] 0.8 0.00 0.01 125694 __node_list_to_xml [36] - 0.00 0.00 125694/1403071 get_element_at [19] - 0.00 0.00 125694/502776 destroy_byte_buffer [31] - 0.00 0.00 125694/628470 new_byte_buffer [49] - 0.00 0.00 125694/502776 append_buffer_to_buffer [51] - 125694 __dom_node_to_xml [24] ------------------------------------------------ - 0.00 0.00 125694/125694 query [2] -[37] 0.4 0.00 0.00 125694 generic_list_iterator_next [37] - 0.00 0.00 125694/1403071 get_element_at [19] ------------------------------------------------ - 0.00 0.00 1/1 main [1] -[38] 0.0 0.00 0.00 1 destroy_dom_tree [38] - 0.00 0.00 2/513002 destroy_dom_node [16] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[39] 0.0 0.00 0.00 1 dequeue [39] - 0.00 0.00 1/894017 remove_element_at [11] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[40] 0.0 0.00 0.00 1 destroy_selector [40] - 0.00 0.00 2/390451 destroy_generic_list [35] ------------------------------------------------ - 0.00 0.00 1/1 enqueue_with_type [42] -[41] 0.0 0.00 0.00 1 add_element_with_type [41] - 0.00 0.00 1/1788810 append_element [13] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [5] -[42] 0.0 0.00 0.00 1 enqueue_with_type [42] - 0.00 0.00 1/1 add_element_with_type [41] ------------------------------------------------ - 0.00 0.00 125694/2513880 node_to_string [22] - 0.00 0.00 2388186/2513880 append_string_to_buffer [44] -[43] 0.0 0.00 0.00 2513880 append_bytes_to_buffer [43] ------------------------------------------------ - 0.00 0.00 1131246/2388186 __dom_node_to_xml [24] - 0.00 0.00 1256940/2388186 __attribute_to_xml [177] -[44] 0.0 0.00 0.00 2388186 append_string_to_buffer [44] - 0.00 0.00 2388186/2513880 append_bytes_to_buffer [43] ------------------------------------------------ - 0.00 0.00 772251/772251 yyparse [5] -[45] 0.0 0.00 0.00 772251 new_element_node [45] - 0.00 0.00 1544502/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 763602/763602 rb_tree_insert [15] -[46] 0.0 0.00 0.00 763602 key [46] ------------------------------------------------ - 0.00 0.00 377082/757313 __dom_node_to_xml [24] - 0.00 0.00 380231/757313 destroy_dom_node [16] -[47] 0.0 0.00 0.00 757313 tree_iterator_has_next [47] ------------------------------------------------ - 0.00 0.00 642626/642626 yyparse [5] -[48] 0.0 0.00 0.00 642626 get_name [48] ------------------------------------------------ - 0.00 0.00 125694/628470 __node_list_to_xml [36] - 0.00 0.00 251388/628470 __dom_node_to_xml [24] - 0.00 0.00 251388/628470 __attribute_to_xml [177] -[49] 0.0 0.00 0.00 628470 new_byte_buffer [49] - 0.00 0.00 1256940/1256940 __alloc [175] ------------------------------------------------ - 0.00 0.00 251388/505137 __dom_node_to_xml [24] - 0.00 0.00 253749/505137 destroy_dom_node [16] -[50] 0.0 0.00 0.00 505137 tree_iterator_next [50] ------------------------------------------------ - 0.00 0.00 125694/502776 __node_list_to_xml [36] - 0.00 0.00 377082/502776 __dom_node_to_xml [24] -[51] 0.0 0.00 0.00 502776 append_buffer_to_buffer [51] ------------------------------------------------ - 0.00 0.00 1/390453 new_queue [84] - 0.00 0.00 1/390453 filter_nodes_by_name [30] - 0.00 0.00 1/390453 query [2] - 0.00 0.00 4/390453 new_stack [68] - 0.00 0.00 1571/390453 merge_lists [4] - 0.00 0.00 129625/390453 append_child [23] - 0.00 0.00 129625/390453 append_children [28] - 0.00 0.00 129625/390453 get_descendants [3] -[52] 0.0 0.00 0.00 390453 new_generic_list [52] - 0.00 0.00 780906/2569717 __alloc [173] ------------------------------------------------ - 0.00 0.00 383375/383375 yyparse [5] -[53] 0.0 0.00 0.00 383375 get_namespace [53] ------------------------------------------------ - 0.00 0.00 383375/383375 yyparse [5] -[54] 0.0 0.00 0.00 383375 set_namespace [54] ------------------------------------------------ - 0.00 0.00 381801/381801 rb_tree_insert [15] -[55] 0.0 0.00 0.00 381801 compare [55] ------------------------------------------------ - 0.00 0.00 379443/379443 rb_tree_insert [15] -[56] 0.0 0.00 0.00 379443 new_rbtree_node [56] - 0.00 0.00 379443/758102 __alloc [176] ------------------------------------------------ - 0.00 0.00 379443/379443 rb_tree_insert [15] -[57] 0.0 0.00 0.00 379443 rb_tree_insert_fixup [57] - 0.00 0.00 122708/122708 left_rbrotate [65] - 0.00 0.00 935/935 right_rbrotate [67] ------------------------------------------------ - 0.00 0.00 253749/253749 yyparse [5] -[58] 0.0 0.00 0.00 253749 new_attribute [58] - 0.00 0.00 761247/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 125694/252176 __dom_node_to_xml [24] - 0.00 0.00 126482/252176 destroy_dom_node [16] -[59] 0.0 0.00 0.00 252176 destroy_iterator [59] ------------------------------------------------ - 0.00 0.00 129626/129626 yyparse [5] -[60] 0.0 0.00 0.00 129626 set_name [60] ------------------------------------------------ - 0.00 0.00 129625/129625 get_descendants [3] -[61] 0.0 0.00 0.00 129625 get_children [61] ------------------------------------------------ - 0.00 0.00 127266/127266 yyparse [5] -[62] 0.0 0.00 0.00 127266 new_text_node [62] - 0.00 0.00 254532/2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 1/126483 new_simple_rbtree [33] - 0.00 0.00 126482/126483 add_attribute [18] -[63] 0.0 0.00 0.00 126483 new_rbtree [63] - 0.00 0.00 126483/758102 __alloc [176] ------------------------------------------------ - 0.00 0.00 125695/125695 query [2] -[64] 0.0 0.00 0.00 125695 generic_list_iterator_has_next [64] ------------------------------------------------ - 0.00 0.00 122708/122708 rb_tree_insert_fixup [57] -[65] 0.0 0.00 0.00 122708 left_rbrotate [65] ------------------------------------------------ - 0.00 0.00 13629/13629 append_element [13] -[66] 0.0 0.00 0.00 13629 refactor_generic_list [66] ------------------------------------------------ - 0.00 0.00 935/935 rb_tree_insert_fixup [57] -[67] 0.0 0.00 0.00 935 right_rbrotate [67] ------------------------------------------------ - 0.00 0.00 1/4 parse_dom [6] - 0.00 0.00 1/4 parse_query [8] - 0.00 0.00 2/4 yyparse [5] -[68] 0.0 0.00 0.00 4 new_stack [68] - 0.00 0.00 4/390453 new_generic_list [52] ------------------------------------------------ - 0.00 0.00 2/4 yylex [7] - 0.00 0.00 2/4 yy_switch_to_buffer [77] -[69] 0.0 0.00 0.00 4 yy_load_buffer_state [69] ------------------------------------------------ - 0.00 0.00 2/4 yyensure_buffer_stack [78] - 0.00 0.00 2/4 yy_scan_buffer [76] -[70] 0.0 0.00 0.00 4 yyalloc [70] ------------------------------------------------ - 0.00 0.00 4/4 yyparse [5] -[71] 0.0 0.00 0.00 4 yydestruct [71] ------------------------------------------------ - 0.00 0.00 2/4 yy_delete_buffer [74] - 0.00 0.00 2/4 yylex_destroy [79] -[72] 0.0 0.00 0.00 4 yyfree [72] ------------------------------------------------ - 0.00 0.00 3/3 yylex [7] -[73] 0.0 0.00 0.00 3 yy_get_next_buffer [73] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [9] - 0.00 0.00 1/2 parse_string [10] -[74] 0.0 0.00 0.00 2 yy_delete_buffer [74] - 0.00 0.00 2/4 yyfree [72] ------------------------------------------------ - 0.00 0.00 2/2 yylex_destroy [79] -[75] 0.0 0.00 0.00 2 yy_init_globals [75] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [9] - 0.00 0.00 1/2 parse_string [10] -[76] 0.0 0.00 0.00 2 yy_scan_buffer [76] - 0.00 0.00 2/4 yyalloc [70] - 0.00 0.00 2/2 yy_switch_to_buffer [77] ------------------------------------------------ - 0.00 0.00 2/2 yy_scan_buffer [76] -[77] 0.0 0.00 0.00 2 yy_switch_to_buffer [77] - 0.00 0.00 2/2 yyensure_buffer_stack [78] - 0.00 0.00 2/4 yy_load_buffer_state [69] ------------------------------------------------ - 0.00 0.00 2/2 yy_switch_to_buffer [77] -[78] 0.0 0.00 0.00 2 yyensure_buffer_stack [78] - 0.00 0.00 2/4 yyalloc [70] ------------------------------------------------ - 0.00 0.00 1/2 parse_file [9] - 0.00 0.00 1/2 parse_string [10] -[79] 0.0 0.00 0.00 2 yylex_destroy [79] - 0.00 0.00 2/4 yyfree [72] - 0.00 0.00 2/2 yy_init_globals [75] ------------------------------------------------ - 0.00 0.00 2/2 yylex [7] -[80] 0.0 0.00 0.00 2 yywrap [80] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[81] 0.0 0.00 0.00 1 destroy_generic_list_iterator [81] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [5] -[82] 0.0 0.00 0.00 1 new_document [82] - 0.00 0.00 1/2560282 __alloc [174] - 0.00 0.00 1/1 set_xml_declaration [88] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[83] 0.0 0.00 0.00 1 new_generic_list_iterator [83] - 0.00 0.00 1/2569717 __alloc [173] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [5] -[84] 0.0 0.00 0.00 1 new_queue [84] - 0.00 0.00 1/390453 new_generic_list [52] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [5] -[85] 0.0 0.00 0.00 1 new_selector [85] - 0.00 0.00 1/1 __alloc [180] ------------------------------------------------ - 0.00 0.00 1/1 query [2] -[86] 0.0 0.00 0.00 1 peek_queue_type [86] ------------------------------------------------ - 0.00 0.00 1/1 yyparse [5] -[87] 0.0 0.00 0.00 1 set_doc_root [87] ------------------------------------------------ - 0.00 0.00 1/1 new_document [82] -[88] 0.0 0.00 0.00 1 set_xml_declaration [88] ------------------------------------------------ - 0.00 0.00 1/1 yylex [7] -[89] 0.0 0.00 0.00 1 yy_get_previous_state [89] ------------------------------------------------ - 0.00 0.00 1/2569717 new_generic_list_iterator [83] - 0.00 0.00 780906/2569717 new_generic_list [52] - 0.00 0.00 1788810/2569717 append_element [13] -[173] 0.0 0.00 0.00 2569717 __alloc [173] ------------------------------------------------ - 0.00 0.00 1/2560282 new_document [82] - 0.00 0.00 254532/2560282 new_text_node [62] - 0.00 0.00 761247/2560282 new_attribute [58] - 0.00 0.00 1544502/2560282 new_element_node [45] -[174] 0.0 0.00 0.00 2560282 __alloc [174] ------------------------------------------------ - 0.00 0.00 1256940/1256940 new_byte_buffer [49] -[175] 0.0 0.00 0.00 1256940 __alloc [175] ------------------------------------------------ - 0.00 0.00 126483/758102 new_rbtree [63] - 0.00 0.00 252176/758102 new_tree_iterator [32] - 0.00 0.00 379443/758102 new_rbtree_node [56] -[176] 0.0 0.00 0.00 758102 __alloc [176] ------------------------------------------------ - 0.00 0.00 251388/251388 __dom_node_to_xml [24] -[177] 0.0 0.00 0.00 251388 __attribute_to_xml [177] - 0.00 0.00 1256940/2388186 append_string_to_buffer [44] - 0.00 0.00 251388/628470 new_byte_buffer [49] ------------------------------------------------ - 0.00 0.00 1/2 parse_dom [6] - 0.00 0.00 1/2 parse_query [8] -[178] 0.0 0.00 0.00 2 __alloc [178] ------------------------------------------------ - 0.00 0.00 1/1 parse_string [10] -[179] 0.0 0.00 0.00 1 __alloc [179] ------------------------------------------------ - 0.00 0.00 1/1 new_selector [85] -[180] 0.0 0.00 0.00 1 __alloc [180] ------------------------------------------------ - - This table describes the call tree of the program, and was sorted by - the total amount of time spent in each function and its children. - - Each entry in this table consists of several lines. The line with the - index number at the left hand margin lists the current function. - The lines above it list the functions that called this function, - and the lines below it list the functions this one called. - This line lists: - index A unique number given to each element of the table. - Index numbers are sorted numerically. - The index number is printed next to every function name so - it is easier to look up where the function in the table. - - % time This is the percentage of the `total' time that was spent - in this function and its children. Note that due to - different viewpoints, functions excluded by options, etc, - these numbers will NOT add up to 100%. - - self This is the total amount of time spent in this function. - - children This is the total amount of time propagated into this - function by its children. - - called This is the number of times the function was called. - If the function called itself recursively, the number - only includes non-recursive calls, and is followed by - a `+' and the number of recursive calls. - - name The name of the current function. The index number is - printed after it. If the function is a member of a - cycle, the cycle number is printed between the - function's name and the index number. - - - For the function's parents, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the function into this parent. - - children This is the amount of time that was propagated from - the function's children into this parent. - - called This is the number of times this parent called the - function `/' the total number of times the function - was called. Recursive calls to the function are not - included in the number after the `/'. - - name This is the name of the parent. The parent's index - number is printed after it. If the parent is a - member of a cycle, the cycle number is printed between - the name and the index number. - - If the parents of the function cannot be determined, the word - `' is printed in the `name' field, and all the other - fields are blank. - - For the function's children, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the child into the function. - - children This is the amount of time that was propagated from the - child's children to the function. - - called This is the number of times the function called - this child `/' the total number of times the child - was called. Recursive calls by the child are not - listed in the number after the `/'. - - name This is the name of the child. The child's index - number is printed after it. If the child is a - member of a cycle, the cycle number is printed - between the name and the index number. - - If there are any cycles (circles) in the call graph, there is an - entry for the cycle-as-a-whole. This entry shows who called the - cycle (as parents) and the members of the cycle (as children.) - The `+' recursive calls entry shows the number of function calls that - were internal to the cycle, and the calls entry for each member shows, - for that member, how many times it was called from other members of - the cycle. - - -Index by function name - - [178] __alloc (macros.h) [42] enqueue_with_type [10] parse_string - [179] __alloc (macros.h) [30] filter_nodes_by_name [86] peek_queue_type - [174] __alloc (macros.h) [29] filter_nodes_by_selector [12] pop_stack - [175] __alloc (macros.h) [64] generic_list_iterator_has_next [17] push_stack - [176] __alloc (macros.h) [37] generic_list_iterator_next [2] query - [173] __alloc (macros.h) [61] get_children [15] rb_tree_insert - [180] __alloc (macros.h) [3] get_descendants [57] rb_tree_insert_fixup (rbtree.c) - [177] __attribute_to_xml [25] get_element_and_type_at [66] refactor_generic_list (stack.c) - [34] __compare_by_pointer (rbtree.c) [19] get_element_at [11] remove_element_at - [27] __destroy_rbtree (rbtree.c) [48] get_name [67] right_rbrotate (rbtree.c) - [24] __dom_node_to_xml [53] get_namespace [87] set_doc_root - [36] __node_list_to_xml [46] key [60] set_name - [20] __pointer (rbtree.c) [65] left_rbrotate (rbtree.c) [54] set_namespace - [18] add_attribute [4] merge_lists [88] set_xml_declaration - [14] add_element [58] new_attribute [47] tree_iterator_has_next - [41] add_element_with_type [49] new_byte_buffer [50] tree_iterator_next - [51] append_buffer_to_buffer [82] new_document [74] yy_delete_buffer - [43] append_bytes_to_buffer [45] new_element_node [73] yy_get_next_buffer (lex.yy.c) - [23] append_child [52] new_generic_list [89] yy_get_previous_state (lex.yy.c) - [28] append_children [83] new_generic_list_iterator [75] yy_init_globals (lex.yy.c) - [13] append_element [84] new_queue [69] yy_load_buffer_state (lex.yy.c) - [44] append_string_to_buffer [63] new_rbtree [76] yy_scan_buffer - [55] compare [56] new_rbtree_node (rbtree.c) [77] yy_switch_to_buffer - [39] dequeue [85] new_selector [70] yyalloc - [31] destroy_byte_buffer [33] new_simple_rbtree [71] yydestruct (y.tab.c) - [16] destroy_dom_node [68] new_stack [78] yyensure_buffer_stack (lex.yy.c) - [38] destroy_dom_tree [62] new_text_node [72] yyfree - [35] destroy_generic_list [32] new_tree_iterator [7] yylex - [81] destroy_generic_list_iterator [22] node_to_string [79] yylex_destroy - [59] destroy_iterator [6] parse_dom [5] yyparse - [26] destroy_rbtree [9] parse_file [80] yywrap - [40] destroy_selector [8] parse_query [21] diff --git a/profiling/sem_remove_dups_e_quick_sort.massif b/profiling/sem_remove_dups_e_quick_sort.massif deleted file mode 100644 index 6ee9330..0000000 --- a/profiling/sem_remove_dups_e_quick_sort.massif +++ /dev/null @@ -1,1140 +0,0 @@ --------------------------------------------------------------------------------- -Command: ./dom_parser really_big.xml @segment -Massif arguments: --time-unit=B --massif-out-file=stats.massif -ms_print arguments: stats.massif --------------------------------------------------------------------------------- - - - MB -98.74^ ## - | # - | # - | # - | # - | ::# - | : # ::::@:: - | @: # : :::::::::::::::::::::::::::::::@:::::::::::::::::::@:: - | @: # :::::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:: - | @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:: - | @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::: - | @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::: - | @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::: - | ::@@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:::: - | : @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:::: - | @: @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:::: - | @: @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@:::: - | ::@: @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::::: - | : @: @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::::: - | : @: @@: # :: ::: ::::::::: ::: :: : :: :::::@: ::::::: :::: ::::@::::@ - 0 +----------------------------------------------------------------------->GB - 0 1.314 - -Number of snapshots: 69 - Detailed snapshots: [2, 4, 5, 7, 8 (peak), 36, 58, 68] - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 0 0 0 0 0 0 - 1 32,044,192 15,745,936 10,047,542 5,698,394 0 - 2 61,129,064 29,487,832 18,433,237 11,054,595 0 -62.51% (18,433,237B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->18.94% (5,583,969B) 0x40B14AE: strdup (strdup.c:43) -| ->04.98% (1,468,552B) 0x8049120: yylex (parser.l:24) -| | ->04.98% (1,468,552B) 0x804B340: yyparse (y.tab.c:1517) -| | ->04.98% (1,468,552B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.98% (1,468,552B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.98% (1,468,552B) 0x80517ED: main (main.c:29) -| | -| ->04.98% (1,468,552B) 0x804CDF3: new_text_node (node.c:180) -| | ->04.98% (1,468,552B) 0x804B78D: yyparse (parser.y:196) -| | ->04.98% (1,468,552B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.98% (1,468,552B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.98% (1,468,552B) 0x80517ED: main (main.c:29) -| | -| ->03.57% (1,053,887B) 0x80491B2: yylex (parser.l:32) -| | ->03.57% (1,053,887B) 0x804B340: yyparse (y.tab.c:1517) -| | ->03.57% (1,053,887B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.57% (1,053,887B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.57% (1,053,887B) 0x80517ED: main (main.c:29) -| | -| ->01.59% (468,867B) 0x804CE54: new_attribute (node.c:191) -| | ->01.59% (468,867B) 0x804B891: yyparse (parser.y:222) -| | ->01.59% (468,867B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.59% (468,867B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.59% (468,867B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (415,789B) 0x8049208: yylex (parser.l:37) -| | ->01.41% (415,789B) 0x804B340: yyparse (y.tab.c:1517) -| | ->01.41% (415,789B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (415,789B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (415,789B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (415,789B) 0x804CE67: new_attribute (node.c:192) -| | ->01.41% (415,789B) 0x804B891: yyparse (parser.y:222) -| | ->01.41% (415,789B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (415,789B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (415,789B) 0x80517ED: main (main.c:29) -| | -| ->00.99% (292,533B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.86% (2,613,928B) 0x804F9F3: append_element (stack.c:147) -| ->06.89% (2,030,848B) 0x804FB54: add_element (stack.c:180) -| | ->06.89% (2,030,848B) 0x80500E4: push_stack (stack.c:311) -| | ->03.95% (1,164,672B) 0x80491CE: yylex (parser.l:32) -| | | ->03.95% (1,164,672B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.95% (1,164,672B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.95% (1,164,672B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.95% (1,164,672B) 0x80517ED: main (main.c:29) -| | | -| | ->01.96% (576,944B) 0x8049224: yylex (parser.l:37) -| | | ->01.96% (576,944B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->01.96% (576,944B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.96% (576,944B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.96% (576,944B) 0x80517ED: main (main.c:29) -| | | -| | ->00.98% (289,232B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.98% (583,080B) 0x804CAA3: append_child (node.c:112) -| ->01.97% (581,248B) 0x804CCFD: append_children (node.c:151) -| | ->01.97% (581,248B) 0x804B638: yyparse (parser.y:169) -| | ->01.97% (581,248B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.97% (581,248B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.97% (581,248B) 0x80517ED: main (main.c:29) -| | -| ->00.01% (1,832B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.94% (2,340,288B) 0x804F3F6: new_generic_list (stack.c:18) -| ->07.94% (2,340,160B) 0x804CCCD: append_children (node.c:148) -| | ->07.94% (2,340,160B) 0x804B638: yyparse (parser.y:169) -| | ->07.94% (2,340,160B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.94% (2,340,160B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.94% (2,340,160B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.85% (2,019,304B) 0x804CE35: new_attribute (node.c:188) -| ->06.85% (2,019,304B) 0x804B891: yyparse (parser.y:222) -| ->06.85% (2,019,304B) 0x804AF9A: parse_file (parser.y:67) -| ->06.85% (2,019,304B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->06.85% (2,019,304B) 0x80517ED: main (main.c:29) -| -->04.89% (1,442,360B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->04.89% (1,442,360B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->04.89% (1,442,360B) 0x804CBAC: add_attribute (node.c:132) -| ->04.89% (1,442,360B) 0x804B86B: yyparse (parser.y:218) -| ->04.89% (1,442,360B) 0x804AF9A: parse_file (parser.y:67) -| ->04.89% (1,442,360B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.89% (1,442,360B) 0x80517ED: main (main.c:29) -| -->04.49% (1,323,136B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->04.49% (1,323,136B) 0x804F9E7: append_element (stack.c:144) -| ->03.56% (1,048,576B) 0x804FB54: add_element (stack.c:180) -| | ->03.56% (1,048,576B) 0x80500E4: push_stack (stack.c:311) -| | ->03.56% (1,048,576B) 0x8049224: yylex (parser.l:37) -| | | ->03.56% (1,048,576B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.56% (1,048,576B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.56% (1,048,576B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.56% (1,048,576B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.93% (274,560B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.49% (1,028,720B) 0x804CD5F: new_element_node (node.c:164) -| ->03.49% (1,028,580B) 0x804B844: yyparse (parser.y:215) -| | ->03.49% (1,028,580B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.49% (1,028,580B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.49% (1,028,580B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.43% (1,012,312B) 0x804CDCA: new_text_node (node.c:176) -| ->03.43% (1,012,312B) 0x804B78D: yyparse (parser.y:196) -| ->03.43% (1,012,312B) 0x804AF9A: parse_file (parser.y:67) -| ->03.43% (1,012,312B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->03.43% (1,012,312B) 0x80517ED: main (main.c:29) -| -->01.99% (587,776B) 0x804F3C0: new_generic_list (stack.c:13) -| ->01.99% (587,696B) 0x804CCCD: append_children (node.c:148) -| | ->01.99% (587,696B) 0x804B638: yyparse (parser.y:169) -| | ->01.99% (587,696B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.99% (587,696B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.99% (587,696B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.46% (431,556B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->01.46% (431,556B) 0x804CB91: add_attribute (node.c:131) -| ->01.46% (431,556B) 0x804B86B: yyparse (parser.y:218) -| ->01.46% (431,556B) 0x804AF9A: parse_file (parser.y:67) -| ->01.46% (431,556B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->01.46% (431,556B) 0x80517ED: main (main.c:29) -| -->00.17% (49,888B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 3 83,026,624 40,341,552 25,448,899 14,892,653 0 - 4 119,773,592 57,764,968 36,097,232 21,667,736 0 -62.49% (36,097,232B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->18.95% (10,946,412B) 0x40B14AE: strdup (strdup.c:43) -| ->04.99% (2,882,256B) 0x8049120: yylex (parser.l:24) -| | ->04.99% (2,882,256B) 0x804B340: yyparse (y.tab.c:1517) -| | ->04.99% (2,882,256B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.99% (2,882,256B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.99% (2,882,256B) 0x80517ED: main (main.c:29) -| | -| ->04.99% (2,882,256B) 0x804CDF3: new_text_node (node.c:180) -| | ->04.99% (2,882,256B) 0x804B78D: yyparse (parser.y:196) -| | ->04.99% (2,882,256B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.99% (2,882,256B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.99% (2,882,256B) 0x80517ED: main (main.c:29) -| | -| ->03.57% (2,063,279B) 0x80491B2: yylex (parser.l:32) -| | ->03.57% (2,063,279B) 0x804B340: yyparse (y.tab.c:1517) -| | ->03.57% (2,063,279B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.57% (2,063,279B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.57% (2,063,279B) 0x80517ED: main (main.c:29) -| | -| ->01.59% (917,921B) 0x804CE54: new_attribute (node.c:191) -| | ->01.59% (917,921B) 0x804B891: yyparse (parser.y:222) -| | ->01.59% (917,921B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.59% (917,921B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.59% (917,921B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (813,999B) 0x8049208: yylex (parser.l:37) -| | ->01.41% (813,999B) 0x804B340: yyparse (y.tab.c:1517) -| | ->01.41% (813,999B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (813,999B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (813,999B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (813,999B) 0x804CE67: new_attribute (node.c:192) -| | ->01.41% (813,999B) 0x804B891: yyparse (parser.y:222) -| | ->01.41% (813,999B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (813,999B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (813,999B) 0x80517ED: main (main.c:29) -| | -| ->00.99% (572,702B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.86% (5,117,504B) 0x804F9F3: append_element (stack.c:147) -| ->06.88% (3,975,936B) 0x804FB54: add_element (stack.c:180) -| | ->06.88% (3,975,936B) 0x80500E4: push_stack (stack.c:311) -| | ->03.95% (2,280,168B) 0x80491CE: yylex (parser.l:32) -| | | ->03.95% (2,280,168B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.95% (2,280,168B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.95% (2,280,168B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.95% (2,280,168B) 0x80517ED: main (main.c:29) -| | | -| | ->01.96% (1,129,512B) 0x8049224: yylex (parser.l:37) -| | | ->01.96% (1,129,512B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->01.96% (1,129,512B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.96% (1,129,512B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.96% (1,129,512B) 0x80517ED: main (main.c:29) -| | | -| | ->00.98% (566,256B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.98% (1,141,568B) 0x804CAA3: append_child (node.c:112) -| ->01.97% (1,136,504B) 0x804CCFD: append_children (node.c:151) -| | ->01.97% (1,136,504B) 0x804B638: yyparse (parser.y:169) -| | ->01.97% (1,136,504B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.97% (1,136,504B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.97% (1,136,504B) 0x80517ED: main (main.c:29) -| | -| ->00.01% (5,064B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.93% (4,581,824B) 0x804F3F6: new_generic_list (stack.c:18) -| ->07.93% (4,581,696B) 0x804CCCD: append_children (node.c:148) -| | ->07.93% (4,581,696B) 0x804B638: yyparse (parser.y:169) -| | ->07.93% (4,581,696B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.93% (4,581,696B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.93% (4,581,696B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.84% (3,953,292B) 0x804CE35: new_attribute (node.c:188) -| ->06.84% (3,953,292B) 0x804B891: yyparse (parser.y:222) -| ->06.84% (3,953,292B) 0x804AF9A: parse_file (parser.y:67) -| ->06.84% (3,953,292B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->06.84% (3,953,292B) 0x80517ED: main (main.c:29) -| -->04.89% (2,823,780B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->04.89% (2,823,780B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->04.89% (2,823,780B) 0x804CBAC: add_attribute (node.c:132) -| ->04.89% (2,823,780B) 0x804B86B: yyparse (parser.y:218) -| ->04.89% (2,823,780B) 0x804AF9A: parse_file (parser.y:67) -| ->04.89% (2,823,780B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.89% (2,823,780B) 0x80517ED: main (main.c:29) -| -->04.56% (2,633,216B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->04.56% (2,633,216B) 0x804F9E7: append_element (stack.c:144) -| ->03.63% (2,097,152B) 0x804FB54: add_element (stack.c:180) -| | ->03.63% (2,097,152B) 0x80500E4: push_stack (stack.c:311) -| | ->03.63% (2,097,152B) 0x804913C: yylex (parser.l:24) -| | | ->03.63% (2,097,152B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.63% (2,097,152B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.63% (2,097,152B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.63% (2,097,152B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.93% (536,064B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.49% (2,013,844B) 0x804CD5F: new_element_node (node.c:164) -| ->03.49% (2,013,704B) 0x804B844: yyparse (parser.y:215) -| | ->03.49% (2,013,704B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.49% (2,013,704B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.49% (2,013,704B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.43% (1,981,896B) 0x804CDCA: new_text_node (node.c:176) -| ->03.43% (1,981,896B) 0x804B78D: yyparse (parser.y:196) -| ->03.43% (1,981,896B) 0x804AF9A: parse_file (parser.y:67) -| ->03.43% (1,981,896B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->03.43% (1,981,896B) 0x80517ED: main (main.c:29) -| -->01.99% (1,150,704B) 0x804F3C0: new_generic_list (stack.c:13) -| ->01.99% (1,150,624B) 0x804CCCD: append_children (node.c:148) -| | ->01.99% (1,150,624B) 0x804B638: yyparse (parser.y:169) -| | ->01.99% (1,150,624B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.99% (1,150,624B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.99% (1,150,624B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.46% (844,872B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->01.46% (844,872B) 0x804CB91: add_attribute (node.c:131) -| ->01.46% (844,872B) 0x804B86B: yyparse (parser.y:218) -| ->01.46% (844,872B) 0x804AF9A: parse_file (parser.y:67) -| ->01.46% (844,872B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->01.46% (844,872B) 0x80517ED: main (main.c:29) -| -->00.09% (49,888B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 5 141,005,528 68,844,648 43,653,818 25,190,830 0 -63.41% (43,653,818B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->18.47% (12,714,498B) 0x40B14AE: strdup (strdup.c:43) -| ->04.87% (3,350,998B) 0x8049120: yylex (parser.l:24) -| | ->04.87% (3,350,998B) 0x804B340: yyparse (y.tab.c:1517) -| | ->04.87% (3,350,998B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.87% (3,350,998B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.87% (3,350,998B) 0x80517ED: main (main.c:29) -| | -| ->04.87% (3,350,998B) 0x804CDF3: new_text_node (node.c:180) -| | ->04.87% (3,350,998B) 0x804B78D: yyparse (parser.y:196) -| | ->04.87% (3,350,998B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.87% (3,350,998B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.87% (3,350,998B) 0x80517ED: main (main.c:29) -| | -| ->03.48% (2,393,972B) 0x80491B2: yylex (parser.l:32) -| | ->03.48% (2,393,972B) 0x804B340: yyparse (y.tab.c:1517) -| | ->03.48% (2,393,972B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.48% (2,393,972B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.48% (2,393,972B) 0x80517ED: main (main.c:29) -| | -| ->01.55% (1,065,027B) 0x804CE54: new_attribute (node.c:191) -| | ->01.55% (1,065,027B) 0x804B891: yyparse (parser.y:222) -| | ->01.55% (1,065,027B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.55% (1,065,027B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.55% (1,065,027B) 0x80517ED: main (main.c:29) -| | -| ->01.37% (944,506B) 0x8049208: yylex (parser.l:37) -| | ->01.37% (944,506B) 0x804B340: yyparse (y.tab.c:1517) -| | ->01.37% (944,506B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.37% (944,506B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.37% (944,506B) 0x80517ED: main (main.c:29) -| | -| ->01.37% (944,506B) 0x804CE67: new_attribute (node.c:192) -| | ->01.37% (944,506B) 0x804B891: yyparse (parser.y:222) -| | ->01.37% (944,506B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.37% (944,506B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.37% (944,506B) 0x80517ED: main (main.c:29) -| | -| ->00.97% (664,491B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.63% (5,939,784B) 0x804F9F3: append_element (stack.c:147) -| ->06.70% (4,613,160B) 0x804FB54: add_element (stack.c:180) -| | ->06.70% (4,613,160B) 0x80500E4: push_stack (stack.c:311) -| | ->03.84% (2,645,624B) 0x80491CE: yylex (parser.l:32) -| | | ->03.84% (2,645,624B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.84% (2,645,624B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.84% (2,645,624B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.84% (2,645,624B) 0x80517ED: main (main.c:29) -| | | -| | ->01.90% (1,310,528B) 0x8049224: yylex (parser.l:37) -| | | ->01.90% (1,310,528B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->01.90% (1,310,528B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.90% (1,310,528B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.90% (1,310,528B) 0x80517ED: main (main.c:29) -| | | -| | ->00.95% (657,008B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.93% (1,326,624B) 0x804CAA3: append_child (node.c:112) -| ->01.92% (1,321,024B) 0x804CCFD: append_children (node.c:151) -| | ->01.92% (1,321,024B) 0x804B638: yyparse (parser.y:169) -| | ->01.92% (1,321,024B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.92% (1,321,024B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.92% (1,321,024B) 0x80517ED: main (main.c:29) -| | -| ->00.01% (5,600B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.72% (5,316,160B) 0x804F3F6: new_generic_list (stack.c:18) -| ->07.72% (5,316,096B) 0x804CCCD: append_children (node.c:148) -| | ->07.72% (5,316,096B) 0x804B638: yyparse (parser.y:169) -| | ->07.72% (5,316,096B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.72% (5,316,096B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.72% (5,316,096B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.00% (4,818,816B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->07.00% (4,818,816B) 0x804F9E7: append_element (stack.c:144) -| ->06.09% (4,194,304B) 0x804FB54: add_element (stack.c:180) -| | ->06.09% (4,194,304B) 0x80500E4: push_stack (stack.c:311) -| | ->06.09% (4,194,304B) 0x80491CE: yylex (parser.l:32) -| | | ->06.09% (4,194,304B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->06.09% (4,194,304B) 0x804AF9A: parse_file (parser.y:67) -| | | ->06.09% (4,194,304B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->06.09% (4,194,304B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.91% (624,512B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.66% (4,586,848B) 0x804CE35: new_attribute (node.c:188) -| ->06.66% (4,586,848B) 0x804B891: yyparse (parser.y:222) -| ->06.66% (4,586,848B) 0x804AF9A: parse_file (parser.y:67) -| ->06.66% (4,586,848B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->06.66% (4,586,848B) 0x80517ED: main (main.c:29) -| -->04.76% (3,276,320B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->04.76% (3,276,320B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->04.76% (3,276,320B) 0x804CBAC: add_attribute (node.c:132) -| ->04.76% (3,276,320B) 0x804B86B: yyparse (parser.y:218) -| ->04.76% (3,276,320B) 0x804AF9A: parse_file (parser.y:67) -| ->04.76% (3,276,320B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.76% (3,276,320B) 0x80517ED: main (main.c:29) -| -->03.39% (2,336,572B) 0x804CD5F: new_element_node (node.c:164) -| ->03.39% (2,336,460B) 0x804B844: yyparse (parser.y:215) -| | ->03.39% (2,336,460B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.39% (2,336,460B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.39% (2,336,460B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (112B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.34% (2,299,528B) 0x804CDCA: new_text_node (node.c:176) -| ->03.34% (2,299,528B) 0x804B78D: yyparse (parser.y:196) -| ->03.34% (2,299,528B) 0x804AF9A: parse_file (parser.y:67) -| ->03.34% (2,299,528B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->03.34% (2,299,528B) 0x80517ED: main (main.c:29) -| -->01.94% (1,335,136B) 0x804F3C0: new_generic_list (stack.c:13) -| ->01.94% (1,335,072B) 0x804CCCD: append_children (node.c:148) -| | ->01.94% (1,335,072B) 0x804B638: yyparse (parser.y:169) -| | ->01.94% (1,335,072B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.94% (1,335,072B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.94% (1,335,072B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.42% (980,268B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->01.42% (980,268B) 0x804CB91: add_attribute (node.c:131) -| ->01.42% (980,268B) 0x804B86B: yyparse (parser.y:218) -| ->01.42% (980,268B) 0x804AF9A: parse_file (parser.y:67) -| ->01.42% (980,268B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->01.42% (980,268B) 0x80517ED: main (main.c:29) -| -->00.07% (49,888B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 6 167,685,128 81,473,736 51,372,897 30,100,839 0 - 7 197,525,416 95,611,704 60,016,593 35,595,111 0 -62.77% (60,016,593B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->18.83% (18,005,877B) 0x40B14AE: strdup (strdup.c:43) -| ->04.96% (4,739,416B) 0x8049120: yylex (parser.l:24) -| | ->04.96% (4,739,416B) 0x804B340: yyparse (y.tab.c:1517) -| | ->04.96% (4,739,416B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.96% (4,739,416B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.96% (4,739,416B) 0x80517ED: main (main.c:29) -| | -| ->04.96% (4,739,416B) 0x804CDF3: new_text_node (node.c:180) -| | ->04.96% (4,739,416B) 0x804B78D: yyparse (parser.y:196) -| | ->04.96% (4,739,416B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.96% (4,739,416B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.96% (4,739,416B) 0x80517ED: main (main.c:29) -| | -| ->03.54% (3,387,859B) 0x80491B2: yylex (parser.l:32) -| | ->03.54% (3,387,859B) 0x804B340: yyparse (y.tab.c:1517) -| | ->03.54% (3,387,859B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.54% (3,387,859B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.54% (3,387,859B) 0x80517ED: main (main.c:29) -| | -| ->01.58% (1,506,240B) 0x804CE54: new_attribute (node.c:191) -| | ->01.58% (1,506,240B) 0x804B891: yyparse (parser.y:222) -| | ->01.58% (1,506,240B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.58% (1,506,240B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.58% (1,506,240B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (1,346,059B) 0x8049208: yylex (parser.l:37) -| | ->01.41% (1,346,059B) 0x804B340: yyparse (y.tab.c:1517) -| | ->01.41% (1,346,059B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (1,346,059B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (1,346,059B) 0x80517ED: main (main.c:29) -| | -| ->01.41% (1,346,059B) 0x804CE67: new_attribute (node.c:192) -| | ->01.41% (1,346,059B) 0x804B891: yyparse (parser.y:222) -| | ->01.41% (1,346,059B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.41% (1,346,059B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.41% (1,346,059B) 0x80517ED: main (main.c:29) -| | -| ->00.98% (940,828B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.79% (8,402,392B) 0x804F9F3: append_element (stack.c:147) -| ->06.83% (6,527,248B) 0x804FB54: add_element (stack.c:180) -| | ->06.83% (6,527,248B) 0x80500E4: push_stack (stack.c:311) -| | ->03.92% (3,744,448B) 0x80491CE: yylex (parser.l:32) -| | | ->03.92% (3,744,448B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.92% (3,744,448B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.92% (3,744,448B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.92% (3,744,448B) 0x80517ED: main (main.c:29) -| | | -| | ->01.94% (1,853,416B) 0x8049224: yylex (parser.l:37) -| | | ->01.94% (1,853,416B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->01.94% (1,853,416B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.94% (1,853,416B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.94% (1,853,416B) 0x80517ED: main (main.c:29) -| | | -| | ->00.97% (929,384B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.96% (1,875,144B) 0x804CAA3: append_child (node.c:112) -| ->01.96% (1,869,504B) 0x804CCFD: append_children (node.c:151) -| | ->01.96% (1,869,504B) 0x804B638: yyparse (parser.y:169) -| | ->01.96% (1,869,504B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.96% (1,869,504B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.96% (1,869,504B) 0x80517ED: main (main.c:29) -| | -| ->00.01% (5,640B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.87% (7,529,088B) 0x804F3F6: new_generic_list (stack.c:18) -| ->07.87% (7,529,024B) 0x804CCCD: append_children (node.c:148) -| | ->07.87% (7,529,024B) 0x804B638: yyparse (parser.y:169) -| | ->07.87% (7,529,024B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.87% (7,529,024B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.87% (7,529,024B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.78% (6,486,956B) 0x804CE35: new_attribute (node.c:188) -| ->06.78% (6,486,956B) 0x804B891: yyparse (parser.y:222) -| ->06.78% (6,486,956B) 0x804AF9A: parse_file (parser.y:67) -| ->06.78% (6,486,956B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->06.78% (6,486,956B) 0x80517ED: main (main.c:29) -| -->05.30% (5,069,440B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->05.30% (5,069,440B) 0x804F9E7: append_element (stack.c:144) -| ->04.39% (4,194,304B) 0x804FB54: add_element (stack.c:180) -| | ->04.39% (4,194,304B) 0x80500E4: push_stack (stack.c:311) -| | ->04.39% (4,194,304B) 0x80491CE: yylex (parser.l:32) -| | | ->04.39% (4,194,304B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->04.39% (4,194,304B) 0x804AF9A: parse_file (parser.y:67) -| | | ->04.39% (4,194,304B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->04.39% (4,194,304B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.92% (875,136B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.85% (4,633,540B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->04.85% (4,633,540B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->04.85% (4,633,540B) 0x804CBAC: add_attribute (node.c:132) -| ->04.85% (4,633,540B) 0x804B86B: yyparse (parser.y:218) -| ->04.85% (4,633,540B) 0x804AF9A: parse_file (parser.y:67) -| ->04.85% (4,633,540B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.85% (4,633,540B) 0x80517ED: main (main.c:29) -| -->03.46% (3,309,460B) 0x804CD5F: new_element_node (node.c:164) -| ->03.46% (3,309,348B) 0x804B844: yyparse (parser.y:215) -| | ->03.46% (3,309,348B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.46% (3,309,348B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.46% (3,309,348B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (112B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.40% (3,252,844B) 0x804CDCA: new_text_node (node.c:176) -| ->03.40% (3,252,844B) 0x804B78D: yyparse (parser.y:196) -| ->03.40% (3,252,844B) 0x804AF9A: parse_file (parser.y:67) -| ->03.40% (3,252,844B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->03.40% (3,252,844B) 0x80517ED: main (main.c:29) -| -->01.98% (1,891,072B) 0x804F3C0: new_generic_list (stack.c:13) -| ->01.98% (1,891,008B) 0x804CCCD: append_children (node.c:148) -| | ->01.98% (1,891,008B) 0x804B638: yyparse (parser.y:169) -| | ->01.98% (1,891,008B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.98% (1,891,008B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.98% (1,891,008B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (64B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.45% (1,386,036B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->01.45% (1,386,036B) 0x804CB91: add_attribute (node.c:131) -| ->01.45% (1,386,036B) 0x804B86B: yyparse (parser.y:218) -| ->01.45% (1,386,036B) 0x804AF9A: parse_file (parser.y:67) -| ->01.45% (1,386,036B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->01.45% (1,386,036B) 0x80517ED: main (main.c:29) -| -->00.05% (49,888B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 8 214,272,384 103,538,928 64,862,412 38,676,516 0 -62.65% (64,862,412B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->18.91% (19,578,572B) 0x40B14AE: strdup (strdup.c:43) -| ->04.97% (5,147,426B) 0x8049120: yylex (parser.l:24) -| | ->04.97% (5,147,426B) 0x804B340: yyparse (y.tab.c:1517) -| | ->04.97% (5,147,426B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.97% (5,147,426B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.97% (5,147,426B) 0x80517ED: main (main.c:29) -| | -| ->04.97% (5,147,426B) 0x804CDF3: new_text_node (node.c:180) -| | ->04.97% (5,147,426B) 0x804B78D: yyparse (parser.y:196) -| | ->04.97% (5,147,426B) 0x804AF9A: parse_file (parser.y:67) -| | ->04.97% (5,147,426B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->04.97% (5,147,426B) 0x80517ED: main (main.c:29) -| | -| ->03.56% (3,682,036B) 0x80491B2: yylex (parser.l:32) -| | ->03.56% (3,682,036B) 0x804B340: yyparse (y.tab.c:1517) -| | ->03.56% (3,682,036B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.56% (3,682,036B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.56% (3,682,036B) 0x80517ED: main (main.c:29) -| | -| ->01.58% (1,636,150B) 0x804CE54: new_attribute (node.c:191) -| | ->01.58% (1,636,150B) 0x804B891: yyparse (parser.y:222) -| | ->01.58% (1,636,150B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.58% (1,636,150B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.58% (1,636,150B) 0x80517ED: main (main.c:29) -| | -| ->01.42% (1,471,284B) 0x8049208: yylex (parser.l:37) -| | ->01.42% (1,471,284B) 0x804B340: yyparse (y.tab.c:1517) -| | ->01.42% (1,471,284B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.42% (1,471,284B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.42% (1,471,284B) 0x80517ED: main (main.c:29) -| | -| ->01.42% (1,471,284B) 0x804CE67: new_attribute (node.c:192) -| | ->01.42% (1,471,284B) 0x804B891: yyparse (parser.y:222) -| | ->01.42% (1,471,284B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.42% (1,471,284B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.42% (1,471,284B) 0x80517ED: main (main.c:29) -| | -| ->00.99% (1,022,966B) in 1+ places, all below ms_print's threshold (01.00%) -| -->08.82% (9,131,080B) 0x804F9F3: append_element (stack.c:147) -| ->06.85% (7,092,984B) 0x804FB54: add_element (stack.c:180) -| | ->06.85% (7,092,984B) 0x80500E4: push_stack (stack.c:311) -| | ->03.93% (4,070,024B) 0x80491CE: yylex (parser.l:32) -| | | ->03.93% (4,070,024B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->03.93% (4,070,024B) 0x804AF9A: parse_file (parser.y:67) -| | | ->03.93% (4,070,024B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->03.93% (4,070,024B) 0x80517ED: main (main.c:29) -| | | -| | ->01.94% (2,013,240B) 0x8049224: yylex (parser.l:37) -| | | ->01.94% (2,013,240B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->01.94% (2,013,240B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.94% (2,013,240B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.94% (2,013,240B) 0x80517ED: main (main.c:29) -| | | -| | ->00.98% (1,009,720B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.97% (2,038,096B) 0x804CAA3: append_child (node.c:112) -| ->01.96% (2,030,560B) 0x804CCFD: append_children (node.c:151) -| | ->01.96% (2,030,560B) 0x804B638: yyparse (parser.y:169) -| | ->01.96% (2,030,560B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.96% (2,030,560B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.96% (2,030,560B) 0x80517ED: main (main.c:29) -| | -| ->00.01% (7,536B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.91% (8,188,800B) 0x804F3F6: new_generic_list (stack.c:18) -| ->07.91% (8,188,672B) 0x804CCCD: append_children (node.c:148) -| | ->07.91% (8,188,672B) 0x804B638: yyparse (parser.y:169) -| | ->07.91% (8,188,672B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.91% (8,188,672B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.91% (8,188,672B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| -->06.81% (7,046,340B) 0x804CE35: new_attribute (node.c:188) -| ->06.81% (7,046,340B) 0x804B891: yyparse (parser.y:222) -| ->06.81% (7,046,340B) 0x804AF9A: parse_file (parser.y:67) -| ->06.81% (7,046,340B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->06.81% (7,046,340B) 0x80517ED: main (main.c:29) -| -->04.96% (5,138,944B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->04.96% (5,138,944B) 0x804F9E7: append_element (stack.c:144) -| ->04.05% (4,194,304B) 0x804FB54: add_element (stack.c:180) -| | ->04.05% (4,194,304B) 0x80500E4: push_stack (stack.c:311) -| | ->04.05% (4,194,304B) 0x80491CE: yylex (parser.l:32) -| | | ->04.05% (4,194,304B) 0x804B340: yyparse (y.tab.c:1517) -| | | ->04.05% (4,194,304B) 0x804AF9A: parse_file (parser.y:67) -| | | ->04.05% (4,194,304B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->04.05% (4,194,304B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.91% (944,640B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.86% (5,033,100B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->04.86% (5,033,100B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->04.86% (5,033,100B) 0x804CBAC: add_attribute (node.c:132) -| ->04.86% (5,033,100B) 0x804B86B: yyparse (parser.y:218) -| ->04.86% (5,033,100B) 0x804AF9A: parse_file (parser.y:67) -| ->04.86% (5,033,100B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.86% (5,033,100B) 0x80517ED: main (main.c:29) -| -->03.48% (3,599,568B) 0x804CD5F: new_element_node (node.c:164) -| ->03.48% (3,599,428B) 0x804B844: yyparse (parser.y:215) -| | ->03.48% (3,599,428B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.48% (3,599,428B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.48% (3,599,428B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (140B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.41% (3,534,020B) 0x804CDCA: new_text_node (node.c:176) -| ->03.41% (3,534,020B) 0x804B78D: yyparse (parser.y:196) -| ->03.41% (3,534,020B) 0x804AF9A: parse_file (parser.y:67) -| ->03.41% (3,534,020B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->03.41% (3,534,020B) 0x80517ED: main (main.c:29) -| -->01.99% (2,056,832B) 0x804F3C0: new_generic_list (stack.c:13) -| ->01.99% (2,056,752B) 0x804CCCD: append_children (node.c:148) -| | ->01.99% (2,056,752B) 0x804B638: yyparse (parser.y:169) -| | ->01.99% (2,056,752B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.99% (2,056,752B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.99% (2,056,752B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (80B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.45% (1,505,268B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->01.45% (1,505,268B) 0x804CB91: add_attribute (node.c:131) -| ->01.45% (1,505,268B) 0x804B86B: yyparse (parser.y:218) -| ->01.45% (1,505,268B) 0x804AF9A: parse_file (parser.y:67) -| ->01.45% (1,505,268B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->01.45% (1,505,268B) 0x80517ED: main (main.c:29) -| -->00.05% (49,888B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 9 248,122,592 72,294,912 48,468,352 23,826,560 0 - 10 269,602,272 67,243,920 43,846,519 23,397,401 0 - 11 299,478,448 67,656,528 44,139,627 23,516,901 0 - 12 316,693,008 67,931,408 44,372,127 23,559,281 0 - 13 343,583,184 68,142,000 44,522,567 23,619,433 0 - 14 377,221,664 68,371,936 44,686,807 23,685,129 0 - 15 394,715,592 68,020,232 44,307,379 23,712,853 0 - 16 418,783,912 68,117,928 44,366,647 23,751,281 0 - 17 435,131,688 68,171,864 44,399,011 23,772,853 0 - 18 458,881,328 68,257,168 44,450,191 23,806,977 0 - 19 476,128,080 68,584,336 44,758,171 23,826,165 0 - 20 499,522,216 68,379,864 44,523,811 23,856,053 0 - 21 518,089,624 68,435,992 44,556,835 23,879,157 0 - 22 547,093,624 69,165,928 45,253,947 23,911,981 0 - 23 576,557,360 68,937,664 44,993,723 23,943,941 0 - 24 594,509,480 68,644,712 44,682,067 23,962,645 0 - 25 623,558,072 68,715,912 44,724,807 23,991,105 0 - 26 653,770,160 68,784,864 44,765,979 24,018,885 0 - 27 685,184,968 68,862,184 44,813,203 24,048,981 0 - 28 709,323,344 68,912,384 44,843,323 24,069,061 0 - 29 745,716,088 68,978,664 44,883,091 24,095,573 0 - 30 766,101,248 69,017,824 44,906,587 24,111,237 0 - 31 804,125,888 69,065,408 44,934,335 24,131,073 0 - 32 823,411,920 69,083,264 44,945,019 24,138,245 0 - 33 852,380,568 69,570,520 45,415,627 24,154,893 0 - 34 862,658,904 69,127,944 44,971,827 24,156,117 0 - 35 891,794,784 69,172,544 44,998,623 24,173,921 0 - 36 911,122,000 70,109,904 45,928,207 24,181,697 0 -65.51% (45,928,207B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->13.34% (9,353,551B) 0x40B14AE: strdup (strdup.c:43) -| ->07.40% (5,188,706B) 0x804CDF3: new_text_node (node.c:180) -| | ->07.40% (5,188,706B) 0x804B78D: yyparse (parser.y:196) -| | ->07.40% (5,188,706B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.40% (5,188,706B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.40% (5,188,706B) 0x80517ED: main (main.c:29) -| | -| ->02.35% (1,649,765B) 0x804CE54: new_attribute (node.c:191) -| | ->02.35% (1,649,765B) 0x804B891: yyparse (parser.y:222) -| | ->02.35% (1,649,765B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.35% (1,649,765B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.35% (1,649,765B) 0x80517ED: main (main.c:29) -| | -| ->02.12% (1,483,582B) 0x804CE67: new_attribute (node.c:192) -| | ->02.12% (1,483,582B) 0x804B891: yyparse (parser.y:222) -| | ->02.12% (1,483,582B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.12% (1,483,582B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.12% (1,483,582B) 0x80517ED: main (main.c:29) -| | -| ->01.47% (1,031,498B) 0x804C6BC: set_name (node.c:26) -| | ->01.47% (1,031,494B) 0x804B7CC: yyparse (parser.y:202) -| | | ->01.47% (1,031,494B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.47% (1,031,494B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.47% (1,031,494B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->12.43% (8,716,196B) 0x804F3F6: new_generic_list (stack.c:18) -| ->11.78% (8,257,152B) 0x804CCCD: append_children (node.c:148) -| | ->11.78% (8,257,152B) 0x804B638: yyparse (parser.y:169) -| | ->11.78% (8,257,152B) 0x804AF9A: parse_file (parser.y:67) -| | ->11.78% (8,257,152B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->11.78% (8,257,152B) 0x80517ED: main (main.c:29) -| | -| ->00.65% (459,044B) in 1+ places, all below ms_print's threshold (01.00%) -| -->10.13% (7,104,972B) 0x804CE35: new_attribute (node.c:188) -| ->10.13% (7,104,972B) 0x804B891: yyparse (parser.y:222) -| ->10.13% (7,104,972B) 0x804AF9A: parse_file (parser.y:67) -| ->10.13% (7,104,972B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->10.13% (7,104,972B) 0x80517ED: main (main.c:29) -| -->07.24% (5,074,980B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->07.24% (5,074,980B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->07.24% (5,074,980B) 0x804CBAC: add_attribute (node.c:132) -| ->07.24% (5,074,980B) 0x804B86B: yyparse (parser.y:218) -| ->07.24% (5,074,980B) 0x804AF9A: parse_file (parser.y:67) -| ->07.24% (5,074,980B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->07.24% (5,074,980B) 0x80517ED: main (main.c:29) -| -->05.18% (3,629,528B) 0x804CD5F: new_element_node (node.c:164) -| ->05.18% (3,629,528B) 0x804B844: yyparse (parser.y:215) -| | ->05.18% (3,629,528B) 0x804AF9A: parse_file (parser.y:67) -| | ->05.18% (3,629,528B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->05.18% (3,629,528B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.08% (3,563,448B) 0x804CDCA: new_text_node (node.c:176) -| ->05.08% (3,563,448B) 0x804B78D: yyparse (parser.y:196) -| ->05.08% (3,563,448B) 0x804AF9A: parse_file (parser.y:67) -| ->05.08% (3,563,448B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->05.08% (3,563,448B) 0x80517ED: main (main.c:29) -| -->04.24% (2,973,208B) 0x804F9F3: append_element (stack.c:147) -| ->02.93% (2,055,120B) 0x804CAA3: append_child (node.c:112) -| | ->02.93% (2,055,120B) 0x804CCFD: append_children (node.c:151) -| | | ->02.93% (2,055,120B) 0x804B638: yyparse (parser.y:169) -| | | ->02.93% (2,055,120B) 0x804AF9A: parse_file (parser.y:67) -| | | ->02.93% (2,055,120B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->02.93% (2,055,120B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.31% (918,088B) 0x804FB54: add_element (stack.c:180) -| ->01.31% (918,088B) 0x804D1BF: get_descendants (node.c:284) -| | ->01.30% (912,856B) 0x804D195: get_descendants (node.c:282) -| | | ->01.29% (902,376B) 0x804D195: get_descendants (node.c:282) -| | | | ->01.29% (902,376B) 0x8051567: query (query_runner.c:248) -| | | | ->01.29% (902,376B) 0x805180B: main (main.c:37) -| | | | -| | | ->00.01% (10,480B) in 1+ places, all below ms_print's threshold (01.00%) -| | | -| | ->00.01% (5,232B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.96% (2,074,048B) 0x804F3C0: new_generic_list (stack.c:13) -| ->02.96% (2,074,000B) 0x804CCCD: append_children (node.c:148) -| | ->02.96% (2,074,000B) 0x804B638: yyparse (parser.y:169) -| | ->02.96% (2,074,000B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.96% (2,074,000B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.96% (2,074,000B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (48B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.67% (1,870,648B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->02.67% (1,870,648B) 0x804F9E7: append_element (stack.c:144) -| ->01.36% (952,576B) 0x804CAA3: append_child (node.c:112) -| | ->01.36% (952,576B) 0x804CCFD: append_children (node.c:151) -| | | ->01.36% (952,576B) 0x804B638: yyparse (parser.y:169) -| | | ->01.36% (952,576B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.36% (952,576B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.36% (952,576B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->01.31% (918,072B) 0x804FB54: add_element (stack.c:180) -| ->01.31% (918,072B) 0x804D1BF: get_descendants (node.c:284) -| | ->01.31% (917,944B) 0x8051567: query (query_runner.c:248) -| | | ->01.31% (917,944B) 0x805180B: main (main.c:37) -| | | -| | ->00.00% (128B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.16% (1,517,784B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->02.16% (1,517,784B) 0x804CB91: add_attribute (node.c:131) -| ->02.16% (1,517,784B) 0x804B86B: yyparse (parser.y:218) -| ->02.16% (1,517,784B) 0x804AF9A: parse_file (parser.y:67) -| ->02.16% (1,517,784B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->02.16% (1,517,784B) 0x80517ED: main (main.c:29) -| -->00.07% (49,844B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 37 940,412,840 69,259,256 45,050,635 24,208,621 0 - 38 978,582,944 69,288,512 45,068,167 24,220,345 0 - 39 997,898,672 69,305,808 45,078,547 24,227,261 0 - 40 1,017,385,648 69,327,296 45,091,459 24,235,837 0 - 41 1,036,961,600 69,340,320 45,099,287 24,241,033 0 - 42 1,056,818,720 69,368,144 45,116,007 24,252,137 0 - 43 1,076,817,712 69,395,008 45,132,883 24,262,125 0 - 44 1,096,987,472 69,412,240 45,142,403 24,269,837 0 - 45 1,117,259,608 69,430,088 45,153,931 24,276,157 0 - 46 1,137,765,672 69,458,088 45,170,731 24,287,357 0 - 47 1,158,441,712 69,482,272 45,185,239 24,297,033 0 - 48 1,178,250,080 70,570,480 46,063,519 24,506,961 0 - 49 1,215,838,040 72,480,376 47,205,625 25,274,751 0 - 50 1,226,116,384 72,480,080 47,205,375 25,274,705 0 - 51 1,236,394,728 72,480,248 47,205,535 25,274,713 0 - 52 1,246,673,064 72,480,264 47,205,473 25,274,791 0 - 53 1,256,951,400 72,480,232 47,205,457 25,274,775 0 - 54 1,267,229,760 72,480,176 47,205,431 25,274,745 0 - 55 1,277,508,152 72,480,344 47,205,559 25,274,785 0 - 56 1,287,786,600 72,480,376 47,205,625 25,274,751 0 - 57 1,298,065,008 72,480,048 47,205,363 25,274,685 0 - 58 1,308,343,384 72,480,376 47,205,625 25,274,751 0 -65.13% (47,205,625B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->12.90% (9,353,551B) 0x40B14AE: strdup (strdup.c:43) -| ->07.16% (5,188,706B) 0x804CDF3: new_text_node (node.c:180) -| | ->07.16% (5,188,706B) 0x804B78D: yyparse (parser.y:196) -| | ->07.16% (5,188,706B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.16% (5,188,706B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.16% (5,188,706B) 0x80517ED: main (main.c:29) -| | -| ->02.28% (1,649,765B) 0x804CE54: new_attribute (node.c:191) -| | ->02.28% (1,649,765B) 0x804B891: yyparse (parser.y:222) -| | ->02.28% (1,649,765B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.28% (1,649,765B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.28% (1,649,765B) 0x80517ED: main (main.c:29) -| | -| ->02.05% (1,483,582B) 0x804CE67: new_attribute (node.c:192) -| | ->02.05% (1,483,582B) 0x804B891: yyparse (parser.y:222) -| | ->02.05% (1,483,582B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.05% (1,483,582B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.05% (1,483,582B) 0x80517ED: main (main.c:29) -| | -| ->01.42% (1,031,498B) 0x804C6BC: set_name (node.c:26) -| | ->01.42% (1,031,494B) 0x804B7CC: yyparse (parser.y:202) -| | | ->01.42% (1,031,494B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.42% (1,031,494B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.42% (1,031,494B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (4B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->12.82% (9,294,136B) 0x804F3F6: new_generic_list (stack.c:18) -| ->11.39% (8,257,152B) 0x804CCCD: append_children (node.c:148) -| | ->11.39% (8,257,152B) 0x804B638: yyparse (parser.y:169) -| | ->11.39% (8,257,152B) 0x804AF9A: parse_file (parser.y:67) -| | ->11.39% (8,257,152B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->11.39% (8,257,152B) 0x80517ED: main (main.c:29) -| | -| ->01.43% (1,036,984B) 0x8051021: filter_nodes_by_name (query_runner.c:131) -| | ->01.43% (1,036,984B) 0x8051484: filter_nodes_by_selector (query_runner.c:224) -| | ->01.43% (1,036,984B) 0x80516D2: query (query_runner.c:290) -| | ->01.43% (1,036,984B) 0x805180B: main (main.c:37) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->09.80% (7,104,972B) 0x804CE35: new_attribute (node.c:188) -| ->09.80% (7,104,972B) 0x804B891: yyparse (parser.y:222) -| ->09.80% (7,104,972B) 0x804AF9A: parse_file (parser.y:67) -| ->09.80% (7,104,972B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->09.80% (7,104,972B) 0x80517ED: main (main.c:29) -| -->07.00% (5,074,980B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->07.00% (5,074,980B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->07.00% (5,074,980B) 0x804CBAC: add_attribute (node.c:132) -| | ->07.00% (5,074,980B) 0x804B86B: yyparse (parser.y:218) -| | ->07.00% (5,074,980B) 0x804AF9A: parse_file (parser.y:67) -| | ->07.00% (5,074,980B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->07.00% (5,074,980B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.61% (4,066,224B) 0x804F9F3: append_element (stack.c:147) -| ->02.84% (2,055,120B) 0x804CAA3: append_child (node.c:112) -| | ->02.84% (2,055,120B) 0x804CCFD: append_children (node.c:151) -| | | ->02.84% (2,055,120B) 0x804B638: yyparse (parser.y:169) -| | | ->02.84% (2,055,120B) 0x804AF9A: parse_file (parser.y:67) -| | | ->02.84% (2,055,120B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->02.84% (2,055,120B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->02.77% (2,011,104B) 0x804FB54: add_element (stack.c:180) -| | ->01.39% (1,005,552B) 0x8051076: filter_nodes_by_name (query_runner.c:135) -| | | ->01.39% (1,005,552B) 0x8051484: filter_nodes_by_selector (query_runner.c:224) -| | | ->01.39% (1,005,552B) 0x80516D2: query (query_runner.c:290) -| | | ->01.39% (1,005,552B) 0x805180B: main (main.c:37) -| | | -| | ->01.39% (1,005,552B) 0x8051744: query (query_runner.c:303) -| | | ->01.39% (1,005,552B) 0x805180B: main (main.c:37) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->05.01% (3,629,528B) 0x804CD5F: new_element_node (node.c:164) -| ->05.01% (3,629,528B) 0x804B844: yyparse (parser.y:215) -| | ->05.01% (3,629,528B) 0x804AF9A: parse_file (parser.y:67) -| | ->05.01% (3,629,528B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->05.01% (3,629,528B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->04.92% (3,563,448B) 0x804CDCA: new_text_node (node.c:176) -| ->04.92% (3,563,448B) 0x804B78D: yyparse (parser.y:196) -| ->04.92% (3,563,448B) 0x804AF9A: parse_file (parser.y:67) -| ->04.92% (3,563,448B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->04.92% (3,563,448B) 0x80517ED: main (main.c:29) -| -->02.86% (2,074,032B) 0x804F3C0: new_generic_list (stack.c:13) -| ->02.86% (2,074,000B) 0x804CCCD: append_children (node.c:148) -| | ->02.86% (2,074,000B) 0x804B638: yyparse (parser.y:169) -| | ->02.86% (2,074,000B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.86% (2,074,000B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.86% (2,074,000B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (32B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.09% (1,517,784B) 0x804E6DD: new_rbtree (rbtree.c:39) -| ->02.09% (1,517,784B) 0x804CB91: add_attribute (node.c:131) -| | ->02.09% (1,517,784B) 0x804B86B: yyparse (parser.y:218) -| | ->02.09% (1,517,784B) 0x804AF9A: parse_file (parser.y:67) -| | ->02.09% (1,517,784B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->02.09% (1,517,784B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->02.04% (1,476,864B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->02.04% (1,476,864B) 0x804F9E7: append_element (stack.c:144) -| ->01.31% (952,576B) 0x804CAA3: append_child (node.c:112) -| | ->01.31% (952,576B) 0x804CCFD: append_children (node.c:151) -| | | ->01.31% (952,576B) 0x804B638: yyparse (parser.y:169) -| | | ->01.31% (952,576B) 0x804AF9A: parse_file (parser.y:67) -| | | ->01.31% (952,576B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | | ->01.31% (952,576B) 0x80517ED: main (main.c:29) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.72% (524,288B) in 1+ places, all below ms_print's threshold (01.00%) -| -->00.07% (50,106B) in 1+ places, all below ms_print's threshold (01.00%) - --------------------------------------------------------------------------------- - n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) --------------------------------------------------------------------------------- - 59 1,318,621,728 72,480,256 47,205,513 25,274,743 0 - 60 1,328,900,064 72,480,144 47,205,419 25,274,725 0 - 61 1,339,178,496 72,480,400 47,205,651 25,274,749 0 - 62 1,349,456,840 65,619,464 42,731,791 22,887,673 0 - 63 1,359,735,184 55,928,992 36,414,236 19,514,756 0 - 64 1,370,013,520 46,238,848 30,095,515 16,143,333 0 - 65 1,380,291,856 36,547,904 23,777,649 12,770,255 0 - 66 1,390,570,232 26,856,664 17,457,757 9,398,907 0 - 67 1,400,848,608 17,166,000 11,138,966 6,027,034 0 - 68 1,411,126,952 7,470,536 4,815,354 2,655,182 0 -64.46% (4,815,354B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc. -->27.77% (2,074,600B) 0x804F9F3: append_element (stack.c:147) -| ->26.92% (2,011,104B) 0x804FB54: add_element (stack.c:180) -| | ->13.46% (1,005,552B) 0x8051076: filter_nodes_by_name (query_runner.c:135) -| | | ->13.46% (1,005,552B) 0x8051484: filter_nodes_by_selector (query_runner.c:224) -| | | ->13.46% (1,005,552B) 0x80516D2: query (query_runner.c:290) -| | | ->13.46% (1,005,552B) 0x805180B: main (main.c:37) -| | | -| | ->13.46% (1,005,552B) 0x8051744: query (query_runner.c:303) -| | | ->13.46% (1,005,552B) 0x805180B: main (main.c:37) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.85% (63,496B) in 1+ places, all below ms_print's threshold (01.00%) -| -->16.90% (1,262,456B) 0x804F3F6: new_generic_list (stack.c:18) -| ->13.88% (1,036,984B) 0x8051021: filter_nodes_by_name (query_runner.c:131) -| | ->13.88% (1,036,984B) 0x8051484: filter_nodes_by_selector (query_runner.c:224) -| | ->13.88% (1,036,984B) 0x80516D2: query (query_runner.c:290) -| | ->13.88% (1,036,984B) 0x805180B: main (main.c:37) -| | -| ->03.02% (225,472B) 0x804CCCD: append_children (node.c:148) -| | ->03.02% (225,472B) 0x804B638: yyparse (parser.y:169) -| | ->03.02% (225,472B) 0x804AF9A: parse_file (parser.y:67) -| | ->03.02% (225,472B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->03.02% (225,472B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->07.43% (555,392B) 0x804F5DE: refactor_generic_list (stack.c:59) -| ->07.43% (555,392B) 0x804F9E7: append_element (stack.c:144) -| ->07.02% (524,288B) 0x804FB54: add_element (stack.c:180) -| | ->07.02% (524,288B) 0x8051744: query (query_runner.c:303) -| | | ->07.02% (524,288B) 0x805180B: main (main.c:37) -| | | -| | ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| | -| ->00.42% (31,104B) in 1+ places, all below ms_print's threshold (01.00%) -| -->03.35% (250,358B) 0x40B14AE: strdup (strdup.c:43) -| ->01.82% (136,099B) 0x804CDF3: new_text_node (node.c:180) -| | ->01.82% (136,099B) 0x804B78D: yyparse (parser.y:196) -| | ->01.82% (136,099B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.82% (136,099B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.82% (136,099B) 0x80517ED: main (main.c:29) -| | -| ->01.53% (114,259B) in 9 places, all below massif's threshold (01.00%) -| -->02.57% (192,080B) 0x804CE35: new_attribute (node.c:188) -| ->02.57% (192,080B) 0x804B891: yyparse (parser.y:222) -| ->02.57% (192,080B) 0x804AF9A: parse_file (parser.y:67) -| ->02.57% (192,080B) 0x8048C76: parse_dom (lxq_parser.c:20) -| ->02.57% (192,080B) 0x80517ED: main (main.c:29) -| -->01.98% (147,548B) in 15 places, all below massif's threshold (01.00%) -| -->01.84% (137,200B) 0x804E63E: new_rbtree_node (rbtree.c:15) -| ->01.84% (137,200B) 0x804EA0C: rb_tree_insert (rbtree.c:146) -| ->01.84% (137,200B) 0x804CBAC: add_attribute (node.c:132) -| | ->01.84% (137,200B) 0x804B86B: yyparse (parser.y:218) -| | ->01.84% (137,200B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.84% (137,200B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.84% (137,200B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.33% (99,260B) 0x804CD5F: new_element_node (node.c:164) -| ->01.33% (99,260B) 0x804B844: yyparse (parser.y:215) -| | ->01.33% (99,260B) 0x804AF9A: parse_file (parser.y:67) -| | ->01.33% (99,260B) 0x8048C76: parse_dom (lxq_parser.c:20) -| | ->01.33% (99,260B) 0x80517ED: main (main.c:29) -| | -| ->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%) -| -->01.29% (96,460B) 0x804CDCA: new_text_node (node.c:176) - ->01.29% (96,460B) 0x804B78D: yyparse (parser.y:196) - ->01.29% (96,460B) 0x804AF9A: parse_file (parser.y:67) - ->01.29% (96,460B) 0x8048C76: parse_dom (lxq_parser.c:20) - ->01.29% (96,460B) 0x80517ED: main (main.c:29) - diff --git a/test.xml b/test.xml deleted file mode 100644 index d270c06..0000000 --- a/test.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - 205 - 97 - 256 - - - - - - - Empty room!!!! - - - - - - - - - - - - - off -20101101235257::off->on -20101101235534::on->off]]> - - - From c6b6f36da087e2ea4f96af7695c9121223d2d308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederico=20Gon=C3=A7alves?= Date: Mon, 29 Nov 2010 01:04:50 +0000 Subject: [PATCH 2/5] realatorio --- relatorio/biblioteca xml.tex | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/relatorio/biblioteca xml.tex b/relatorio/biblioteca xml.tex index 99f97bb..1899748 100644 --- a/relatorio/biblioteca xml.tex +++ b/relatorio/biblioteca xml.tex @@ -345,28 +345,28 @@ \section{Profiling memory usage}\label{sec:mprof} \begin{tabular}{ | l | r | r | r | r | r | } \hline & Non-optimized (MB) & Optimized (MB)\\ \hline - MS-Windows 7 & 102.23 & 102.23 \\ \hline - Linux 2.6 (Intel core duo) & 98.78 & 98.78 \\ \hline - Linux 2.6 (ARM cpu) & 54.2 RAM and 48.58 Swap & 54.2 RAM and 48.58 Swap \\ \hline - Mac OSx 10.4 & 100.43 & 100.43 \\ + MS-Windows 7 & 41 & 41 \\ \hline + Linux 2.6 (Intel core duo) & 34 & 34 \\ \hline + Linux 2.6 (ARM cpu) & 37 & 37 \\ \hline + Mac OSx 10.4 & 35 & 35 \\ \hline \end{tabular} \end{center} From this first test we can already conclude that optimizing the query engine didn't do nothing to optimize space. In fact, further analyzes to our profiling output reveals that the peak memory usage is related to the XML - parser. At this point we can't do anything because the parser has already been optimized and the parsed data doesn't have such an overhead. + parser. At this point we can't do anything because the parser has already been optimized and the parsed data doesn't have such an overhead. However, with the flag \emph{USE\_DICT} (see appendix \ref{chap:gcc}) the + amount of memory usage drops about 6M. - In the ARM cpu, since it has only 64MB of RAM, after a while swap area begins to be used. Swapping is done on an SD card with a total of 2GB and a partition of 312MB for swapping. The next table shows the results for - the second kind of test. + The next table shows the results for the second kind of test. \begin{center} \begin{tabular}{ | l | r | r | r | r | r | } \hline & Non-optimized (MB) & Optimized (MB)\\ \hline - MS-Windows 7 & 0.035 & 0.035 \\ \hline - Linux 2.6 (Intel core duo) & 0.026 & 0.026 \\ \hline - Linux 2.6 (ARM cpu) & 0.030 & 0.030 \\ \hline - Mac OSx 10.4 & 0.032 & 0.032 \\ + MS-Windows 7 & 0.026 & 0.026 \\ \hline + Linux 2.6 (Intel core duo) & 0.019 & 0.019 \\ \hline + Linux 2.6 (ARM cpu) & 0.022 & 0.022 \\ \hline + Mac OSx 10.4 & 0.020 & 0.020 \\ \hline \end{tabular} \end{center} From ef61617ce2a2af75d3199c956fb9c37096f0b43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederico=20Gon=C3=A7alves?= Date: Wed, 1 Dec 2010 16:07:04 +0000 Subject: [PATCH 3/5] Added new things to delivery --- Makefile | 6 +----- selectors/query_runner.c | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index ab6d1c4..edaa7a9 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,8 @@ DOM_SRC = ./dom PARSER_SRC = ./parser STRUCTS = ./data_structures SELECTORS = ./selectors -OUT = xmlquery -all: exec so +all: so object_code: make -C $(DOM_SRC) all @@ -14,9 +13,6 @@ object_code: make -C $(STRUCTS) all make -C $(SELECTORS) all -exec: object_code - $(CC) $(CFLAGS) -o $(OUT) $(PARSER_SRC)/*.o $(DOM_SRC)/*.o $(STRUCTS)/*.o $(SELECTORS)/*.o main.c - clean: make -C $(DOM_SRC) clean make -C $(PARSER_SRC) clean diff --git a/selectors/query_runner.c b/selectors/query_runner.c index 55c39a3..70af325 100644 --- a/selectors/query_runner.c +++ b/selectors/query_runner.c @@ -91,7 +91,7 @@ list* apply_custom_relation_operator(const list* nodes, char* op){ if(operator == NULL) return NULL; - list* r = operator(nodes); + list* r = operator((list*) nodes); return r; } From 9eb5ecdee02c4c866333d00403a01cf41519beca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederico=20Gon=C3=A7alves?= Date: Wed, 1 Dec 2010 16:14:39 +0000 Subject: [PATCH 4/5] =?UTF-8?q?A=20entrega=20agora=20s=C3=B3=20tem=20a=20s?= =?UTF-8?q?ource=20e=20os=20testes.=20Tudo=20o=20resto=20est=C3=A1=20no=20?= =?UTF-8?q?master.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relatorio/arch.png | Bin 23787 -> 0 bytes relatorio/biblioteca xml.tex | 521 ----------------------------------- relatorio/disk.png | Bin 114365 -> 0 bytes tests/Makefile | 5 +- tests/README.rst | 4 + tests/out | 1 - tools/html2xml.py | 13 - 7 files changed, 8 insertions(+), 536 deletions(-) delete mode 100644 relatorio/arch.png delete mode 100644 relatorio/biblioteca xml.tex delete mode 100644 relatorio/disk.png create mode 100644 tests/README.rst delete mode 100644 tests/out delete mode 100755 tools/html2xml.py diff --git a/relatorio/arch.png b/relatorio/arch.png deleted file mode 100644 index 0025798c8d641da141c99adb02265e8fe35f77e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23787 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 R03TwGpdh0vT_tH6@;^b7#NGe^ diff --git a/relatorio/biblioteca xml.tex b/relatorio/biblioteca xml.tex deleted file mode 100644 index 1899748..0000000 --- a/relatorio/biblioteca xml.tex +++ /dev/null @@ -1,521 +0,0 @@ -\documentclass[a4paper]{report} - -%============ Packages ================ -\usepackage{graphicx} -\usepackage{amsmath} -\usepackage{listings} -\usepackage{framed} -\usepackage[pdfborder={0 0 0}]{hyperref} -%============ End Packages ============= - -%============ Title ================ -\title{\textbf{\Huge{libxmlquery}}\\A lightweight library to query and manipulate XML files} -\author{ -Vasco Fernandes\\ -MEIC-T, 53801\\ -vasco.fernandes@ist.utl.pt \\ -\and -Frederico Gon\c{c}alves\\ -MEIC-T, 57843\\ -frederico.goncalves@ist.utl.pt\\ -} -%============ End Title ============= - -%============ Document ============ -\begin{document} - -\maketitle - -\tableofcontents - -%Intro% -\chapter{Introduction} - -\section{Motivation} %O google taduz domotica para Home Automation.....% - As computers tend to get smaller and powerful, ubiquitous environments begin to emerge as possible and reliable systems. One of the main characteristics of an ubiquitous environment is the fact that it's filled with - devices that interoperate in order to provide the user with different kind of services. Home Automation is part of the ubiquitous computing philosophy, in the sense that it fills a certain space with devices that work together in - order to provide users with services that are home oriented. Each device has its own characteristics, like a certain operating system, communication medium (Bluetooth, Wifi, etethernet, etc.), communication protocols and - computational capacity. This creates a problem in terms of communication between devices, because each one will communicate with different methods and rules for treating data. This problem stands even if the devices - are of equal characteristics, because there are several different software and hardware configurations that can have an effect on data transmission and handling. - - We need a system that provides communication between devices and lets us handle the transmitted data with great ease. - -\section{Problem description} - When targeting systems built for Home Automation and as said before, we expect a highly heterogeneous environment. One possible solution for this problem is to agree in a common representation and treating method - for transmitted data. - - Such can be achieved by using XML (e\textbf{X}tensible \textbf{M}arkup \textbf{L}anguage). There are several solutions that use this approach, however they tend to be implemented in languages not suitable for - embedded systems. Such solutions also provide a mechanism to query the XML documents, but yet again they're too heavy for embedded systems. We need a lightweight solution that parses and queries XML - documents with good degree of performance in embedded systems. - - Another concern is how easily is to develop some program that parses and manipulates XML. There are three different phases in this kind of program: - - \begin{enumerate} - \item \textbf{Parsing} - Reading an XML document and building a data structure to hold the parsed information. - \item \textbf{Getting the correct data} - Traverse the data structure and retrieve the correct portion of the XML that needs to be manipulated. - \item \textbf{Manipulating} - Alter the retrieved structure and save the changes. - \end{enumerate} - - Each of each phase has different levels of complexity but probably the second is the most tiresome. If the right querying engine is provided to gather the data from the data structure, then this phase can actually be - speed upped. Also, with the right techniques, parsing can be done efficiently without the need to write code to parse different XML documents. - -\section{Goal} - The goal is simple, build a lightweight mechanism to parse, query and manipulate XML documents. To achieve this goal, we've built a library called libxmlquery. - -\section{What is libxmlquery?} - Libxmlquery is a library designed to parse XML files and query them. It also allows manipulation of the xml elements. It is written in C and was tested in three different kind of operating systems - MS-Windows 7, Linux 2.6 - and MacOSx 10.4. It uses the flex library to implement the parser, but it is not compiled against it, which means that the end system doesn't need to have the flex library. However, it has a strong dependency on the C library - and won't work on systems that don't have it.\\ - - - The rest of this report is organized as follows: in chapter \ref{chap:arch} we outline the design of our architecture, present the main modules (sections \ref{sec:dom}, \ref{sec:parser} and \ref{sec:sels}) and explain the data - structure and macros used in them (section \ref{sec:helpers}); in chapter \ref{chap:eval} we present some profiling tests to the memory usage (section \ref{sec:mprof}) and time usage \ref{sec:tprof}; chapter - \ref{chap:concl} we present our main conclusions; in the appendix we shows how to compile against our lib (appendix \ref{chap:gcc}), some sample applications (appendix \ref{chap:app}) and the entire libxmlquery - documentation (appendix \ref{chap:doc}). -%END Intro% - -%Arch% -\chapter{Architecture}\label{chap:arch} -\section{Overview}\label{sec:overview} - We begin by describing the modules of our implementation. Figure \ref{fig:arch} shows the scheme of libxmlquery. - - %Figura da arquitectura - \begin{figure}[h!] - \centering - \label{fig:arch} - \includegraphics[width=0.5\textwidth] {arch} - \caption{libxmlquery module design. Three main modules - DOM module responsible for implementing the data structure that holds the xml contents; Parser module, which parses queries and xml documents; - Querying engine module, which enables querying to a dom structure.} - \end{figure} - - The DOM module defines structures and functions to manipulate a given XML document. As shown in figure \ref{fig:arch}, the DOM module doesn't depend on any other module so it doesn't have to change if any of the - others changes. However, if modifications are made to it, then the other modules must change as well, unless the function signature stays exactly the same. - - The Parser module is responsible for parsing queries and XML documents. Due to implementation details (see section \ref{sec:parser}) we weren't able to separate query parsing from XML parsing. This means that the - parser depends on both querying engine module and DOM module to work correctly. If any of them changes the parser has to be changed as well. However, if a new parser is needed instead of the one we use, the - change wouldn't affect the DOM module and the querying engine module would only need one line changed (The line that calls the function, which parses a query). This new parser would only have to build each query - and DOM according to each module's interface. - - Finally, the query engine module is responsible for evaluating query plans and querying XML documents. Each query returns a list of the selected elements. Notice that this module depends on both the DOM module - and parser module, because it needs to parse queries and use the data structure provided by the DOM module to search the XML document. In a normal use, one would call the query engine module, which would call the - parser module and then the DOM module. - - We've adopted this architecture in order to support flexibility and modularity. However, the user may need to interact directly with the DOM module, which can be achieve by calling the functions provided by its interface. - This is also true for the parser module. - - In order to ease the continued development of the library, we've structured the files on disk according to figure \ref{fig:disk}. - - %Figura das pastas em disco. - \begin{figure}[h!] - \centering - \label{fig:disk} - \includegraphics[width=0.30\textwidth] {disk} - \caption{libxmlquery organization on disk.} - \end{figure} - - The first two folders are pretty much descriptive, the third one is where all the query engine source code is. The data\_structures folder has various data structures to help us (see section \ref{sec:helpers}) and the includes - folder has all the header files of our library. - - The next sections details each module's implementation. - -\section{The Document Object Model Module}\label{sec:dom} - This section describes how our implementation of DOM works. Although DOM is a standard from W3C\footnote{\url{http://www.w3.org/} - Official site of the World Wide Web consortium} we did our own implementation in - order to keep it simple and smaller enough for embedded systems. The goal of our DOM implementation is to keep in memory the information stored in the XML file. The idea is to keep the same semantics offered by the - XML. In order to do this, the DOM creates a tree where every node is either an XML element, attribute, normal text, or CDATA element. Each time an XML document is parsed, the DOM module returns a pointer to its - corresponding tree root. - - \pagebreak - A tree root is just a structure that holds two pointers. The first one points to what we call XML declaration and the second points to the root element of the XML document. For the sake of better understanding to which - structure we're referring to, we'll refer to a tree root as a DOM tree. As an example consider the following XML document : - - \lstset{language=XML,caption=Sample XML file, captionpos=b} - \begin{lstlisting} - - - - - \end{lstlisting} - - The DOM tree returned by the module for this XML contains in its XML declaration pointer the tree corresponding to: - \lstset{language=XML,caption=Sample XML declaration, captionpos=b} - \begin{lstlisting} - - \end{lstlisting} - - and in its second pointer will have the tree corresponding to: - \label{lst:xml_example} - \lstset{language=XML,caption=Sample XML file without XML declaration, captionpos=b} - \begin{lstlisting} - - - - \end{lstlisting} - - Because some documents may not contain the XML declaration part, the DOM will return that pointer pointing to NULL. - - \subsection{Building the Document Object Module} - As explained before, the parser module is responsible for constructing the tree returned by the DOM module. It does this by calling upon functions provided by the DOM module. Currently, the simplest way of building - a DOM tree is to create a new document with the appropriate function and iteratively add all the elements, attributes, normal text and CDATA present in the XML (These functions are described in appendix - \ref{chap:doc}). - - As a simple example, suppose we would like to parse the XML in listing \ref{lst:xml_example}. The following code shows how to do this: - - \begin{center} - \lstset{language=C,numbers=left, captionpos=b, caption=Sample code to build a DOM tree.} - \begin{tabular}{c} - \begin{lstlisting} -... -doc* document = new_document(NULL); -set_doc_root(document, new_element_node("a")); - -dom_node* root = get_doc_root(document); -append_child(root, new_element_node("b")); -... - \end{lstlisting} - \end{tabular} - \end{center} - - Line 2 creates a DOM tree with no XML declaration. On line 3 we make the root of this tree point to element \textbf{a}. Lines 5 and 6 add element \textbf{b} to the DOM tree and complete the building process. - - \subsection{Handling and viewing DOM trees} - The DOM module also provides functions to retrieve and manipulate the various DOM trees in memory (see appendix \ref{chap:doc}). We strongly recommend the use of \emph{getters} and \emph{setters} to do this, - because they deal with implementation details that shouldn't be dealt by the user. - - As the DOM tree gets modified it might help the user if he or she could actually see how it looks like, or save it to disk. This is where serialization comes into play. Currently we support three kinds of serialization - XML; - JSON (\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation); YAML (\textbf{Y}AML \textbf{A}in't \textbf{M}arkup \textbf{L}anguage). Serialization is the reverse of parsing, as in it transforms the DOM tree in an XML - string. - - \subsection{Cleaning a document} - Since our implementation is done in C, there is no garbage collection mechanism. This means that the DOM tree must be freed manually. We provide two functions to do this. One destroys the entire DOM tree the - other destroys a generic DOM node (a DOM tree node). However, the second function must be used with care, because it also frees the nodes below the given node. - - Freeing up memory space is crucial in an embedded system, but can have a great impact in the system's performance. We leave it to the user to decide where to call these functions. - -\section{The Parser Module}\label{sec:parser} - The parser module implements both the XML parser and the query parser. We've done this because the current implementation is using flex lexical analyzer\footnote{\url{http://flex.sourceforge.net/} - Flex home page.} and - bison parser generator\footnote{\url{http://dinosaur.compilertools.net/bison/index.html} - Bison site} . One of the biggest disadvantages of flex and bison is that they only support one lexical analyzer per program, which - means we may only have one parser built with flex and bison in our library. - - Another disadvantage is the fact that we need global variables to store temporally what is parsed with bison. In order to avoid name clashes, each parser global variable has the prefix \textbf{lxq\_} and shouldn't be used - directly. Since the parser isn't thread safe, concurrent parsing isn't possible, unless the user ensures that. - - Despite of these two disadvantages we've chosen flex and bison because they provide a simple, flexible and extendable way to build very powerful parsers. Moreover, the outcome is a fully optimized parser. - - However, the target system doesn't need to have the flex or yaac library. This happens because we're only compiling our library we're not linking it. Since linking does't happen, there is no need to tell the compiler which - libraries to use. This method generates and compiles all the code needed for our parser and all functions needed for parsing are in the code. Thus they do not depend on fact of the targeted system having the flex or yacc - library. - - \subsection{XML parsing} - The XML parser implements most of XML features. It is able to parse elements, attributes, normal text and CDATA regions. However, it relies on the fact that the XML had to be validated before parsing began. For this - reason, a DOM tree contains only one pointer to the XML root element instead of several pointers to different elements. - - Currently we provide two ways of parsing an XML - from a file and from a string - both use the same parsing rules. In fact, there is no difference in them besides the input type. - - In order to build the DOM tree the parser needs to interact with it. For this reason, if the DOM module interface changes the parser will have to be modified as well. - - \subsection{Query parsing} - The query parser implements a parser built for queries compliant to most of the CSS3\footnote{\url{http://www.w3.org/TR/css3-selectors/\#selectors} - CSS3 selector list.} standard selectors. We didn't implement every - selector because they're HTML (\textbf{H}yper\textbf{T}ext \textbf{M}arkup \textbf{L}anguage) specific. For instance, the selector \emph{E:link} selects an element based on the fact that it is a source anchor, which can - only happen in HTML files. - - Since querying and XML parsing had to be merge onto a single parser, we had to come up with some kind of distinction between a query and an XML file. We've chosen the character \textbf{@} to indicate that it is a - query we're parsing. This means that each query has to be preceded by the character \textbf{@}, if it isn't our library will prepend it. As an example consider the following code, which retrieves every element named - \textbf{room}. - -\begin{center} - \lstset{language=C,numbers=left, captionpos=b, caption=Sample query to a DOM tree.} - \begin{tabular}{c} - \begin{lstlisting} -... -doc* document = parse_xml_from_string(" "); -list* query_result = query("@room", get_doc_root(document)); -... - \end{lstlisting} - \end{tabular} - \end{center} - - Line 2 parses an XML document from the given string and line 3 queries that document. The result will be an empty element with the tag \textbf{room}. Notice how the query was preceded by \textbf{@}. However, - we could simply write \textbf{"room"} as a query, and it would be preceded by an \textbf{@}. - - Like in XML parsing, the query parser must know the interface of the querying engine module in order to construct the query plan. A query plan is just a sequence of filters that the query engine will apply to the XML - nodes. - -\section{The Querying Engine Module}\label{sec:sels} - This module is responsible for evaluation of the query plan returned by the parser module and its execution. The result of querying an XML document is always a list containing zero or more XML elements. Note that the list - will contain only elements, it won't return attributes. We'll have to access them through the returned nodes. Nevertheless, querying by attribute is always possible since the querying module is CSS3 compliant. - - The returned list can then be iterated with the proper functions (see section \ref{sec:helpers}). - - One major concern when querying a document is typing the query correctly. Don't forget that the whitespace character is valid in CSS3 and it means \emph{descendants}. For instance, if we want all elements B - \emph{descendants} of A we need to write "A B" as a query, or "@A B". Since the whitespace character has special meaning, "@A" is different from "@ A". - - Cleaning up after querying an XML document is very easy. The generated plan is automatically freed by the library, so the user won't have to bother with this part. The only thing that needs to be freed is the returned list of - results. This list contains pointers to the actual nodes in the DOM tree in order to reduce used memory and enable XML manipulation. This means that the user will only need to destroy the list, leaving the content intact - (see appendix \ref{chap:doc}). - - \subsection{Implemented features} - As said before, our querying engine module is CSS3 compliant. However, not every feature of CSS3 was implemented since it is HTML specific. - - In our implementation it's possible to query by element name, attribute name and attribute value. As an example consider these three queries: - - \begin{enumerate} - \item \textbf{"A"} - Query an XML document for all elements with name \textbf{A}.\\ - \item \textbf{"A[b]"} - Query an XML document for all elements with name \textbf{A}, that have an attribute \textbf{b}.\\ - \item \textbf{"A[b='c']"} - Query an XML document for all elements with name \textbf{A}, that have an attribute \textbf{b} with value \textbf{c}.\\ - \end{enumerate} - - These queries are pretty simple, but we've added some new features. It is possible to use regular expressions everywhere by putting the regular expression between slashes (\textbf{"/"}). - As an example consider these three queries: - - \begin{enumerate} - \item \textbf{"/A/"} - Query an XML document for all elements that begin by \textbf{A}.\\ - \item \textbf{"/A/[/b./]"} - Query an XML document for all elements that begin by \textbf{A} and have an attribute with two characters, which the first one is a \textbf{b}.\\ - \item \textbf{"/A/[/b./='/(e$|$f)/']"} - Query an XML document for all elements that begin by \textbf{A}, have an attribute with two characters, which the first one is a \textbf{b} and its value begins by \textbf{e} or - \textbf{f}.\\ - \end{enumerate} - - The implemented selectors also support the CSS3 \emph{filters} relative to document navigation. The only \emph{filters} that we didn't implement are relative to HTML specific markup language. - These \emph{filters} do not make sense for XML handling. Nevertheless, we added the possibility for the user to create its own \emph{filters}. - - Custom \emph{filters} are very easy to implement. The user defines a function which represents a filter, which means it will receive all XML nodes and should return true for nodes that match the filter. - Then, registers that function as a custom \emph{pseudo-filter} and that's it. Custom \emph{filters} can receive 0 or more arguments. Check appendix \ref{chap:doc} for more information on these filters. - -\section{Data structures and macros}\label{sec:helpers} - - \subsection{Data structures} - In order to keep the implementation efficient both in time usage and memory usage, we've developed a couple of optimized structures. - - We've built a circular generic list backed up by an array. There are two great features about this list. First it is backed up by an array, which means that elements in the list will be in contiguous memory thus speeding - up the access. The second great feature is the circular part. Elements in a list can be added and removed as desired. In order to keep a good performance, the list will only grow if necessary. In other words, if the - number of elements to keep in the list is much smaller or bigger than its capacity, the list will be resized accordingly. - - We've chosen to keep this data structure separated from the rest of the modules because it can hold any type of object, which means it can be used by any code. In particular, it can be used by the user to store its - own program data. - - Since any kind of object can be stored in the list there is no way of type checking each element, so the user must know which elements are present in the list or use another feature of our implementation which is typed - elements. Typed elements are just elements with an integer that indicates their type. For instance, if a list would contain three different types of elements we would encourage the use of typed elements in order - to know which kind of data the user is dealing with. - - However, they aren't generic only because they can store any kind of object, but because they implement different policies as well. The user may choose to use the list as a random access list, as a stack, or as a - queue. This provides much greater flexibility. - - Whichever policy and type of elements the user chooses to use and store, he or she can always iterate over the results by using the appropriate functions (see appendix \ref{chap:doc}). After using an iterator it must - be destroyed in order to prevent memory leaks. This is also true for our generic lists. However, in this case we can only free the containers of the list, because we can't possibly know which type of object is stored in - each one. The user must iterate over the list and free each element one by one. Currently the DOM module and querying engine module use these lists. - - Another generic structure we've built is a red black tree. Red black trees are a very good structure when storing unique values that need to be searched. The height of a red black tree is always $\log_2(n)$, where $n$ - is the number of nodes in the tree, thus the search is always done in $\Theta(\log_2(n))$. Currently we use this tree when storing attributes for an XML node. - - One concern when developing code that uses this structure is to be careful and don't use the word \emph{RBNIL} for a variable. The red black tree code defines a global variable called RBNIL and uses it with the goal of - being efficient. - - If the need to iterate over a tree emerges, we've built iterators for this job. There is no guarantee about the order of the returned elements, because the iterator is designed to return every element in the tree with - only one pass. When iteration is over, the user will have to destroy the iterator (see appendix \ref{chap:doc}. Also, like in the list implementation we provide functions to destroy each tree, but the user must free each - element stored in each node. - - \subsection{Macros} - This section only describe two macros. The first one is a logging mechanism. We've developed a macro that logs messages with different kind of error levels and supports output formatting. This macro can be found - almost in any source file we've written. However, it is compilation dependent and when compiled without certain flags it won't get into the binary file (see appendix \ref{chap:gcc}). This helps us debug the code when - developing and keeps the binary smaller when a final version is created. - - The second macro is an allocation macro. The simplest way to describe this macro is to say that its a one line code \emph{malloc} with type cast that exits on allocation failure. In other words, it allocates space and - returns a pointer to it, casted to a specific type. If allocation fails, a log message is printed and the program will exit (see appendix \ref{chap:doc}). - -%END Arch% - -%Eval% -\chapter{Evaluation}\label{chap:eval} - -\section{Test description}\label{sec:testdesc} - This section presents some tests made to our library. We present only two kinds of tests, that were made in different kinds of systems.\\ - - The first kind of test is done with a 131986 line XML with 12MB. We're parsing the XML and querying it for a total of 127266 elements. The test was performed on MS-Windows 7, Linux 2.6 and Mac OSx 10.4. Each - operating system was running on a 2.6GHz 32-bit intel core duo with 1GB of RAM memory. We've also performed this test on an 250MHz Cavium ARM9 CPU, with 64MB of RAM memory. For each configuration, we've ran - the test two times - One without querying engine optimization and other with querying engine optimization. \\ - - The second test was done with the same configurations, the only difference is that the XML has a total of 36 lines, 0.77KB and we're querying it for 6 elements.\\ - - Sections \ref{sec:mprof} and \ref{sec:tprof} show the results for these tests. It's important to know that every test was done with a cold cache. - -\section{Profiling memory usage}\label{sec:mprof} - This section shows the results for the memory usage on the different systems. The following table shows the result for the first kind of test. Each value is presented in Megabytes and represents the peak usage, that is the - maximum amount of memory used. - - \begin{center} - \begin{tabular}{ | l | r | r | r | r | r | } - \hline - & Non-optimized (MB) & Optimized (MB)\\ \hline - MS-Windows 7 & 41 & 41 \\ \hline - Linux 2.6 (Intel core duo) & 34 & 34 \\ \hline - Linux 2.6 (ARM cpu) & 37 & 37 \\ \hline - Mac OSx 10.4 & 35 & 35 \\ - \hline - \end{tabular} - \end{center} - - From this first test we can already conclude that optimizing the query engine didn't do nothing to optimize space. In fact, further analyzes to our profiling output reveals that the peak memory usage is related to the XML - parser. At this point we can't do anything because the parser has already been optimized and the parsed data doesn't have such an overhead. However, with the flag \emph{USE\_DICT} (see appendix \ref{chap:gcc}) the - amount of memory usage drops about 6M. - - The next table shows the results for the second kind of test. - - \begin{center} - \begin{tabular}{ | l | r | r | r | r | r | } - \hline - & Non-optimized (MB) & Optimized (MB)\\ \hline - MS-Windows 7 & 0.026 & 0.026 \\ \hline - Linux 2.6 (Intel core duo) & 0.019 & 0.019 \\ \hline - Linux 2.6 (ARM cpu) & 0.022 & 0.022 \\ \hline - Mac OSx 10.4 & 0.020 & 0.020 \\ - \hline - \end{tabular} - \end{center} - - This test confirms that the memory usage peak isn't related with the querying engine. Yet again, a detailed analysis of our profiling output revealed that the peak usage was when data was being parsed. - - The results from both tests show that the memory usage depends heavily on the size of the XML and not so much on the number of elements to be queried. We believe that most of XML documents used in Home - Automation systems are small, thus not occupying great amounts of memory. That said, the results shows that our solution is adequate for such systems. - -\section{Time usage}\label{sec:tprof} - This section shows the time results for each kind of test. The value units are given in seconds. The first table shows the results for the first kind of test. - - \begin{center} - \begin{tabular}{ | l | r | r | r | r | r | } - \hline - & Non-optimized (s) & Optimized (s)\\ \hline - MS-Windows 7 & 23.12 & 0.74 \\ \hline - Linux 2.6 (Intel core duo) & 18.82 & 0.67 \\ \hline - Linux 2.6 (ARM cpu) & 32.36 & 1.3 \\ \hline - Mac OSx 10.4 & 21.78 & 0.71 \\ - \hline - \end{tabular} - \end{center} - - This first test shows the impact of query plan evaluation in our design. When optimized the speedup gained is around: - - $$speedup = \frac{non-optimized}{optimized} = \frac{18.82}{0.67} = 28.09$$ - - In fact, a detailed analysis of our profiling output showed that the non-optimized version wasted to much time on evaluating each query plan. For this reason we've optimized it and show impressive results. The following - table shows the results for the second kind of test. - - \begin{center} - \begin{tabular}{ | l | r | r | r | r | r | } - \hline - & Non-optimized (s) & Optimized (s)\\ \hline - MS-Windows 7 & 0.003 & $<$ 0.001 \\ \hline - Linux 2.6 (Intel core duo) & 0.002 & $<$ 0.001 \\ \hline - Linux 2.6 (ARM cpu) & 0.007 & $<$ 0.001 \\ \hline - Mac OSx 10.4 & 0.002 & $<$ 0.001 \\ - \hline - \end{tabular} - \end{center} - - This test confirms that the query engine optimization was successful. In fact, the optimized version is so fast that there isn't enough granularity to give the precise time it took the program to run. - - Another conclusion we take is that memory usage has little impact in time usage. In fact, our profiling output shows that the memory usage peak lasts only during parsing and them drops abruptly. -%END Eval% - -%Conclusion% -\chapter{Conclusion} \label{chap:concl} - We've presented a solution for an XML library designed for embedded systems. The main goal was to build it as light as possible, while giving the user a flexible and expandable way of parsing, querying and manipulating - XML documents. - - We've built a library in three modules - A parser module; A DOM module; A querying engine module. Each has its own functionalities and can be modified almost effortlessly. - - We've shown that the performance depends heavily on the size of the XML being parsed. Our goal has been reach, as our library provides a flexible way to speedup development of applications that use XML documents - to store configuration properties. - -%END Conclusion% - -\appendix -\chapter{Compiling and using the code}\label{chap:gcc} - This section shows how to compile our library and compile other programs with our library. - - Compiling libxmlquery is very easy. The source code ships with a Makefile, so you just need to type in \emph{make}. On Unix based systems the \emph{make} command comes within the system, on MS-Windows we - encourage the use of Cygwin. - - When \emph{make} finishes you'll notice a file with the extension \textbf{.so} (Shared Object). You just need to pass this object to the compiler when linking and you're done. You have compiled your program against - libxmlquery. - - As an example consider the command using \emph{gcc}: - - \begin{center} - \lstset{language=bash,caption=Compiling a program against our library, captionpos=b} - \begin{tabular}{c} - \begin{lstlisting} - gcc -o outputname libxmlquery.so myapplication.c - \end{lstlisting} - \end{tabular} - \end{center} - - \section{Compilation flags} - If the flag \emph{DEBUG} is passed to the compiler when compiling our library, then more debug output will be generated. As an example: - - \begin{center} - \lstset{language=bash,caption=Compiling libxmlquery with debug output, captionpos=b} - \begin{tabular}{c} - \begin{lstlisting} - gcc -DDEBUG -c - \end{lstlisting} - \end{tabular} - \end{center} - - The flag \emph{USE\_DICT} optimizes memory usage in most of the cases. If used, a dictionary will be created and will act as a kind of cache. However, if the XML is massively edited the dictionary will grow - considerably. As an example: - - \begin{center} - \lstset{language=bash,caption=Compiling libxmlquery with dictionary optimization, captionpos=b} - \begin{tabular}{c} - \begin{lstlisting} - gcc -DUSE_DICT -c - \end{lstlisting} - \end{tabular} - \end{center} - - -\chapter{Sample applications}\label{chap:app} %lol% - \section{Shell} - The application shell is just a simple shell that enables loading XML documents and querying them. Its purpose is just to demonstrate the use of queries. Consider this typical use: - -\begin{center} -\lstset{language=bash,caption=Typical usage of the shell application. The banner was intentionally removed., captionpos=b} -\begin{tabular}{c} -\begin{lstlisting} ->>> load ../test.xml doc -XML ../test.xml loaded and stored in doc ->>> query doc "@room device" -Node: - - -Node: - - -Node: - - - - 205 - - - 97 - - - 256 - - - - ->>> quit -exiting... -\end{lstlisting} -\end{tabular} -\end{center} - - In this example, the file \textbf{test.xml} gets loaded into the symbol \textbf{doc}. Then a query is performed on this symbol. It is possible to execute more commands. Type \emph{help} to get a description of them. - - The shell application comes with a Makefile, so it's easy to compile it. To compile in other systems see appendix \ref{chap:gcc}. - -\chapter{Documentation}\label{chap:doc} - This section provides all the documentation for the libxmlquery. The most recent version of the documentation is at \url{http://nullable.github.com/libxmlquery/}. - -\end{document} \ No newline at end of file diff --git a/relatorio/disk.png b/relatorio/disk.png deleted file mode 100644 index e791cc57f523d5519c9b1a794f5c17557f1c4b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114365 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�@Ll75@NRa{^ghFG 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 diff --git a/tests/Makefile b/tests/Makefile index 65d9c89..87b13d4 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,4 +1,7 @@ include ../Makefile.inc all: - $(CC) -o dom_parser $(CFLAGS) ../libxmlquery.so -I../include test.c \ No newline at end of file + $(CC) -o dom_parser $(CFLAGS) ../libxmlquery.so -I../include test.c + +clean: + rm -f *~ *.out \ No newline at end of file diff --git a/tests/README.rst b/tests/README.rst new file mode 100644 index 0000000..02784ce --- /dev/null +++ b/tests/README.rst @@ -0,0 +1,4 @@ +Running tests +============= + +In a linux terminal just type **./tests** diff --git a/tests/out b/tests/out deleted file mode 100644 index b91b5d5..0000000 --- a/tests/out +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/html2xml.py b/tools/html2xml.py deleted file mode 100755 index 32ea33c..0000000 --- a/tools/html2xml.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/python - -import sys -from BeautifulSoup import BeautifulSoup - -if not len(sys.argv) == 2: - print "Usage: html2python 'file.html'" - -f = open(sys.argv[1], 'r') - -soup = BeautifulSoup(f.read()) -print soup.prettify() - From 6e205f64134ef7471cb0c72b4a5aa46222f99d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frederico=20Gon=C3=A7alves?= Date: Wed, 1 Dec 2010 20:35:48 +0000 Subject: [PATCH 5/5] Sem huffman --- Makefile.inc | 4 +- data_structures/Makefile | 4 +- data_structures/bitbuffer.c | 137 ---------------------- dom/Makefile | 4 +- dom/huffman.c | 223 ------------------------------------ 5 files changed, 5 insertions(+), 367 deletions(-) delete mode 100644 data_structures/bitbuffer.c delete mode 100644 dom/huffman.c diff --git a/Makefile.inc b/Makefile.inc index a90b68c..4fc8f22 100644 --- a/Makefile.inc +++ b/Makefile.inc @@ -1,5 +1,5 @@ # common definitions CC = gcc -CFLAGS = -Wall -g -DDEBUG -LEXFLAGS = -DDEBUG -g -c \ No newline at end of file +CFLAGS = -Wall +LEXFLAGS = -c \ No newline at end of file diff --git a/data_structures/Makefile b/data_structures/Makefile index a85936d..98a9f87 100644 --- a/data_structures/Makefile +++ b/data_structures/Makefile @@ -1,7 +1,7 @@ include ../Makefile.inc -OBJS = rbtree.o stack.o btree.o bitbuffer.o byte_buffer.o +OBJS = rbtree.o stack.o btree.o byte_buffer.o all: $(OBJS) @@ -11,8 +11,6 @@ stack.o: ../include/stack.h stack.c $(CC) $(CFLAGS) -c stack.c btree.o: ../include/btree.h btree.c $(CC) $(CFLAGS) -c btree.c -bitbuffer.o: ../include/bitbuffer.h bitbuffer.c - $(CC) $(CFLAGS) -c bitbuffer.c byte_buffer.o: ../include/byte_buffer.h byte_buffer.c $(CC) $(CFLAGS) -c byte_buffer.c diff --git a/data_structures/bitbuffer.c b/data_structures/bitbuffer.c deleted file mode 100644 index 3da95c3..0000000 --- a/data_structures/bitbuffer.c +++ /dev/null @@ -1,137 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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 -#include -#include "../include/macros.h" -#include "../include/bitbuffer.h" - - -bitbuffer* new_bitbuffer(int byte_size){ - bitbuffer* r = alloc(bitbuffer, 1); - r->buffer = alloc(char, byte_size); - memset(r->buffer, 0, byte_size); - r->capacity = byte_size; - r->size = 0; - return r; -} - -bitbuffer* duplicate_bitbuffer(bitbuffer* bb){ - bitbuffer* r = new_bitbuffer(bb->capacity); - r->size = bb->size; - - //memcpy(r->buffer, bb->buffer, (r->size / 8)+1); - memcpy(r->buffer, bb->buffer, r->capacity); - return r; -} - -void append_bitbuffer_to_bitbuffer(const bitbuffer* from, bitbuffer* to){ - int i; - for(i = 0; i < from->size; i++){ - append_bit_to_buffer(get_bit_from_buffer(from, i), to); - } -} - -void print_bitbuffer(bitbuffer* bb){ - int j; - - for(j = 0; j < bb->size; j++){ - printf("%d", get_bit_from_buffer(bb, j)); - } - printf("\n"); -} - -void append_bit_to_buffer(char c, bitbuffer* bb){ - char v = c & (unsigned char) 0x01; - int bit_offset = bb->size % 8; - char* cur = bb->buffer + (bb->size / 8); - //char* cur = bb->buffer + (bb->size / 8); - - //for(i = 0; i < bit_offset; i++){ v <<= 1; } - - *cur |= (v << bit_offset); - - bb->size += 1; - if(bit_offset == 7){ - if(cur - bb->buffer >= bb->capacity){ - bb->buffer = (char*)realloc(bb->buffer, bb->capacity*2); - memset(bb->buffer + (bb->size/8), 0, bb->capacity*2 - (bb->size/8)); - bb->capacity *= 2; - } - } - - -} - -void append_bits_to_buffer(char c, int bit_count, bitbuffer* bb){ - int i; - for(i = bit_count; i > 0; i--){ - char v = c >> (i-1); - append_bit_to_buffer(v, bb); - } - -} - -char get_bit_from_buffer(const bitbuffer* bb, int offset){ - if(offset < 0 || offset > bb->size){ - exit(-1); - } - char* cur = bb->buffer + (offset / 8); - int bit_offset = offset % 8; - - return (*cur >> bit_offset) & 1; -} - -char get_byte_from_buffer(const bitbuffer* bb, int offset){ - char r = 0; - int i; - - for(i = 0; i < 7; i++){ - r |= get_bit_from_buffer(bb, offset+i); - r <<= 1; - } - r |= get_bit_from_buffer(bb, offset+i); - return r; -} - - -/*int main(){ - bitbuffer* bb = new_bitbuffer(1); - int i, seed = 12244543; - char c; - for(i = 0; i < 25; i++){ - c = (char) ((seed >> i) & 1); - append_bit_to_buffer(c, bb); - printf("%d", c); - } - printf("\n"); - - for(i = 0; i < bb->size; i++){ - printf("%d", get_bit_from_buffer(bb, i)); - } - printf("\n"); - - return 0; -}*/ - diff --git a/dom/Makefile b/dom/Makefile index cc90c13..0dae498 100644 --- a/dom/Makefile +++ b/dom/Makefile @@ -1,8 +1,8 @@ include ../Makefile.inc -OBJS = node.o numbers.o serialize.o huffman.o -includes = ../include/node.h ../include/serializer.h ../include/bitbuffer.h ../includes/huffman.h ../include/byte_buffer.h +OBJS = node.o numbers.o serialize.o +includes = ../include/node.h ../include/serializer.h ../include/byte_buffer.h all: $(OBJS) diff --git a/dom/huffman.c b/dom/huffman.c deleted file mode 100644 index a9f5569..0000000 --- a/dom/huffman.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -Copyright (c) 2010 Frederico Gonçalves, Vasco Fernandes - -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 "../include/huffman.h" -#include "../include/btree.h" -#include "../include/bitbuffer.h" -#include "../include/stack.h" -#include "../include/byte_buffer.h" - -int compare_bc(void* o1, int16_t t1, void* o2, int16_t t2){ - return ((bc*)o2)->count - ((bc*)o1)->count; -} - -void print_btree(btree* node, int depth){ - int i; - for(i = 0; i++ < depth; printf(" ")); - if(node->left == NULL){ - printf("%c:%d\n", ((bc*)(node->value))->byte, ((bc*)(node->value))->count); - } - else{ - printf("| 0\n"); - print_btree(node->left, depth+1); - } - - for(i = 0; i++ < depth; printf(" ")); - if(node->right == NULL){ - printf("%c:%d\n", ((bc*)(node->value))->byte, ((bc*)(node->value))->count); - } - else{ - printf("| 1\n"); - print_btree(node->right, depth+1); - } -} - - - -void pack_huffman_tree(btree* tree, bitbuffer* bb){ - if(tree->left != NULL && tree->right != NULL){ - append_bit_to_buffer(0, bb); - pack_huffman_tree(tree->left, bb); - append_bit_to_buffer(0, bb); - pack_huffman_tree(tree->right, bb); - append_bit_to_buffer(1, bb); - } - else{ - append_bit_to_buffer(1, bb); - bc* node_bc = (bc*)tree->value; - append_bits_to_buffer(node_bc->byte, 8, bb); - } -} - -btree* unpack_huffman_tree(bitbuffer* packed_tree, int* i){ - btree* tree = new_btree(); - - char bit = get_bit_from_buffer(packed_tree, (*i)++); - if(bit == 0){ - tree->left = unpack_huffman_tree(packed_tree, i); - bit = get_bit_from_buffer(packed_tree, (*i)++); - if(bit == 0) tree->right = unpack_huffman_tree(packed_tree, i); - (*i)++; //next value must be 1 - } - else{ - char value = get_byte_from_buffer(packed_tree, *i); - (*i) += 8; - tree->value = alloc(char, 1); - *((char*)tree->value) = value; - } - - return tree; -} - -void set_translation(btree* node){ - bc* node_bc = (bc*)node->value; - bc *left_bc, *right_bc; - - if(node->left != NULL){ - left_bc = (bc*)node->left->value; - left_bc->bb = duplicate_bitbuffer(node_bc->bb); - append_bit_to_buffer(0, left_bc->bb); - set_translation(node->left); - } - - if(node->right != NULL){ - right_bc = (bc*)node->right->value; - right_bc->bb = duplicate_bitbuffer(node_bc->bb); - append_bit_to_buffer(1, right_bc->bb);; - set_translation(node->right); - } -} - -void print_simple_btree(btree* bt, int depth){ - int i; - if(bt->left != NULL){ - for(i = 0; i++ < depth; printf(" ")); - printf("|\n"); - print_simple_btree(bt->left, depth+1); - } - if(bt->right != NULL){ - for(i = 0; i++ < depth; printf(" ")); - printf("|\n"); - print_simple_btree(bt->right, depth+1); - } - if(bt->value != NULL){ - for(i = 0; i++ < depth; printf(" ")); - printf("'%c'\n", *((char*)bt->value)); - } -} - -char* huffman_decode(bitbuffer* bit_string){ - int* offset = alloc(int, 1); - *offset = 0; - btree* ut = unpack_huffman_tree(bit_string, offset); - - int i = *offset; - - btree* ct = ut; - byte_buffer* bb = new_byte_buffer(bit_string->size / 8); - - for(; i < bit_string->size; i++){ - char b = get_bit_from_buffer(bit_string, i); - if(b == 0) ct = ct->left; - else ct = ct->right; - - if(ct->left == NULL && ct->right == NULL){ - append_bytes_to_buffer(ct->value, bb, 1); - ct = ut; - } - } - - char end = 0; - append_bytes_to_buffer(&end, bb, 1); - return bb->buffer; -} - -bitbuffer* huffman_encode(char* byte_string, int size){ - bc* table = alloc(bc, 256); - int i; - - //initialize - for(i = 0; i < 256; i++){ - table[i].count = 0; - table[i].byte = i; - table[i].bt = NULL; - table[i].bb = NULL; - } - - //count - for(i = 0; i < size; i++){ - table[(int)(byte_string[i])].count++; - } - - //sort - list* l = new_generic_list(256); - for(i = 0; i < 256; i++){ - if(table[i].count == 0) continue; - - sorted_insert_element_with_type(l, table+i, 0, &compare_bc); - } - - - while(l->count > 1){ - int16_t t1 = peek_stack_type(l); - bc* c1 = pop_stack(l); - - int16_t t2 = peek_stack_type(l); - bc* c2 = pop_stack(l); - - bc* parent = alloc(bc, 1); - parent->byte = 0; - parent->count = c1->count + c2->count; - parent->bt = new_btree(); - parent->bt->value = parent; - - if(t1 == 0){ - parent->bt->left = new_btree(); - parent->bt->left->value = c1; - } - else {parent->bt->left = c1->bt; } - - if(t2 == 0){ - parent->bt->right = new_btree(); - parent->bt->right->value = c2; - } - else {parent->bt->right = c2->bt; } - - sorted_insert_element_with_type(l, parent, 1, &compare_bc); - } - - bc* root = pop_stack(l); - root->bb = new_bitbuffer(256); - set_translation(root->bt); - bitbuffer* packed_data = new_bitbuffer(256); - pack_huffman_tree(root->bt, packed_data); - - for(i = 0; i < size; i++){ - append_bitbuffer_to_bitbuffer(table[(int)byte_string[i]].bb, packed_data); - } - - - return packed_data; -} -