X-Git-Url: http://www.sigaev.ru/git/gitweb.cgi?a=blobdiff_plain;f=sfxstr.c;h=4a4e4da34ee6277b536ff83ee414e9b94d9f4ec7;hb=b99712a22de6fb3f45b36580e63596aac7e6061c;hp=c107e60f9df28de319aa204cb74ad7f8a09e7cfa;hpb=d3539aea94a979d4725ef4504ae7a118a99496ad;p=tedtools.git diff --git a/sfxstr.c b/sfxstr.c index c107e60..4a4e4da 100644 --- a/sfxstr.c +++ b/sfxstr.c @@ -149,20 +149,28 @@ SFSFindData(SFSTree *info, char *word, int len) { in.key = word; in.keylen = len; - return SFSFindDataOrSave(info, &in, NULL); + return SFSFindDataFromSavedOrSave(info, &in, NULL); } void* SFSFindDataOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *position) { + if ( position ) + memset(position, 0, sizeof(position)); + + return SFSFindDataFromSavedOrSave(info, in, position); +} + +void* +SFSFindDataFromSavedOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *position) { SFSNode *node = info->node; SFSNode **pnode = &(info->node); SFSNodeData *StopLow, *StopHigh, *StopMiddle; u_int8_t *ptr =(u_int8_t*)in->key; - if ( position ) { - position->nodeptr = NULL; - position->node = NULL; - position->level = 0; + if ( position && position->nodeptr && position->node && in->keylen > position->level ) { + node = position->node; + pnode = position->nodeptr; + ptr += position->level; } while( node && !ISEND(ptr, in->key, in->keylen) ) { @@ -173,7 +181,7 @@ SFSFindDataOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *position) { } if ( node->isskip ) { - if ( in->keylen>0 && in->keylen - (((char*)ptr) - in->key) > node->nchar ) + if ( in->keylen>0 && in->keylen - (((char*)ptr) - in->key) < node->nchar ) return NULL; else if ( STRNCMP(ptr, ((char*)node)+node->dataptr, node->nchar) ) { ptr+=node->nchar; @@ -626,11 +634,11 @@ addRecord(SFSTree *info, SFSNode* node, SFSDataIO *in, int level) { else node = splitSkipNode(info, node, in, level); } else { - StopLow = node->data; + StopLow = node->data; StopHigh = StopLow + node->nchar; while (StopLow < StopHigh) { StopMiddle = StopLow + ((StopHigh - StopLow) >> 1); - if ( StopMiddle->val == *ptr ) { + if ( StopMiddle->val == *ptr ) { if ( *(ptr+1)=='\0' ) { if ( StopMiddle->isword ) { /* already exists */