Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudySL/JudySL.c view on Meta::CPAN
else
{
APPEND_SCL(Pscl2, PPValue2, pos2 + WORDSIZE,
len2 - WORDSIZE, PJError);
(Pscl2->scl_Pvalue) = Pscl->scl_Pvalue;
}
// old SCL no longer needed.
JudyFree((void *)Pscl, scl2);
Pscl = (Pscl_t) NULL;
}
}
// APPEND NEXT LEVEL JUDYL ARRAY TO TREE:
//
// If a shortcut leaf was carried down and diverged at this level, the code
// above already appended the new JudyL array, but the next word of the new
// Index still must be inserted in it.
//
// See header comments about premature return().
//
// Note: If JudyLIns() returns JU_ERRNO_NOTJUDYL here, *PPArray should not be
// modified, so JudySLModifyErrno() can do the right thing.
if ((PPValue = JudyLIns(PPArray, indexword, PJError)) == PPJERR)
{
JudySLModifyErrno(PJError, *PPArray, *PPArrayOrig);
return (PPJERR);
}
assert(PPValue != (PPvoid_t) NULL);
// CHECK IF NEW INDEX TERMINATES:
//
// Note that if it does, and an old SCL was being carried down, it must have
// diverged by this point, and is already handled.
if (len <= WORDSIZE)
{
assert(Pscl == (Pscl_t) NULL);
return (PPValue); // is value for whole Index string.
}
pos += WORDSIZE;
len -= WORDSIZE;
pos2 += WORDSIZE; // useless unless Pscl is set.
len2 -= WORDSIZE;
PPArray = PPValue; // each value -> next array.
} // while.
} // NOTREACHED, JudySLIns()
// ****************************************************************************
// J U D Y S L D E L
//
// See the comments in JudySLGet(), which is somewhat similar.
//
// Unlike JudySLGet() and JudySLIns(), recurse downward through the tree of
// JudyL arrays to find and delete the given Index, if present, and then on the
// way back up, any of its parent arrays which ends up empty.
//
// TECHNICAL NOTES:
//
// Recursion seems bad, but this allows for an arbitrary-length Index. Also, a
// more clever iterative solution that used JudyLCount() (see below) would
// still require a function call per tree level, so why not just recurse?
//
// An earlier version (1.20) used a fixed-size stack, which limited the Index
// size. We were going to replace this with using JudyLCount(), in order to
// note and return to (read this carefully) the highest level JudyL array with
// a count of 1, all of whose descendant JudyL arrays also have a count of 1,
// and delete from that point downwards. This solution would traverse the
// array tree downward looking to see if the given Index is in the tree, then
// if so, delete layers downwards starting below the last one that contains
// other Indexes than the one being deleted.
//
// TBD: To save time coding, and to very likely save time overall during
// execution, this function does "lazy deletions", or putting it more nicely,
// it allows "hysteresis" in the JudySL tree, when shortcut leafs are present.
// It only removes the specified Index, and recursively any empty JudyL arrays
// above it, without fully reversing the effects of JudySLIns(). This is
// probably OK because any application that calls JudySLDel() is likely to call
// JudySLIns() again with the same or a neighbor Index.
int
JudySLDel(PPvoid_t PPArray, const uint8_t * Index, PJError_t PJError) // optional, for returning error info.
{
// Check for caller error (null pointer):
if (PPArray == (PPvoid_t) NULL)
{
JU_SET_ERRNO(PJError, JU_ERRNO_NULLPPARRAY);
return (JERR);
}
if (Index == (uint8_t *) NULL)
{
JU_SET_ERRNO(PJError, JU_ERRNO_NULLPINDEX);
return (JERR);
}
// Do the deletion:
return (JudySLDelSub(PPArray, PPArray, Index, STRLEN(Index), PJError));
} // JudySLDel()
// ****************************************************************************
// J U D Y S L D E L S U B
//
// This is the "engine" for JudySLDel() that expects aligned and len to already
// be computed (only once). See the header comments for JudySLDel().
static int
JudySLDelSub(PPvoid_t PPArray, // in which to delete.
PPvoid_t PPArrayOrig, // for error reporting.
const uint8_t * Index, // to delete.
Word_t len, // bytes remaining.
PJError_t PJError) // optional, for returning error info.
{
( run in 0.488 second using v1.01-cache-2.11-cpan-2398b32b56e )