Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyGet.c view on Meta::CPAN
// @(#) $Revision: 4.43 $ $Source: /judy/src/JudyCommon/JudyGet.c $
//
// Judy1Test() and JudyLGet() functions for Judy1 and JudyL.
// Compile with one of -DJUDY1 or -DJUDYL.
#if (! (defined(JUDY1) || defined(JUDYL)))
#error: One of -DJUDY1 or -DJUDYL must be specified.
#endif
#ifdef JUDY1
#include "Judy1.h"
#else
#include "JudyL.h"
#endif
#include "JudyPrivate1L.h"
#ifdef TRACEJPR // different macro name, for "retrieval" only.
#include "JudyPrintJP.c"
#endif
// ****************************************************************************
// J U D Y 1 T E S T
// J U D Y L G E T
//
// See the manual entry for details. Note support for "shortcut" entries to
// trees known to start with a JPM.
#ifdef JUDY1
#ifdef JUDYGETINLINE
FUNCTION int j__udy1Test
#else
FUNCTION int Judy1Test
#endif
#else // JUDYL
#ifdef JUDYGETINLINE
FUNCTION PPvoid_t j__udyLGet
#else
FUNCTION PPvoid_t JudyLGet
#endif
#endif // JUDYL
(
#ifdef JUDYGETINLINE
Pvoid_t PArray, // from which to retrieve.
Word_t Index // to retrieve.
#else
Pcvoid_t PArray, // from which to retrieve.
Word_t Index, // to retrieve.
PJError_t PJError // optional, for returning error info.
#endif
)
{
Pjp_t Pjp; // current JP while walking the tree.
Pjpm_t Pjpm; // for global accounting.
uint8_t Digit; // byte just decoded from Index.
Word_t Pop1; // leaf population (number of indexes).
Pjll_t Pjll; // pointer to LeafL.
DBGCODE(uint8_t ParentJPType;)
#ifndef JUDYGETINLINE
if (PArray == (Pcvoid_t) NULL) // empty array.
{
JUDY1CODE(return(0);)
JUDYLCODE(return((PPvoid_t) NULL);)
}
// ****************************************************************************
// PROCESS TOP LEVEL BRANCHES AND LEAF:
if (JU_LEAFW_POP0(PArray) < cJU_LEAFW_MAXPOP1) // must be a LEAFW
{
Pjlw_t Pjlw = P_JLW(PArray); // first word of leaf.
int posidx; // signed offset in leaf.
Pop1 = Pjlw[0] + 1;
posidx = j__udySearchLeafW(Pjlw + 1, Pop1, Index);
if (posidx >= 0)
{
JUDY1CODE(return(1);)
JUDYLCODE(return((PPvoid_t) (JL_LEAFWVALUEAREA(Pjlw, Pop1) + posidx));)
}
JUDY1CODE(return(0);)
JUDYLCODE(return((PPvoid_t) NULL);)
}
#endif // ! JUDYGETINLINE
Pjpm = P_JPM(PArray);
Pjp = &(Pjpm->jpm_JP); // top branch is below JPM.
// ****************************************************************************
// WALK THE JUDY TREE USING A STATE MACHINE:
ContinueWalk: // for going down one level; come here with Pjp set.
#ifdef TRACEJPR
JudyPrintJP(Pjp, "g", __LINE__);
#endif
switch (JU_JPTYPE(Pjp))
{
// Ensure the switch table starts at 0 for speed; otherwise more code is
// executed:
case 0: goto ReturnCorrupt; // save a little code.
// ****************************************************************************
// JPNULL*:
//
// Note: These are legitimate in a BranchU (only) and do not constitute a
// fault.
( run in 0.556 second using v1.01-cache-2.11-cpan-39bf76dae61 )