diff --git a/C/bignum.c b/C/bignum.c index c34d19c1f..2e696df18 100755 --- a/C/bignum.c +++ b/C/bignum.c @@ -59,6 +59,28 @@ Yap_MkBigIntTerm(MP_INT *big) return AbsAppl(ret); } +Term +Yap_AllocDynamicData(size_t bytes) +{ + CACHE_REGS + Int nlimbs; + MP_INT *dst = (MP_INT *)(H+2); + CELL *ret = H; + + nlimbs = ALIGN_YAPTYPE(bytes,CELL)/CellSize; + if (nlimbs > (ASP-ret)-1024) { + return TermNil; + } + H[0] = (CELL)FunctorBigInt; + H[1] = EXTERNAL_BLOB; + dst->_mp_size = 0; + dst->_mp_alloc = nlimbs; + H = (CELL *)(dst+1)+nlimbs; + H[0] = EndSpecials; + H++; + return AbsAppl(ret); +} + MP_INT * Yap_BigIntOfTerm(Term t) { diff --git a/C/heapgc.c b/C/heapgc.c index ccae4f8cb..4f48e2c4e 100755 --- a/C/heapgc.c +++ b/C/heapgc.c @@ -1325,7 +1325,7 @@ mark_variable(CELL_PTR current USES_REGS) sz++; #if DEBUG if (next[sz] != EndSpecials) { - fprintf(stderr,"[ Error: could not find EndSpecials at blob %p type %lx ]\n", next, next[1]); + fprintf(stderr,"[ Error: could not find EndSpecials at blob %p type " UInt_FORMAT " ]\n", next, next[1]); } #endif MARK(next+sz); @@ -1904,11 +1904,11 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose PredEntry *pe = Yap_PredForChoicePt(gc_B); #if defined(ANALYST) || defined(DEBUG) if (pe == NULL) { - fprintf(GLOBAL_stderr,"%% marked %ld (%s)\n", LOCAL_total_marked, Yap_op_names[opnum]); + fprintf(GLOBAL_stderr,"%% marked " UInt_FORMAT " (%s)\n", LOCAL_total_marked, Yap_op_names[opnum]); } else if (pe->ArityOfPE) { - fprintf(GLOBAL_stderr,"%% %s/%d marked %ld (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, LOCAL_total_marked, Yap_op_names[opnum]); + fprintf(GLOBAL_stderr,"%% %s/%d marked " UInt_FORMAT " (%s)\n", RepAtom(NameOfFunctor(pe->FunctorOfPred))->StrOfAE, pe->ArityOfPE, LOCAL_total_marked, Yap_op_names[opnum]); } else { - fprintf(GLOBAL_stderr,"%% %s marked %ld (%s)\n", RepAtom((Atom)(pe->FunctorOfPred))->StrOfAE, LOCAL_total_marked, Yap_op_names[opnum]); + fprintf(GLOBAL_stderr,"%% %s marked " UInt_FORMAT " (%s)\n", RepAtom((Atom)(pe->FunctorOfPred))->StrOfAE, LOCAL_total_marked, Yap_op_names[opnum]); } #else if (pe == NULL) { diff --git a/H/TermExt.h b/H/TermExt.h index 61c617e6b..d090fa0ea 100755 --- a/H/TermExt.h +++ b/H/TermExt.h @@ -86,7 +86,7 @@ typedef enum CLAUSE_LIST = 0x40, BLOB_STRING = 0x80, /* SWI style strings */ BLOB_WIDE_STRING = 0x81, /* SWI style strings */ - EXTERNAL_BLOB = 0x100 /* for SWI emulation */ + EXTERNAL_BLOB = 0x100 /* generic data */ } big_blob_type; @@ -438,6 +438,25 @@ IsLargeNumTerm (Term t) && (FunctorOfTerm (t) >= FunctorLongInt))); } +inline EXTERN int IsExternalBlobTerm (Term); + +inline EXTERN int +IsExternalBlobTerm (Term t) +{ + return (int) (IsApplTerm (t) && + FunctorOfTerm (t) == FunctorBigInt && + RepAppl(t)[1] == EXTERNAL_BLOB); +} + +inline EXTERN void *ExternalBlobFromTerm (Term); + +inline EXTERN void * +ExternalBlobFromTerm (Term t) +{ + MP_INT *base = (MP_INT *)(RepAppl(t)+2); + return (void *) (base+1); +} + diff --git a/H/Yapproto.h b/H/Yapproto.h index 0c8be2542..06f855e01 100755 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -120,6 +120,7 @@ int STD_PROTO(Yap_IsStringTerm, (Term)); int STD_PROTO(Yap_IsWideStringTerm, (Term)); Term STD_PROTO(Yap_RatTermToApplTerm, (Term)); void STD_PROTO(Yap_InitBigNums, (void)); +Term STD_PROTO(Yap_AllocDynamicData, (size_t)); /* c_interface.c */ Int STD_PROTO(YAP_Execute,(struct pred_entry *, CPredicate));