Alien-Judy

 view release on metacpan or  search on metacpan

src/judy-1.0.5/src/JudyCommon/JudyCreateBranch.c  view on Meta::CPAN

        Pjbu_t    PjbuRaw;
        Pjbu_t    Pjbu;
	Pjbb_t	  PjbbRaw;
	Pjbb_t	  Pjbb;
	Word_t	  ii, jj;
	BITMAPB_t BitMap;
	Pjp_t	  PDstJP;
#ifdef JU_STAGED_EXP
	jbu_t	  BranchU;	// Staged uncompressed branch
#else

// Allocate memory for a BranchU:

	PjbuRaw = j__udyAllocJBU(Pjpm);
	if (PjbuRaw == (Pjbu_t) NULL) return(-1);
        Pjbu = P_JBU(PjbuRaw);
#endif
        JU_JPSETADT(&JPNull, 0, 0, JU_JPTYPE(Pjp) - cJU_JPBRANCH_B2 + cJU_JPNULL1);

// Get the pointer to the BranchB:

	PjbbRaw	= (Pjbb_t) (Pjp->jp_Addr);
	Pjbb	= P_JBB(PjbbRaw);

//	Set the pointer to the Uncompressed branch
#ifdef JU_STAGED_EXP
	PDstJP = BranchU.jbu_jp;
#else
        PDstJP = Pjbu->jbu_jp;
#endif
	for (ii = 0; ii < cJU_NUMSUBEXPB; ii++)
	{
		Pjp_t	PjpA;
		Pjp_t	PjpB;

		PjpB = PjpA = P_JP(JU_JBB_PJP(Pjbb, ii));

//		Get the bitmap for this subexpanse
		BitMap	= JU_JBB_BITMAP(Pjbb, ii);

//		NULL empty subexpanses
		if (BitMap == 0)
		{
//			But, fill with NULLs
			for (jj = 0; jj < cJU_BITSPERSUBEXPB; jj++)
			{
				PDstJP[jj] = JPNull;
			}
			PDstJP += cJU_BITSPERSUBEXPB;
			continue;
		}
//		Check if Uncompressed subexpanse
		if (BitMap == cJU_FULLBITMAPB)
		{
//			Copy subexpanse to the Uncompressed branch intact
			JU_COPYMEM(PDstJP, PjpA, cJU_BITSPERSUBEXPB);

//			Bump to next subexpanse
			PDstJP += cJU_BITSPERSUBEXPB;

//			Set length of subexpanse
			jj = cJU_BITSPERSUBEXPB;
		}
		else
		{
			for (jj = 0; jj < cJU_BITSPERSUBEXPB; jj++)
			{
//				Copy JP or NULLJP depending on bit
				if (BitMap & 1) { *PDstJP = *PjpA++; }
				else		{ *PDstJP = JPNull; }

				PDstJP++;	// advance to next JP
				BitMap >>= 1;
			}
			jj = PjpA - PjpB;
		}

// Free the subexpanse:

		j__udyFreeJBBJP(JU_JBB_PJP(Pjbb, ii), jj, Pjpm);

	} // for each JP in BranchU

#ifdef JU_STAGED_EXP

// Allocate memory for a BranchU:

	PjbuRaw = j__udyAllocJBU(Pjpm);
	if (PjbuRaw == (Pjbu_t) NULL) return(-1);
        Pjbu = P_JBU(PjbuRaw);

// Copy staged branch to newly allocated branch:
//
// TBD:  I think this code is broken.

	*Pjbu = BranchU;

#endif // JU_STAGED_EXP

// Finally free the BranchB and put the BranchU in its place:

	j__udyFreeJBB(PjbbRaw, Pjpm);

	Pjp->jp_Addr  = (Word_t) PjbuRaw;
	Pjp->jp_Type += cJU_JPBRANCH_U - cJU_JPBRANCH_B;

	return(1);

} // j__udyCreateBranchU()



( run in 1.077 second using v1.01-cache-2.11-cpan-13bb782fe5a )