int strrindex(char s[], char t[]) { int tLen = strlen(t); int sLen = strlen(s); if (sLen < tLen) { return -1; } for (int i = sLen - tLen; i >= 0; i--) { if (diffIdx(&s[i], t, tLen) == -1) { return i; } } return -1; }
CNode* CTree::insert(CNode* node, int32_t start, int32_t len, int32_t pos, int8_t depth) { if(node == NULL) { nodeCnt++; return new CLeaf(start, len, pos); } int32_t mini = min<int32_t>(len, node->len); int32_t diff = diffIdx(txt + start, txt + node->id, mini, depth); if(diff == mini) { // total match if(!node->leaf) { // inner node CInnerNode* inner = (CInnerNode *) node; //int8_t idx = bioinf::baseToInt(txt[start + diff]); int8_t idx = txt[start + diff]; inner->children[idx] = insert(inner->children[idx], start + mini, len - mini, pos, depth + mini); return inner; } else { // kmer complete match - add pos CLeaf* leaf = (CLeaf*) node; leaf->pos.push_back(pos); return leaf; } } else { // split on inner nodeCnt += 2; // update old node CInnerNode* parent = splitNode(node, diff); // new leaf CLeaf* leaf = new CLeaf(start + diff, len - diff, pos); //int8_t idx = bioinf::baseToInt(txt[start + diff]); int8_t idx = txt[start + diff]; parent->children[idx] = leaf; return parent; } }