add .gitignore
[tedtools.git] / sfxstr.c
index 4a4e4da..d65bf7c 100644 (file)
--- a/sfxstr.c
+++ b/sfxstr.c
@@ -155,7 +155,7 @@ SFSFindData(SFSTree *info, char *word, int len) {
 void*
 SFSFindDataOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *position) {
        if ( position )
-               memset(position, 0, sizeof(position));
+               memset(position, 0, sizeof(SFSTreePosition));
 
        return SFSFindDataFromSavedOrSave(info, in, position); 
 }
@@ -185,11 +185,13 @@ SFSFindDataFromSavedOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *positi
                                return NULL;
                        else if ( STRNCMP(ptr, ((char*)node)+node->dataptr, node->nchar) ) {
                                ptr+=node->nchar;
-                               if ( ISEND(ptr, in->key, in->keylen) && node->isword) {
-                                       return (void*) ( ((char*)(node->data)) + ((node->haschild) ? sizeof(SFSNode*) : 0) );
+                               if ( ISEND(ptr, in->key, in->keylen) ) {
+                                       if (node->isword)
+                                               return (void*) ( ((char*)(node->data)) + ((node->haschild) ? sizeof(SFSNode*) : 0) );
+                                       return NULL;
                                } else if ( node->haschild ) {
-                                       node = getSkipChildPointer(info, node);
                                        pnode = (SFSNode**)( (char*)(node->data) );
+                                       node = getSkipChildPointer(info, node);
                                } else {
                                        return NULL;
                                }
@@ -202,11 +204,13 @@ SFSFindDataFromSavedOrSave(SFSTree *info, SFSDataIO *in, SFSTreePosition *positi
                                StopMiddle = StopLow + ((StopHigh - StopLow) >> 1);
                                if ( StopMiddle->val == *ptr ) {
                                        ptr++;
-                                       if ( ISEND(ptr, in->key, in->keylen) && StopMiddle->isword ) {
-                                               return (void*)( ((char*)node) + node->dataptr + info->datasize * StopMiddle->data );
+                                       if ( ISEND(ptr, in->key, in->keylen) ) {
+                                               if ( StopMiddle->isword )
+                                                       return (void*)( ((char*)node) + node->dataptr + info->datasize * StopMiddle->data );
+                                               return NULL;
                                        } else if ( StopMiddle->haschild ) {
-                                               node = getChildPointer(info, StopMiddle);
                                                pnode = (SFSNode**)(((char*)StopMiddle) + StopMiddle->child);
+                                               node = getChildPointer(info, StopMiddle);
                                        } else {
                                                return NULL;
                                        }
@@ -228,7 +232,7 @@ void
 SFSAddSaved(SFSTree *info, SFSDataIO *in, SFSTreePosition *position) {
        CHECK_MEMORY(info);
 
-       if ( !(position->nodeptr && position->node) ) {
+       if ( !(position && position->nodeptr && position->node) ) {
                SFSAdd(info, in);
                return;
        }
@@ -799,8 +803,13 @@ SFSIterate(SFSTree *info, SFSDataIO *out) {
                return 1;
        }
 
-       if ( s == NULL || s->node == NULL)
+       if ( s == NULL )
                return 0;
+       if ( s->node == NULL ) {
+               info->stack = s->next;
+               tfree(s);
+               return SFSIterate(info, out);
+       }
                                                         
        while ( s->level + s->node->nchar + 1 >= info->tlen ) {
                info->tlen *= 2;
@@ -1117,8 +1126,9 @@ SFSWriteDump(SFSTree *info, char *filename, void *extradata, u_int32_t extrasize
 
                wp.info = info;
                wp.offset = 0;
-               
-               writeNode(&wp, fd, info->node, extrasize);
+       
+               if ( info->node )
+                       writeNode(&wp, fd, info->node, extrasize);
        }
        
        flock(fd, LOCK_UN);