* xmlTextReaderReadTree: * @reader: the xmlTextReaderPtr used * * Moves the position of the current instance to the next node in * the stream, exposing its properties. * * Returns 1 if the node was read successfully, 0 if there is no more * nodes to read, or -1 in case of error */
| 1895 | * nodes to read, or -1 in case of error |
| 1896 | */ |
| 1897 | static int |
| 1898 | xmlTextReaderReadTree(xmlTextReaderPtr reader) { |
| 1899 | if (reader->state == XML_TEXTREADER_END) |
| 1900 | return(0); |
| 1901 | |
| 1902 | next_node: |
| 1903 | if (reader->node == NULL) { |
| 1904 | if (reader->doc->children == NULL) { |
| 1905 | reader->state = XML_TEXTREADER_END; |
| 1906 | return(0); |
| 1907 | } |
| 1908 | |
| 1909 | reader->node = reader->doc->children; |
| 1910 | reader->state = XML_TEXTREADER_START; |
| 1911 | goto found_node; |
| 1912 | } |
| 1913 | |
| 1914 | if ((reader->state != XML_TEXTREADER_BACKTRACK) && |
| 1915 | (reader->node->type != XML_DTD_NODE) && |
| 1916 | (reader->node->type != XML_XINCLUDE_START) && |
| 1917 | (reader->node->type != XML_ENTITY_REF_NODE)) { |
| 1918 | if (reader->node->children != NULL) { |
| 1919 | reader->node = reader->node->children; |
| 1920 | reader->depth++; |
| 1921 | reader->state = XML_TEXTREADER_START; |
| 1922 | goto found_node; |
| 1923 | } |
| 1924 | |
| 1925 | if (reader->node->type == XML_ATTRIBUTE_NODE) { |
| 1926 | reader->state = XML_TEXTREADER_BACKTRACK; |
| 1927 | goto found_node; |
| 1928 | } |
| 1929 | } |
| 1930 | |
| 1931 | if (reader->node->next != NULL) { |
| 1932 | reader->node = reader->node->next; |
| 1933 | reader->state = XML_TEXTREADER_START; |
| 1934 | goto found_node; |
| 1935 | } |
| 1936 | |
| 1937 | if (reader->node->parent != NULL) { |
| 1938 | if ((reader->node->parent->type == XML_DOCUMENT_NODE) || |
| 1939 | (reader->node->parent->type == XML_HTML_DOCUMENT_NODE)) { |
| 1940 | reader->state = XML_TEXTREADER_END; |
| 1941 | return(0); |
| 1942 | } |
| 1943 | |
| 1944 | reader->node = reader->node->parent; |
| 1945 | reader->depth--; |
| 1946 | reader->state = XML_TEXTREADER_BACKTRACK; |
| 1947 | goto found_node; |
| 1948 | } |
| 1949 | |
| 1950 | reader->state = XML_TEXTREADER_END; |
| 1951 | |
| 1952 | found_node: |
| 1953 | if ((reader->node->type == XML_XINCLUDE_START) || |
| 1954 | (reader->node->type == XML_XINCLUDE_END)) |