* * * Operating on a preparsed tree * * * ************************************************************************/
| 1873 | * * |
| 1874 | ************************************************************************/ |
| 1875 | static int |
| 1876 | xmlTextReaderNextTree(xmlTextReaderPtr reader) |
| 1877 | { |
| 1878 | if (reader == NULL) |
| 1879 | return(-1); |
| 1880 | |
| 1881 | if (reader->state == XML_TEXTREADER_END) |
| 1882 | return(0); |
| 1883 | |
| 1884 | if (reader->node == NULL) { |
| 1885 | if (reader->doc->children == NULL) { |
| 1886 | reader->state = XML_TEXTREADER_END; |
| 1887 | return(0); |
| 1888 | } |
| 1889 | |
| 1890 | reader->node = reader->doc->children; |
| 1891 | reader->state = XML_TEXTREADER_START; |
| 1892 | return(1); |
| 1893 | } |
| 1894 | |
| 1895 | if (reader->state != XML_TEXTREADER_BACKTRACK) { |
| 1896 | /* Here removed traversal to child, because we want to skip the subtree, |
| 1897 | replace with traversal to sibling to skip subtree */ |
| 1898 | if (reader->node->next != 0) { |
| 1899 | /* Move to sibling if present,skipping sub-tree */ |
| 1900 | reader->node = reader->node->next; |
| 1901 | reader->state = XML_TEXTREADER_START; |
| 1902 | return(1); |
| 1903 | } |
| 1904 | |
| 1905 | /* if reader->node->next is NULL mean no subtree for current node, |
| 1906 | so need to move to sibling of parent node if present */ |
| 1907 | reader->state = XML_TEXTREADER_BACKTRACK; |
| 1908 | /* This will move to parent if present */ |
| 1909 | xmlTextReaderRead(reader); |
| 1910 | } |
| 1911 | |
| 1912 | if (reader->node->next != 0) { |
| 1913 | reader->node = reader->node->next; |
| 1914 | reader->state = XML_TEXTREADER_START; |
| 1915 | return(1); |
| 1916 | } |
| 1917 | |
| 1918 | if (reader->node->parent != 0) { |
| 1919 | if (reader->node->parent->type == XML_DOCUMENT_NODE) { |
| 1920 | reader->state = XML_TEXTREADER_END; |
| 1921 | return(0); |
| 1922 | } |
| 1923 | |
| 1924 | reader->node = reader->node->parent; |
| 1925 | reader->depth--; |
| 1926 | reader->state = XML_TEXTREADER_BACKTRACK; |
| 1927 | /* Repeat process to move to sibling of parent node if present */ |
| 1928 | xmlTextReaderNextTree(reader); |
| 1929 | } |
| 1930 | |
| 1931 | reader->state = XML_TEXTREADER_END; |
| 1932 |
no test coverage detected