size_t rem = 0;
size_t i;
size_t n;
+ bool cont;
nodes = (struct node *) malloc(sizeof(struct node) * stree_max_size(len));
if (!nodes) return -1;
aux[i] = (size_t) (active_node - root);
prev = (struct node *) 0;
++rem;
- while (rem > 0) {
- printf("i = %d, active_node = %d, active_edge = %c, active_len = %d, rem = %d\n", (int) i, (int) (active_node - root), (char) active_edge, (int) active_len, (int) (rem - 1));
+ cont = false;
+ while (rem > 0 && !cont) {
if (active_len == 0) {
if (!node_edge_present(active_node, in, i)) {
- printf("creating node %d as child of %d\n", (int) n, (int) (active_node - root));
- printf("remainder is currently %d\n", (int) rem);
- printf("i is currently %d\n", (int) i);
node_init(nodes + n, i);
node_add_son(active_node, nodes + n);
++n;
--rem;
if (active_node != root) {
- if (active_node->link) {
- printf("following link from node %d to %d\n", (int) (active_node - root), (int) (active_node->link - root));
- }
active_node = active_node->link ? active_node->link : root;
if (active_node == root) {
active_len = rem - 1;
active_edge = in[i-active_len];
- while (node_edge_end(active_node, active_edge, active_len, in)) {
- active_node = node_edge(active_node, active_edge, in);
- printf("setting active_edge in first loop to %c\n", (char) active_edge);
- active_len -= active_node->to - active_node->from;
- active_edge = in[i-active_len];
- if (active_len == 0) active_edge = '^';
- }
}
}
} else {
- printf("active_edge is currently %c\n", (char) active_edge);
active_edge = in[i];
- printf("setting active_edge in first branch to %c\n", (char) active_edge);
- printf("i is currently %d\n", (int) i);
++active_len;
- if (node_edge_end(active_node, active_edge, active_len, in)) {
- active_node = node_edge(active_node, active_edge, in);
- active_edge = '^';
- active_len = 0;
- }
- break;
+ cont = true;
}
} else if (active_len > 0) {
if (!node_edge_present_2(active_node, active_edge, active_len, in, i)) {
- printf("creating nodes %d and %d from %d\n", (int) n, (int) n + 1, (int) (active_node - root));
node_init(nodes + n + 1, i);
node_split_son(active_node, active_edge, active_len, nodes + n, nodes + n + 1, in);
if (prev) {
prev->link = nodes + n;
- printf("creating link from node %d to node %d\n", (int) (prev - root), (int) n);
}
prev = nodes + n;
n += 2;
--rem;
- printf("active_edge is currently %c\n", (char) active_edge);
if (active_node == root) {
--active_len;
- printf("setting active_edge in second branch\n");
active_edge = in[i-active_len];
- if (active_len == 0) active_edge = '^';
} else {
- if (active_node->link) {
- printf("following link from node %d to %d\n", (int) (active_node - root), (int) (active_node->link - root));
- }
active_node = active_node->link ? active_node->link : root;
if (active_node == root) {
active_len = rem - 1;
active_edge = in[i-active_len];
}
}
- printf("active_edge is currently %c\n", (char) active_edge);
- printf("remainder is currently %d\n", (int) rem);
- printf("active_node is currently %d\n", (int) (active_node - root));
- while (node_edge_end(active_node, active_edge, active_len, in)) {
- active_node = node_edge(active_node, active_edge, in);
- printf("setting active_node in second loop to %d\n", (int) (active_node - root));
- active_len -= active_node->to - active_node->from;
- active_edge = in[i-active_len];
- printf("setting active_edge in second loop to %c\n", (char) active_edge);
- if (active_len == 0) active_edge = '^';
- }
} else {
++active_len;
- if (node_edge_end(active_node, active_edge, active_len, in)) {
- active_node = node_edge(active_node, active_edge, in);
- active_edge = '^';
- active_len = 0;
- }
- break;
+ cont = true;
}
}
+ while (node_edge_end(active_node, active_edge, active_len, in)) {
+ active_node = node_edge(active_node, active_edge, in);
+ active_len -= active_node->to - active_node->from;
+ active_edge = in[i-active_len];
+ }
}
}
- //node_dbg(root, root, 0, in, len);
-
+#ifndef NDEBUG
if (!node_validate_suffixes(root, len, in, 0)) {
free(nodes);
return -1;
}
+#endif
(void) out; // TODO
free(nodes);