cst_node cst_canonize(cst_node node) { int c1,c2; cst_node newnode; i64 l, r; i64 i, depth; CSA *csa; newnode = node; csa = node.csa; l = node.l; r = node.r; depth = node.depth; for (i=0; i<depth; i++) { l = csa->psi(csa, l); r = csa->psi(csa, r); } while (1) { c1 = csa->head(csa, l); c2 = csa->head(csa, r); if (c1 != c2) break; l = csa->psi(csa, l); r = csa->psi(csa, r); depth++; } newnode.depth = depth; return newnode; }
cst_node cst_firstchild(cst_node node) { int c; i64 l; i64 i, depth; CSA *csa; cst_node newnode; csa = node.csa; l = node.l; depth = node.depth; for (i=0; i<depth; i++) { l = csa->psi(csa, l); } c = csa->head(csa, l); if (c == -1) { newnode.csa = csa; newnode.depth = depth+1; newnode.depth2 = depth+1; newnode.l = newnode.r = node.l; return newnode; } else { return cst_child(node, csa->AtoC[c]); } }
cst_node cst_nextchild(cst_node node, cst_node child) { int c; i64 l, r; i64 i, depth; CSA *csa; cst_node newnode; csa = node.csa; l = child.r+1; depth = node.depth; if (l > node.r) { newnode.depth = -1; newnode.l = 1; newnode.r = 0; return newnode; } for (i=0; i<depth; i++) { l = csa->psi(csa, l); } c = csa->head(csa, l); if (c == -1) { newnode.csa = csa; newnode.depth = depth+1; newnode.l = newnode.r = node.l; return newnode; } else { return cst_child(node, csa->AtoC[c]); } }
static VALUE rb_csa_head(VALUE self, VALUE oi) { CSA *sa = csa_ptr(self); i64 i, n; int c; i = FIX2LONG(oi); n = sa->n; if (i < 0 || i > n) { // error return Qnil; } c = sa->head(sa, i); return INT2FIX(c); }
int cst_isunary(cst_node node) { int c1,c2; i64 l, r; i64 i, depth; CSA *csa; csa = node.csa; l = node.l; r = node.r; depth = node.depth; for (i=0; i<depth; i++) { l = csa->psi(csa, l); r = csa->psi(csa, r); } c1 = csa->head(csa, l); c2 = csa->head(csa, r); return (c1 == c2); }