projects
/
tedtools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add optional length to SFSFindData
[tedtools.git]
/
sfxstr.c
diff --git
a/sfxstr.c
b/sfxstr.c
index
b9a048e
..
0dd5fa7
100644
(file)
--- a/
sfxstr.c
+++ b/
sfxstr.c
@@
-139,17
+139,21
@@
SFSInit_c(SFSTree *info, char **in) {
return info;
}
return info;
}
+#define ISEND(p,w,l) ( (l>0) ? ( ((char*)(p))-(w) < (l) ) : ( *(p) == '\0' ) )
+
void*
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;
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 ( 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;
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);
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++;
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);
return (void*)( ((char*)node) + node->dataptr + info->datasize * StopMiddle->data );
} else if ( StopMiddle->haschild ) {
node = getChildPointer(info, StopMiddle);