From e72b58a0470edb0b592699c1f47fc5b27cdf1e4f Mon Sep 17 00:00:00 2001 From: teodor Date: Wed, 9 Jul 2008 14:24:33 +0000 Subject: [PATCH] Add optional length to SFSFindData --- sfxstr.c | 14 +++++++++----- sfxstr.h | 2 +- sfxtest.c | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/sfxstr.c b/sfxstr.c index b9a048e..0dd5fa7 100644 --- a/sfxstr.c +++ b/sfxstr.c @@ -139,17 +139,21 @@ SFSInit_c(SFSTree *info, char **in) { return info; } +#define ISEND(p,w,l) ( (l>0) ? ( ((char*)(p))-(w) < (l) ) : ( *(p) == '\0' ) ) + void* -SFSFindData(SFSTree *info, char *word) { +SFSFindData(SFSTree *info, char *word, int len) { SFSNode *node = info->node; SFSNodeData *StopLow, *StopHigh, *StopMiddle; u_int8_t *ptr =(u_int8_t*)word; - while( node && *ptr ) { + while( node && !ISEND(ptr, word, len) ) { if ( node->isskip ) { - if ( STRNCMP(ptr, ((char*)node)+node->dataptr, node->nchar) ) { + if ( len>0 && len - (((char*)ptr) - word) > node->nchar ) + return NULL; + else if ( STRNCMP(ptr, ((char*)node)+node->dataptr, node->nchar) ) { ptr+=node->nchar; - if ( *ptr=='\0' && node->isword) { + if ( ISEND(ptr, word, len) && node->isword) { return (void*) ( ((char*)(node->data)) + ((node->haschild) ? sizeof(SFSNode*) : 0) ); } else if ( node->haschild ) { node = getSkipChildPointer(info, node); @@ -165,7 +169,7 @@ SFSFindData(SFSTree *info, char *word) { StopMiddle = StopLow + ((StopHigh - StopLow) >> 1); if ( StopMiddle->val == *ptr ) { ptr++; - if ( *ptr=='\0' && StopMiddle->isword ) { + if ( ISEND(ptr, word, len) && StopMiddle->isword ) { return (void*)( ((char*)node) + node->dataptr + info->datasize * StopMiddle->data ); } else if ( StopMiddle->haschild ) { node = getChildPointer(info, StopMiddle); diff --git a/sfxstr.h b/sfxstr.h index 84b708e..22f8410 100644 --- a/sfxstr.h +++ b/sfxstr.h @@ -183,7 +183,7 @@ void SFSAdd(SFSTree *info, SFSDataIO *in); * ðÏÉÓË ÚÎÁÞÅÎÉÑ ÐÏ ËÌÀÞÕ, × ÓÌÕÞÁÅ ÕÓÐÅÈÁ ×ÏÚ×ÒÁÝÁÅÔ * ÕËÁÚÁÔÅÌØ ÎÁ ÚÎÁÞÅÎÉÅ, ÉÎÁÞÅ - NULL */ -void* SFSFindData(SFSTree *info, char *word); +void* SFSFindData(SFSTree *info, char *word, int len /* optional */ ); /* * éÎÉÃÉÁÌÉÚÁÃÉÑ ÉÔÅÒÁÔÏÒÁ × ÎÁÞÁÌÏ ÄÅÒÅ×Á diff --git a/sfxtest.c b/sfxtest.c index 393aff5..e42e925 100644 --- a/sfxtest.c +++ b/sfxtest.c @@ -352,7 +352,7 @@ main(int argn, char *argv[]) { len = clrspace(buf); if (!len) continue; - res = SFSFindData(&info,buf); + res = SFSFindData(&info,buf,0); if (verbose) { if (enumerate && res) printf("%d\n", *(int*)(res)); -- 2.37.3