Exemple #1
0
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;
}
Exemple #2
0
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;
    }

}