diff --git a/.configure-custom.sh b/.configure-custom.sh index 9c3f011d5..12243128a 100644 --- a/.configure-custom.sh +++ b/.configure-custom.sh @@ -1,2 +1,20 @@ -ENABLE_VARS="jit|no|WITH_JIT clpbn|yes|WITH_CLPBN cplint|yes|WITH_CPLINT horus|yes|WITH_HORUS docs|no|WITH_DOCS problog|yes|WITH_PROBLOG" -WITH_VARS="swig|yes|WITH_SWIG gecode|yes|WITH_GECODE R|yes|WITH_REAL cudd|yes|WITH_BDD python|yes|WITH_PYTHON " +ENABLE_VARS="clpbn|yes|WITH_CLPBN \ + cplint|yes|WITH_CPLINT \ + horus|yes|WITH_HORUS \ + clpr|yes|WITH_CLPR \ + problog|yes|WITH_PROBLOG \ + jit|no|WITH_JIT \ + chr|no|WITH_CHR \ + threads|no|WITH_THREADS" +WITH_VARS="swig|yes|WITH_SWIG \ + mpi|yes|WITH_MPI \ + gecode|yes|WITH_GECODE \ + docs|yes|WITH_DOCS \ + r|yes|WITH_REAL \ + cudd|yes|WITH_CUDD \ + xml2|yes|WITH_XML2 \ + raptor|yes|WITH_RAPTOR \ + python|yes|WITH_PYTHON \ + openssl|yes|WITH_OPENSSL\ + readline|yes|WITH_READLINE \ + gmp|yes|WITH_GMP " diff --git a/.gitignore b/.gitignore index e9a3c5a7c..634f7d844 100644 --- a/.gitignore +++ b/.gitignore @@ -203,3 +203,5 @@ packages/python/yap_kernel/x/__init__.py packages/python/yap_kernel/x/__main__.py *.gch +mxe +build diff --git a/C/absmi.c b/C/absmi.c index a33b8e760..f4fa7a75a 100755 --- a/C/absmi.c +++ b/C/absmi.c @@ -902,7 +902,8 @@ static void undef_goal(USES_REGS1) { PP = pe; } #endif - if (pe->PredFlags & (DynamicPredFlag | LogUpdatePredFlag | MultiFileFlag)) { + if (pe->PredFlags & (DynamicPredFlag | LogUpdatePredFlag | MultiFileFlag) || + pe == UndefCode) { #if defined(YAPOR) || defined(THREADS) UNLOCKPE(19, PP); PP = NULL; diff --git a/C/absmi_insts.i b/C/absmi_insts.i index 55257cc1c..8c70a2895 100644 --- a/C/absmi_insts.i +++ b/C/absmi_insts.i @@ -8160,12 +8160,7 @@ saveregs(); d0 = p_plus(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_PreProcessedError(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } + } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); diff --git a/C/adtdefs.c b/C/adtdefs.c index 1b8fb6a0c..f067d5965 100755 --- a/C/adtdefs.c +++ b/C/adtdefs.c @@ -51,28 +51,20 @@ uint64_t HashFunction(const unsigned char *CHP) { */ } -uint64_t WideHashFunction(wchar_t *CHP) { - UInt hash = 5381; - - UInt c; - - while ((c = *CHP++) != '\0') { - hash = hash * 33 ^ c; - } - return hash; -} - /* this routine must be run at least having a read lock on ae */ static Prop GetFunctorProp(AtomEntry *ae, arity_t arity) { /* look property list of atom a for kind */ - FunctorEntry *pp; - pp = RepFunctorProp(ae->PropsOfAE); - while (!EndOfPAEntr(pp) && - (!IsFunctorProperty(pp->KindOfPE) || pp->ArityOfFE != arity)) - pp = RepFunctorProp(pp->NextOfPE); - return (AbsFunctorProp(pp)); + PropEntry *p = ae->PropsOfAE; + while (p != NIL) { + if (p->KindOfPE == FunctorProperty && + RepFunctorProp(p)->ArityOfFE == arity) { + return p; + } + p = p->NextOfPE; + } + return NIL; } /* vsc: We must guarantee that IsVarTerm(functor) returns true! */ @@ -153,19 +145,6 @@ static inline Atom SearchAtom(const unsigned char *p, Atom a) { return (NIL); } -static inline Atom SearchWideAtom(const wchar_t *p, Atom a) { - AtomEntry *ae; - - /* search atom in chain */ - while (a != NIL) { - ae = RepAtom(a); - if (wcscmp((wchar_t *)ae->StrOfAE, p) == 0) { - return a; - } - a = ae->NextOfAE; - } - return (NIL); -} static Atom LookupAtom(const unsigned char *atom) { /* lookup atom in atom table */ @@ -180,7 +159,6 @@ LookupAtom(const unsigned char *atom) { /* lookup atom in atom table */ hash = HashFunction(p); hash = hash % sz; - /* we'll start by holding a read lock in order to avoid contention */ READ_LOCK(HashChain[hash].AERWLock); a = HashChain[hash].Entry; @@ -224,145 +202,10 @@ LookupAtom(const unsigned char *atom) { /* lookup atom in atom table */ if (NOfAtoms > 2 * AtomHashTableSize) { Yap_signal(YAP_CDOVF_SIGNAL); } + return na; } -static Atom -LookupWideAtom(const wchar_t *atom) { /* lookup atom in atom table */ - CELL hash; - wchar_t *p; - Atom a, na; - AtomEntry *ae; - UInt sz; - WideAtomEntry *wae; - - /* compute hash */ - p = (wchar_t *)atom; - hash = WideHashFunction(p) % WideAtomHashTableSize; - /* we'll start by holding a read lock in order to avoid contention */ - READ_LOCK(WideHashChain[hash].AERWLock); - a = WideHashChain[hash].Entry; - /* search atom in chain */ - na = SearchWideAtom(atom, a); - if (na != NIL) { - READ_UNLOCK(WideHashChain[hash].AERWLock); - return (na); - } - READ_UNLOCK(WideHashChain[hash].AERWLock); - /* we need a write lock */ - WRITE_LOCK(WideHashChain[hash].AERWLock); -/* concurrent version of Yap, need to take care */ -#if defined(YAPOR) || defined(THREADS) - if (a != WideHashChain[hash].Entry) { - a = WideHashChain[hash].Entry; - na = SearchWideAtom(atom, a); - if (na != NIL) { - WRITE_UNLOCK(WideHashChain[hash].AERWLock); - return na; - } - } -#endif - /* add new atom to start of chain */ - sz = wcslen(atom); - ae = (AtomEntry *)Yap_AllocAtomSpace((size_t)(((AtomEntry *)NULL) + 1) + - sizeof(wchar_t) * (sz + 1)); - if (ae == NULL) { - WRITE_UNLOCK(WideHashChain[hash].AERWLock); - return NIL; - } - wae = (WideAtomEntry *)Yap_AllocAtomSpace(sizeof(WideAtomEntry)); - if (wae == NULL) { - WRITE_UNLOCK(WideHashChain[hash].AERWLock); - return NIL; - } - na = AbsAtom(ae); - ae->PropsOfAE = AbsWideAtomProp(wae); - wae->NextOfPE = NIL; - wae->KindOfPE = WideAtomProperty; - wae->SizeOfAtom = sz; - if (ae->WStrOfAE != atom) - wcscpy(ae->WStrOfAE, atom); - NOfAtoms++; - ae->NextOfAE = a; - WideHashChain[hash].Entry = na; - INIT_RWLOCK(ae->ARWLock); - WRITE_UNLOCK(WideHashChain[hash].AERWLock); - - if (NOfWideAtoms > 2 * WideAtomHashTableSize) { - Yap_signal(YAP_CDOVF_SIGNAL); - } - return na; -} - -Atom Yap_LookupMaybeWideAtom( - const wchar_t *atom) { /* lookup atom in atom table */ - wchar_t *p = (wchar_t *)atom, c; - size_t len = 0; - unsigned char *ptr, *ptr0; - Atom at; - - while ((c = *p++)) { - if (c > 255) - return LookupWideAtom(atom); - len++; - } - /* not really a wide atom */ - p = (wchar_t *)atom; - ptr0 = ptr = Yap_AllocCodeSpace(len + 1); - if (!ptr) - return NIL; - while ((*ptr++ = *p++)) - ; - at = LookupAtom(ptr0); - Yap_FreeCodeSpace(ptr0); - return at; -} - -Atom Yap_LookupMaybeWideAtomWithLength( - const wchar_t *atom, size_t len0) { /* lookup atom in atom table */ - Atom at; - int wide = FALSE; - size_t i = 0; - - while (i < len0) { - // primary support for atoms with null chars - wchar_t c = atom[i]; - if (c >= 255) { - wide = true; - break; - } - if (c == '\0') { - wide = true; - break; - } - i++; - } - if (wide) { - wchar_t *ptr0; - - ptr0 = (wchar_t *)Yap_AllocCodeSpace(sizeof(wchar_t) * (len0 + 2)); - if (!ptr0) - return NIL; - memcpy(ptr0, atom, (len0 + 1) * sizeof(wchar_t)); - ptr0[len0] = '\0'; - at = LookupWideAtom(ptr0); - Yap_FreeCodeSpace((char *)ptr0); - return at; - } else { - unsigned char *ptr0; - - ptr0 = Yap_AllocCodeSpace((len0 + 2)); - if (!ptr0) - return NIL; - for (i = 0; i < len0; i++) - ptr0[i] = atom[i]; - ptr0[len0] = '\0'; - at = LookupAtom(ptr0); - Yap_FreeCodeSpace(ptr0); - return at; - } -} - Atom Yap_LookupAtomWithLength(const char *atom, size_t len0) { /* lookup atom in atom table */ Atom at; @@ -388,9 +231,6 @@ Atom Yap_ULookupAtom( return LookupAtom(atom); } -Atom Yap_LookupWideAtom(const wchar_t *atom) { /* lookup atom in atom table */ - return LookupWideAtom(atom); -} Atom Yap_FullLookupAtom(const char *atom) { /* lookup atom in atom table */ Atom t; @@ -809,8 +649,8 @@ Prop Yap_NewPredPropByFunctor(FunctorEntry *fe, Term cur_mod) { p->cs.p_code.ExpandCode = EXPAND_OP_CODE; p->TimeStampOfPred = 0L; p->LastCallOfPred = LUCALL_ASSERT; - p->MetaEntryOfPred = NULL; - if (cur_mod == TermProlog) + p->MetaEntryOfPred = NULL; + if (cur_mod == TermProlog) p->ModuleOfPred = 0L; else p->ModuleOfPred = cur_mod; @@ -947,8 +787,8 @@ Prop Yap_NewPredPropByAtom(AtomEntry *ae, Term cur_mod) { p->OpcodeOfPred = UNDEF_OPCODE; p->cs.p_code.ExpandCode = EXPAND_OP_CODE; p->CodeOfPred = p->cs.p_code.TrueCodeOfPred = (yamop *)(&(p->OpcodeOfPred)); - p->MetaEntryOfPred = NULL; - if (cur_mod == TermProlog) + p->MetaEntryOfPred = NULL; + if (cur_mod == TermProlog) p->ModuleOfPred = 0; else p->ModuleOfPred = cur_mod; diff --git a/C/agc.c b/C/agc.c index de697b565..5a4b74f85 100755 --- a/C/agc.c +++ b/C/agc.c @@ -427,12 +427,7 @@ clean_atom_list(AtomHashEntry *HashPtr) Yap_FreeCodeSpace((char *)b); GLOBAL_agc_collected += sizeof(YAP_BlobPropEntry); GLOBAL_agc_collected += sizeof(AtomEntry)+sizeof(size_t)+at->rep.blob->length; - } else if (IsWideAtom(atm)) { -#ifdef DEBUG_RESTORE3 - fprintf(stderr, "Purged %p:%S\n", at, at->WStrOfAE); -#endif - GLOBAL_agc_collected += sizeof(AtomEntry)+wcslen(at->WStrOfAE); - } else { + } else { #ifdef DEBUG_RESTORE3 fprintf(stderr, "Purged %p:%s patm=%p %p\n", at, at->StrOfAE, patm, at->NextOfAE); #endif @@ -459,11 +454,6 @@ clean_atoms(void) clean_atom_list(HashPtr); HashPtr++; } - HashPtr = WideHashChain; - for (i = 0; i < WideAtomHashTableSize; ++i) { - clean_atom_list(HashPtr); - HashPtr++; - } clean_atom_list(&INVISIBLECHAIN); { AtomHashEntry list; diff --git a/C/alloc.c b/C/alloc.c index 3987d04f5..395d9ab5f 100644 --- a/C/alloc.c +++ b/C/alloc.c @@ -1,4 +1,4 @@ -/************************************************************************* + /************************************************************************* * * * YAP Prolog * * * @@ -90,7 +90,7 @@ void *my_realloc(void *ptr, size_t sz) { p = realloc(ptr, sz); if (Yap_do_low_level_trace) - fprintf(stderr, "+ %p -> %p : %lu\n", ptr, p, sz); + // fprintf(stderr, "+ %p -> %p : %lu\n", ptr, p, sz); // Yap_DebugPuts(stderr,"gof\n"); if (sz > 500 && write_malloc++ > 0) __android_log_print(ANDROID_LOG_ERROR, "YAPDroid ", "* %d %p", write_malloc, @@ -671,7 +671,7 @@ static char *AllocHeap(size_t size) { LOCK(FreeBlocksLock); if ((b = GetBlock(size))) { if (b->b_size >= size + 24 + 1) { - n = (BlockHeader *)(((YAP_SEG_SIZE *)b) + size + 1); + n = (BlockHeader *)(((YAP_SEG_SIZE *)b) + size + 1)v; n->b_size = b->b_size - size - 1; b->b_size = size; AddToFreeList(n); diff --git a/C/arith1.c b/C/arith1.c index cb0a9cba6..0c7d45798 100644 --- a/C/arith1.c +++ b/C/arith1.c @@ -20,9 +20,9 @@ static char SccsId[] = "%W% %G%"; /** @file arith1.c - + @addtogroup arithmetic_operators - + - exp( _X_) [ISO]

@anchor exp_1 Natural exponential. @@ -109,7 +109,7 @@ static char SccsId[] = "%W% %G%"; - integer( _X_)

@anchor integer_1_op - If _X_ evaluates to a float, the integer between the value of _X_ and 0 closest to the value of _X_, else if _X_ evaluates to an + If _X_ evaluates to a float, the integer between the value of _X_ and 0 closest to the value of _X_, else if _X_ evaluates to an integer, the value of _X_. - float( _X_) [ISO]

@anchor float_1_op @@ -178,7 +178,7 @@ A = 3602879701896397 rdiv 36028797018963968 Convert the expression _X_ to a rational number or integer. The function is similar to [rational/1](@ref rational_1), but the result is only accurate within the rounding error of floating point numbers, generally producing a much - smaller denominator. + smaller denominator. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~prolog ?- A is rationalize(0.25). @@ -298,24 +298,24 @@ get_float(Term t) { #else static double my_rint(double x) -{ - double y, z; - Int n; - - if (x >= 0) { - y = x + 0.5; - z = floor(y); - n = (Int) z; +{ + double y, z; + Int n; + + if (x >= 0) { + y = x + 0.5; + z = floor(y); + n = (Int) z; if (y == z && n % 2) - return(z-1); - } else { - y = x - 0.5; - z = ceil(y); - n = (Int) z; + return(z-1); + } else { + y = x - 0.5; + z = ceil(y); + n = (Int) z; if (y == z && n % 2) - return(z+1); + return(z+1); } - return(z); + return(z); } #endif @@ -326,7 +326,7 @@ msb(Int inp USES_REGS) /* calculate the most significant bit for an integer */ Int out = 0; if (inp < 0) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), "msb/1 received %d", inp); } @@ -363,7 +363,7 @@ lsb(Int inp USES_REGS) /* calculate the least significant bit for an integer */ Int out = 0; if (inp < 0) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), "msb/1 received %d", inp); } if (inp==0) @@ -387,7 +387,7 @@ popcount(Int inp USES_REGS) /* calculate the least significant bit for an intege Int c = 0, j = 0, m = ((CELL)1); if (inp < 0) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(inp), "popcount/1 received %d", inp); } if (inp==0) @@ -412,7 +412,7 @@ eval1(Int fi, Term t USES_REGS) { { #ifdef USE_GMP Int i = IntegerOfTerm(t); - + if (i == Int_MIN) { return Yap_gmp_neg_int(i); } @@ -434,7 +434,7 @@ eval1(Int fi, Term t USES_REGS) { case long_int_e: RINT(~IntegerOfTerm(t)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "\\(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "\\(%f)", FloatOfTerm(t)); case big_int_e: #ifdef USE_GMP return Yap_gmp_unot_big(t); @@ -450,7 +450,7 @@ eval1(Int fi, Term t USES_REGS) { if (dbl >= 0) { RFLOAT(log(dbl)); } else { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, "log(%f)", dbl); + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "log(%f)", dbl); } } case op_log10: @@ -459,7 +459,7 @@ eval1(Int fi, Term t USES_REGS) { if (dbl >= 0) { RFLOAT(log10(dbl)); } else { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, "log10(%f)", dbl); + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "log10(%f)", dbl); } } case op_sqrt: @@ -468,7 +468,7 @@ eval1(Int fi, Term t USES_REGS) { out = sqrt(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "sqrt(%f)", dbl); + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "sqrt(%f)", dbl); } #endif RFLOAT(out); @@ -517,7 +517,7 @@ eval1(Int fi, Term t USES_REGS) { out = asin(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "asin(%f)", dbl); + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "asin(%f)", dbl); } #endif RFLOAT(out); @@ -530,7 +530,7 @@ eval1(Int fi, Term t USES_REGS) { out = acos(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "acos(%f)", dbl); + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t, "acos(%f)", dbl); } #endif RFLOAT(out); @@ -543,7 +543,7 @@ eval1(Int fi, Term t USES_REGS) { out = atan(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "atan(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "atan(%f)", dbl); } #endif RFLOAT(out); @@ -556,7 +556,7 @@ eval1(Int fi, Term t USES_REGS) { out = asinh(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "asinh(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "asinh(%f)", dbl); } #endif RFLOAT(out); @@ -569,7 +569,7 @@ eval1(Int fi, Term t USES_REGS) { out = acosh(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "acosh(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "acosh(%f)", dbl); } #endif RFLOAT(out); @@ -582,7 +582,7 @@ eval1(Int fi, Term t USES_REGS) { out = atanh(dbl); #if HAVE_ISNAN if (isnan(out)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "atanh(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "atanh(%f)", dbl); } #endif RFLOAT(out); @@ -645,12 +645,12 @@ eval1(Int fi, Term t USES_REGS) { } #if HAVE_ISNAN if (isnan(dbl)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); } #endif #if HAVE_ISINF if (isinf(dbl)) { - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ (%f)",dbl); } #endif @@ -674,12 +674,12 @@ eval1(Int fi, Term t USES_REGS) { } #if HAVE_ISNAN if (isnan(dbl)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); } #endif #if HAVE_ISINF if (isinf(dbl)) { - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ (%f)",dbl); } #endif @@ -704,12 +704,12 @@ eval1(Int fi, Term t USES_REGS) { } #if HAVE_ISNAN if (isnan(dbl)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); } #endif #if HAVE_ISINF if (isinf(dbl)) { - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ (%f)",dbl); } #endif @@ -734,18 +734,18 @@ eval1(Int fi, Term t USES_REGS) { } #if HAVE_ISNAN if (isnan(dbl)) { - return Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); + Yap_ArithError(DOMAIN_ERROR_OUT_OF_RANGE, t, "integer(%f)", dbl); } #endif #if HAVE_ISINF if (isinf(dbl)) { - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer (%f)",dbl); + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer (%f)",dbl); } #endif if (dbl < 0.0) RBIG_FL(ceil(dbl)); else - RBIG_FL(floor(dbl)); + RBIG_FL(floor(dbl)); } case op_float: switch (ETypeOfTerm(t)) { @@ -804,7 +804,7 @@ eval1(Int fi, Term t USES_REGS) { case long_int_e: RINT(msb(IntegerOfTerm(t) PASS_REGS)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "msb(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "msb(%f)", FloatOfTerm(t)); case big_int_e: #ifdef USE_GMP return Yap_gmp_msb(t); @@ -817,7 +817,7 @@ eval1(Int fi, Term t USES_REGS) { case long_int_e: RINT(lsb(IntegerOfTerm(t) PASS_REGS)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "lsb(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "lsb(%f)", FloatOfTerm(t)); case big_int_e: #ifdef USE_GMP return Yap_gmp_lsb(t); @@ -830,7 +830,7 @@ eval1(Int fi, Term t USES_REGS) { case long_int_e: RINT(popcount(IntegerOfTerm(t) PASS_REGS)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount(%f)", FloatOfTerm(t)); case big_int_e: #ifdef USE_GMP return Yap_gmp_popcount(t); @@ -842,7 +842,7 @@ eval1(Int fi, Term t USES_REGS) { switch (ETypeOfTerm(t)) { case long_int_e: if (isoLanguageFlag()) { /* iso */ - return Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_fractional_part(%f)", IntegerOfTerm(t)); + Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_fractional_part(%f)", IntegerOfTerm(t)); } else { RFLOAT(0.0); } @@ -863,7 +863,7 @@ eval1(Int fi, Term t USES_REGS) { case op_fintp: switch (ETypeOfTerm(t)) { case long_int_e: - return Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_integer_part(%f)", IntegerOfTerm(t)); + Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_integer_part(%f)", IntegerOfTerm(t)); case double_e: RFLOAT(rint(FloatOfTerm(t))); break; @@ -901,7 +901,7 @@ eval1(Int fi, Term t USES_REGS) { case long_int_e: RINT(Yap_random()*IntegerOfTerm(t)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "random(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "random(%f)", FloatOfTerm(t)); case big_int_e: #ifdef USE_GMP return Yap_gmp_mul_float_big(Yap_random(), t); @@ -967,7 +967,7 @@ Yap_NameOfUnaryOp(int i) return Yap_LookupAtom(InitUnTab[i].OpName); } -static Int +static Int p_unary_is( USES_REGS1 ) { /* X is Y */ Term t = Deref(ARG2); @@ -1017,7 +1017,7 @@ p_unary_is( USES_REGS1 ) return(FALSE); } -static Int +static Int p_unary_op_as_integer( USES_REGS1 ) { /* X is Y */ Term t = Deref(ARG1); @@ -1075,4 +1075,3 @@ Yap_ReInitUnaryExps(void) { return TRUE; } - diff --git a/C/arith2.c b/C/arith2.c index 4551bf8da..ddce481a5 100644 --- a/C/arith2.c +++ b/C/arith2.c @@ -150,7 +150,7 @@ p_mod(Term t1, Term t2 USES_REGS) { Int mod; if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " mod 0", i1); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " mod 0", i1); if (i1 == Int_MIN && i2 == -1) { return MkIntTerm(0); } @@ -160,7 +160,7 @@ p_mod(Term t1, Term t2 USES_REGS) { RINT(mod); } case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2"); case (CELL)big_int_e: #ifdef USE_GMP return Yap_gmp_mod_int_big(IntegerOfTerm(t1), t2); @@ -170,7 +170,7 @@ p_mod(Term t1, Term t2 USES_REGS) { break; } case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "mod/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "mod/2"); case (CELL)big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -180,14 +180,14 @@ p_mod(Term t1, Term t2 USES_REGS) { Int i2 = IntegerOfTerm(t2); if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... mod 0"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... mod 0"); return Yap_gmp_mod_big_int(t1, i2); } case (CELL)big_int_e: /* two bignums */ return Yap_gmp_mod_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2"); default: RERROR(); } @@ -210,12 +210,12 @@ p_div2(Term t1, Term t2 USES_REGS) { Int res, mod; if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " div 0", i1); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " div 0", i1); if (i1 == Int_MIN && i2 == -1) { #ifdef USE_GMP return Yap_gmp_add_ints(Int_MAX, 1); #else - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, t1, + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, t1, "// /2 with %d and %d", i1, i2); #endif } @@ -226,7 +226,7 @@ p_div2(Term t1, Term t2 USES_REGS) { RINT(res); } case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); case (CELL)big_int_e: #ifdef USE_GMP return Yap_gmp_div_int_big(IntegerOfTerm(t1), t2); @@ -236,7 +236,7 @@ p_div2(Term t1, Term t2 USES_REGS) { break; } case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); case (CELL)big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -246,14 +246,14 @@ p_div2(Term t1, Term t2 USES_REGS) { Int i2 = IntegerOfTerm(t2); if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... div 0"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... div 0"); return Yap_gmp_div2_big_int(t1, i2); } case (CELL)big_int_e: /* two bignums */ return Yap_gmp_div2_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "div/2"); default: RERROR(); } @@ -275,14 +275,14 @@ p_rem(Term t1, Term t2 USES_REGS) { Int i2 = IntegerOfTerm(t2); if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " rem 0", i1); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " rem 0", i1); if (i1 == Int_MIN && i2 == -1) { return MkIntTerm(0); } RINT(i1%i2); } case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rem/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rem/2"); case (CELL)big_int_e: #ifdef USE_GMP return Yap_gmp_rem_int_big(IntegerOfTerm(t1), t2); @@ -292,19 +292,19 @@ p_rem(Term t1, Term t2 USES_REGS) { } break; case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "rem/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "rem/2"); case (CELL)big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { case long_int_e: if (IntegerOfTerm(t2) == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... rem 0"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... rem 0"); return Yap_gmp_rem_big_int(t1, IntegerOfTerm(t2)); case (CELL)big_int_e: /* two bignums */ return Yap_gmp_rem_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rem/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rem/2"); default: RERROR(); } @@ -320,7 +320,7 @@ p_rdiv(Term t1, Term t2 USES_REGS) { #ifdef USE_GMP switch (ETypeOfTerm(t1)) { case (CELL)double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rdiv/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rdiv/2"); case (CELL)long_int_e: switch (ETypeOfTerm(t2)) { case (CELL)long_int_e: @@ -330,7 +330,7 @@ p_rdiv(Term t1, Term t2 USES_REGS) { Int i2 = IntegerOfTerm(t2); if (i2 == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " rdiv 0", i1); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is " Int_FORMAT " rdiv 0", i1); return Yap_gmq_rdiv_int_int(i1, i2); } case (CELL)big_int_e: @@ -344,13 +344,13 @@ p_rdiv(Term t1, Term t2 USES_REGS) { switch (ETypeOfTerm(t2)) { case long_int_e: if (IntegerOfTerm(t2) == 0) - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... rdiv 0"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "X is ... rdiv 0"); /* I know the term is much larger, so: */ return Yap_gmq_rdiv_big_int(t1, IntegerOfTerm(t2)); case (CELL)big_int_e: return Yap_gmq_rdiv_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rdiv/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "rdiv/2"); default: RERROR(); } @@ -449,7 +449,7 @@ p_xor(Term t1, Term t2 USES_REGS) /* two integers */ RINT(IntegerOfTerm(t1) ^ IntegerOfTerm(t2)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "#/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "#/2"); case big_int_e: #ifdef USE_GMP return Yap_gmp_xor_int_big(IntegerOfTerm(t1), t2); @@ -459,7 +459,7 @@ p_xor(Term t1, Term t2 USES_REGS) } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "#/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "#/2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -468,7 +468,7 @@ p_xor(Term t1, Term t2 USES_REGS) case big_int_e: return Yap_gmp_xor_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "#/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "#/2"); default: RERROR(); } @@ -690,7 +690,7 @@ p_exp(Term t1, Term t2 USES_REGS) Int pow; if (i2 < 0) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, "%d ^ %d", i1, i2); } pow = ipow(i1,i2); @@ -836,7 +836,7 @@ p_gcd(Term t1, Term t2 USES_REGS) RINT(gcd(i1,i2 PASS_REGS)); } case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "gcd/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "gcd/2"); case big_int_e: #ifdef USE_GMP return Yap_gmp_gcd_int_big(IntegerOfTerm(t1), t2); @@ -846,7 +846,7 @@ p_gcd(Term t1, Term t2 USES_REGS) } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "gcd/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "gcd/2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -855,7 +855,7 @@ p_gcd(Term t1, Term t2 USES_REGS) case big_int_e: return Yap_gmp_gcd_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "gcd/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "gcd/2"); default: RERROR(); } diff --git a/C/atomic.c b/C/atomic.c index cfe1c099c..3dc5f90e3 100644 --- a/C/atomic.c +++ b/C/atomic.c @@ -68,6 +68,22 @@ static Int hide_atom(USES_REGS1); static Int hidden_atom(USES_REGS1); static Int unhide_atom(USES_REGS1); +#define ReleaseAndReturn(r) \ + { \ + pop_text_stack(l); \ + return r; \ + } +#define release_cut_fail() \ + { \ + pop_text_stack(l); \ + cut_fail(); \ + } +#define release_cut_succeed() \ + { \ + pop_text_stack(l); \ + cut_succeed(); \ + } + static int AlreadyHidden(unsigned char *name) { AtomEntry *chain; @@ -78,8 +94,8 @@ static int AlreadyHidden(unsigned char *name) { strcmp((char *)chain->StrOfAE, (char *)name) != 0) chain = RepAtom(chain->NextOfAE); if (EndOfPAEntr(chain)) - return (FALSE); - return (TRUE); + return false; + return true; } /** @pred hide_atom(+ _Atom_) @@ -230,15 +246,15 @@ static Int char_code(USES_REGS1) { return (FALSE); } if (code > MAX_ISO_LATIN1) { - wchar_t wcodes[2]; + unsigned char codes[10]; if (code > CHARCODE_MAX) { Yap_Error(REPRESENTATION_ERROR_INT, t1, "char_code/2"); return (FALSE); } - wcodes[0] = code; - wcodes[1] = '\0'; - tout = MkAtomTerm(Yap_LookupWideAtom(wcodes)); + size_t n = put_utf8(codes, code); + codes[n] = code; + tout = MkAtomTerm(Yap_ULookupAtom(codes)); } else { char codes[2]; @@ -254,24 +270,14 @@ static Int char_code(USES_REGS1) { } else { Atom at = AtomOfTerm(t0); Term tf; - - if (IsWideAtom(at)) { - wchar_t *c = RepAtom(at)->WStrOfAE; - - if (c[1] != '\0') { - Yap_Error(TYPE_ERROR_CHARACTER, t0, "char_code/2"); - return FALSE; - } - tf = MkIntegerTerm(c[0]); - } else { - unsigned char *c = RepAtom(at)->UStrOfAE; - - if (c[1] != '\0') { - Yap_Error(TYPE_ERROR_CHARACTER, t0, "char_code/2"); - return FALSE; - } - tf = MkIntTerm((unsigned char)(c[0])); + unsigned char *c = RepAtom(at)->UStrOfAE; + int32_t v; + c += get_utf8(c, 1, &v); + if (c[0] != '\0') { + Yap_Error(TYPE_ERROR_CHARACTER, t0, "char_code/2"); + return FALSE; } + tf = MkIntTerm(v); return Yap_unify(ARG2, tf); } } @@ -280,50 +286,62 @@ static Int name(USES_REGS1) { /* name(?Atomic,?String) */ Term t = Deref(ARG2), NewT, AtomNameT = Deref(ARG1); LOCAL_MAX_SIZE = 1024; + int l = push_text_stack(); restart_aux: if (Yap_IsGroundTerm(AtomNameT)) { if (!IsVarTerm(t) && !IsPairTerm(t) && t != TermNil) { Yap_Error(TYPE_ERROR_LIST, ARG2, "name/2"); - return FALSE; + pop_text_stack(l); + ReleaseAndReturn(FALSE); } // verify if an atom, int, float or bi§gnnum NewT = Yap_AtomicToListOfCodes(AtomNameT PASS_REGS); - if (NewT) - return Yap_unify(NewT, ARG2); + if (NewT) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(NewT, ARG2)); + } // else } else if (IsVarTerm(t)) { Yap_Error(INSTANTIATION_ERROR, t, "name/2"); + pop_text_stack(l); return FALSE; } else { Term at = Yap_ListToAtomic(t PASS_REGS); - if (at) - return Yap_unify(at, ARG1); + if (at) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(at, ARG1)); + } } if (LOCAL_Error_TYPE && Yap_HandleError("atom/2")) { AtomNameT = Deref(ARG1); t = Deref(ARG2); goto restart_aux; } - return FALSE; + pop_text_stack(l); + ReleaseAndReturn(FALSE); } static Int string_to_atomic( USES_REGS1) { /* string_to_atom(?String,?Atom) */ Term t2 = Deref(ARG2), t1 = Deref(ARG1); LOCAL_MAX_SIZE = 1024; - + int l = push_text_stack(); restart_aux: if (IsStringTerm(t1)) { Term t; // verify if an atom, int, float or bignnum t = Yap_StringToAtomic(t1 PASS_REGS); - if (t != 0L) - return Yap_unify(t, t2); + if (t != 0L) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(t, t2)); + } // else } else if (IsVarTerm(t1)) { Term t0 = Yap_AtomicToString(t2 PASS_REGS); - if (t0) - return Yap_unify(t0, t1); + if (t0) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(t0, t1)); + } } else { LOCAL_Error_TYPE = TYPE_ERROR_STRING; } @@ -332,26 +350,32 @@ restart_aux: t2 = Deref(ARG2); goto restart_aux; } - return FALSE; + pop_text_stack(l); + ReleaseAndReturn(FALSE); } static Int string_to_atom( USES_REGS1) { /* string_to_atom(?String,?Atom) */ Term t2 = Deref(ARG2), t1 = Deref(ARG1); LOCAL_MAX_SIZE = 1024; + int l = push_text_stack(); restart_aux: if (IsStringTerm(t1)) { Atom at; // verify if an atom, int, float or bignnum at = Yap_StringSWIToAtom(t1 PASS_REGS); - if (at) - return Yap_unify(MkAtomTerm(at), t2); + if (at) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(MkAtomTerm(at), t2)); + } // else } else if (IsVarTerm(t1)) { Term t0 = Yap_AtomSWIToString(t2 PASS_REGS); - if (t0) - return Yap_unify(t0, t1); + if (t0) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(t0, t1)); + } } else { LOCAL_Error_TYPE = TYPE_ERROR_ATOM; } @@ -360,21 +384,26 @@ restart_aux: t2 = Deref(ARG2); goto restart_aux; } - return FALSE; + pop_text_stack(l); + ReleaseAndReturn(FALSE); } static Int string_to_list(USES_REGS1) { Term list = Deref(ARG2), string = Deref(ARG1); LOCAL_MAX_SIZE = 1024; + int l = push_text_stack(); restart_aux: if (IsVarTerm(string)) { Term t1 = Yap_ListToString(list PASS_REGS); - if (t1) - return Yap_unify(ARG1, t1); + if (t1) { + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(ARG1, t1)); + } } else if (IsStringTerm(string)) { Term tf = Yap_StringToListOfCodes(string PASS_REGS); - return Yap_unify(ARG2, tf); + pop_text_stack(l); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else { LOCAL_Error_TYPE = TYPE_ERROR_STRING; } @@ -383,12 +412,14 @@ restart_aux: list = Deref(ARG2); goto restart_aux; } - return FALSE; + pop_text_stack(l); + ReleaseAndReturn(FALSE); } static Int atom_string(USES_REGS1) { Term t1 = Deref(ARG1), t2 = Deref(ARG2); LOCAL_MAX_SIZE = 1024; + int l = push_text_stack(); restart_aux: if (IsVarTerm(t1)) { @@ -396,12 +427,12 @@ restart_aux: // verify if an atom, int, float or bignnum at = Yap_StringSWIToAtom(t2 PASS_REGS); if (at) - return Yap_unify(MkAtomTerm(at), t1); + ReleaseAndReturn(Yap_unify(MkAtomTerm(at), t1)); // else } else if (IsAtomTerm(t1)) { Term t0 = Yap_AtomSWIToString(t1 PASS_REGS); if (t0) - return Yap_unify(t0, t2); + ReleaseAndReturn(Yap_unify(t0, t2)); } else { LOCAL_Error_TYPE = TYPE_ERROR_ATOM; } @@ -410,25 +441,26 @@ restart_aux: t2 = Deref(ARG2); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int atom_chars(USES_REGS1) { Term t1; LOCAL_MAX_SIZE = 1024; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (IsAtomTerm(t1)) { Term tf = Yap_AtomSWIToListOfAtoms(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Atom af = Yap_ListOfAtomsToAtom(t PASS_REGS); if (af) - return Yap_unify(ARG1, MkAtomTerm(af)); + ReleaseAndReturn(Yap_unify(ARG1, MkAtomTerm(af))); /* error handling */ } else { LOCAL_Error_TYPE = TYPE_ERROR_ATOM; @@ -436,24 +468,24 @@ restart_aux: if (LOCAL_Error_TYPE && Yap_HandleError("atom_chars/2")) { goto restart_aux; } - return false; + ReleaseAndReturn(false); } static Int atom_codes(USES_REGS1) { Term t1; t1 = Deref(ARG1); - LOCAL_Error_TYPE = 0; + int l = push_text_stack(); restart_aux: if (IsAtomTerm(t1)) { Term tf = Yap_AtomToListOfCodes(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Atom af = Yap_ListToAtom(t PASS_REGS); if (af) - return Yap_unify(ARG1, MkAtomTerm(af)); + ReleaseAndReturn(Yap_unify(ARG1, MkAtomTerm(af))); } else if (IsVarTerm(t1)) { LOCAL_Error_TYPE = TYPE_ERROR_ATOM; } @@ -462,23 +494,24 @@ restart_aux: t1 = Deref(ARG1); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int string_codes(USES_REGS1) { Term t1; t1 = Deref(ARG1); + int l = push_text_stack(); restart_aux: if (IsStringTerm(t1)) { Term tf = Yap_StringSWIToListOfCodes(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_ListSWIToString(t PASS_REGS); if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } else { LOCAL_Error_TYPE = TYPE_ERROR_STRING; } @@ -487,23 +520,24 @@ restart_aux: t1 = Deref(ARG1); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int string_chars(USES_REGS1) { Term t1; t1 = Deref(ARG1); + int l = push_text_stack(); restart_aux: if (IsStringTerm(t1)) { Term tf = Yap_StringSWIToListOfAtoms(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_ListSWIToString(t PASS_REGS); if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } else { LOCAL_Error_TYPE = TYPE_ERROR_STRING; } @@ -512,7 +546,7 @@ restart_aux: t1 = Deref(ARG1); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } /** @pred number_chars(? _I_,? _L_) is iso @@ -525,22 +559,28 @@ characters of the external representation of _I_. */ static Int number_chars(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (IsNumTerm(t1)) { - Term tf; - tf = Yap_NumberToListOfAtoms(t1 PASS_REGS); - if (tf) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - return Yap_unify(ARG2, tf); + Term t2 = Deref(ARG2); + if (IsVarTerm(t2)) { + t1 = Yap_NumberToListOfAtoms(t1 PASS_REGS); + } + if (t1) { + ReleaseAndReturn(Yap_unify(t1, t2)); + } else { + t2 = Yap_ListToNumber(t2 PASS_REGS); + if (t2) { + ReleaseAndReturn(Yap_unify(t1, t2)); + } } } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_ListToNumber(t PASS_REGS); if (tf) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } } else if (IsVarTerm(t1)) { LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; @@ -549,48 +589,59 @@ restart_aux: if (LOCAL_Error_TYPE && Yap_HandleError("number_chars/2")) { goto restart_aux; } - return false; + ReleaseAndReturn(false); } static Int number_atom(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (IsNumTerm(t1)) { + Term t2 = Deref(ARG2); Atom af; af = Yap_NumberToAtom(t1 PASS_REGS); - if (af) - return Yap_unify(ARG2, MkAtomTerm(af)); + if (af) { + if (IsVarTerm(t2)) { + + ReleaseAndReturn(Yap_unify(t1, t2)); + } else { + t2 = Yap_AtomToNumber(t2 PASS_REGS); + if (t2) { + ReleaseAndReturn(Yap_unify(t1, t2)); + } + } + } } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_AtomToNumber(t PASS_REGS); - if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } else if (IsVarTerm(t1)) { LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; } /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("number_atom/2")) { goto restart_aux; } - return false; + ReleaseAndReturn(false); } static Int number_string(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (IsNumTerm(t1)) { Term tf; tf = Yap_NumberToString(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_StringToNumber(t PASS_REGS); if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } else { LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; } @@ -598,24 +649,25 @@ restart_aux: if (LOCAL_Error_TYPE && Yap_HandleError("number_string/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int number_codes(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (IsNumTerm(t1)) { Term tf; tf = Yap_NumberToListOfCodes(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else if (IsVarTerm(t1)) { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_ListToNumber(t PASS_REGS); if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } else { LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; } @@ -623,39 +675,41 @@ restart_aux: if (LOCAL_Error_TYPE && Yap_HandleError("number_codes/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int cont_atom_concat3(USES_REGS1) { Term t3; Atom ats[2]; Int i, max; + int l = push_text_stack(); restart_aux: t3 = Deref(ARG3); i = IntOfTerm(EXTRA_CBACK_ARG(3, 1)); max = IntOfTerm(EXTRA_CBACK_ARG(3, 2)); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(i + 1); - if (!Yap_SpliceAtom(t3, ats, i, max PASS_REGS) && LOCAL_Error_TYPE == - YAP_NO_ERROR) { - cut_fail(); + if (!Yap_SpliceAtom(t3, ats, i, max PASS_REGS) && + LOCAL_Error_TYPE == YAP_NO_ERROR) { + release_cut_fail(); } else { - if (i < max) - return Yap_unify(ARG1, MkAtomTerm(ats[0])) && - Yap_unify(ARG2, MkAtomTerm(ats[1])); + if (i < max) { + ReleaseAndReturn(Yap_unify(ARG1, MkAtomTerm(ats[0])) && + Yap_unify(ARG2, MkAtomTerm(ats[1]))); + } if (Yap_unify(ARG1, MkAtomTerm(ats[0])) && Yap_unify(ARG2, MkAtomTerm(ats[1]))) - cut_succeed(); - cut_fail(); + release_cut_succeed(); + release_cut_fail(); } /* Error handling */ if (LOCAL_Error_TYPE) { if (Yap_HandleError("atom_concat/3")) { goto restart_aux; } else { - return false; + ReleaseAndReturn(false); } } - cut_fail(); + release_cut_fail(); } static Int atom_concat3(USES_REGS1) { @@ -663,13 +717,14 @@ static Int atom_concat3(USES_REGS1) { Term t2, t3, ot; Atom at; bool g1, g2, g3; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); t3 = Deref(ARG3); - g1 = Yap_IsGroundTerm(t1); - g2 = Yap_IsGroundTerm(t2); - g3 = Yap_IsGroundTerm(t3); + g1 = Yap_IsGroundTerm(t1); + g2 = Yap_IsGroundTerm(t2); + g3 = Yap_IsGroundTerm(t3); if (g1 && g2) { at = Yap_ConcatAtoms(t1, t2 PASS_REGS); ot = ARG3; @@ -678,34 +733,34 @@ restart_aux: ot = ARG2; } else if (g2 && g3) { at = Yap_SubtractTailAtom(t3, t2 PASS_REGS); - ot = ARG1; + ot = ARG1; } else if (g3) { EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomToLength(t3 PASS_REGS)); - return cont_atom_concat3(PASS_REGS1); + ReleaseAndReturn(cont_atom_concat3(PASS_REGS1)); } else { - LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t1; - at = NULL; + LOCAL_Error_TYPE = INSTANTIATION_ERROR; + at = NULL; } + pop_text_stack(l); if (at) { - if (Yap_unify(ot, MkAtomTerm(at))) - cut_succeed(); - else - cut_fail(); + if (Yap_unify(ot, MkAtomTerm(at))) { + release_cut_succeed(); + } else { + release_cut_fail(); + } } /* Error handling */ if (LOCAL_Error_TYPE) { if (Yap_HandleError("atom_concat/3")) { goto restart_aux; } else { - return false; + ReleaseAndReturn(false); } } - cut_fail(); + release_cut_fail(); } - #define CastToNumeric(x) CastToNumeric__(x PASS_REGS) static Term CastToNumeric__(Atom at USES_REGS) { @@ -719,31 +774,32 @@ static Int cont_atomic_concat3(USES_REGS1) { Term t3; Atom ats[2]; size_t i, max; + int l = push_text_stack(); restart_aux: t3 = Deref(ARG3); i = IntOfTerm(EXTRA_CBACK_ARG(3, 1)); max = IntOfTerm(EXTRA_CBACK_ARG(3, 2)); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(i + 1); if (!Yap_SpliceAtom(t3, ats, i, max PASS_REGS)) { - cut_fail(); + release_cut_fail(); } else { Term t1 = CastToNumeric(ats[0]); Term t2 = CastToNumeric(ats[1]); if (i < max) - return Yap_unify(ARG1, t1) && Yap_unify(ARG2, t2); + ReleaseAndReturn(Yap_unify(ARG1, t1) && Yap_unify(ARG2, t2)); if (Yap_unify(ARG1, t1) && Yap_unify(ARG2, t2)) - cut_succeed(); - cut_fail(); + release_cut_succeed(); + release_cut_fail(); } /* Error handling */ if (LOCAL_Error_TYPE) { if (Yap_HandleError("string_concat/3")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int atomic_concat3(USES_REGS1) { @@ -751,13 +807,14 @@ static Int atomic_concat3(USES_REGS1) { Term t2, t3, ot; Atom at = NULL; bool g1, g2, g3; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); t3 = Deref(ARG3); - g1 = Yap_IsGroundTerm(t1); - g2 = Yap_IsGroundTerm(t2); - g3 = Yap_IsGroundTerm(t3); + g1 = Yap_IsGroundTerm(t1); + g2 = Yap_IsGroundTerm(t2); + g3 = Yap_IsGroundTerm(t3); if (g1 && g2) { at = Yap_ConcatAtomics(t1, t2 PASS_REGS); ot = ARG3; @@ -766,21 +823,21 @@ restart_aux: ot = ARG2; } else if (g2 && g3) { at = Yap_SubtractTailAtom(t3, t2 PASS_REGS); - ot = ARG1; + ot = ARG1; } else if (g3) { EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_AtomicToLength(t3 PASS_REGS)); return cont_atomic_concat3(PASS_REGS1); } else { - LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t1; - at = NULL; + LOCAL_Error_TYPE = INSTANTIATION_ERROR; + at = NULL; } if (at) { - if (Yap_unify(ot, MkAtomTerm(at))) - cut_succeed(); - else - cut_fail(); + if (Yap_unify(ot, MkAtomTerm(at))) { + release_cut_succeed(); + } else { + release_cut_fail(); + } } /* Error handling */ if (LOCAL_Error_TYPE) { @@ -790,26 +847,27 @@ restart_aux: return false; } } - cut_fail(); + release_cut_fail(); } static Int cont_string_concat3(USES_REGS1) { Term t3; Term ts[2]; size_t i, max; + int l = push_text_stack(); restart_aux: t3 = Deref(ARG3); i = IntOfTerm(EXTRA_CBACK_ARG(3, 1)); max = IntOfTerm(EXTRA_CBACK_ARG(3, 2)); EXTRA_CBACK_ARG(3, 1) = MkIntTerm(i + 1); if (!Yap_SpliceString(t3, ts, i, max PASS_REGS)) { - cut_fail(); + release_cut_fail(); } else { if (i < max) return Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1]); if (Yap_unify(ARG1, ts[0]) && Yap_unify(ARG2, ts[1])) - cut_succeed(); - cut_fail(); + release_cut_succeed(); + release_cut_fail(); } /* Error handling */ if (LOCAL_Error_TYPE) { @@ -819,7 +877,7 @@ restart_aux: return FALSE; } } - cut_fail(); + release_cut_fail(); } static Int string_concat3(USES_REGS1) { @@ -827,14 +885,14 @@ static Int string_concat3(USES_REGS1) { Term t2, t3, ot; Term tf = 0; bool g1, g2, g3; - Atom at; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); t3 = Deref(ARG3); - g1 = Yap_IsGroundTerm(t1); - g2 = Yap_IsGroundTerm(t2); - g3 = Yap_IsGroundTerm(t3); + g1 = Yap_IsGroundTerm(t1); + g2 = Yap_IsGroundTerm(t2); + g3 = Yap_IsGroundTerm(t3); if (g1 && g2) { tf = Yap_ConcatStrings(t1, t2 PASS_REGS); ot = ARG3; @@ -843,31 +901,30 @@ restart_aux: ot = ARG2; } else if (g2 && g3) { tf = Yap_SubtractTailString(t3, t2 PASS_REGS); - ot = ARG1; + ot = ARG1; } else if (g3) { EXTRA_CBACK_ARG(3, 1) = MkIntTerm(0); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(Yap_StringToLength(t3 PASS_REGS)); return cont_string_concat3(PASS_REGS1); } else { - LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t1; - at = NULL; + LOCAL_Error_TYPE = INSTANTIATION_ERROR; } if (tf) { - if (Yap_unify(ot, tf)) - cut_succeed(); - else - cut_fail(); + if (Yap_unify(ot, tf)) { + release_cut_succeed(); + } else { + release_cut_fail(); + } } /* Error handling */ if (LOCAL_Error_TYPE) { if (Yap_HandleError("atom_concat/3")) { goto restart_aux; } else { - return false; + ReleaseAndReturn(false); } } - cut_fail(); + release_cut_fail(); } static Int cont_string_code3(USES_REGS1) { @@ -876,6 +933,7 @@ static Int cont_string_code3(USES_REGS1) { utf8proc_int32_t chr; const unsigned char *s; const unsigned char *s0; + int l = push_text_stack(); restart_aux: t2 = Deref(ARG2); s0 = UStringOfTerm(t2); @@ -887,37 +945,38 @@ restart_aux: if (s[0]) { EXTRA_CBACK_ARG(3, 1) = MkIntTerm(s - s0); EXTRA_CBACK_ARG(3, 2) = MkIntTerm(j + 1); - return Yap_unify(MkIntegerTerm(chr), ARG3) && - Yap_unify(MkIntegerTerm(j + 1), ARG1); + ReleaseAndReturn(Yap_unify(MkIntegerTerm(chr), ARG3) && + Yap_unify(MkIntegerTerm(j + 1), ARG1)); + } + if (Yap_unify(MkIntegerTerm(chr), ARG3) && + Yap_unify(MkIntegerTerm(j), ARG1)) { + release_cut_succeed(); + } else { + release_cut_fail(); } - if (Yap_unify(MkIntegerTerm(chr), ARG3) && Yap_unify(MkIntegerTerm(j), ARG1)) - cut_succeed(); - else - cut_fail(); /* Error handling */ if (LOCAL_Error_TYPE) { if (Yap_HandleError("string_code/3")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int string_code3(USES_REGS1) { Term t1; Term t2; const unsigned char *s; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); if (IsVarTerm(t2)) { LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t2; } else if (!IsStringTerm(t2)) { LOCAL_Error_TYPE = TYPE_ERROR_STRING; - LOCAL_Error_Term = t2; } else { s = UStringOfTerm(t2); t1 = Deref(ARG1); @@ -927,7 +986,6 @@ restart_aux: return cont_string_code3(PASS_REGS1); } else if (!IsIntegerTerm(t1)) { LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t1; } else { const unsigned char *ns = s; utf8proc_int32_t chr; @@ -935,20 +993,19 @@ restart_aux: if (indx <= 0) { if (indx < 0) { LOCAL_Error_TYPE = DOMAIN_ERROR_NOT_LESS_THAN_ZERO; - LOCAL_Error_Term = t1; } - cut_fail(); + release_cut_fail(); } ns = skip_utf8(s, indx); if (ns == NULL) { - cut_fail(); // silently fail? + release_cut_fail(); // silently fail? } get_utf8(ns, -1, &chr); if (chr == '\0') - cut_fail(); + release_cut_fail(); if (Yap_unify(ARG3, MkIntegerTerm(chr))) - cut_succeed(); - cut_fail(); + release_cut_succeed(); + release_cut_fail(); } } /* Error handling */ @@ -956,34 +1013,32 @@ restart_aux: if (Yap_HandleError("string_code/3")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int get_string_code3(USES_REGS1) { Term t1; Term t2; const unsigned char *s; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); if (IsVarTerm(t2)) { LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t2; } else if (!IsStringTerm(t2)) { LOCAL_Error_TYPE = TYPE_ERROR_STRING; - LOCAL_Error_Term = t2; } else { s = UStringOfTerm(t2); t1 = Deref(ARG1); if (IsVarTerm(t1)) { LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t1; + } else if (!IsIntegerTerm(t1)) { LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t1; } else { const unsigned char *ns = s; utf8proc_int32_t chr; @@ -992,22 +1047,21 @@ restart_aux: if (indx <= 0) { if (indx < 0) { LOCAL_Error_TYPE = DOMAIN_ERROR_NOT_LESS_THAN_ZERO; - LOCAL_Error_Term = t1; } else { - return false; + ReleaseAndReturn(false); } } else { indx -= 1; ns = skip_utf8(ns, indx); if (ns == NULL) { - return false; + ReleaseAndReturn(false); } else { get_utf8(ns, -1, &chr); if (chr != '\0') - return Yap_unify(ARG3, MkIntegerTerm(chr)); + ReleaseAndReturn(Yap_unify(ARG3, MkIntegerTerm(chr))); } } - return FALSE; // replace by error code + ReleaseAndReturn(FALSE); // replace by error cod )e } } /* Error handling */ @@ -1015,16 +1069,17 @@ restart_aux: if (Yap_HandleError("string_code/3")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int atom_concat2(USES_REGS1) { Term t1; Term *tailp; Int n; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); n = Yap_SkipList(&t1, &tailp); @@ -1055,7 +1110,7 @@ restart_aux: free(inpv); at = out.val.a; if (at) - return Yap_unify(ARG2, MkAtomTerm(at)); + ReleaseAndReturn(Yap_unify(ARG2, MkAtomTerm(at))); } error: /* Error handling */ @@ -1063,16 +1118,17 @@ error: if (Yap_HandleError("atom_concat/2")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int string_concat2(USES_REGS1) { Term t1; Term *tailp; Int n; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); n = Yap_SkipList(&t1, &tailp); @@ -1101,7 +1157,7 @@ restart_aux: } free(inpv); if (out.val.t) - return Yap_unify(ARG2, out.val.t); + ReleaseAndReturn(Yap_unify(ARG2, out.val.t)); } error: /* Error handling */ @@ -1109,16 +1165,17 @@ error: if (Yap_HandleError("string_code/3")) { goto restart_aux; } else { - return FALSE; + ReleaseAndReturn(FALSE); } } - cut_fail(); + release_cut_fail(); } static Int atomic_concat2(USES_REGS1) { Term t1; Term *tailp; Int n; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); n = Yap_SkipList(&t1, &tailp); @@ -1130,7 +1187,7 @@ restart_aux: Atom at; if (n == 1) - return Yap_unify(ARG2, HeadOfTerm(t1)); + ReleaseAndReturn(Yap_unify(ARG2, HeadOfTerm(t1))); if (!inpv) { LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; free(inpv); @@ -1153,7 +1210,7 @@ restart_aux: free(inpv); at = out.val.a; if (at) - return Yap_unify(ARG2, MkAtomTerm(at)); + ReleaseAndReturn(Yap_unify(ARG2, MkAtomTerm(at))); } error: /* Error handling */ @@ -1167,6 +1224,7 @@ static Int atomics_to_string2(USES_REGS1) { Term t1; Term *tailp; Int n; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); n = Yap_SkipList(&t1, &tailp); @@ -1198,20 +1256,21 @@ restart_aux: free(inpv); at = out.val.a; if (at) - return Yap_unify(ARG2, MkAtomTerm(at)); + ReleaseAndReturn(Yap_unify(ARG2, MkAtomTerm(at))); } error: /* Error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("atomics_to_string/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int atomics_to_string3(USES_REGS1) { Term t1, t2; Term *tailp; Int n; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); t2 = Deref(ARG2); @@ -1248,14 +1307,14 @@ restart_aux: free(inpv); at = out.val.a; if (at) - return Yap_unify(ARG3, MkAtomTerm(at)); + ReleaseAndReturn(Yap_unify(ARG3, MkAtomTerm(at))); } error: /* Error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("atomics_to_string/3")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int atom_length(USES_REGS1) { @@ -1263,33 +1322,34 @@ static Int atom_length(USES_REGS1) { Term t2 = Deref(ARG2); size_t len; + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return (FALSE); + ReleaseAndReturn(FALSE); } else if (!IsAtomTerm(t1)) { Yap_Error(TYPE_ERROR_ATOM, t1, "at first argument"); - return (FALSE); + ReleaseAndReturn(FALSE); } if (Yap_IsGroundTerm(t2)) { if (!IsIntegerTerm(t2)) { Yap_Error(TYPE_ERROR_INTEGER, t2, "atom_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } else if ((Int)(len = IntegerOfTerm(t2)) < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, "atom_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } } restart_aux: len = Yap_AtomicToLength(t1 PASS_REGS); if (len != (size_t)-1) - return Yap_unify(ARG2, MkIntegerTerm(len)); + ReleaseAndReturn(Yap_unify(ARG2, MkIntegerTerm(len))); /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("atom_length/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int atomic_length(USES_REGS1) { @@ -1297,30 +1357,31 @@ static Int atomic_length(USES_REGS1) { Term t2 = Deref(ARG2); size_t len; + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return (FALSE); + ReleaseAndReturn(FALSE); } if (IsNonVarTerm(t2)) { if (!IsIntegerTerm(t2)) { Yap_Error(TYPE_ERROR_INTEGER, t2, "atom_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } else if ((Int)(len = IntegerOfTerm(t2)) < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, "atom_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } } restart_aux: len = Yap_AtomicToLength(t1 PASS_REGS); if (len != (size_t)-1) - return Yap_unify(ARG2, MkIntegerTerm(len)); + ReleaseAndReturn(Yap_unify(ARG2, MkIntegerTerm(len))); /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("atomic_length/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int string_length(USES_REGS1) { @@ -1328,27 +1389,28 @@ static Int string_length(USES_REGS1) { Term t2 = Deref(ARG2); size_t len; + int l = push_text_stack(); if (Yap_IsGroundTerm(t2)) { if (!IsIntegerTerm(t2)) { Yap_Error(TYPE_ERROR_INTEGER, t2, "string_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } if (FALSE && (Int)(len = IntegerOfTerm(t2)) < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, "string_length/2"); - return (FALSE); + ReleaseAndReturn(FALSE); } } restart_aux: t1 = Deref(ARG1); len = Yap_AtomicToLength(t1 PASS_REGS); if (len != (size_t)-1) - return Yap_unify(ARG2, MkIntegerTerm(len)); + ReleaseAndReturn(Yap_unify(ARG2, MkIntegerTerm(len))); /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("string_length/2")) { goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } /** @pred downcase_text_to_atom(+Text, -Atom) @@ -1361,15 +1423,16 @@ static Int downcase_text_to_atom(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!IsAtomTerm(t2)) { Yap_Error(TYPE_ERROR_ATOM, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1377,11 +1440,11 @@ static Int downcase_text_to_atom(USES_REGS1) { if (at == NULL) { if (LOCAL_Error_TYPE && Yap_HandleError("downcase_text_to_atom/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(MkAtomTerm(at), t2); + ReleaseAndReturn(Yap_unify(MkAtomTerm(at), t2)); } - return false; + ReleaseAndReturn(false); } /** @pred upcase_text_to_atom(+Text, -Atom) @@ -1394,15 +1457,16 @@ static Int upcase_text_to_atom(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!IsAtomTerm(t2)) { Yap_Error(TYPE_ERROR_ATOM, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1410,11 +1474,11 @@ static Int upcase_text_to_atom(USES_REGS1) { if (at == NULL) { if (LOCAL_Error_TYPE && Yap_HandleError("upcase_text_to_atom/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(MkAtomTerm(at), t2); + ReleaseAndReturn(Yap_unify(MkAtomTerm(at), t2)); } - return false; + ReleaseAndReturn(false); } /** @pred downcase_text_to_string(+Text, -String) @@ -1427,15 +1491,16 @@ static Int downcase_text_to_string(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!IsStringTerm(t2)) { Yap_Error(TYPE_ERROR_STRING, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1443,11 +1508,11 @@ static Int downcase_text_to_string(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("downcase_text_to_string/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; + ReleaseAndReturn(false); } /** @pred upcase_text_to_string(+Text, -String) @@ -1460,15 +1525,16 @@ static Int upcase_text_to_string(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!IsStringTerm(t2)) { Yap_Error(TYPE_ERROR_STRING, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1476,11 +1542,11 @@ static Int upcase_text_to_string(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("upcase_text_to_string/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; + ReleaseAndReturn(false); } /** @pred downcase_text_to_codes(+Text, -Codes) @@ -1493,15 +1559,16 @@ static Int downcase_text_to_codes(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!Yap_IsListTerm(t2)) { Yap_Error(TYPE_ERROR_LIST, t2, "at second argument"); - return false; + ReleaseAndReturn(false); } } while (true) { @@ -1509,11 +1576,11 @@ static Int downcase_text_to_codes(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("downcase_text_to_codes/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; + ReleaseAndReturn(false); } /** @pred upcase_text_to_codes(+Text, -Codes) @@ -1526,15 +1593,16 @@ static Int upcase_text_to_codes(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!Yap_IsListTerm(t2)) { Yap_Error(TYPE_ERROR_LIST, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1542,11 +1610,11 @@ static Int upcase_text_to_codes(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("upcase_text_to_codes/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; + ReleaseAndReturn(false); } /** @pred downcase_text_to_chars(+Text, -Chars) @@ -1559,15 +1627,16 @@ static Int downcase_text_to_chars(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!Yap_IsListTerm(t2)) { Yap_Error(TYPE_ERROR_LIST, t2, "at second argument"); - return false; + ReleaseAndReturn(false); } } while (true) { @@ -1575,11 +1644,11 @@ static Int downcase_text_to_chars(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("downcase_text_to_to_chars/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; + ReleaseAndReturn(false); } /** @pred upcase_text_to_chars(+Text, -Chars) @@ -1592,15 +1661,16 @@ static Int upcase_text_to_chars(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); + int l = push_text_stack(); if (!Yap_IsGroundTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "at first argument"); - return false; + ReleaseAndReturn(false); } if (IsNonVarTerm(t2)) { if (!Yap_IsListTerm(t2)) { Yap_Error(TYPE_ERROR_LIST, t2, "at second argument"); - return (FALSE); + ReleaseAndReturn((FALSE)); } } while (true) { @@ -1608,21 +1678,11 @@ static Int upcase_text_to_chars(USES_REGS1) { if (t == TermZERO) { if (LOCAL_Error_TYPE && Yap_HandleError("upcase_text_to_chars/2")) continue; - return false; + ReleaseAndReturn(false); } - return Yap_unify(t, t2); + ReleaseAndReturn(Yap_unify(t, t2)); } - return false; -} - -static int is_wide(wchar_t *s) { - wchar_t ch; - - while ((ch = *s++)) { - if (ch > MAX_ISO_LATIN1) - return TRUE; - } - return FALSE; + ReleaseAndReturn(false); } /* split an atom into two sub-atoms */ @@ -1630,457 +1690,262 @@ static Int atom_split(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); size_t len; - int i; Term to1, to2; Atom at; + int l = push_text_stack(); if (IsVarTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "$atom_split/4"); - return (FALSE); + ReleaseAndReturn((FALSE)); } if (!IsAtomTerm(t1)) { Yap_Error(TYPE_ERROR_ATOM, t1, "$atom_split/4"); - return (FALSE); + ReleaseAndReturn((FALSE)); } if (IsVarTerm(t2)) { Yap_Error(INSTANTIATION_ERROR, t2, "$atom_split/4"); - return (FALSE); + ReleaseAndReturn((FALSE)); } if (!IsIntTerm(t2)) { Yap_Error(TYPE_ERROR_INTEGER, t2, "$atom_split/4"); - return (FALSE); + ReleaseAndReturn((FALSE)); } if ((Int)(len = IntOfTerm(t2)) < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, "$atom_split/4"); - return (FALSE); + ReleaseAndReturn((FALSE)); } at = AtomOfTerm(t1); - if (IsWideAtom(at)) { - wchar_t *ws, *ws1 = (wchar_t *)HR; - unsigned char *s1 = (unsigned char *)HR; - size_t wlen; - - ws = (wchar_t *)RepAtom(at)->StrOfAE; - wlen = wcslen(ws); - if (len > wlen) - return FALSE; - if (s1 + len > (unsigned char *)LCL0 - 1024) - Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4"); - for (i = 0; i < len; i++) { - if (ws[i] > MAX_ISO_LATIN1) { - break; - } - s1[i] = ws[i]; - } - if (ws1[i] > MAX_ISO_LATIN1) { - /* first sequence is wide */ - if (ws1 + len > (wchar_t *)ASP - 1024) - Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4"); - ws = (wchar_t *)RepAtom(at)->StrOfAE; - for (i = 0; i < len; i++) { - ws1[i] = ws[i]; - } - ws1[len] = '\0'; - to1 = MkAtomTerm(Yap_LookupWideAtom(ws1)); - /* we don't know if the rest of the string is wide or not */ - if (is_wide(ws + len)) { - to2 = MkAtomTerm(Yap_LookupWideAtom(ws + len)); - } else { - char *s2 = (char *)HR; - if (s2 + (wlen - len) > (char *)ASP - 1024) - Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4"); - ws += len; - while ((*s2++ = *ws++)) - ; - to2 = MkAtomTerm(Yap_LookupAtom((char *)HR)); - } - } else { - s1[len] = '\0'; - to1 = MkAtomTerm(Yap_ULookupAtom(s1)); - /* second atom must be wide, if first wasn't */ - to2 = MkAtomTerm(Yap_LookupWideAtom(ws + len)); - } - } else { - unsigned char *s, *s1 = (unsigned char *)HR; - - s = RepAtom(at)->UStrOfAE; - if (len > (Int)strlen((char *)s)) - return (FALSE); - if (s1 + len > (unsigned char *)ASP - 1024) - Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4"); - for (i = 0; i < len; i++) { - s1[i] = s[i]; - } - s1[len] = '\0'; - to1 = MkAtomTerm(Yap_ULookupAtom(s1)); - to2 = MkAtomTerm(Yap_ULookupAtom(s + len)); + unsigned char *s, *s1, *s10; + s = RepAtom(at)->UStrOfAE; + if (len > (Int)strlen_utf8(s)) + ReleaseAndReturn((FALSE)); + s1 = s10 = Malloc(len); + if (s1 + len > (unsigned char *)ASP - 1024) + Yap_Error(RESOURCE_ERROR_STACK, t1, "$atom_split/4"); + size_t j; + for (j = 0; j < len; j++) { + int32_t val; + s += get_utf8(s, 1, &val); + s1 += put_utf8(s, val); } - return (Yap_unify_constant(ARG3, to1) && Yap_unify_constant(ARG4, to2)); + s1[0] = '\0'; + to1 = MkAtomTerm(Yap_ULookupAtom(s10)); + to2 = MkAtomTerm(Yap_ULookupAtom(s)); + ReleaseAndReturn( + (Yap_unify_constant(ARG3, to1) && Yap_unify_constant(ARG4, to2))); } static Int atom_number(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (Yap_IsGroundTerm(t1)) { Term tf = Yap_AtomToNumber(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else { /* ARG1 unbound */ Term t = Deref(ARG2); Atom af = Yap_NumberToAtom(t PASS_REGS); if (af) - return Yap_unify(ARG1, MkAtomTerm(af)); + ReleaseAndReturn(Yap_unify(ARG1, MkAtomTerm(af))); } /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("atom_number/2")) { t1 = Deref(ARG1); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } static Int string_number(USES_REGS1) { Term t1; + int l = push_text_stack(); restart_aux: t1 = Deref(ARG1); if (Yap_IsGroundTerm(t1)) { Term tf = Yap_StringToNumber(t1 PASS_REGS); if (tf) - return Yap_unify(ARG2, tf); + ReleaseAndReturn(Yap_unify(ARG2, tf)); } else { /* ARG1 unbound */ Term t = Deref(ARG2); Term tf = Yap_NumberToString(t PASS_REGS); if (tf) - return Yap_unify(ARG1, tf); + ReleaseAndReturn(Yap_unify(ARG1, tf)); } /* error handling */ if (LOCAL_Error_TYPE && Yap_HandleError("string_number/2")) { t1 = Deref(ARG1); goto restart_aux; } - return FALSE; + ReleaseAndReturn(FALSE); } #define SUB_ATOM_HAS_MIN 1 #define SUB_ATOM_HAS_SIZE 2 #define SUB_ATOM_HAS_AFTER 4 #define SUB_ATOM_HAS_VAL 8 -#define SUB_ATOM_HAS_WIDE 16 +#define SUB_ATOM_HAS_ATOM 16 #define SUB_ATOM_HAS_UTF8 32 -static void *alloc_tmp_stack(size_t sz USES_REGS) { - void *pt = (void *)HR; - while (HR > ASP - (1044 + sz / sizeof(CELL))) { - if (!Yap_gc(5, ENV, gc_P(P, CP))) { - Yap_Error(RESOURCE_ERROR_STACK, TermNil, "sub_atom/5"); - return (NULL); - } - } - return pt; -} - static Term build_new_atomic(int mask, wchar_t *wp, const unsigned char *p, - size_t min, size_t len USES_REGS) { - Atom nat; - if (mask & SUB_ATOM_HAS_WIDE) { - wchar_t *src = wp + min; - wchar_t *d = alloc_tmp_stack((len + 1) * sizeof(wchar_t) PASS_REGS); - if (!d) - return NIL; - - wcsncpy(d, src, len); - d[len] = '\0'; - nat = Yap_LookupMaybeWideAtom(d); - if (nat) - return MkAtomTerm(nat); - } else if (!(mask & SUB_ATOM_HAS_UTF8)) { - const unsigned char *src = p + min; - unsigned char *d = alloc_tmp_stack((len + 1) * sizeof(char) PASS_REGS); - if (!d) - return NIL; - - strncpy((char *)d, (char *)src, len); - d[len] = '\0'; - nat = Yap_ULookupAtom(d); - if (nat) - return MkAtomTerm(nat); + size_t minv, size_t len USES_REGS) { + int n; + seq_tv_t outv[5], inp; + size_t cuts[3]; + if (minv) { + cuts[0] = minv; + cuts[1] = minv + len; + cuts[2] = 0; + outv[0].type = 0; + n = 1; } else { - const unsigned char *src = p; - unsigned char *buf; - Term t = init_tstring(PASS_REGS1); - src = skip_utf8((unsigned char *)src, min); - const unsigned char *cp = src; - - LOCAL_TERM_ERROR(t, 4 * (len + 1)); - buf = buf_from_tstring(HR); - while (len) { - utf8proc_int32_t chr; - cp += get_utf8((unsigned char *)cp, -1, &chr); - buf += put_utf8((unsigned char *)buf, chr); - len--; - } - *buf++ = '\0'; - - close_tstring(buf PASS_REGS); - return t; + cuts[0] = minv + len; + cuts[1] = 0; + n = 0; } - return 0L; -} - -static Int wcsstrcmp(wchar_t *p, char *p2, size_t len) { - while (len--) { - Int d = *p++ - *p2++; - if (d) - return d; - } - return 0; -} - -static int check_sub_atom_at(int min, Atom at, Atom nat) { - if (IsWideAtom(nat)) { - wchar_t *p1, *p2; - wchar_t c1; - if (!IsWideAtom(at)) - return FALSE; - p1 = RepAtom(at)->WStrOfAE + min; - p2 = RepAtom(nat)->WStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; + inp.type = YAP_STRING_CHARS; + inp.enc = ENC_ISO_UTF8; + inp.val.uc0 = p; + outv[n + 1].type = 0; + if (mask & SUB_ATOM_HAS_ATOM) { + outv[n].type = YAP_STRING_ATOM; } else { - if (IsWideAtom(at)) { - wchar_t *p1; - unsigned char *p2; - wchar_t c1; - p1 = RepAtom(at)->WStrOfAE + min; - p2 = RepAtom(nat)->UStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; - } else { - unsigned char *p1, *p2; - char c1; - p1 = RepAtom(at)->UStrOfAE + min; - p2 = RepAtom(nat)->UStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; - } + outv[n].type = YAP_STRING_STRING; + outv[n].val.c = Malloc(512); } + int lvl = push_text_stack(PASS_REGS1); + bool rc = Yap_Splice_Text(2 + n, cuts, &inp, outv PASS_REGS); + pop_text_stack(lvl); + if (!rc) + return (false); + if (mask & SUB_ATOM_HAS_ATOM) + return (MkAtomTerm(outv[n].val.a)); + return (outv[n].val.t); } -static int check_sub_string_at(int min, const unsigned char *p1, - const unsigned char *p2, size_t len) { - p1 = skip_utf8((unsigned char *)p1, min); +static int check_sub_atom_at(int minv, Atom at, Atom nat, size_t len) { + const unsigned char *p1; + const unsigned char *p2 = RepAtom(nat)->UStrOfAE; + p1 = skip_utf8(RepAtom(at)->UStrOfAE, minv); return cmpn_utf8(p1, p2, len) == 0; } -static int check_sub_atom_bef(int max, Atom at, Atom nat) { - if (IsWideAtom(nat)) { - wchar_t *p1, *p2; - wchar_t c1; - - size_t len = wcslen(RepAtom(nat)->WStrOfAE); - int min = max - len; - if (min < 0) - return FALSE; - if (!IsWideAtom(at)) - return FALSE; - p1 = RepAtom(at)->WStrOfAE + min; - p2 = RepAtom(nat)->WStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; - } else { - size_t len = strlen((char *)RepAtom(nat)->StrOfAE); - int min = max - len; - if ((Int)(min - len) < 0) - return FALSE; - if (IsWideAtom(at)) { - wchar_t *p1; - unsigned char *p2; - wchar_t c1; - p1 = RepAtom(at)->WStrOfAE + min; - p2 = RepAtom(nat)->UStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; - } else { - unsigned char *p1, *p2; - char c1; - p1 = RepAtom(at)->UStrOfAE + min; - p2 = RepAtom(nat)->UStrOfAE; - while ((c1 = *p1++) == *p2++ && c1) - ; - return c1 == 0; - } - } +static int check_sub_string_at(int minv, const unsigned char *p1, + const unsigned char *p2, size_t len) { + p1 = skip_utf8((unsigned char *)p1, minv); + if (p1 == NULL || p2 == NULL) + return p1 == p2; + return cmpn_utf8(p1, p2, len) == 0; } static int check_sub_string_bef(int max, Term at, Term nat) { size_t len = strlen_utf8(UStringOfTerm(nat)); - int min = max - len; + int minv = max - len; const unsigned char *p1, *p2; int c1; - if ((Int)(min - len) < 0) + if ((Int)(minv - len) < 0) return FALSE; - p1 = skip_utf8((unsigned char *)UStringOfTerm(at), min); + p1 = skip_utf8((unsigned char *)UStringOfTerm(at), minv); p2 = UStringOfTerm(nat); while ((c1 = *p1++) == *p2++ && c1) ; return c1 == 0; } +static int check_sub_atom_bef(int max, Atom at, Atom nat) { + const unsigned char *p1, *p2 = RepAtom(nat)->UStrOfAE; + size_t len = strlen_utf8(p2); + int minv = max - len; + int c1; + + if ((Int)(minv - len) < 0) + return false; + p1 = skip_utf8(RepAtom(at)->UStrOfAE, minv); + while ((c1 = *p1++) == *p2++ && c1) + ; + return c1 == 0; +} + static Int cont_sub_atomic(USES_REGS1) { Term tat1 = Deref(ARG1); - Atom at = NULL; + Term tat5 = Deref(ARG5); int mask; - size_t min, len, after, sz; + size_t minv, len, after, sz; wchar_t *wp = NULL; - const unsigned char *p = NULL; - Term nat; - int sub_atom = TRUE; + const unsigned char *p = NULL, *p5 = NULL; mask = IntegerOfTerm(EXTRA_CBACK_ARG(5, 1)); - min = IntegerOfTerm(EXTRA_CBACK_ARG(5, 2)); + minv = IntegerOfTerm(EXTRA_CBACK_ARG(5, 2)); len = IntegerOfTerm(EXTRA_CBACK_ARG(5, 3)); after = IntegerOfTerm(EXTRA_CBACK_ARG(5, 4)); sz = IntegerOfTerm(EXTRA_CBACK_ARG(5, 5)); - if (mask & SUB_ATOM_HAS_UTF8) { - sub_atom = FALSE; - p = UStringOfTerm(tat1); - } else if (mask & SUB_ATOM_HAS_WIDE) { - at = AtomOfTerm(tat1); - wp = RepAtom(at)->WStrOfAE; - } else { - at = AtomOfTerm(tat1); - p = RepAtom(at)->UStrOfAE; + if (!IsVarTerm(tat1)) { + if (IsAtomTerm(tat1)) { + p = AtomOfTerm(tat1)->UStrOfAE; + } else { + p = UStringOfTerm(tat1); + } + } + if (!IsVarTerm(tat5)) { + if (IsAtomTerm(tat5)) { + p5 = AtomOfTerm(tat5)->UStrOfAE; + } else { + p5 = UStringOfTerm(tat5); + } } /* we can have one of two cases: A5 bound or unbound */ if (mask & SUB_ATOM_HAS_VAL) { - int found = FALSE; - nat = Deref(ARG5); - if (mask & SUB_ATOM_HAS_WIDE) { - wp = RepAtom(at)->WStrOfAE; - if (IsWideAtom(AtomOfTerm(nat))) { - while (!found) { - if (wcsncmp(wp + min, AtomOfTerm(nat)->WStrOfAE, len) == 0) { - Yap_unify(ARG2, MkIntegerTerm(min)); - Yap_unify(ARG3, MkIntegerTerm(len)); - Yap_unify(ARG4, MkIntegerTerm(after)); - found = TRUE; - /* found one, check if there is any left */ - while (min <= sz - len) { - after--; - min++; - if (wcsncmp(wp + min, AtomOfTerm(nat)->WStrOfAE, len) == 0) - break; - } - } else { - if (min == sz - len) - break; - after--; - min++; - } - } - } else { - while (!found) { - if (wcsstrcmp(wp + min, (char *)AtomOfTerm(nat)->StrOfAE, len) == 0) { - Yap_unify(ARG2, MkIntegerTerm(min)); - Yap_unify(ARG3, MkIntegerTerm(len)); - Yap_unify(ARG4, MkIntegerTerm(after)); - found = TRUE; - /* found one, check if there is any left */ - while (min <= sz - len) { - after--; - min++; - if (wcsstrcmp(wp + min, (char *)AtomOfTerm(nat)->StrOfAE, len) == - 0) - break; - } - } else { - if (min == sz - len) - break; - after--; - min++; - } - } - } - } else if (sub_atom) { - p = RepAtom(at)->UStrOfAE; - while (!found) { - if (strncmp((char *)p + min, (char *)AtomOfTerm(nat)->StrOfAE, len) == - 0) { - Yap_unify(ARG2, MkIntegerTerm(min)); - Yap_unify(ARG3, MkIntegerTerm(len)); - Yap_unify(ARG4, MkIntegerTerm(after)); - found = TRUE; - /* found one, check if there is any left */ - while (min <= sz - len) { - after--; - min++; - if (strncmp((char *)p + min, (char *)AtomOfTerm(nat)->StrOfAE, - len) == 0) - break; - } - } else { - if (min == sz - len) - break; - after--; - min++; - } - } - } else { - const unsigned char *p = UStringOfTerm(Deref(ARG1)), *p1 = p; - const unsigned char *p5 = UStringOfTerm(Deref(ARG5)); + bool found = false; + { + const unsigned char *p1 = p; while (!found) { - p = skip_utf8((unsigned char *)p1, min); + p = skip_utf8(p1, minv); if (cmpn_utf8(p, p5, len) == 0) { - Yap_unify(ARG2, MkIntegerTerm(min)); + Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); - found = TRUE; + found = true; /* found one, check if there is any left */ - while (min <= sz - len) { + while (minv <= sz - len) { int chr; p += get_utf8((unsigned char *)p, -1, &chr); after--; - min++; - if (cmpn_utf8(p, UStringOfTerm(nat), len) == 0) + minv++; + if (cmpn_utf8(p, p5, len) == 0) break; } } else { - if (min == sz - len) + if (minv == sz - len) break; after--; - min++; + minv++; } } } if (found) { - if (min > sz - len) + if (minv > sz - len) cut_succeed(); } else { cut_fail(); } } else if (mask & SUB_ATOM_HAS_SIZE) { - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); - Yap_unify(ARG2, MkIntegerTerm(min)); + Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG4, MkIntegerTerm(after)); Yap_unify(ARG5, nat); - min++; + minv++; if (after-- == 0) cut_succeed(); } else if (mask & SUB_ATOM_HAS_MIN) { - after = sz - (min + len); - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); + after = sz - (minv + len); + Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); Yap_unify(ARG5, nat); @@ -2088,70 +1953,87 @@ static Int cont_sub_atomic(USES_REGS1) { if (after-- == 0) cut_succeed(); } else if (mask & SUB_ATOM_HAS_AFTER) { - len = sz - (min + after); - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); - Yap_unify(ARG2, MkIntegerTerm(min)); + len = sz - (minv + after); + Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG5, nat); - min++; + minv++; if (len-- == 0) cut_succeed(); } else { - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); - Yap_unify(ARG2, MkIntegerTerm(min)); + Term nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); + Yap_unify(ARG2, MkIntegerTerm(minv)); Yap_unify(ARG3, MkIntegerTerm(len)); Yap_unify(ARG4, MkIntegerTerm(after)); Yap_unify(ARG5, nat); len++; if (after-- == 0) { - if (min == sz) + if (minv == sz) cut_succeed(); - min++; + minv++; len = 0; - after = sz - min; + after = sz - minv; } } EXTRA_CBACK_ARG(5, 1) = MkIntegerTerm(mask); - EXTRA_CBACK_ARG(5, 2) = MkIntegerTerm(min); + EXTRA_CBACK_ARG(5, 2) = MkIntegerTerm(minv); EXTRA_CBACK_ARG(5, 3) = MkIntegerTerm(len); EXTRA_CBACK_ARG(5, 4) = MkIntegerTerm(after); EXTRA_CBACK_ARG(5, 5) = MkIntegerTerm(sz); return TRUE; } -static Int sub_atomic(int sub_atom USES_REGS) { +static Int sub_atomic(bool sub_atom, bool sub_string USES_REGS) { Term tat1, tbef, tsize, tafter, tout; - int mask = 0; - size_t min, len, after, sz; + int mask = SUB_ATOM_HAS_UTF8; + size_t minv, len, after, sz; wchar_t *wp = NULL; - unsigned char *p = NULL; + const unsigned char *p = NULL; int bnds = 0; Term nat = 0L; Atom at = NULL; + int l = push_text_stack(); + if (sub_atom) + mask |= SUB_ATOM_HAS_ATOM; + tat1 = Deref(ARG1); - EXTRA_CBACK_ARG(5, 3) = MkIntegerTerm(0); - if (IsVarTerm(tat1)) { - Yap_Error(INSTANTIATION_ERROR, tat1, "sub_atom/5: first argument"); - return FALSE; - } else if (sub_atom && !IsAtomTerm(tat1)) { - Yap_Error(TYPE_ERROR_ATOM, tat1, "sub_atom/5"); - return FALSE; - } else if (!sub_atom && !IsStringTerm(tat1)) { - Yap_Error(TYPE_ERROR_STRING, tat1, "sub_string/5"); - return FALSE; + + if (!IsVarTerm(tat1)) { + if (sub_atom) { + if (IsAtomTerm(tat1)) { + p = AtomOfTerm(tat1)->UStrOfAE; + sz = strlen_utf8(p); + } else { + Yap_Error(TYPE_ERROR_ATOM, tat1, "sub_atom/5"); + ReleaseAndReturn(false); + } + } else if (sub_string) { + if (IsStringTerm(tat1)) { + p = UStringOfTerm(tat1); + sz = strlen_utf8(p); + } else { + Yap_Error(TYPE_ERROR_STRING, tat1, "sub_atom/5"); + ReleaseAndReturn(false); + } + } + } else { + Yap_Error(INSTANTIATION_ERROR, tat1, "sub_atom/5: first variable\n"); + ReleaseAndReturn(false); } + EXTRA_CBACK_ARG(5, 3) = MkIntegerTerm(0); tbef = Deref(ARG2); if (IsVarTerm(tbef)) { - min = 0; + minv = 0; } else if (!IsIntegerTerm(tbef)) { Yap_Error(TYPE_ERROR_INTEGER, tbef, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); } else { - min = IntegerOfTerm(tbef); - if ((Int)min < 0) { + minv = IntegerOfTerm(tbef); + if ((Int)minv < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, tbef, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); }; mask |= SUB_ATOM_HAS_MIN; bnds++; @@ -2160,12 +2042,12 @@ static Int sub_atomic(int sub_atom USES_REGS) { len = 0; } else if (!IsIntegerTerm(tsize)) { Yap_Error(TYPE_ERROR_INTEGER, tsize, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); } else { len = IntegerOfTerm(tsize); if ((Int)len < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, tsize, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); }; mask |= SUB_ATOM_HAS_SIZE; bnds++; @@ -2174,12 +2056,12 @@ static Int sub_atomic(int sub_atom USES_REGS) { after = 0; } else if (!IsIntegerTerm(tafter)) { Yap_Error(TYPE_ERROR_INTEGER, tafter, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); } else { after = IntegerOfTerm(tafter); if ((Int)after < 0) { Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, tafter, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); }; mask |= SUB_ATOM_HAS_AFTER; bnds++; @@ -2188,82 +2070,64 @@ static Int sub_atomic(int sub_atom USES_REGS) { if (sub_atom) { if (!IsAtomTerm(tout)) { Yap_Error(TYPE_ERROR_ATOM, tout, "sub_atom/5"); - return FALSE; + ReleaseAndReturn(FALSE); } else { Atom oat; mask |= SUB_ATOM_HAS_VAL | SUB_ATOM_HAS_SIZE; oat = AtomOfTerm(tout); - if (IsWideAtom(oat)) - len = wcslen(RepAtom(oat)->WStrOfAE); - else - len = strlen((const char *)RepAtom(oat)->StrOfAE); + len = strlen_utf8(RepAtom(oat)->UStrOfAE); } } else { if (!IsStringTerm(tout)) { Yap_Error(TYPE_ERROR_STRING, tout, "sub_string/5"); - return FALSE; + ReleaseAndReturn(FALSE); } else { mask |= SUB_ATOM_HAS_VAL | SUB_ATOM_HAS_SIZE; len = strlen_utf8(UStringOfTerm(tout)); } } if (!Yap_unify(ARG3, MkIntegerTerm(len))) - cut_fail(); + release_cut_fail(); bnds += 2; } - if (sub_atom) { - at = AtomOfTerm(tat1); - if (IsWideAtom(at)) { - mask |= SUB_ATOM_HAS_WIDE; - wp = RepAtom(at)->WStrOfAE; - sz = wcslen(wp); - } else { - p = RepAtom(at)->UStrOfAE; - sz = strlen((const char *)p); - } - } else { - mask |= SUB_ATOM_HAS_UTF8; - p = (unsigned char *)StringOfTerm(tat1); - sz = strlen_utf8(p); - } /* the problem is deterministic if we have two cases */ if (bnds > 1) { int out = FALSE; if ((mask & (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_SIZE)) == (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_SIZE)) { - if (min + len > sz) - cut_fail(); - if ((Int)(after = (sz - (min + len))) < 0) - cut_fail(); - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); + if (minv + len > sz) + release_cut_fail(); + if ((Int)(after = (sz - (minv + len))) < 0) + release_cut_fail(); + nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); if (!nat) - cut_fail(); + release_cut_fail(); out = Yap_unify(ARG4, MkIntegerTerm(after)) && Yap_unify(ARG5, nat); } else if ((mask & (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_AFTER)) == (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_AFTER)) { - if (sz < min + after) - cut_fail(); - len = sz - (min + after); - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); + if (sz < minv + after) + release_cut_fail(); + len = sz - (minv + after); + nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); if (!nat) - cut_fail(); + release_cut_fail(); out = Yap_unify(ARG3, MkIntegerTerm(len)) && Yap_unify(ARG5, nat); } else if ((mask & (SUB_ATOM_HAS_SIZE | SUB_ATOM_HAS_AFTER)) == (SUB_ATOM_HAS_SIZE | SUB_ATOM_HAS_AFTER)) { if (len + after > sz) - cut_fail(); - min = sz - (len + after); - nat = build_new_atomic(mask, wp, p, min, len PASS_REGS); + release_cut_fail(); + minv = sz - (len + after); + nat = build_new_atomic(mask, wp, p, minv, len PASS_REGS); if (!nat) - cut_fail(); - out = Yap_unify(ARG2, MkIntegerTerm(min)) && Yap_unify(ARG5, nat); + release_cut_fail(); + out = Yap_unify(ARG2, MkIntegerTerm(minv)) && Yap_unify(ARG5, nat); } else if ((mask & (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_VAL)) == (SUB_ATOM_HAS_MIN | SUB_ATOM_HAS_VAL)) { if (sub_atom) - out = check_sub_atom_at(min, at, AtomOfTerm(nat)); + out = check_sub_atom_at(minv, at, AtomOfTerm(nat), len); else - out = check_sub_string_at(min, p, UStringOfTerm(nat), len); + out = check_sub_string_at(minv, p, UStringOfTerm(nat), len); } else if ((mask & (SUB_ATOM_HAS_AFTER | SUB_ATOM_HAS_VAL)) == (SUB_ATOM_HAS_AFTER | SUB_ATOM_HAS_VAL)) { if (sub_atom) @@ -2275,49 +2139,43 @@ static Int sub_atomic(int sub_atom USES_REGS) { if (!sub_atom) { out = (strlen_utf8(UStringOfTerm(tout)) == len); if (!out) - cut_fail(); - } else if (IsWideAtom(AtomOfTerm(tout))) { - if (!(mask & SUB_ATOM_HAS_VAL)) { - cut_fail(); - } - /* just check length, they may still be several occurrences :( */ - out = (wcslen(RepAtom(AtomOfTerm(tout))->WStrOfAE) == len); + release_cut_fail(); } else { - out = (strlen((const char *)RepAtom(AtomOfTerm(tout))->StrOfAE) == len); + out = (strlen_utf8(RepAtom(AtomOfTerm(tout))->UStrOfAE) == len); if (!out) - cut_fail(); + release_cut_fail(); } if (len == sz) { out = out && Yap_unify(ARG1, ARG5) && Yap_unify(ARG2, MkIntegerTerm(0)) && Yap_unify(ARG4, MkIntegerTerm(0)); } else if (len > sz) { - cut_fail(); + release_cut_fail(); } else { mask |= SUB_ATOM_HAS_SIZE; - min = 0; + minv = 0; after = sz - len; goto backtrackable; } } if (out) - cut_succeed(); - cut_fail(); + release_cut_succeed(); + release_cut_fail(); } else { if (!(mask & SUB_ATOM_HAS_MIN)) - min = 0; + minv = 0; if (!(mask & SUB_ATOM_HAS_SIZE)) len = 0; if (!(mask & SUB_ATOM_HAS_AFTER)) - after = sz - (len + min); + after = sz - (len + minv); } backtrackable: EXTRA_CBACK_ARG(5, 1) = MkIntegerTerm(mask); - EXTRA_CBACK_ARG(5, 2) = MkIntegerTerm(min); + EXTRA_CBACK_ARG(5, 2) = MkIntegerTerm(minv); EXTRA_CBACK_ARG(5, 3) = MkIntegerTerm(len); EXTRA_CBACK_ARG(5, 4) = MkIntegerTerm(after); EXTRA_CBACK_ARG(5, 5) = MkIntegerTerm(sz); - return cont_sub_atomic(PASS_REGS1); + ReleaseAndReturn(cont_sub_atomic(PASS_REGS1)); } /** @pred sub_atom(+ _A_,? _Bef_, ? _Size_, ? _After_, ? _At_out_) is iso @@ -2334,9 +2192,10 @@ are unbound, the built-in will backtrack through all possible sub-strings of _A_. */ -static Int sub_atom(USES_REGS1) { return sub_atomic(TRUE PASS_REGS); } +static Int sub_atom(USES_REGS1) { return (sub_atomic(true, false PASS_REGS)); } -/** @pred sub_string(+ _S_,? _Bef_, ? _Size_, ? _After_, ? _S_out_) is iso +/** @pred sub_string(+ _S_,? _Bef_, ? _Size_, ? _After_, ? _S_out_) is +iso True when _S_ and _S_out_ are strings such that the @@ -2350,7 +2209,7 @@ are unbound, the built-in will generate all possible sub-strings of _S_. */ -static Int sub_string(USES_REGS1) { return sub_atomic(FALSE PASS_REGS); } +static Int sub_string(USES_REGS1) { return sub_atomic(false, true PASS_REGS); } static Int cont_current_atom(USES_REGS1) { Atom catom; @@ -2403,13 +2262,14 @@ static Int cont_current_atom(USES_REGS1) { READ_UNLOCK(ap->ARWLock); } EXTRA_CBACK_ARG(1, 2) = MkIntTerm(i); - return TRUE; + return (TRUE); } else { - return FALSE; + return (FALSE); } } -static Int current_atom(USES_REGS1) { /* current_atom(?Atom) */ +static Int current_atom(USES_REGS1) { /* current_atom(?Atom) + */ Term t1 = Deref(ARG1); if (!IsVarTerm(t1)) { if (IsAtomTerm(t1)) @@ -2428,88 +2288,9 @@ static Int current_atom(USES_REGS1) { /* current_atom(?Atom) */ return (cont_current_atom(PASS_REGS1)); } -static Int cont_current_wide_atom(USES_REGS1) { - Atom catom; - Int i = IntOfTerm(EXTRA_CBACK_ARG(1, 2)); - AtomEntry *ap; /* nasty hack for gcc on hpux */ - - /* protect current hash table line */ - if (IsAtomTerm(EXTRA_CBACK_ARG(1, 1))) - catom = AtomOfTerm(EXTRA_CBACK_ARG(1, 1)); - else - catom = NIL; - if (catom == NIL) { - i++; - /* move away from current hash table line */ - while (i < WideAtomHashTableSize) { - READ_LOCK(WideHashChain[i].AERWLock); - catom = WideHashChain[i].Entry; - READ_UNLOCK(WideHashChain[i].AERWLock); - if (catom != NIL) { - break; - } - i++; - } - if (i == WideAtomHashTableSize) { - cut_fail(); - } - } - ap = RepAtom(catom); - if (Yap_unify_constant(ARG1, MkAtomTerm(catom))) { - READ_LOCK(ap->ARWLock); - if (ap->NextOfAE == NIL) { - READ_UNLOCK(ap->ARWLock); - i++; - while (i < WideAtomHashTableSize) { - READ_LOCK(WideHashChain[i].AERWLock); - catom = WideHashChain[i].Entry; - READ_UNLOCK(WideHashChain[i].AERWLock); - if (catom != NIL) { - break; - } - i++; - } - if (i == WideAtomHashTableSize) { - cut_fail(); - } else { - EXTRA_CBACK_ARG(1, 1) = MkAtomTerm(catom); - } - } else { - EXTRA_CBACK_ARG(1, 1) = MkAtomTerm(ap->NextOfAE); - READ_UNLOCK(ap->ARWLock); - } - EXTRA_CBACK_ARG(1, 2) = MkIntTerm(i); - return TRUE; - } else { - return FALSE; - } -} - -static Int current_wide_atom(USES_REGS1) { /* current_atom(?Atom) - */ - Term t1 = Deref(ARG1); - if (!IsVarTerm(t1)) { - if (IsAtomTerm(t1)) - cut_succeed(); - else - cut_fail(); - } - READ_LOCK(WideHashChain[0].AERWLock); - if (WideHashChain[0].Entry != NIL) { - EXTRA_CBACK_ARG(1, 1) = MkAtomTerm(WideHashChain[0].Entry); - } else { - EXTRA_CBACK_ARG(1, 1) = MkIntTerm(0); - } - READ_UNLOCK(WideHashChain[0].AERWLock); - EXTRA_CBACK_ARG(1, 2) = MkIntTerm(0); - return (cont_current_wide_atom(PASS_REGS1)); -} - void Yap_InitBackAtoms(void) { Yap_InitCPredBack("$current_atom", 1, 2, current_atom, cont_current_atom, SafePredFlag | SyncPredFlag); - Yap_InitCPredBack("$current_wide_atom", 1, 2, current_wide_atom, - cont_current_wide_atom, SafePredFlag | SyncPredFlag); Yap_InitCPredBack("atom_concat", 3, 2, atom_concat3, cont_atom_concat3, 0); Yap_InitCPredBack("atomic_concat", 3, 2, atomic_concat3, cont_atomic_concat3, 0); @@ -2626,7 +2407,8 @@ void Yap_InitAtomPreds(void) { /** @pred atomic_concat(+ _As_,? _A_) - The predicate holds when the first argument is a list of atomic terms, and + The predicate holds when the first argument is a list of atomic terms, + and the second unifies with the atom obtained by concatenating all the atomic terms in the first list. The first argument thus may contain atoms or numbers. diff --git a/C/attvar.c b/C/attvar.c index a2627a09e..e6045e8d8 100644 --- a/C/attvar.c +++ b/C/attvar.c @@ -28,10 +28,11 @@ static char SccsId[] = "%W% %G%"; #define NULL (void *)0 #endif -/** @{ */ +/** @file attvars.c + @{ */ -/** @defgroup AttributeVariables_Builtins Implementation of Attribute - Declarations +/** + * @defgroup AttributeVariables_Builtins Implementation of Attribute Declarations @ingroup AttributeVariables */ diff --git a/C/blobs.c b/C/blobs.c index 6b2099d8a..7a5b3b5dc 100644 --- a/C/blobs.c +++ b/C/blobs.c @@ -212,16 +212,9 @@ bool YAP_get_blob(Term t, void **blob, size_t *len, blob_type_t **type) { void *YAP_blob_data(Atom x, size_t *len, blob_type_t **type) { if (!IsBlob(x)) { - if (IsWideAtom(x)) { - if (len) - *len = wcslen(x->WStrOfAE); - if (type) - *type = &unregistered_blob_atom; - return x->WStrOfAE; - } if (len) - *len = strlen((char *)x->StrOfAE); + *len = strlen_utf8(x->UStrOfAE); if (type) *type = &unregistered_blob_atom; return x->StrOfAE; diff --git a/C/c_interface.c b/C/c_interface.c index 53ccf3a74..1fedec402 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -398,7 +398,16 @@ X_API Term YAP_MkAtomTerm(Atom n) { X_API Atom YAP_AtomOfTerm(Term t) { return (AtomOfTerm(t)); } -X_API bool YAP_IsWideAtom(Atom a) { return IsWideAtom(a); } +X_API bool YAP_IsWideAtom(Atom a) { + const unsigned char *s = RepAtom(a)->UStrOfAE; + int32_t v; + while (*s) { + size_t n = get_utf8(s, 1, &v); + if (n > 1) + return true; + } + return false; +} X_API const char *YAP_AtomName(Atom a) { const char *o; @@ -407,7 +416,20 @@ X_API const char *YAP_AtomName(Atom a) { return (o); } -X_API const wchar_t *YAP_WideAtomName(Atom a) { return RepAtom(a)->WStrOfAE; } +X_API const wchar_t *YAP_WideAtomName(Atom a) { + int32_t v; + const unsigned char *s = RepAtom(a)->UStrOfAE; + size_t n = strlen_utf8(s); + wchar_t *dest = Malloc((n + 1) * sizeof(wchar_t)), *o = dest; + while (*s) { + size_t n = get_utf8(s, 1, &v); + if (n == 0) + return NULL; + *o++ = v; + } + o[0] = '\0'; + return dest; +} X_API Atom YAP_LookupAtom(const char *c) { CACHE_REGS @@ -432,7 +454,7 @@ X_API Atom YAP_LookupWideAtom(const wchar_t *c) { Atom a; while (TRUE) { - a = Yap_LookupWideAtom((wchar_t *)c); + a = Yap_NWCharsToAtom(c, -1 USES_REGS); if (a == NIL || Yap_get_signal(YAP_CDOVF_SIGNAL)) { if (!Yap_locked_growheap(FALSE, 0, NULL)) { Yap_Error(RESOURCE_ERROR_HEAP, TermNil, "YAP failed to grow heap: %s", @@ -467,15 +489,9 @@ X_API size_t YAP_AtomNameLength(Atom at) { if (IsBlob(at)) { return RepAtom(at)->rep.blob->length; } - if (IsWideAtom(at)) { - wchar_t *c = RepAtom(at)->WStrOfAE; + unsigned char *c = RepAtom(at)->UStrOfAE; - return wcslen(c); - } else { - unsigned char *c = RepAtom(at)->UStrOfAE; - - return strlen((char *)c); - } + return strlen_utf8(c); } X_API Term YAP_MkVarTerm(void) { @@ -1169,10 +1185,10 @@ Int YAP_ExecuteOnCut(PredEntry *pe, CPredicate exec_code, Yap_CloseSlots(CurSlot); PP = NULL; // B = LCL0-(CELL*)oB; - if (false && Yap_RaiseException()) { + if (!val && Yap_RaiseException()) { return false; } else { /* TRUE */ - return true; + return val; } } @@ -1355,12 +1371,17 @@ X_API Term YAP_NWideBufferToString(const wchar_t *s, size_t len) { /* copy a string to a buffer */ X_API Term YAP_ReadBuffer(const char *s, Term *tp) { CACHE_REGS - Term t; + Term tv, t; BACKUP_H(); + if (*tp) + tv = *tp; + else + tv = 0; LOCAL_ErrorMessage = NULL; - while (!(t = Yap_StringToTerm(s, strlen(s) + 1, &LOCAL_encoding, - GLOBAL_MaxPriority, tp))) { + const unsigned char *us = (const unsigned char *)s; + while (!(t = Yap_BufferToTermWithPrioBindings( + us, strlen(s) + 1, TermNil, GLOBAL_MaxPriority, tv))) { if (LOCAL_ErrorMessage) { if (!strcmp(LOCAL_ErrorMessage, "Stack Overflow")) { if (!Yap_dogc(0, NULL PASS_REGS)) { @@ -2088,7 +2109,7 @@ X_API void YAP_Write(Term t, FILE *f, int flags) { RECOVER_MACHINE_REGS(); } -X_API Term YAP_CopyTerm(Term t) { +X_API YAP_Term YAP_CopyTerm(Term t) { Term tn; BACKUP_MACHINE_REGS(); @@ -2096,7 +2117,7 @@ X_API Term YAP_CopyTerm(Term t) { RECOVER_MACHINE_REGS(); - return tn; + return (tn); } X_API char *YAP_WriteBuffer(Term t, char *buf, size_t sze, int flags) { @@ -2289,7 +2310,7 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) { !yap_init->Embedded; Yap_InitSysbits(0); /* init signal handling and time, required by later functions */ - GLOBAL_argv = yap_init->Argv; + GLOBAL_argv = yap_init->Argv; GLOBAL_argc = yap_init->Argc; if (0 && ((YAP_QLY && yap_init->SavedState) || (YAP_BOOT_PL && (yap_init->YapPrologBootFile)))) { @@ -2350,10 +2371,10 @@ YAP_file_type_t YAP_Init(YAP_init_args *yap_init) { // CACHE_REGS - if (Yap_embedded) - if (yap_init->QuietMode) { - setVerbosity(TermSilent); - } + if (Yap_embedded) + if (yap_init->QuietMode) { + setVerbosity(TermSilent); + } { if (yap_init->YapPrologRCFile != NULL) { /* @@ -3191,10 +3212,10 @@ size_t YAP_UTF8_TextLength(Term t) { Term hd = HeadOfTerm(t); if (IsAtomTerm(hd)) { Atom at = AtomOfTerm(hd); - if (IsWideAtom(at)) - c = RepAtom(at)->WStrOfAE[0]; - else - c = RepAtom(at)->StrOfAE[0]; + unsigned char *s = RepAtom(at)->UStrOfAE; + int32_t ch; + get_utf8(s, 1, &ch); + c = ch; } else if (IsIntegerTerm(hd)) { c = IntegerOfTerm(hd); } else { @@ -3205,20 +3226,7 @@ size_t YAP_UTF8_TextLength(Term t) { } } else if (IsAtomTerm(t)) { Atom at = AtomOfTerm(t); - if (IsWideAtom(at)) { - const wchar_t *s = RepAtom(at)->WStrOfAE; - int c; - while ((c = *s++)) { - sz += utf8proc_encode_char(c, dst); - } - } else { - const unsigned char *s = (const unsigned char *)RepAtom(at)->StrOfAE; - int c; - - while ((c = *s++)) { - sz += utf8proc_encode_char(c, dst); - } - } + sz = strlen(RepAtom(at)->StrOfAE); } else if (IsStringTerm(t)) { sz = strlen(StringOfTerm(t)); } diff --git a/C/cdmgr.c b/C/cdmgr.c index bb62f0954..65acb4b91 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -1447,14 +1447,10 @@ static int not_was_reconsulted(PredEntry *p, Term t, int mode) { static void addcl_permission_error(AtomEntry *ap, Int Arity, int in_use) { CACHE_REGS - Term t, ti[2]; - ti[0] = MkAtomTerm(AbsAtom(ap)); - ti[1] = MkIntegerTerm(Arity); - t = Yap_MkApplTerm(FunctorSlash, 2, ti); - LOCAL_ErrorMessage = LOCAL_ErrorSay; - LOCAL_Error_Term = t; LOCAL_Error_TYPE = PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE; + LOCAL_ErrorMessage = Malloc( 256 ); + if (in_use) { if (Arity == 0) sprintf(LOCAL_ErrorMessage, "static predicate %s is in use", ap->StrOfAE); @@ -2028,9 +2024,7 @@ static Int p_compile(USES_REGS1) { /* '$compile'(+C,+Flags,+C0,-Ref) */ YAPLeaveCriticalSection(); } if (LOCAL_ErrorMessage) { - if (!LOCAL_Error_Term) - LOCAL_Error_Term = TermNil; - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + Yap_Error(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage); YAPLeaveCriticalSection(); return false; } @@ -3590,7 +3584,8 @@ static Int p_predicate_erased_statistics(USES_REGS1) { Term tpred = ArgOfTerm(2, Deref(ARG1)); Term tmod = ArgOfTerm(1, Deref(ARG1)); - if (EndOfPAEntr(pe = Yap_get_pred(tpred, tmod, "predicate_erased_statistics"))) + if (EndOfPAEntr(pe = + Yap_get_pred(tpred, tmod, "predicate_erased_statistics"))) return FALSE; while (cl) { if (cl->ClPred == pe) { diff --git a/C/cmppreds.c b/C/cmppreds.c index da947221f..9da40cd5b 100644 --- a/C/cmppreds.c +++ b/C/cmppreds.c @@ -18,30 +18,28 @@ /// @file cmppreds.c - - -/** +/** @defgroup Comparing_Terms Comparing Terms @ingroup builtins The following predicates are used to compare and order terms, using the standard ordering: -+ ++ variables come before numbers, numbers come before atoms which in turn come before compound terms, i.e.: variables @< numbers @< atoms @< compound terms. + Variables are roughly ordered by "age" (the "oldest" variable is put first); -+ ++ Floating point numbers are sorted in increasing order; -+ ++ Rational numbers are sorted in increasing order; -+ ++ Integers are sorted in increasing order; -+ ++ Atoms are sorted in lexicographic order; -+ ++ Compound terms are ordered first by arity of the main functor, then by the name of the main functor, and finally by their arguments in left-to-right order. @@ -49,282 +47,254 @@ left-to-right order. @{ - + */ - #ifdef SCCS -static char SccsId[] = "%W% %G%"; +static char SccsId[] = "%W% %G%"; #endif #include "Yap.h" -#include "Yatom.h" #include "YapHeap.h" +#include "Yatom.h" #include "eval.h" #if HAVE_STRING_H #include #endif #include +#include "YapError.h" + static Int compare(Term, Term); -static Int p_compare( USES_REGS1 ); -static Int p_acomp( USES_REGS1 ); -static Int a_eq(Term,Term); -static Int a_dif(Term,Term); +static Int p_compare(USES_REGS1); +static Int p_acomp(USES_REGS1); +static Int a_eq(Term, Term); +static Int a_dif(Term, Term); static Int a_gt(Term, Term); -static Int a_ge(Term,Term); -static Int a_lt(Term,Term); -static Int a_le(Term,Term); -static Int a_noteq(Term,Term); -static Int a_gen_lt(Term,Term); -static Int a_gen_le(Term,Term); -static Int a_gen_gt(Term,Term); -static Int a_gen_ge(Term,Term); +static Int a_ge(Term, Term); +static Int a_lt(Term, Term); +static Int a_le(Term, Term); +static Int a_noteq(Term, Term); +static Int a_gen_lt(Term, Term); +static Int a_gen_le(Term, Term); +static Int a_gen_gt(Term, Term); +static Int a_gen_ge(Term, Term); -#define rfloat(X) ( X > 0.0 ? 1 : ( X == 0.0 ? 0 : -1)) +#define rfloat(X) (X > 0.0 ? 1 : (X == 0.0 ? 0 : -1)) -static int -cmp_atoms(Atom a1, Atom a2) -{ - if (IsWideAtom(a1)) { - if (IsWideAtom(a2)) { - return wcscmp((wchar_t *)RepAtom(a1)->StrOfAE,(wchar_t *)RepAtom(a2)->StrOfAE); - } else { - /* The standard does not seem to have nothing on this */ - unsigned char *s1 = (unsigned char *)RepAtom(a1)->StrOfAE; - wchar_t *s2 = (wchar_t *)RepAtom(a2)->StrOfAE; - - while (*s1 == *s2) { - if (!*s1) return 0; - s1++; - s2++; - } - return *s1-*s2; - } - } else if (IsWideAtom(a2)) { - /* The standard does not seem to have nothing on this */ - wchar_t *s1 = (wchar_t *)RepAtom(a1)->StrOfAE; - unsigned char *s2 = (unsigned char *)RepAtom(a2)->StrOfAE; - - while (*s1 == *s2) { - if (!*s1) return 0; - s1++; - s2++; - } - return *s1-*s2; - } else { - return strcmp((char *)RepAtom(a1)->StrOfAE,(char *)RepAtom(a2)->StrOfAE); - } +static int cmp_atoms(Atom a1, Atom a2) { + return strcmp(RepAtom(a1)->StrOfAE, RepAtom(a2)->StrOfAE); } -static Int compare_complex(register CELL *pt0, register CELL *pt0_end, register - CELL *pt1) -{ +static Int compare_complex(register CELL *pt0, register CELL *pt0_end, + register CELL *pt1) { CACHE_REGS register CELL **to_visit = (CELL **)HR; register Int out = 0; - loop: +loop: while (pt0 < pt0_end) { register CELL d0, d1; - ++ pt0; - ++ pt1; + ++pt0; + ++pt1; d0 = Derefa(pt0); d1 = Derefa(pt1); if (IsVarTerm(d0)) { if (IsVarTerm(d1)) { - out = Signed(d0) - Signed(d1); - if (out) goto done; - } - else { - out = -1; - goto done; + out = Signed(d0) - Signed(d1); + if (out) + goto done; + } else { + out = -1; + goto done; } } else if (IsVarTerm(d1)) { out = 1; goto done; } else { - if (d0 == d1) continue; + if (d0 == d1) + continue; else if (IsAtomTerm(d0)) { - if (IsAtomTerm(d1)) - out = cmp_atoms(AtomOfTerm(d0), AtomOfTerm(d1)); - else if (IsPrimitiveTerm(d1)) - out = 1; - else out = -1; - /* I know out must be != 0 */ - goto done; - } - else if (IsIntTerm(d0)) { - if (IsIntTerm(d1)) - out = IntOfTerm(d0) - IntOfTerm(d1); - else if (IsFloatTerm(d1)) { - out = 1; - } else if (IsLongIntTerm(d1)) { - out = IntOfTerm(d0) - LongIntOfTerm(d1); + if (IsAtomTerm(d1)) + out = cmp_atoms(AtomOfTerm(d0), AtomOfTerm(d1)); + else if (IsPrimitiveTerm(d1)) + out = 1; + else + out = -1; + /* I know out must be != 0 */ + goto done; + } else if (IsIntTerm(d0)) { + if (IsIntTerm(d1)) + out = IntOfTerm(d0) - IntOfTerm(d1); + else if (IsFloatTerm(d1)) { + out = 1; + } else if (IsLongIntTerm(d1)) { + out = IntOfTerm(d0) - LongIntOfTerm(d1); #ifdef USE_GMP - } else if (IsBigIntTerm(d1)) { - out = Yap_gmp_tcmp_int_big(IntOfTerm(d0), d1); + } else if (IsBigIntTerm(d1)) { + out = Yap_gmp_tcmp_int_big(IntOfTerm(d0), d1); #endif - } else if (IsRefTerm(d1)) - out = 1 ; - else out = -1; - if (out != 0) - goto done; + } else if (IsRefTerm(d1)) + out = 1; + else + out = -1; + if (out != 0) + goto done; } else if (IsFloatTerm(d0)) { - if (IsFloatTerm(d1)){ - out = rfloat(FloatOfTerm(d0) - FloatOfTerm(d1)); - } else if (IsRefTerm(d1)) { - out = 1; - } else { - out = -1; - } - if (out != 0) - goto done; + if (IsFloatTerm(d1)) { + out = rfloat(FloatOfTerm(d0) - FloatOfTerm(d1)); + } else if (IsRefTerm(d1)) { + out = 1; + } else { + out = -1; + } + if (out != 0) + goto done; } else if (IsStringTerm(d0)) { - if (IsStringTerm(d1)){ - out = strcmp((char *)StringOfTerm(d0) , (char *)StringOfTerm(d1)); - } else if (IsIntTerm(d1)) - out = 1; - else if (IsFloatTerm(d1)) { - out = 1; - } else if (IsLongIntTerm(d1)) { - out = 1; + if (IsStringTerm(d1)) { + out = strcmp((char *)StringOfTerm(d0), (char *)StringOfTerm(d1)); + } else if (IsIntTerm(d1)) + out = 1; + else if (IsFloatTerm(d1)) { + out = 1; + } else if (IsLongIntTerm(d1)) { + out = 1; #ifdef USE_GMP - } else if (IsBigIntTerm(d1)) { - out = 1; + } else if (IsBigIntTerm(d1)) { + out = 1; #endif - } else if (IsRefTerm(d1)) { - out = 1 ; - } else { - out = -1; - } - if (out != 0) - goto done; + } else if (IsRefTerm(d1)) { + out = 1; + } else { + out = -1; + } + if (out != 0) + goto done; } else if (IsLongIntTerm(d0)) { - if (IsIntTerm(d1)) - out = LongIntOfTerm(d0) - IntOfTerm(d1); - else if (IsFloatTerm(d1)) { - out = 1; - } else if (IsLongIntTerm(d1)) { - out = LongIntOfTerm(d0) - LongIntOfTerm(d1); + if (IsIntTerm(d1)) + out = LongIntOfTerm(d0) - IntOfTerm(d1); + else if (IsFloatTerm(d1)) { + out = 1; + } else if (IsLongIntTerm(d1)) { + out = LongIntOfTerm(d0) - LongIntOfTerm(d1); #ifdef USE_GMP - } else if (IsBigIntTerm(d1)) { - out = Yap_gmp_tcmp_int_big(LongIntOfTerm(d0), d1); + } else if (IsBigIntTerm(d1)) { + out = Yap_gmp_tcmp_int_big(LongIntOfTerm(d0), d1); #endif - } else if (IsRefTerm(d1)) { - out = 1 ; - } else { - out = -1; - } - if (out != 0) - goto done; + } else if (IsRefTerm(d1)) { + out = 1; + } else { + out = -1; + } + if (out != 0) + goto done; } #ifdef USE_GMP else if (IsBigIntTerm(d0)) { - if (IsIntTerm(d1)) { - out = Yap_gmp_tcmp_big_int(d0, IntOfTerm(d1)); - } else if (IsFloatTerm(d1)) { - out = 1; - } else if (IsLongIntTerm(d1)) { - out = Yap_gmp_tcmp_big_int(d0, LongIntOfTerm(d1)); - } else if (IsBigIntTerm(d1)) { - out = Yap_gmp_tcmp_big_big(d0, d1); - } else if (IsRefTerm(d1)) - out = 1 ; - else out = -1; - if (out != 0) - goto done; + if (IsIntTerm(d1)) { + out = Yap_gmp_tcmp_big_int(d0, IntOfTerm(d1)); + } else if (IsFloatTerm(d1)) { + out = 1; + } else if (IsLongIntTerm(d1)) { + out = Yap_gmp_tcmp_big_int(d0, LongIntOfTerm(d1)); + } else if (IsBigIntTerm(d1)) { + out = Yap_gmp_tcmp_big_big(d0, d1); + } else if (IsRefTerm(d1)) + out = 1; + else + out = -1; + if (out != 0) + goto done; } #endif else if (IsPairTerm(d0)) { - if (!IsPairTerm(d1)) { - if (IsApplTerm(d1)) { - Functor f = FunctorOfTerm(d1); - if (IsExtensionFunctor(f)) - out = 1; - else if (!(out = 2-ArityOfFunctor(f))) - out = strcmp(".",(char *)RepAtom(NameOfFunctor(f))->StrOfAE); - } else out = 1; - goto done; - } + if (!IsPairTerm(d1)) { + if (IsApplTerm(d1)) { + Functor f = FunctorOfTerm(d1); + if (IsExtensionFunctor(f)) + out = 1; + else if (!(out = 2 - ArityOfFunctor(f))) + out = strcmp(".", (char *)RepAtom(NameOfFunctor(f))->StrOfAE); + } else + out = 1; + goto done; + } #ifdef RATIONAL_TREES - to_visit[0] = pt0; - to_visit[1] = pt0_end; - to_visit[2] = pt1; - to_visit[3] = (CELL *)*pt0; - to_visit += 4; - *pt0 = d1; + to_visit[0] = pt0; + to_visit[1] = pt0_end; + to_visit[2] = pt1; + to_visit[3] = (CELL *)*pt0; + to_visit += 4; + *pt0 = d1; #else - /* store the terms to visit */ - if (pt0 < pt0_end) { - to_visit[0] = pt0; - to_visit[1] = pt0_end; - to_visit[2] = pt1; - to_visit += 3; - } + /* store the terms to visit */ + if (pt0 < pt0_end) { + to_visit[0] = pt0; + to_visit[1] = pt0_end; + to_visit[2] = pt1; + to_visit += 3; + } #endif - pt0 = RepPair(d0) - 1; - pt0_end = RepPair(d0) + 1; - pt1 = RepPair(d1) - 1; - continue; - } - else if (IsRefTerm(d0)) { - if (IsRefTerm(d1)) - out = Unsigned(RefOfTerm(d1)) - - Unsigned(RefOfTerm(d0)); - else out = -1; - goto done; + pt0 = RepPair(d0) - 1; + pt0_end = RepPair(d0) + 1; + pt1 = RepPair(d1) - 1; + continue; + } else if (IsRefTerm(d0)) { + if (IsRefTerm(d1)) + out = Unsigned(RefOfTerm(d1)) - Unsigned(RefOfTerm(d0)); + else + out = -1; + goto done; } else if (IsApplTerm(d0)) { - register Functor f; - register CELL *ap2, *ap3; - if (!IsApplTerm(d1)) { - out = 1 ; - goto done; - } else { - /* store the terms to visit */ - Functor f2; - ap2 = RepAppl(d0); - ap3 = RepAppl(d1); - f = (Functor)(*ap2); - if (IsExtensionFunctor(f)) { - out = 1; - goto done; - } - f2 = (Functor)(*ap3); - if (IsExtensionFunctor(f2)) { - out = -1; - goto done; - } - /* compare functors */ - if (f != (Functor)*ap3) { - if (!(out = ArityOfFunctor(f)-ArityOfFunctor(f2))) - out = cmp_atoms(NameOfFunctor(f), NameOfFunctor(f2)); - goto done; - } + register Functor f; + register CELL *ap2, *ap3; + if (!IsApplTerm(d1)) { + out = 1; + goto done; + } else { + /* store the terms to visit */ + Functor f2; + ap2 = RepAppl(d0); + ap3 = RepAppl(d1); + f = (Functor)(*ap2); + if (IsExtensionFunctor(f)) { + out = 1; + goto done; + } + f2 = (Functor)(*ap3); + if (IsExtensionFunctor(f2)) { + out = -1; + goto done; + } + /* compare functors */ + if (f != (Functor)*ap3) { + if (!(out = ArityOfFunctor(f) - ArityOfFunctor(f2))) + out = cmp_atoms(NameOfFunctor(f), NameOfFunctor(f2)); + goto done; + } #ifdef RATIONAL_TREES - to_visit[0] = pt0; - to_visit[1] = pt0_end; - to_visit[2] = pt1; - to_visit[3] = (CELL *)*pt0; - to_visit += 4; - *pt0 = d1; + to_visit[0] = pt0; + to_visit[1] = pt0_end; + to_visit[2] = pt1; + to_visit[3] = (CELL *)*pt0; + to_visit += 4; + *pt0 = d1; #else - /* store the terms to visit */ - if (pt0 < pt0_end) { - to_visit[0] = pt0; - to_visit[1] = pt0_end; - to_visit[2] = pt1; - to_visit += 3; - } + /* store the terms to visit */ + if (pt0 < pt0_end) { + to_visit[0] = pt0; + to_visit[1] = pt0_end; + to_visit[2] = pt1; + to_visit += 3; + } #endif - d0 = ArityOfFunctor(f); - pt0 = ap2; - pt0_end = ap2 + d0; - pt1 = ap3; - continue; - } + d0 = ArityOfFunctor(f); + pt0 = ap2; + pt0_end = ap2 + d0; + pt1 = ap3; + continue; + } } - } } /* Do we still have compound terms to visit */ @@ -344,8 +314,8 @@ static Int compare_complex(register CELL *pt0, register CELL *pt0_end, register goto loop; } - done: - /* failure */ +done: +/* failure */ #ifdef RATIONAL_TREES while (to_visit > (CELL **)HR) { to_visit -= 4; @@ -355,11 +325,10 @@ static Int compare_complex(register CELL *pt0, register CELL *pt0_end, register *pt0 = (CELL)to_visit[3]; } #endif - return(out); + return (out); } -inline static Int -compare(Term t1, Term t2) /* compare terms t1 and t2 */ +inline static Int compare(Term t1, Term t2) /* compare terms t1 and t2 */ { if (t1 == t2) @@ -375,32 +344,32 @@ compare(Term t1, Term t2) /* compare terms t1 and t2 */ if (IsAtomOrIntTerm(t1)) { if (IsAtomTerm(t1)) { if (IsAtomTerm(t2)) - return cmp_atoms(AtomOfTerm(t1),AtomOfTerm(t2)); + return cmp_atoms(AtomOfTerm(t1), AtomOfTerm(t2)); if (IsPrimitiveTerm(t2)) - return 1; + return 1; if (IsStringTerm(t2)) - return 1; + return 1; return -1; } else { if (IsIntTerm(t2)) { - return IntOfTerm(t1) - IntOfTerm(t2); + return IntOfTerm(t1) - IntOfTerm(t2); } if (IsApplTerm(t2)) { - Functor fun2 = FunctorOfTerm(t2); - switch ((CELL)fun2) { - case double_e: - return 1; - case long_int_e: - return IntOfTerm(t1) - LongIntOfTerm(t2); + Functor fun2 = FunctorOfTerm(t2); + switch ((CELL)fun2) { + case double_e: + return 1; + case long_int_e: + return IntOfTerm(t1) - LongIntOfTerm(t2); #ifdef USE_GMP - case big_int_e: - return Yap_gmp_tcmp_int_big(IntOfTerm(t1), t2); + case big_int_e: + return Yap_gmp_tcmp_int_big(IntOfTerm(t1), t2); #endif - case db_ref_e: - return 1; - case string_e: - return -1; - } + case db_ref_e: + return 1; + case string_e: + return -1; + } } return -1; } @@ -408,20 +377,20 @@ compare(Term t1, Term t2) /* compare terms t1 and t2 */ if (IsApplTerm(t2)) { Functor f = FunctorOfTerm(t2); if (IsExtensionFunctor(f)) - return 1; + return 1; else { - int out; - if (!(out = 2-ArityOfFunctor(f))) - out = strcmp(".",(char *)RepAtom(NameOfFunctor(f))->StrOfAE); - return(out); + if (f != FunctorDot) + return strcmp(".", RepAtom(NameOfFunctor(f))->StrOfAE); + else { + return compare_complex(RepPair(t1) - 1, RepPair(t1) + 1, RepAppl(t2)); + } } } if (IsPairTerm(t2)) { - return(compare_complex(RepPair(t1)-1, - RepPair(t1)+1, - RepPair(t2)-1)); - } - else return 1; + return ( + compare_complex(RepPair(t1) - 1, RepPair(t1) + 1, RepPair(t2) - 1)); + } else + return 1; } else { /* compound term */ Functor fun1 = FunctorOfTerm(t1); @@ -429,87 +398,82 @@ compare(Term t1, Term t2) /* compare terms t1 and t2 */ if (IsExtensionFunctor(fun1)) { /* float, long, big, dbref */ switch ((CELL)fun1) { - case double_e: - { - if (IsFloatTerm(t2)) - return(rfloat(FloatOfTerm(t1) - FloatOfTerm(t2))); - if (IsRefTerm(t2)) - return 1; - return -1; - } - case long_int_e: - { - if (IsIntTerm(t2)) - return LongIntOfTerm(t1) - IntOfTerm(t2); - if (IsFloatTerm(t2)) { - return 1; - } - if (IsLongIntTerm(t2)) - return LongIntOfTerm(t1) - LongIntOfTerm(t2); + case double_e: { + if (IsFloatTerm(t2)) + return (rfloat(FloatOfTerm(t1) - FloatOfTerm(t2))); + if (IsRefTerm(t2)) + return 1; + return -1; + } + case long_int_e: { + if (IsIntTerm(t2)) + return LongIntOfTerm(t1) - IntOfTerm(t2); + if (IsFloatTerm(t2)) { + return 1; + } + if (IsLongIntTerm(t2)) + return LongIntOfTerm(t1) - LongIntOfTerm(t2); #ifdef USE_GMP - if (IsBigIntTerm(t2)) { - return Yap_gmp_tcmp_int_big(LongIntOfTerm(t1), t2); - } + if (IsBigIntTerm(t2)) { + return Yap_gmp_tcmp_int_big(LongIntOfTerm(t1), t2); + } #endif - if (IsRefTerm(t2)) - return 1; - return -1; - } + if (IsRefTerm(t2)) + return 1; + return -1; + } #ifdef USE_GMP - case big_int_e: - { - if (IsIntTerm(t2)) - return Yap_gmp_tcmp_big_int(t1, IntOfTerm(t2)); - if (IsFloatTerm(t2)) { - return 1; - } - if (IsLongIntTerm(t2)) - return Yap_gmp_tcmp_big_int(t1, LongIntOfTerm(t2)); - if (IsBigIntTerm(t2)) { - return Yap_gmp_tcmp_big_big(t1, t2); - } - if (IsRefTerm(t2)) - return 1; - return -1; - } + case big_int_e: { + if (IsIntTerm(t2)) + return Yap_gmp_tcmp_big_int(t1, IntOfTerm(t2)); + if (IsFloatTerm(t2)) { + return 1; + } + if (IsLongIntTerm(t2)) + return Yap_gmp_tcmp_big_int(t1, LongIntOfTerm(t2)); + if (IsBigIntTerm(t2)) { + return Yap_gmp_tcmp_big_big(t1, t2); + } + if (IsRefTerm(t2)) + return 1; + return -1; + } #endif - case string_e: - { - if (IsApplTerm(t2)) { - Functor fun2 = FunctorOfTerm(t2); - switch ((CELL)fun2) { - case double_e: - return 1; - case long_int_e: - return 1; + case string_e: { + if (IsApplTerm(t2)) { + Functor fun2 = FunctorOfTerm(t2); + switch ((CELL)fun2) { + case double_e: + return 1; + case long_int_e: + return 1; #ifdef USE_GMP - case big_int_e: - return 1; + case big_int_e: + return 1; #endif - case db_ref_e: - return 1; - case string_e: - return strcmp((char *)StringOfTerm(t1), (char *)StringOfTerm(t2)); - } - return -1; - } - return -1; - } + case db_ref_e: + return 1; + case string_e: + return strcmp((char *)StringOfTerm(t1), (char *)StringOfTerm(t2)); + } + return -1; + } + return -1; + } case db_ref_e: - if (IsRefTerm(t2)) - return Unsigned(RefOfTerm(t2)) - - Unsigned(RefOfTerm(t1)); - return -1; + if (IsRefTerm(t2)) + return Unsigned(RefOfTerm(t2)) - Unsigned(RefOfTerm(t1)); + return -1; } } if (!IsApplTerm(t2)) { if (IsPairTerm(t2)) { - Int out; - Functor f = FunctorOfTerm(t1); + Int out; + Functor f = FunctorOfTerm(t1); - if (!(out = ArityOfFunctor(f))-2) - out = strcmp((char *)RepAtom(NameOfFunctor(f))->StrOfAE,"."); - return out; + if (!(out = ArityOfFunctor(f)) - 2) + out = strcmp((char *)RepAtom(NameOfFunctor(f))->StrOfAE, "."); + return out; } return 1; } else { @@ -517,46 +481,42 @@ compare(Term t1, Term t2) /* compare terms t1 and t2 */ Int r; if (IsExtensionFunctor(fun2)) { - return 1; + return 1; } r = ArityOfFunctor(fun1) - ArityOfFunctor(fun2); if (r) - return r; + return r; r = cmp_atoms(NameOfFunctor(fun1), NameOfFunctor(fun2)); if (r) - return r; + return r; else - return(compare_complex(RepAppl(t1), - RepAppl(t1)+ArityOfFunctor(fun1), - RepAppl(t2))); + return (compare_complex(RepAppl(t1), RepAppl(t1) + ArityOfFunctor(fun1), + RepAppl(t2))); } } } -Int Yap_compare_terms(Term d0, Term d1) -{ - return compare(Deref(d0),Deref(d1)); +Int Yap_compare_terms(Term d0, Term d1) { + return compare(Deref(d0), Deref(d1)); } -/** @pred compare( _C_, _X_, _Y_) is iso +/** @pred compare( _C_, _X_, _Y_) is iso As a result of comparing _X_ and _Y_, _C_ may take one of the following values: -+ ++ `=` if _X_ and _Y_ are identical; -+ ++ `<` if _X_ precedes _Y_ in the defined order; -+ ++ `>` if _Y_ precedes _X_ in the defined order; */ -Int -p_compare( USES_REGS1 ) -{ /* compare(?Op,?T1,?T2) */ - Int r = compare(Deref(ARG2), Deref(ARG3)); - Atom p; +Int p_compare(USES_REGS1) { /* compare(?Op,?T1,?T2) */ + Int r = compare(Deref(ARG2), Deref(ARG3)); + Atom p; Term t = Deref(ARG1); if (r < 0) p = AtomLT; @@ -568,70 +528,46 @@ p_compare( USES_REGS1 ) if (IsAtomTerm(t)) { Atom a = AtomOfTerm(t); if (a == p) - return true; - if (a != AtomLT && - a != AtomGT && - a != AtomEq) - Yap_Error(DOMAIN_ERROR_ORDER, ARG1, NULL); + return true; + if (a != AtomLT && a != AtomGT && a != AtomEq) + Yap_Error(DOMAIN_ERROR_ORDER, ARG1, NULL); } else { - Yap_Error(TYPE_ERROR_ATOM, ARG1, NULL); + Yap_Error(TYPE_ERROR_ATOM, ARG1, NULL); } return false; } - + return Yap_unify_constant(ARG1, MkAtomTerm(p)); } - -/** @pred _X_ \== _Y_ is iso +/** @pred _X_ \== _Y_ is iso Terms _X_ and _Y_ are not strictly identical. */ -static Int -a_noteq(Term t1, Term t2) -{ - return (compare(t1, t2) != 0); -} +static Int a_noteq(Term t1, Term t2) { return (compare(t1, t2) != 0); } -static Int -a_gen_lt(Term t1, Term t2) -{ - return (compare(t1, t2) < 0); -} +static Int a_gen_lt(Term t1, Term t2) { return (compare(t1, t2) < 0); } -/** @pred _X_ @=< _Y_ is iso +/** @pred _X_ @=< _Y_ is iso Term _X_ does not follow term _Y_ in the standard order. */ -static Int -a_gen_le(Term t1, Term t2) -{ - return (compare(t1, t2) <= 0); -} +static Int a_gen_le(Term t1, Term t2) { return (compare(t1, t2) <= 0); } -/** @pred _X_ @> _Y_ is iso +/** @pred _X_ @> _Y_ is iso Term _X_ does not follow term _Y_ in the standard order */ -static Int -a_gen_gt(Term t1, Term t2) -{ - return compare(t1, t2) > 0; -} +static Int a_gen_gt(Term t1, Term t2) { return compare(t1, t2) > 0; } -/** @pred _X_ @>= _Y_ is iso +/** @pred _X_ @>= _Y_ is iso -Term _X_ does not precede term _Y_ in the standard order. +Term _X_ does not precede term _Y_ in the standard order. */ -static Int -a_gen_ge(Term t1, Term t2) -{ - return compare(t1, t2) >= 0; -} - +static Int a_gen_ge(Term t1, Term t2) { return compare(t1, t2) >= 0; } /** @} @@ -642,19 +578,14 @@ a_gen_ge(Term t1, Term t2) @defgroup arithmetic_cmps Arithmetic Comparison Predicates @ingroup arithmetic - Comparison of Numeric Expressions. Both arguments must be valid ground expressions at time of call. + Comparison of Numeric Expressions. Both arguments must be valid ground + expressions at time of call. @{ */ -inline static Int -int_cmp(Int dif) -{ - return dif; -} +inline static Int int_cmp(Int dif) { return dif; } -inline static Int -flt_cmp(Float dif) -{ +inline static Int flt_cmp(Float dif) { if (dif < 0.0) return -1; if (dif > 0.0) @@ -662,26 +593,20 @@ flt_cmp(Float dif) return dif = 0.0; } - -static inline Int -a_cmp(Term t1, Term t2 USES_REGS) -{ - LOCAL_ArithError = FALSE; +static Int a_cmp(Term t1, Term t2 USES_REGS) { if (IsVarTerm(t1)) { - LOCAL_ArithError = TRUE; - Yap_Error(INSTANTIATION_ERROR, t1, "=:=/2"); - return FALSE; + Yap_ArithError(INSTANTIATION_ERROR, t1, + "while doing arithmetic comparison"); } if (IsVarTerm(t2)) { - LOCAL_ArithError = TRUE; - Yap_Error(INSTANTIATION_ERROR, t2, "=:=/2"); - return FALSE; + Yap_ArithError(INSTANTIATION_ERROR, t2, + "while doing arithmetic comparison"); } if (IsFloatTerm(t1) && IsFloatTerm(t2)) { - return flt_cmp(FloatOfTerm(t1)-FloatOfTerm(t2)); + return flt_cmp(FloatOfTerm(t1) - FloatOfTerm(t2)); } if (IsIntegerTerm(t1) && IsIntegerTerm(t2)) { - return int_cmp(IntegerOfTerm(t1)-IntegerOfTerm(t2)); + return int_cmp(IntegerOfTerm(t1) - IntegerOfTerm(t2)); } t1 = Yap_Eval(t1); if (!t1) { @@ -693,21 +618,19 @@ a_cmp(Term t1, Term t2 USES_REGS) if (IsIntegerTerm(t2)) { Int i2 = IntegerOfTerm(t2); - return int_cmp(i1-i2); + return int_cmp(i1 - i2); } else if (IsFloatTerm(t2)) { Float f2 = FloatOfTerm(t2); #if HAVE_ISNAN if (isnan(f2)) { - LOCAL_Error_TYPE = EVALUATION_ERROR_UNDEFINED; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = "trying to evaluate nan"; - LOCAL_ArithError = TRUE; + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t2, + "trying to evaluate nan"); } -#endif - return flt_cmp(i1-f2); +#endif + return flt_cmp(i1 - f2); #ifdef USE_GMP } else if (IsBigIntTerm(t2)) { - return Yap_gmp_cmp_int_big(i1,t2); + return Yap_gmp_cmp_int_big(i1, t2); #endif } else { return FALSE; @@ -716,35 +639,31 @@ a_cmp(Term t1, Term t2 USES_REGS) Float f1 = FloatOfTerm(t1); #if HAVE_ISNAN if (isnan(f1)) { - LOCAL_Error_TYPE = EVALUATION_ERROR_UNDEFINED; - LOCAL_Error_Term = t1; - LOCAL_ErrorMessage = "trying to evaluate nan"; - LOCAL_ArithError = TRUE; + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t1, + "trying to evaluate nan"); } -#endif +#endif t2 = Yap_Eval(t2); #if HAVE_ISNAN - if (isnan(f1)) - return -1; -#endif + if (isnan(f1)) + return -1; +#endif if (IsIntegerTerm(t2)) { Int i2 = IntegerOfTerm(t2); - return flt_cmp(f1-i2); + return flt_cmp(f1 - i2); } else if (IsFloatTerm(t2)) { Float f2 = FloatOfTerm(t2); #if HAVE_ISNAN if (isnan(f2)) { - LOCAL_Error_TYPE = EVALUATION_ERROR_UNDEFINED; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = "trying to evaluate nan"; - LOCAL_ArithError = TRUE; + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t2, + "trying to evaluate nan"); } -#endif - return flt_cmp(f1-f2); +#endif + return flt_cmp(f1 - f2); #ifdef USE_GMP } else if (IsBigIntTerm(t2)) { - return Yap_gmp_cmp_float_big(f1,t2); + return Yap_gmp_cmp_float_big(f1, t2); #endif } else { return FALSE; @@ -755,22 +674,20 @@ a_cmp(Term t1, Term t2 USES_REGS) t2 = Yap_Eval(t2); if (IsIntegerTerm(t2)) { - return Yap_gmp_cmp_big_int(t1, IntegerOfTerm(t2)); + return Yap_gmp_cmp_big_int(t1, IntegerOfTerm(t2)); } else if (IsFloatTerm(t2)) { - Float f2 = FloatOfTerm(t2); + Float f2 = FloatOfTerm(t2); #if HAVE_ISNAN - if (isnan(f2)) { - LOCAL_Error_TYPE = EVALUATION_ERROR_UNDEFINED; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = "trying to evaluate nan"; - LOCAL_ArithError = TRUE; - } -#endif - return Yap_gmp_cmp_big_float(t1, f2); + if (isnan(f2)) { + Yap_ArithError(EVALUATION_ERROR_UNDEFINED, t2, + "trying to evaluate nan"); + } +#endif + return Yap_gmp_cmp_big_float(t1, f2); } else if (IsBigIntTerm(t2)) { - return Yap_gmp_cmp_big_big(t1, t2); + return Yap_gmp_cmp_big_big(t1, t2); } else { - return FALSE; + return FALSE; } } #endif @@ -779,23 +696,17 @@ a_cmp(Term t1, Term t2 USES_REGS) } } -Int -Yap_acmp(Term t1, Term t2 USES_REGS) -{ +Int Yap_acmp(Term t1, Term t2 USES_REGS) { Int out = a_cmp(t1, t2 PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } return out; } -static Int -p_acomp( USES_REGS1 ) -{ /* $a_compare(?R,+X,+Y) */ +static Int p_acomp(USES_REGS1) { /* $a_compare(?R,+X,+Y) */ Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); Int out; out = a_cmp(t1, t2 PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } return out; } @@ -806,9 +717,7 @@ p_acomp( USES_REGS1 ) The value of the expression _X_ is equal to the value of expression _Y_. */ /// @memberof =:=/2 -static Int -a_eq(Term t1, Term t2) -{ +static Int a_eq(Term t1, Term t2) { CACHE_REGS /* A =:= B */ Int out; @@ -817,11 +726,11 @@ a_eq(Term t1, Term t2) if (IsVarTerm(t1)) { Yap_Error(INSTANTIATION_ERROR, t1, "=:=/2"); - return(FALSE); + return (FALSE); } if (IsVarTerm(t2)) { Yap_Error(INSTANTIATION_ERROR, t2, "=:=/2"); - return(FALSE); + return (FALSE); } if (IsFloatTerm(t1)) { if (IsFloatTerm(t2)) @@ -837,25 +746,21 @@ a_eq(Term t1, Term t2) return (FloatOfTerm(t2) == IntegerOfTerm(t1)); } } - out = a_cmp(t1,t2 PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } + out = a_cmp(t1, t2 PASS_REGS); return out == 0; } - /* @pred +_X_ =\\= _Y_ is iso Difference of arithmetic expressions - The value of the expression _X_ is different from the value of expression _Y_. + The value of the expression _X_ is different from the value of expression + _Y_. */ /// @memberof =\\=/2 -static Int -a_dif(Term t1, Term t2) -{ +static Int a_dif(Term t1, Term t2) { CACHE_REGS - Int out = a_cmp(Deref(t1),Deref(t2) PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } + Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); return out != 0; } @@ -866,12 +771,9 @@ a_dif(Term t1, Term t2) The value of the expression _X_ is less than or equal to the value of expression _Y_. */ -static Int -a_gt(Term t1, Term t2) -{ /* A > B */ +static Int a_gt(Term t1, Term t2) { /* A > B */ CACHE_REGS - Int out = a_cmp(Deref(t1),Deref(t2) PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } + Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); return out > 0; } @@ -882,12 +784,9 @@ a_gt(Term t1, Term t2) The value of the expression _X_ is greater than or equal to the value of expression _Y_. */ -static Int -a_ge(Term t1, Term t2) -{ /* A >= B */ +static Int a_ge(Term t1, Term t2) { /* A >= B */ CACHE_REGS - Int out = a_cmp(Deref(t1),Deref(t2) PASS_REGS); - if (LOCAL_ArithError) { Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); return FALSE; } + Int out = a_cmp(Deref(t1), Deref(t2) PASS_REGS); return out >= 0; } @@ -899,12 +798,9 @@ a_ge(Term t1, Term t2) _Y_. */ /// @memberof ", 2, a_gt, SafePredFlag | BinaryPredFlag); + Yap_InitCmpPred(">", 2, a_gt, SafePredFlag | BinaryPredFlag); Yap_InitCmpPred("=<", 2, a_le, SafePredFlag | BinaryPredFlag); Yap_InitCmpPred("<", 2, a_lt, SafePredFlag | BinaryPredFlag); Yap_InitCmpPred(">=", 2, a_ge, SafePredFlag | BinaryPredFlag); diff --git a/C/compiler.c b/C/compiler.c index 19a404be2..bffd9ab19 100644 --- a/C/compiler.c +++ b/C/compiler.c @@ -11,7 +11,8 @@ * File: compiler.c * * comments: Clause compiler * * * -* Last rev: $Date: 2008-08-06 17:32:18 $,$Author: vsc $ * +* Last rev: $Date: 2008-08-06 17:32:18 $,$Author: vsc $ +** * $Log: not supported by cvs2svn $ * Revision 1.88 2008/03/13 14:37:58 vsc * update chr @@ -67,7 +68,8 @@ * fix debugging typo * * Revision 1.73 2006/04/12 20:08:51 vsc -* make it sure that making vars safe does not propagate across branches of disjunctions. +* make it sure that making vars safe does not propagate across branches of +*disjunctions. * * Revision 1.72 2006/04/05 00:16:54 vsc * Lots of fixes (check logfile for details @@ -137,7 +139,8 @@ * Handle overflows when allocating big clauses properly. * * Revision 1.54 2004/11/19 22:08:41 vsc -* replace SYSTEM_ERROR_INTERNAL by out OUT_OF_WHATEVER_ERROR whenever appropriate. +* replace SYSTEM_ERROR_INTERNAL by out OUT_OF_WHATEVER_ERROR whenever +*appropriate. * * Revision 1.53 2004/09/03 03:11:08 vsc * memory management fixes @@ -167,11 +170,11 @@ #ifdef SCCS static char SccsId[] = "%W% %G%"; -#endif /* SCCS */ +#endif /* SCCS */ #include "Yap.h" -#include "compile.h" -#include "clause.h" #include "alloc.h" +#include "clause.h" +#include "compile.h" #include "yapio.h" #if HAVE_STRING_H #include @@ -179,12 +182,12 @@ static char SccsId[] = "%W% %G%"; #ifdef BEAM extern int EAM; -//extern PInstr *CodeStart, *ppc, *ppc1, *BodyStart, *ppc_body; +// extern PInstr *CodeStart, *ppc, *ppc1, *BodyStart, *ppc_body; #endif typedef struct branch_descriptor { - int id; /* the branch id */ - Term cm; /* if a banch is associated with a commit */ + int id; /* the branch id */ + Term cm; /* if a banch is associated with a commit */ } branch; typedef struct compiler_struct_struct { @@ -232,7 +235,8 @@ static void c_arg(Int, Term, unsigned int, unsigned int, compiler_struct *); static void c_args(Term, unsigned int, compiler_struct *); static void c_eq(Term, Term, compiler_struct *); static void c_test(Int, Term, compiler_struct *); -static void c_bifun(basic_preds, Term, Term, Term, Term, Term, compiler_struct *); +static void c_bifun(basic_preds, Term, Term, Term, Term, Term, + compiler_struct *); static void c_goal(Term, Term, compiler_struct *); static void c_body(Term, Term, compiler_struct *); static void c_head(Term, compiler_struct *); @@ -243,38 +247,34 @@ static void clear_bvarray(int, CELL *, compiler_struct *); #else static void clear_bvarray(int, CELL *); #endif -static void add_bvarray_op(PInstr *,CELL *, int, compiler_struct *); +static void add_bvarray_op(PInstr *, CELL *, int, compiler_struct *); static void AssignPerm(PInstr *, compiler_struct *); static void CheckUnsafe(PInstr *, compiler_struct *); static void CheckVoids(compiler_struct *); -static int checktemp(Int, Int, compiler_vm_op, compiler_struct *); -static Int checkreg(Int, Int, compiler_vm_op, int, compiler_struct *); +static int checktemp(Int, Int, compiler_vm_op, compiler_struct *); +static Int checkreg(Int, Int, compiler_vm_op, int, compiler_struct *); static void c_layout(compiler_struct *); static void c_optimize(PInstr *); #ifdef SFUNC static void compile_sf_term(Term, int); #endif -static void -push_branch(int id, Term cmvar, compiler_struct *cglobs) { +static void push_branch(int id, Term cmvar, compiler_struct *cglobs) { cglobs->branch_pointer->id = id; cglobs->branch_pointer->cm = cmvar; cglobs->branch_pointer++; } -static int -pop_branch(compiler_struct *cglobs) { +static int pop_branch(compiler_struct *cglobs) { cglobs->branch_pointer--; - return(cglobs->branch_pointer->id); + return (cglobs->branch_pointer->id); } #ifdef TABLING -#define is_tabled(pe) (pe->PredFlags & TabledPredFlag) +#define is_tabled(pe) (pe->PredFlags & TabledPredFlag) #endif /* TABLING */ -static inline int -active_branch(int i, int onbranch) -{ +static inline int active_branch(int i, int onbranch) { /* register int *bp;*/ return (i == onbranch); @@ -286,19 +286,22 @@ active_branch(int i, int onbranch) return(i==onbranch);*/ } -#define FAIL(M,T,E) { LOCAL_ErrorMessage=M; LOCAL_Error_TYPE = T; LOCAL_Error_Term = E; return; } +#define FAIL(M, T, E) \ + { \ + LOCAL_Error_TYPE = T; \ + return; \ + } #if USE_SYSTEM_MALLOC -#define IsNewVar(v) ((CELL *)(v) >= H0 && (CELL *)(v) < LCL0) +#define IsNewVar(v) ((CELL *)(v) >= H0 && (CELL *)(v) < LCL0) #else -#define IsNewVar(v) (Addr(v)cint.freep0 || Addr(v)>cglobs->cint.freep) +#define IsNewVar(v) \ + (Addr(v) < cglobs->cint.freep0 || Addr(v) > cglobs->cint.freep) #endif inline static void pop_code(unsigned int, compiler_struct *); -inline static void -pop_code(unsigned int level, compiler_struct *cglobs) -{ +inline static void pop_code(unsigned int level, compiler_struct *cglobs) { if (level == 0) return; if (cglobs->cint.cpc->op == pop_op) @@ -308,8 +311,7 @@ pop_code(unsigned int level, compiler_struct *cglobs) } } -static void -adjust_current_commits(compiler_struct *cglobs) { +static void adjust_current_commits(compiler_struct *cglobs) { branch *bp = cglobs->branch_pointer; while (bp > cglobs->parent_branches) { bp--; @@ -319,22 +321,21 @@ adjust_current_commits(compiler_struct *cglobs) { } } - -static int -check_var(Term t, unsigned int level, Int argno, compiler_struct *cglobs) { +static int check_var(Term t, unsigned int level, Int argno, + compiler_struct *cglobs) { CACHE_REGS int flags, new = FALSE; Ventry *v = (Ventry *)t; - if (IsNewVar(v)) { /* new var */ - v = (Ventry *) Yap_AllocCMem(sizeof(*v), &cglobs->cint); + if (IsNewVar(v)) { /* new var */ + v = (Ventry *)Yap_AllocCMem(sizeof(*v), &cglobs->cint); #if YAPOR_SBA v->SelfOfVE = 0; #else - v->SelfOfVE = (CELL) v; + v->SelfOfVE = (CELL)v; #endif v->AdrsOfVE = t; - *CellPtr(t) = (CELL) v; + *CellPtr(t) = (CELL)v; v->KindOfVE = v->NoOfVE = Unassigned; flags = 0; /* Be careful with eithers. I may make a variable global in a branch, @@ -349,12 +350,11 @@ check_var(Term t, unsigned int level, Int argno, compiler_struct *cglobs) { And, yes, there is code like this... */ - if (((level > 0 || cglobs->onhead) && cglobs->curbranch == 0) - || argno == save_pair_flag || - argno == save_appl_flag) + if (((level > 0 || cglobs->onhead) && cglobs->curbranch == 0) || + argno == save_pair_flag || argno == save_appl_flag) flags |= SafeVar; - if ((level > 0 && cglobs->curbranch == 0) || argno == save_pair_flag || - argno == save_appl_flag) + if ((level > 0 && cglobs->curbranch == 0) || argno == save_pair_flag || + argno == save_appl_flag) flags |= GlobalVal; v->FlagsOfVE = flags; v->BranchOfVE = cglobs->onbranch; @@ -367,29 +367,29 @@ check_var(Term t, unsigned int level, Int argno, compiler_struct *cglobs) { v->FlagsOfVE |= NonVoid; if (v->BranchOfVE > 0) { if (!active_branch(v->BranchOfVE, cglobs->onbranch)) { - v->AgeOfVE = v->FirstOfVE = 1; - new = FALSE; - v->FlagsOfVE |= BranchVar; - /* set the original instruction correctly */ - switch (v->FirstOpForV->op) { - case get_var_op: - v->FirstOpForV->op = get_val_op; - break; - case unify_var_op: - v->FirstOpForV->op = unify_val_op; - break; - case unify_last_var_op: - v->FirstOpForV->op = unify_last_val_op; - break; - case put_var_op: - v->FirstOpForV->op = put_val_op; - break; - case write_var_op: - v->FirstOpForV->op = write_val_op; - break; - default: - break; - } + v->AgeOfVE = v->FirstOfVE = 1; + new = FALSE; + v->FlagsOfVE |= BranchVar; + /* set the original instruction correctly */ + switch (v->FirstOpForV->op) { + case get_var_op: + v->FirstOpForV->op = get_val_op; + break; + case unify_var_op: + v->FirstOpForV->op = unify_val_op; + break; + case unify_last_var_op: + v->FirstOpForV->op = unify_last_val_op; + break; + case put_var_op: + v->FirstOpForV->op = put_val_op; + break; + case write_var_op: + v->FirstOpForV->op = write_val_op; + break; + default: + break; + } } } } @@ -398,10 +398,8 @@ check_var(Term t, unsigned int level, Int argno, compiler_struct *cglobs) { return new; } -static void -tag_var(Term t, int new, compiler_struct *cglobs) -{ - Ventry *v = (Ventry *) t; +static void tag_var(Term t, int new, compiler_struct *cglobs) { + Ventry *v = (Ventry *)t; if (new) { v->FirstOpForV = cglobs->cint.cpc; @@ -414,9 +412,8 @@ tag_var(Term t, int new, compiler_struct *cglobs) v->AgeOfVE = cglobs->goalno; } -static void -c_var(Term t, Int argno, unsigned int arity, unsigned int level, compiler_struct *cglobs) -{ +static void c_var(Term t, Int argno, unsigned int arity, unsigned int level, + compiler_struct *cglobs) { int new = check_var(Deref(t), level, argno, cglobs); t = Deref(t); @@ -450,37 +447,40 @@ c_var(Term t, Int argno, unsigned int arity, unsigned int level, compiler_struct #ifdef SFUNC if (argno < 0) { if (new) - Yap_emit((cglobs->onhead ? unify_s_var_op : write_s_var_op), v, -argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_s_var_op : write_s_var_op), v, -argno, + &cglobs->cint); else - Yap_emit((cglobs->onhead ? unify_s_val_op : write_s_val_op), v, -argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_s_val_op : write_s_val_op), v, -argno, + &cglobs->cint); } else #endif - if (cglobs->onhead) { - cglobs->space_used ++; + if (cglobs->onhead) { + cglobs->space_used++; if (level == 0) - Yap_emit((new ? (++cglobs->nvars, get_var_op) : get_val_op), t, argno, &cglobs->cint); + Yap_emit((new ? (++cglobs->nvars, get_var_op) : get_val_op), t, argno, + &cglobs->cint); else - Yap_emit((new ? (++cglobs->nvars, (argno == (Int)arity ? - unify_last_var_op : - unify_var_op)) : - (argno == (Int)arity ? unify_last_val_op : - unify_val_op)), - t, Zero, &cglobs->cint); - } - else { + Yap_emit( + (new ? (++cglobs->nvars, + (argno == (Int)arity ? unify_last_var_op : unify_var_op)) + : (argno == (Int)arity ? unify_last_val_op : unify_val_op)), + t, Zero, &cglobs->cint); + } else { if (level == 0) - Yap_emit((new ? (++cglobs->nvars, put_var_op) : put_val_op), t, argno, &cglobs->cint); + Yap_emit((new ? (++cglobs->nvars, put_var_op) : put_val_op), t, argno, + &cglobs->cint); else - Yap_emit((new ? (++cglobs->nvars, write_var_op) : write_val_op), t, Zero, &cglobs->cint); + Yap_emit((new ? (++cglobs->nvars, write_var_op) : write_val_op), t, + Zero, &cglobs->cint); } } tag_var(t, new, cglobs); } // built-in like X >= Y. -static void -c_2vars(int op, Term t1, Int argno1, Term t2, Int argno2, CELL extra, unsigned int arity, unsigned int level, compiler_struct *cglobs) -{ +static void c_2vars(int op, Term t1, Int argno1, Term t2, Int argno2, + CELL extra, unsigned int arity, unsigned int level, + compiler_struct *cglobs) { int new1 = check_var((t1 = Deref(t1)), level, argno1, cglobs); int new2 = check_var((t2 = Deref(t2)), level, argno2, cglobs); @@ -495,28 +495,26 @@ c_2vars(int op, Term t1, Int argno1, Term t2, Int argno2, CELL extra, unsigned i tag_var(t2, new2, cglobs); } -static void -reset_vars(Ventry *vtable) -{ +static void reset_vars(Ventry *vtable) { Ventry *v = vtable; CELL *t; while (v != NIL) { - t = (CELL *) v->AdrsOfVE; + t = (CELL *)v->AdrsOfVE; RESET_VARIABLE(t); v = v->NextOfVE; } } -static Term -optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cglobs) -{ +static Term optimize_ce(Term t, unsigned int arity, unsigned int level, + compiler_struct *cglobs) { CACHE_REGS CExpEntry *p = cglobs->common_exps; int cmp = 0; #ifdef BEAM - if (EAM) return t; + if (EAM) + return t; #endif if (IsApplTerm(t) && IsExtensionFunctor(FunctorOfTerm(t))) @@ -533,7 +531,7 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl break; } } - if (p != NULL) { /* already there */ + if (p != NULL) { /* already there */ return (p->VarOfCE); } /* first occurrence */ @@ -541,14 +539,14 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl return t; } ++(cglobs->n_common_exps); - p = (CExpEntry *) Yap_AllocCMem(sizeof(CExpEntry), &cglobs->cint); + p = (CExpEntry *)Yap_AllocCMem(sizeof(CExpEntry), &cglobs->cint); p->TermOfCE = t; p->VarOfCE = MkVarTerm(); if (HR >= (CELL *)cglobs->cint.freep0) { /* oops, too many new variables */ save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); } p->NextCE = cglobs->common_exps; cglobs->common_exps = p; @@ -560,46 +558,46 @@ optimize_ce(Term t, unsigned int arity, unsigned int level, compiler_struct *cgl } #ifdef SFUNC -static void -compile_sf_term(Term t, int argno, int level) -{ +static void compile_sf_term(Term t, int argno, int level) { Functor f = FunctorOfTerm(t); CELL *p = ArgsOfSFTerm(t) - 1; SFEntry *pe = RepSFProp(Yap_GetAProp(NameOfFunctor(f), SFProperty)); Term nullvalue = pe->NilValue; if (level == 0) - Yap_emit((cglobs->onhead ? get_s_f_op : put_s_f_op), f, argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_s_f_op : put_s_f_op), f, argno, + &cglobs->cint); else - Yap_emit((cglobs->onhead ? unify_s_f_op : write_s_f_op), f, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_s_f_op : write_s_f_op), f, Zero, + &cglobs->cint); ++level; while ((argno = *++p)) { t = Derefa(++p); if (t != nullvalue) { if (IsAtomicTerm(t)) - Yap_emit((cglobs->onhead ? unify_s_a_op : write_s_a_op), t, (CELL) argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_s_a_op : write_s_a_op), t, (CELL)argno, + &cglobs->cint); else if (!IsVarTerm(t)) { - LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; - LOCAL_ErrorMessage = "illegal argument of soft functor"; - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); - } - else - c_var(t, -argno, arity, level, cglobs); + LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; + LOCAL_ErrorMessage = "illegal argument of soft functor"; + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); + } else + c_var(t, -argno, arity, level, cglobs); } } --level; if (level == 0) - Yap_emit((cglobs->onhead ? get_s_end_op : put_s_end_op), Zero, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_s_end_op : put_s_end_op), Zero, Zero, + &cglobs->cint); else - Yap_emit((cglobs->onhead ? unify_s_end_op : write_s_end_op), Zero, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_s_end_op : write_s_end_op), Zero, Zero, + &cglobs->cint); } #endif -inline static void -c_args(Term app, unsigned int level, compiler_struct *cglobs) -{ +inline static void c_args(Term app, unsigned int level, + compiler_struct *cglobs) { CACHE_REGS Functor f = FunctorOfTerm(app); unsigned int Arity = ArityOfFunctor(f); @@ -608,7 +606,6 @@ c_args(Term app, unsigned int level, compiler_struct *cglobs) if (level == 0) { if (Arity >= MaxTemps) { LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "exceed maximum arity of compiled goal"; save_machine_regs(); siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); @@ -620,191 +617,208 @@ c_args(Term app, unsigned int level, compiler_struct *cglobs) c_arg(i, ArgOfTerm(i, app), Arity, level, cglobs); } -static int -try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, compiler_struct *cglobs) -{ +static int try_store_as_dbterm(Term t, Int argno, unsigned int arity, int level, + compiler_struct *cglobs) { CACHE_REGS DBTerm *dbt; int g; CELL *h0 = HR; - while ((g=Yap_SizeGroundTerm(t,TRUE)) < 0) { + while ((g = Yap_SizeGroundTerm(t, TRUE)) < 0) { /* oops, too deep a term */ save_machine_regs(); LOCAL_Error_Size = 0; siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_AUX_BOTCH); } // if (g < 16) - return FALSE; + return FALSE; /* store ground term away */ HR = CellPtr(cglobs->cint.freep); if ((dbt = Yap_StoreTermInDB(t, -1)) == NULL) { HR = h0; - switch(LOCAL_Error_TYPE) { + switch (LOCAL_Error_TYPE) { case RESOURCE_ERROR_STACK: LOCAL_Error_TYPE = YAP_NO_ERROR; - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_STACK_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_STACK_BOTCH); case RESOURCE_ERROR_TRAIL: LOCAL_Error_TYPE = YAP_NO_ERROR; - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TRAIL_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TRAIL_BOTCH); case RESOURCE_ERROR_HEAP: LOCAL_Error_TYPE = YAP_NO_ERROR; - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_HEAP_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); case RESOURCE_ERROR_AUXILIARY_STACK: LOCAL_Error_TYPE = YAP_NO_ERROR; - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_AUX_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_AUX_BOTCH); default: - siglongjmp(cglobs->cint.CompilerBotch,COMPILER_ERR_BOTCH); + siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); } } HR = h0; if (level == 0) - Yap_emit((cglobs->onhead ? get_dbterm_op : put_dbterm_op), dbt->Entry, argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_dbterm_op : put_dbterm_op), dbt->Entry, + argno, &cglobs->cint); else Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_dbterm_op - : unify_dbterm_op) : - write_dbterm_op), dbt->Entry, Zero, &cglobs->cint); + : unify_dbterm_op) + : write_dbterm_op), + dbt->Entry, Zero, &cglobs->cint); return TRUE; } -static void -c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct *cglobs) -{ - restart: +static void c_arg(Int argno, Term t, unsigned int arity, unsigned int level, + compiler_struct *cglobs) { +restart: if (IsVarTerm(t)) c_var(t, argno, arity, level, cglobs); else if (IsAtomTerm(t)) { - if (level == 0) { - Yap_emit((cglobs->onhead ? get_atom_op : put_atom_op), (CELL) t, argno, &cglobs->cint); + if (level == 0) { + Yap_emit((cglobs->onhead ? get_atom_op : put_atom_op), (CELL)t, argno, + &cglobs->cint); } else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_atom_op - : unify_atom_op) : - write_atom_op), (CELL) t, Zero, &cglobs->cint); - } else if (IsIntegerTerm(t) || IsFloatTerm(t) || IsBigIntTerm(t) || IsStringTerm(t)) { + Yap_emit((cglobs->onhead + ? (argno == (Int)arity ? unify_last_atom_op : unify_atom_op) + : write_atom_op), + (CELL)t, Zero, &cglobs->cint); + } else if (IsIntegerTerm(t) || IsFloatTerm(t) || IsBigIntTerm(t) || + IsStringTerm(t)) { if (!IsIntTerm(t)) { if (IsFloatTerm(t)) { - if (level == 0) - Yap_emit((cglobs->onhead ? get_float_op : put_float_op), t, argno, &cglobs->cint); - else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_float_op - : unify_float_op) : - write_float_op), t, Zero, &cglobs->cint); + if (level == 0) + Yap_emit((cglobs->onhead ? get_float_op : put_float_op), t, argno, + &cglobs->cint); + else + Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_float_op + : unify_float_op) + : write_float_op), + t, Zero, &cglobs->cint); } else if (IsLongIntTerm(t)) { - if (level == 0) - Yap_emit((cglobs->onhead ? get_longint_op : put_longint_op), t, argno, &cglobs->cint); - else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_longint_op - : unify_longint_op) : - write_longint_op), t, Zero, &cglobs->cint); + if (level == 0) + Yap_emit((cglobs->onhead ? get_longint_op : put_longint_op), t, argno, + &cglobs->cint); + else + Yap_emit((cglobs->onhead + ? (argno == (Int)arity ? unify_last_longint_op + : unify_longint_op) + : write_longint_op), + t, Zero, &cglobs->cint); } else if (IsStringTerm(t)) { - /* we are taking a string, that is supposed to be - guarded in the clause itself. . */ - CELL l1 = ++cglobs->labelno; - CELL *src = RepAppl(t); - PInstr *ocpc = cglobs->cint.cpc, *OCodeStart = cglobs->cint.CodeStart; - Int sz = (3+src[1])*sizeof(CELL); - CELL *dest; + /* we are taking a string, that is supposed to be + guarded in the clause itself. . */ + CELL l1 = ++cglobs->labelno; + CELL *src = RepAppl(t); + PInstr *ocpc = cglobs->cint.cpc, *OCodeStart = cglobs->cint.CodeStart; + Int sz = (3 + src[1]) * sizeof(CELL); + CELL *dest; - /* use a special list to store the blobs */ - cglobs->cint.cpc = cglobs->cint.icpc; - /* if (IsFloatTerm(t)) { - Yap_emit(align_float_op, Zero, Zero, &cglobs->cint); - }*/ - Yap_emit(label_op, l1, Zero, &cglobs->cint); - dest = - Yap_emit_extra_size(blob_op, sz/CellSize, sz, &cglobs->cint); + /* use a special list to store the blobs */ + cglobs->cint.cpc = cglobs->cint.icpc; + /* if (IsFloatTerm(t)) { + Yap_emit(align_float_op, Zero, Zero, &cglobs->cint); + }*/ + Yap_emit(label_op, l1, Zero, &cglobs->cint); + dest = Yap_emit_extra_size(blob_op, sz / CellSize, sz, &cglobs->cint); - /* copy the bignum */ - memcpy(dest, src, sz); - /* note that we don't need to copy size info, unless we wanted - to garbage collect clauses ;-) */ - cglobs->cint.icpc = cglobs->cint.cpc; - if (cglobs->cint.BlobsStart == NULL) - cglobs->cint.BlobsStart = cglobs->cint.CodeStart; - cglobs->cint.cpc = ocpc; - cglobs->cint.CodeStart = OCodeStart; - /* The argument to pass to the structure is now the label for - where we are storing the blob */ - if (level == 0) - Yap_emit((cglobs->onhead ? get_string_op : put_string_op), l1, argno, &cglobs->cint); - else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_string_op - : unify_string_op) : - write_string_op), l1, Zero, &cglobs->cint); + /* copy the bignum */ + memcpy(dest, src, sz); + /* note that we don't need to copy size info, unless we wanted + to garbage collect clauses ;-) */ + cglobs->cint.icpc = cglobs->cint.cpc; + if (cglobs->cint.BlobsStart == NULL) + cglobs->cint.BlobsStart = cglobs->cint.CodeStart; + cglobs->cint.cpc = ocpc; + cglobs->cint.CodeStart = OCodeStart; + /* The argument to pass to the structure is now the label for + where we are storing the blob */ + if (level == 0) + Yap_emit((cglobs->onhead ? get_string_op : put_string_op), l1, argno, + &cglobs->cint); + else + Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_string_op + : unify_string_op) + : write_string_op), + l1, Zero, &cglobs->cint); } else { - /* we are taking a blob, that is a binary that is supposed to be - guarded in the clause itself. Possible examples include - floats, long ints, bignums, bitmaps.... */ - CELL l1 = ++cglobs->labelno; - CELL *src = RepAppl(t); - PInstr *ocpc = cglobs->cint.cpc, *OCodeStart = cglobs->cint.CodeStart; - Int sz = 2*sizeof(CELL)+sizeof(Functor)+ - sizeof(MP_INT)+ - ((((MP_INT *)(RepAppl(t)+2))->_mp_alloc)*sizeof(mp_limb_t)); - CELL *dest; + /* we are taking a blob, that is a binary that is supposed to be + guarded in the clause itself. Possible examples include + floats, long ints, bignums, bitmaps.... */ + CELL l1 = ++cglobs->labelno; + CELL *src = RepAppl(t); + PInstr *ocpc = cglobs->cint.cpc, *OCodeStart = cglobs->cint.CodeStart; + Int sz = + 2 * sizeof(CELL) + sizeof(Functor) + sizeof(MP_INT) + + ((((MP_INT *)(RepAppl(t) + 2))->_mp_alloc) * sizeof(mp_limb_t)); + CELL *dest; - /* use a special list to store the blobs */ - cglobs->cint.cpc = cglobs->cint.icpc; - /* if (IsFloatTerm(t)) { - Yap_emit(align_float_op, Zero, Zero, &cglobs->cint); - }*/ - Yap_emit(label_op, l1, Zero, &cglobs->cint); - dest = - Yap_emit_extra_size(blob_op, sz/CellSize, sz, &cglobs->cint); + /* use a special list to store the blobs */ + cglobs->cint.cpc = cglobs->cint.icpc; + /* if (IsFloatTerm(t)) { + Yap_emit(align_float_op, Zero, Zero, &cglobs->cint); + }*/ + Yap_emit(label_op, l1, Zero, &cglobs->cint); + dest = Yap_emit_extra_size(blob_op, sz / CellSize, sz, &cglobs->cint); - /* copy the bignum */ - memcpy(dest, src, sz); - /* note that we don't need to copy size info, unless we wanted - to garbage collect clauses ;-) */ - cglobs->cint.icpc = cglobs->cint.cpc; - if (cglobs->cint.BlobsStart == NULL) - cglobs->cint.BlobsStart = cglobs->cint.CodeStart; - cglobs->cint.cpc = ocpc; - cglobs->cint.CodeStart = OCodeStart; - /* The argument to pass to the structure is now the label for - where we are storing the blob */ - if (level == 0) - Yap_emit((cglobs->onhead ? get_bigint_op : put_bigint_op), l1, argno, &cglobs->cint); - else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_bigint_op - : unify_bigint_op) : - write_bigint_op), l1, Zero, &cglobs->cint); + /* copy the bignum */ + memcpy(dest, src, sz); + /* note that we don't need to copy size info, unless we wanted + to garbage collect clauses ;-) */ + cglobs->cint.icpc = cglobs->cint.cpc; + if (cglobs->cint.BlobsStart == NULL) + cglobs->cint.BlobsStart = cglobs->cint.CodeStart; + cglobs->cint.cpc = ocpc; + cglobs->cint.CodeStart = OCodeStart; + /* The argument to pass to the structure is now the label for + where we are storing the blob */ + if (level == 0) + Yap_emit((cglobs->onhead ? get_bigint_op : put_bigint_op), l1, argno, + &cglobs->cint); + else + Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_bigint_op + : unify_bigint_op) + : write_bigint_op), + l1, Zero, &cglobs->cint); } /* That's it folks! */ return; } if (level == 0) - Yap_emit((cglobs->onhead ? get_num_op : put_num_op), (CELL) t, argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_num_op : put_num_op), (CELL)t, argno, + &cglobs->cint); else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_num_op - : unify_num_op) : - write_num_op), (CELL) t, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead + ? (argno == (Int)arity ? unify_last_num_op : unify_num_op) + : write_num_op), + (CELL)t, Zero, &cglobs->cint); } else if (IsPairTerm(t)) { cglobs->space_used += 2; if (optimizer_on && level < 6) { #if !defined(THREADS) && !defined(YAPOR) /* discard code sharing because we cannot write on shared stuff */ - if (FALSE && !(cglobs->cint.CurrentPred->PredFlags & (DynamicPredFlag|LogUpdatePredFlag))) { - if (try_store_as_dbterm(t, argno, arity, level, cglobs)) - return; - } -#endif + if (FALSE && + !(cglobs->cint.CurrentPred->PredFlags & + (DynamicPredFlag | LogUpdatePredFlag))) { + if (try_store_as_dbterm(t, argno, arity, level, cglobs)) + return; + } +#endif t = optimize_ce(t, arity, level, cglobs); if (IsVarTerm(t)) { - c_var(t, argno, arity, level, cglobs); - return; + c_var(t, argno, arity, level, cglobs); + return; } } if (level == 0) - Yap_emit((cglobs->onhead ? get_list_op : put_list_op), Zero, argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_list_op : put_list_op), Zero, argno, + &cglobs->cint); else if (argno == (Int)arity) - Yap_emit((cglobs->onhead ? unify_last_list_op : write_last_list_op), Zero, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_last_list_op : write_last_list_op), Zero, + Zero, &cglobs->cint); else - Yap_emit((cglobs->onhead ? unify_list_op : write_list_op), Zero, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? unify_list_op : write_list_op), Zero, Zero, + &cglobs->cint); ++level; c_arg(1, HeadOfTerm(t), 2, level, cglobs); if (argno == (Int)arity) { - /* optimise for tail recursion */ + /* optimise for tail recursion */ t = TailOfTerm(t); goto restart; } @@ -814,20 +828,23 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct pop_code(level, cglobs); } } else if (IsRefTerm(t)) { - PELOCK(40,cglobs->cint.CurrentPred); - if (!(cglobs->cint.CurrentPred->PredFlags & (DynamicPredFlag|LogUpdatePredFlag))) { + PELOCK(40, cglobs->cint.CurrentPred); + if (!(cglobs->cint.CurrentPred->PredFlags & + (DynamicPredFlag | LogUpdatePredFlag))) { CACHE_REGS UNLOCK(cglobs->cint.CurrentPred->PELock); - FAIL("can not compile data base reference",TYPE_ERROR_CALLABLE,t); + FAIL("can not compile data base reference", TYPE_ERROR_CALLABLE, t); } else { UNLOCK(cglobs->cint.CurrentPred->PELock); cglobs->hasdbrefs = TRUE; if (level == 0) - Yap_emit((cglobs->onhead ? get_atom_op : put_atom_op), (CELL) t, argno, &cglobs->cint); + Yap_emit((cglobs->onhead ? get_atom_op : put_atom_op), (CELL)t, argno, + &cglobs->cint); else - Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_atom_op - : unify_atom_op) : - write_atom_op), (CELL) t, Zero, &cglobs->cint); + Yap_emit((cglobs->onhead ? (argno == (Int)arity ? unify_last_atom_op + : unify_atom_op) + : write_atom_op), + (CELL)t, Zero, &cglobs->cint); } } else { @@ -839,26 +856,27 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct #endif if (optimizer_on) { - if (!(cglobs->cint.CurrentPred->PredFlags & (DynamicPredFlag|LogUpdatePredFlag))) { - if (try_store_as_dbterm(t, argno, arity, level, cglobs)) - return; - } + if (!(cglobs->cint.CurrentPred->PredFlags & + (DynamicPredFlag | LogUpdatePredFlag))) { + if (try_store_as_dbterm(t, argno, arity, level, cglobs)) + return; + } t = optimize_ce(t, arity, level, cglobs); if (IsVarTerm(t)) { - c_var(t, argno, arity, level, cglobs); - return; + c_var(t, argno, arity, level, cglobs); + return; } } - cglobs->space_used += 1+arity; + cglobs->space_used += 1 + arity; if (level == 0) Yap_emit((cglobs->onhead ? get_struct_op : put_struct_op), - (CELL) FunctorOfTerm(t), argno, &cglobs->cint); + (CELL)FunctorOfTerm(t), argno, &cglobs->cint); else if (argno == (Int)arity) Yap_emit((cglobs->onhead ? unify_last_struct_op : write_last_struct_op), - (CELL) FunctorOfTerm(t), Zero, &cglobs->cint); + (CELL)FunctorOfTerm(t), Zero, &cglobs->cint); else Yap_emit((cglobs->onhead ? unify_struct_op : write_struct_op), - (CELL) FunctorOfTerm(t), Zero, &cglobs->cint); + (CELL)FunctorOfTerm(t), Zero, &cglobs->cint); ++level; c_args(t, level, cglobs); --level; @@ -868,9 +886,7 @@ c_arg(Int argno, Term t, unsigned int arity, unsigned int level, compiler_struct } } -static void -c_eq(Term t1, Term t2, compiler_struct *cglobs) -{ +static void c_eq(Term t1, Term t2, compiler_struct *cglobs) { CACHE_REGS if (t1 == t2) { Yap_emit(nop_op, Zero, Zero, &cglobs->cint); @@ -884,65 +900,65 @@ c_eq(Term t1, Term t2, compiler_struct *cglobs) } else { /* compile unification */ if (IsAtomicTerm(t1)) { - /* just check if they unify */ - if (!IsAtomicTerm(t2) || !Yap_unify(t1,t2)) { - /* they don't */ - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - return; - } - /* they do */ - Yap_emit(nop_op, Zero, Zero, &cglobs->cint); - return; + /* just check if they unify */ + if (!IsAtomicTerm(t2) || !Yap_unify(t1, t2)) { + /* they don't */ + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + return; + } + /* they do */ + Yap_emit(nop_op, Zero, Zero, &cglobs->cint); + return; } else if (IsPairTerm(t1)) { - /* just check if they unify */ - if (!IsPairTerm(t2)) { - /* they don't */ - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - return; - } - /* they might */ - c_eq(HeadOfTerm(t1), HeadOfTerm(t2), cglobs); - c_eq(TailOfTerm(t1), TailOfTerm(t2), cglobs); - return; + /* just check if they unify */ + if (!IsPairTerm(t2)) { + /* they don't */ + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + return; + } + /* they might */ + c_eq(HeadOfTerm(t1), HeadOfTerm(t2), cglobs); + c_eq(TailOfTerm(t1), TailOfTerm(t2), cglobs); + return; } else if (IsRefTerm(t1)) { - /* just check if they unify */ - if (t1 != t2) { - /* they don't */ - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - return; - } - /* they do */ - Yap_emit(nop_op, Zero, Zero, &cglobs->cint); - return; + /* just check if they unify */ + if (t1 != t2) { + /* they don't */ + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + return; + } + /* they do */ + Yap_emit(nop_op, Zero, Zero, &cglobs->cint); + return; } else { - /* compound terms */ - Functor f = FunctorOfTerm(t1); - UInt i, max; - /* just check if they unify */ - if (!IsApplTerm(t2) || - FunctorOfTerm(t2) != f) { - /* they don't */ - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - return; - } - /* they might */ - max = ArityOfFunctor(f); - for (i=0; i < max; i++) { - c_eq(ArgOfTerm(i+1,t1), ArgOfTerm(i+1,t2), cglobs); - } - return; + /* compound terms */ + Functor f = FunctorOfTerm(t1); + UInt i, max; + /* just check if they unify */ + if (!IsApplTerm(t2) || FunctorOfTerm(t2) != f) { + /* they don't */ + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + return; + } + /* they might */ + max = ArityOfFunctor(f); + for (i = 0; i < max; i++) { + c_eq(ArgOfTerm(i + 1, t1), ArgOfTerm(i + 1, t2), cglobs); + } + return; } } } /* first argument is an unbound var */ - if (IsNewVar(t1) && !IsVarTerm(t2) && !(cglobs->cint.CurrentPred->PredFlags & TabledPredFlag)) { + if (IsNewVar(t1) && !IsVarTerm(t2) && + !(cglobs->cint.CurrentPred->PredFlags & TabledPredFlag)) { Int v; - + v = --cglobs->tmpreg; c_arg(v, t2, 0, 0, cglobs); cglobs->onhead = TRUE; c_var(t1, v, 0, 0, cglobs); - cglobs->onhead = FALSE; + cglobs->onhead = FALSE; } else { if (IsVarTerm(t2)) { c_var(t1, 0, 0, 0, cglobs); @@ -958,23 +974,20 @@ c_eq(Term t1, Term t2, compiler_struct *cglobs) } } -static void -c_test(Int Op, Term t1, compiler_struct *cglobs) { +static void c_test(Int Op, Term t1, compiler_struct *cglobs) { CACHE_REGS Term t = Deref(t1); /* be caareful, has to be first occurrence */ if (Op == _save_by) { if (!IsNewVar(t)) { - char s[32]; + char s[32]; - LOCAL_Error_TYPE = UNINSTANTIATION_ERROR; - LOCAL_Error_Term = t; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2 on bound variable", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + LOCAL_Error_TYPE = UNINSTANTIATION_ERROR; + Yap_bip_name(Op, s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2 on bound variable", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); } c_var(t, save_b_flag, 1, 0, cglobs); return; @@ -987,7 +1000,7 @@ c_test(Int Op, Term t1, compiler_struct *cglobs) { if (Op == _cut_by) c_var(t, commit_b_flag, 1, 0, cglobs); else - c_var(t, f_flag,(unsigned int)Op, 0, cglobs); + c_var(t, f_flag, (unsigned int)Op, 0, cglobs); } /* Arithmetic builtins will be compiled in the form: @@ -998,8 +1011,10 @@ c_test(Int Op, Term t1, compiler_struct *cglobs) { put_var Xk,Ak bip_body Op,Xk -The put_var should always be disposable, and the put_vals can be disposed of if R is an X. -This, in the best case, Ri and Rj are WAM temp registers and this will reduce to: +The put_var should always be disposable, and the put_vals can be disposed of if +R is an X. +This, in the best case, Ri and Rj are WAM temp registers and this will reduce +to: bip Op,Ak,Ri,Rj @@ -1018,292 +1033,262 @@ and this should reduce to : bip_cons Op,Xk,Ri,C */ -static void -c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler_struct *cglobs) -{ +static void c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, + Term mod, compiler_struct *cglobs) { CACHE_REGS - /* compile Z = X Op Y arithmetic function */ + /* compile Z = X Op Y arithmetic function */ /* first we fetch the arguments */ if (IsVarTerm(t1)) { if (IsVarTerm(t2)) { - /* first temp */ - Int v1 = --cglobs->tmpreg; - /* second temp */ - Int v2 = --cglobs->tmpreg; + /* first temp */ + Int v1 = --cglobs->tmpreg; + /* second temp */ + Int v2 = --cglobs->tmpreg; - Yap_emit(fetch_args_vv_op, Zero, Zero, &cglobs->cint); - /* these should be the arguments */ - c_var(t1, v1, 0, 0, cglobs); - c_var(t2, v2, 0, 0, cglobs); - /* now we know where the arguments are */ + Yap_emit(fetch_args_vv_op, Zero, Zero, &cglobs->cint); + /* these should be the arguments */ + c_var(t1, v1, 0, 0, cglobs); + c_var(t2, v2, 0, 0, cglobs); + /* now we know where the arguments are */ } else { if (Op == _arg) { - /* we know the second argument is bound */ - if (IsPrimitiveTerm(t2) || IsNumTerm(t2)) { - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - return; - } else { - Term tn = MkVarTerm(); - Int v1 = --cglobs->tmpreg; - Int v2 = --cglobs->tmpreg; + /* we know the second argument is bound */ + if (IsPrimitiveTerm(t2) || IsNumTerm(t2)) { + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + return; + } else { + Term tn = MkVarTerm(); + Int v1 = --cglobs->tmpreg; + Int v2 = --cglobs->tmpreg; - c_eq(t2, tn, cglobs); - Yap_emit(fetch_args_vv_op, Zero, Zero, &cglobs->cint); - /* these should be the arguments */ - c_var(t1, v1, 0, 0, cglobs); - c_var(tn, v2, 0, 0, cglobs); - } - /* it has to be either an integer or a floating point */ + c_eq(t2, tn, cglobs); + Yap_emit(fetch_args_vv_op, Zero, Zero, &cglobs->cint); + /* these should be the arguments */ + c_var(t1, v1, 0, 0, cglobs); + c_var(tn, v2, 0, 0, cglobs); + } + /* it has to be either an integer or a floating point */ } else if (IsIntegerTerm(t2)) { - /* first temp */ - Int v1 = 0; + /* first temp */ + Int v1 = 0; - Yap_emit(fetch_args_vi_op, IntegerOfTerm(t2), 0L, &cglobs->cint); - /* these should be the arguments */ - c_var(t1, v1, 0, 0, cglobs); - /* now we know where the arguments are */ + Yap_emit(fetch_args_vi_op, IntegerOfTerm(t2), 0L, &cglobs->cint); + /* these should be the arguments */ + c_var(t1, v1, 0, 0, cglobs); + /* now we know where the arguments are */ } else { - char s[32]; + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2 with output bound", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + Yap_bip_name(Op, s); + Yap_ThrowError(TYPE_ERROR_NUMBER, t2, 1, + "compiling %s/2 with output bound", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); } } } else { /* t1 is bound */ /* it has to be either an integer or a floating point */ if (IsVarTerm(t2)) { if (IsNewVar(t2)) { - char s[32]; + char s[32]; - LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/3",s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + Yap_bip_name(Op, s); + Yap_ThrowError(INSTANTIATION_ERROR, t2, 1, "compiling %s/3", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); } } else { if (Op == _functor) { - /* both arguments are bound, we must perform unification */ - Int i2; - - if (!IsIntegerTerm(t2)) { - char s[32]; + /* both arguments are bound, we must perform unification */ + Int i2; - LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling functor/3"); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - i2 = IntegerOfTerm(t2); - if (i2 < 0) { - char s[32]; + if (!IsIntegerTerm(t2)) { + Yap_ThrowError(TYPE_ERROR_INTEGER, t2, 1, "compiling functor/3"); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + i2 = IntegerOfTerm(t2); + if (i2 < 0) { - LOCAL_Error_TYPE = DOMAIN_ERROR_NOT_LESS_THAN_ZERO; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling functor/3"); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - if (IsNumTerm(t1)) { - /* we will always fail */ - if (i2) - c_goal(MkAtomTerm(AtomFalse), mod, cglobs); - } else if (!IsAtomTerm(t1)) { - char s[32]; + Yap_ThrowError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t2, + "compiling functor/3"); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + if (IsNumTerm(t1)) { + /* we will always fail */ + if (i2) + c_goal(MkAtomTerm(AtomFalse), mod, cglobs); + } else if (!IsAtomTerm(t1)) { + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_ATOM; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling functor/3"); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - if (i2 == 0) - c_eq(t1, t3, cglobs); - else { - CELL *hi = HR; - Int i; + Yap_bip_name(Op, s); + Yap_ThrowError(TYPE_ERROR_ATOM, t2, 4, "compiling functor/3"); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + if (i2 == 0) + c_eq(t1, t3, cglobs); + else { + CELL *hi = HR; + Int i; - if (t1 == TermDot && i2 == 2) { - if (HR+2 >= (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); - HR += 2; - c_eq(AbsPair(HR-2),t3, cglobs); - } else if (i2 < 256 && IsAtomTerm(t1)) { - *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),i2); - for (i=0; i < i2; i++) { - if (HR >= (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - RESET_VARIABLE(HR); - HR++; - } - c_eq(AbsAppl(hi),t3, cglobs); - } else { - /* compile as default */ - Functor f = FunctorOfTerm(Goal); - Prop p0 = PredPropByFunc(f, mod); - if (EndOfPAEntr(p0)) { - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); - } - c_args(Goal, 0, cglobs); - Yap_emit(safe_call_op, (CELL)p0 , Zero, &cglobs->cint); - Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); - Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); - return; - } - } + if (t1 == TermDot && i2 == 2) { + if (HR + 2 >= (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + RESET_VARIABLE(HR); + RESET_VARIABLE(HR + 1); + HR += 2; + c_eq(AbsPair(HR - 2), t3, cglobs); + } else if (i2 < 256 && IsAtomTerm(t1)) { + *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1), i2); + for (i = 0; i < i2; i++) { + if (HR >= (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + RESET_VARIABLE(HR); + HR++; + } + c_eq(AbsAppl(hi), t3, cglobs); + } else { + /* compile as default */ + Functor f = FunctorOfTerm(Goal); + Prop p0 = PredPropByFunc(f, mod); + if (EndOfPAEntr(p0)) { + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); + } + c_args(Goal, 0, cglobs); + Yap_emit(safe_call_op, (CELL)p0, Zero, &cglobs->cint); + Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); + Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); + return; + } + } } else if (Op == _arg) { - Int i1; - if (IsIntegerTerm(t1)) - i1 = IntegerOfTerm(t1); - else { - char s[32]; + Int i1; + if (IsIntegerTerm(t1)) + i1 = IntegerOfTerm(t1); + else { + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - if (IsAtomicTerm(t2) || - (IsApplTerm(t2) && IsExtensionFunctor(FunctorOfTerm(t2)))) { - char s[32]; + Yap_bip_name(Op, s); + Yap_ThrowError(TYPE_ERROR_INTEGER, t1, 1, "compiling %s/2", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + if (IsAtomicTerm(t2) || + (IsApplTerm(t2) && IsExtensionFunctor(FunctorOfTerm(t2)))) { + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_COMPOUND; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } else if (IsApplTerm(t2)) { - Functor f = FunctorOfTerm(t2); - if (i1 < 1 || i1 > ArityOfFunctor(f)) { - c_goal(MkAtomTerm(AtomFalse), mod, cglobs); - } else { - c_eq(ArgOfTerm(i1, t2), t3, cglobs); - } - return; - } else if (IsPairTerm(t2)) { - switch (i1) { - case 1: - c_eq(HeadOfTerm(t2), t3, cglobs); - return; - case 2: - c_eq(TailOfTerm(t2), t3, cglobs); - return; - default: - c_goal(MkAtomTerm(AtomFalse), mod, cglobs); - return; - } - } + LOCAL_Error_TYPE = TYPE_ERROR_COMPOUND; + Yap_bip_name(Op, s); + Yap_ThrowError(TYPE_ERROR_COMPOUND, t2, 1, "compiling %s/2", 1, s); + + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } else if (IsApplTerm(t2)) { + Functor f = FunctorOfTerm(t2); + if (i1 < 1 || i1 > ArityOfFunctor(f)) { + c_goal(MkAtomTerm(AtomFalse), mod, cglobs); + } else { + c_eq(ArgOfTerm(i1, t2), t3, cglobs); + } + return; + } else if (IsPairTerm(t2)) { + switch (i1) { + case 1: + c_eq(HeadOfTerm(t2), t3, cglobs); + return; + case 2: + c_eq(TailOfTerm(t2), t3, cglobs); + return; + default: + c_goal(MkAtomTerm(AtomFalse), mod, cglobs); + return; + } + } } else { - char s[32]; + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; + Yap_bip_name(Op, s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); } } if (Op == _functor) { if (!IsAtomicTerm(t1)) { - char s[32]; + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_ATOM; - LOCAL_Error_Term = t1; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + LOCAL_Error_TYPE = TYPE_ERROR_ATOM; + Yap_bip_name(Op, s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); } else { - if (!IsVarTerm(t2)) { - Int arity; + if (!IsVarTerm(t2)) { + Int arity; - /* We actually have the term ready, so let's just do the unification now */ - if (!IsIntegerTerm(t2)) { - char s[32]; + /* We actually have the term ready, so let's just do the unification + * now */ + if (!IsIntegerTerm(t2)) { + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; - LOCAL_Error_Term = t2; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - arity = IntOfTerm(t2); - if (arity < 0) { - /* fail straight away */ - Yap_emit(fail_op, Zero, Zero, &cglobs->cint); - } - if (arity) { - Term tnew; - if (!IsAtomTerm(t1)) { - char s[32]; + LOCAL_Error_TYPE = TYPE_ERROR_INTEGER; + Yap_bip_name(Op, s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + arity = IntOfTerm(t2); + if (arity < 0) { + /* fail straight away */ + Yap_emit(fail_op, Zero, Zero, &cglobs->cint); + } + if (arity) { + Term tnew; + if (!IsAtomTerm(t1)) { + char s[32]; - LOCAL_Error_TYPE = TYPE_ERROR_ATOM; - LOCAL_Error_Term = t1; - LOCAL_ErrorMessage = LOCAL_ErrorSay; - Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); - } - if (HR+1+arity >= (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - tnew = AbsAppl(HR); - *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1),arity); - while (arity--) { - RESET_VARIABLE(HR); - HR++; - } - c_eq(tnew, t3, cglobs); - } else { - /* just unify the two arguments */ - c_eq(t1,t3, cglobs); - } - return; - } else { - /* first temp */ - Int v1 = 0; - Yap_emit(fetch_args_cv_op, t1, Zero, &cglobs->cint); - /* these should be the arguments */ - c_var(t2, v1, 0, 0, cglobs); - /* now we know where the arguments are */ - } + LOCAL_Error_TYPE = TYPE_ERROR_ATOM; + Yap_bip_name(Op, s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2", s); + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, 1); + } + if (HR + 1 + arity >= (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + tnew = AbsAppl(HR); + *HR++ = (CELL)Yap_MkFunctor(AtomOfTerm(t1), arity); + while (arity--) { + RESET_VARIABLE(HR); + HR++; + } + c_eq(tnew, t3, cglobs); + } else { + /* just unify the two arguments */ + c_eq(t1, t3, cglobs); + } + return; + } else { + /* first temp */ + Int v1 = 0; + Yap_emit(fetch_args_cv_op, t1, Zero, &cglobs->cint); + /* these should be the arguments */ + c_var(t2, v1, 0, 0, cglobs); + /* now we know where the arguments are */ + } } } else if (IsIntegerTerm(t1)) { /* first temp */ @@ -1316,53 +1301,54 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler char s[32]; LOCAL_Error_TYPE = UNINSTANTIATION_ERROR; - LOCAL_Error_Term = t1; - LOCAL_ErrorMessage = LOCAL_ErrorSay; Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2 with output bound", s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2 with output bound", s); save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + siglongjmp(cglobs->cint.CompilerBotch, 1); } - } + } /* then we compile the opcode/result */ if (!IsVarTerm(t3)) { if (Op == _arg) { Term tmpvar = MkVarTerm(); if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); } - c_var(tmpvar,f_flag,(unsigned int)Op, 0, cglobs); - c_eq(tmpvar,t3, cglobs); + c_var(tmpvar, f_flag, (unsigned int)Op, 0, cglobs); + c_eq(tmpvar, t3, cglobs); } else { char s[32]; LOCAL_Error_TYPE = UNINSTANTIATION_ERROR; - LOCAL_Error_Term = t3; - LOCAL_ErrorMessage = LOCAL_ErrorSay; Yap_bip_name(Op, s); - sprintf(LOCAL_ErrorMessage, "compiling %s/2 with input unbound", s); + sprintf(LOCAL_ErrorMessage, "compiling %s/2 with input unbound", s); save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,1); + siglongjmp(cglobs->cint.CompilerBotch, 1); } - } else if (IsNewVar(t3) && cglobs->curbranch == 0 && cglobs->cint.CurrentPred->PredFlags & TabledPredFlag) { + } else if (IsNewVar(t3) && cglobs->curbranch == 0 && + cglobs->cint.CurrentPred->PredFlags & TabledPredFlag) { Term nv = MkVarTerm(); - c_var(nv,f_flag,(unsigned int)Op, 0, cglobs); + c_var(nv, f_flag, (unsigned int)Op, 0, cglobs); if (Op == _functor) { Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); } - /* make sure that we first get the true t3, and then bind it to nv. That way it will be confitional */ + /* make sure that we first get the true t3, and then bind it to nv. That way + * it will be confitional */ c_eq(t3, nv, cglobs); - } else if (IsNewVar(t3) && cglobs->curbranch == 0 /* otherwise you may have trouble with z(X) :- ( Z is X*2 ; write(Z)) */) { - c_var(t3,f_flag,(unsigned int)Op, 0, cglobs); + } else if ( + IsNewVar(t3) && + cglobs->curbranch == + 0 /* otherwise you may have trouble with z(X) :- ( Z is X*2 ; write(Z)) */) { + c_var(t3, f_flag, (unsigned int)Op, 0, cglobs); if (Op == _functor) { Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); } } else { - /* generate code for a temp and then unify temp with previous variable */ + /* generate code for a temp and then unify temp with previous variable */ Yap_emit(f_0_op, 0, (unsigned int)Op, &cglobs->cint); /* I have to do it here, before I do the unification */ if (Op == _functor) { @@ -1375,9 +1361,7 @@ c_bifun(basic_preds Op, Term t1, Term t2, Term t3, Term Goal, Term mod, compiler } } -static void -c_functor(Term Goal, Term mod, compiler_struct *cglobs) -{ +static void c_functor(Term Goal, Term mod, compiler_struct *cglobs) { CACHE_REGS Term t1 = ArgOfTerm(1, Goal); Term t2 = ArgOfTerm(2, Goal); @@ -1388,23 +1372,22 @@ c_functor(Term Goal, Term mod, compiler_struct *cglobs) } else if (IsNonVarTerm(t1)) { /* just split the structure */ if (IsAtomicTerm(t1)) { - c_eq(t1,t2, cglobs); - c_eq(t3,MkIntTerm(0), cglobs); + c_eq(t1, t2, cglobs); + c_eq(t3, MkIntTerm(0), cglobs); } else if (IsApplTerm(t1)) { Functor f = FunctorOfTerm(t1); - c_eq(t2,MkAtomTerm(NameOfFunctor(f)), cglobs); - c_eq(t3,MkIntegerTerm(ArityOfFunctor(f)), cglobs); + c_eq(t2, MkAtomTerm(NameOfFunctor(f)), cglobs); + c_eq(t3, MkIntegerTerm(ArityOfFunctor(f)), cglobs); } else /* list */ { - c_eq(t2,TermDot, cglobs); - c_eq(t3,MkIntTerm(2), cglobs); + c_eq(t2, TermDot, cglobs); + c_eq(t3, MkIntTerm(2), cglobs); } - } else if (IsVarTerm(t2) && IsNewVar(t2) && - IsVarTerm(t3) && IsNewVar(t3)) { + } else if (IsVarTerm(t2) && IsNewVar(t2) && IsVarTerm(t3) && IsNewVar(t3)) { Int v1 = --cglobs->tmpreg; Yap_emit(fetch_args_vi_op, Zero, Zero, &cglobs->cint); c_var(t1, v1, 0, 0, cglobs); - c_var(t2,f_flag,(unsigned int)_functor, 0, cglobs); - c_var(t3,f_flag,(unsigned int)_functor, 0, cglobs); + c_var(t2, f_flag, (unsigned int)_functor, 0, cglobs); + c_var(t3, f_flag, (unsigned int)_functor, 0, cglobs); } else { Functor f = FunctorOfTerm(Goal); Prop p0 = PredPropByFunc(f, mod); @@ -1418,33 +1401,32 @@ c_functor(Term Goal, Term mod, compiler_struct *cglobs) } else if (call_counting) Yap_emit(count_call_op, (CELL)RepPredProp(p0), Zero, &cglobs->cint); c_args(Goal, 0, cglobs); - Yap_emit(safe_call_op, (CELL)p0 , Zero, &cglobs->cint); + Yap_emit(safe_call_op, (CELL)p0, Zero, &cglobs->cint); Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); } } -static int -IsTrueGoal(Term t) { - if (IsVarTerm(t)) return(FALSE); +static int IsTrueGoal(Term t) { + if (IsVarTerm(t)) + return (FALSE); if (IsApplTerm(t)) { Functor f = FunctorOfTerm(t); if (f == FunctorModule) { - return(IsTrueGoal(ArgOfTerm(2,t))); + return (IsTrueGoal(ArgOfTerm(2, t))); } - if (f == FunctorComma || f == FunctorOr || f == FunctorVBar || f == FunctorArrow) { - return(IsTrueGoal(ArgOfTerm(1,t)) && IsTrueGoal(ArgOfTerm(2,t))); + if (f == FunctorComma || f == FunctorOr || f == FunctorVBar || + f == FunctorArrow) { + return (IsTrueGoal(ArgOfTerm(1, t)) && IsTrueGoal(ArgOfTerm(2, t))); } - return(FALSE); + return (FALSE); } - return(t == MkAtomTerm(AtomTrue)); + return (t == MkAtomTerm(AtomTrue)); } -static void -emit_special_label(Term Goal, compiler_struct *cglobs) -{ - special_label_op lab_op = IntOfTerm(ArgOfTerm(1,Goal)); - special_label_id lab_id = IntOfTerm(ArgOfTerm(2,Goal)); +static void emit_special_label(Term Goal, compiler_struct *cglobs) { + special_label_op lab_op = IntOfTerm(ArgOfTerm(1, Goal)); + special_label_id lab_id = IntOfTerm(ArgOfTerm(2, Goal)); UInt label_name; switch (lab_op) { @@ -1490,34 +1472,12 @@ emit_special_label(Term Goal, compiler_struct *cglobs) } } -static void -c_goal(Term Goal, Term mod, compiler_struct *cglobs) -{ +static void c_goal(Term Goal, Term mod, compiler_struct *cglobs) { Functor f; PredEntry *p; Prop p0; - if (IsVarTerm(Goal)) { - Goal = Yap_MkApplTerm(FunctorCall, 1, &Goal); - } - if (IsApplTerm(Goal) && FunctorOfTerm(Goal) == FunctorModule) { - Term M = ArgOfTerm(1, Goal); - - if (IsVarTerm(M) || !IsAtomTerm(M)) { - CACHE_REGS - if (IsVarTerm(M)) { - LOCAL_Error_TYPE = INSTANTIATION_ERROR; - } else { - LOCAL_Error_TYPE = TYPE_ERROR_ATOM; - } - LOCAL_Error_Term = M; - LOCAL_ErrorMessage = "in module name"; - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); - } - Goal = ArgOfTerm(2, Goal); - mod = M; - } + Goal = Yap_YapStripModule(Goal, &mod); if (IsVarTerm(Goal)) { Goal = Yap_MkApplTerm(FunctorCall, 1, &Goal); } else if (IsNumTerm(Goal)) { @@ -1526,10 +1486,9 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) } else if (IsRefTerm(Goal)) { CACHE_REGS LOCAL_Error_TYPE = TYPE_ERROR_DBREF; - LOCAL_Error_Term = Goal; - FAIL("goal argument in static procedure can not be a data base reference", TYPE_ERROR_CALLABLE, Goal); - } - else if (IsPairTerm(Goal)) { + FAIL("goal argument in static procedure can not be a data base reference", + TYPE_ERROR_CALLABLE, Goal); + } else if (IsPairTerm(Goal)) { Goal = Yap_MkApplTerm(FunctorCall, 1, &Goal); } if (IsAtomTerm(Goal)) { @@ -1538,59 +1497,60 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) if (atom == AtomFail || atom == AtomFalse) { Yap_emit(fail_op, Zero, Zero, &cglobs->cint); return; - } - else if (atom == AtomTrue || atom == AtomOtherwise) { + } else if (atom == AtomTrue || atom == AtomOtherwise) { if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(41,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(41, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } return; - } - else if (atom == AtomCut) { + } else if (atom == AtomCut) { if (profiling) - Yap_emit(enter_profiling_op, (CELL)RepPredProp(PredPropByAtom(AtomCut,0)), Zero, &cglobs->cint); + Yap_emit(enter_profiling_op, + (CELL)RepPredProp(PredPropByAtom(AtomCut, 0)), Zero, + &cglobs->cint); else if (call_counting) - Yap_emit(count_call_op, (CELL)RepPredProp(PredPropByAtom(AtomCut,0)), Zero, &cglobs->cint); + Yap_emit(count_call_op, (CELL)RepPredProp(PredPropByAtom(AtomCut, 0)), + Zero, &cglobs->cint); if (cglobs->onlast) { - /* never a problem here with a -> b, !, c ; d */ - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + /* never a problem here with a -> b, !, c ; d */ + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(42,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) { - Yap_emit_3ops(cut_op, Zero, Zero, Zero, &cglobs->cint); - /* needs to adjust previous commits */ - Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); - Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - } - else + PELOCK(42, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) { + Yap_emit_3ops(cut_op, Zero, Zero, Zero, &cglobs->cint); + /* needs to adjust previous commits */ + Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); + Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + } else #endif /* TABLING */ - { - Yap_emit_3ops(cutexit_op, Zero, Zero, Zero, &cglobs->cint); - /* needs to adjust previous commits */ - Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); - Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); - } + { + Yap_emit_3ops(cutexit_op, Zero, Zero, Zero, &cglobs->cint); + /* needs to adjust previous commits */ + Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); + Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + } #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif - } - else { - Yap_emit_3ops(cut_op, Zero, Zero, Zero, &cglobs->cint); - /* needs to adjust previous commits */ - Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); - Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); - adjust_current_commits(cglobs); + } else { + Yap_emit_3ops(cut_op, Zero, Zero, Zero, &cglobs->cint); + /* needs to adjust previous commits */ + Yap_emit(empty_call_op, Zero, Zero, &cglobs->cint); + Yap_emit(restore_tmps_and_skip_op, Zero, Zero, &cglobs->cint); + adjust_current_commits(cglobs); } return; } @@ -1602,9 +1562,13 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) /* I need an either_me */ cglobs->needs_env = TRUE; if (profiling) - Yap_emit(enter_profiling_op, (CELL)RepPredProp(PredPropByAtom(AtomRepeat,0)), Zero, &cglobs->cint); + Yap_emit(enter_profiling_op, + (CELL)RepPredProp(PredPropByAtom(AtomRepeat, 0)), Zero, + &cglobs->cint); else if (call_counting) - Yap_emit(count_call_op, (CELL)RepPredProp(PredPropByAtom(AtomRepeat,0)), Zero, &cglobs->cint); + Yap_emit(count_call_op, + (CELL)RepPredProp(PredPropByAtom(AtomRepeat, 0)), Zero, + &cglobs->cint); cglobs->or_found = TRUE; push_branch(cglobs->onbranch, TermNil, cglobs); cglobs->curbranch++; @@ -1619,20 +1583,21 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) Yap_emit(label_op, l2, Zero, &cglobs->cint); if (cglobs->onlast) { #ifdef TABLING - PELOCK(43,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) { - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - } else { + PELOCK(43, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) { + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + } else { #endif - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - } - UNLOCK(cglobs->cint.CurrentPred->PELock); + } + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif - } else { - ++cglobs->goalno; - } + } else { + ++cglobs->goalno; + } cglobs->onbranch = pop_branch(cglobs); Yap_emit(pop_or_op, Zero, Zero, &cglobs->cint); /* --cglobs->onbranch; */ @@ -1649,8 +1614,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); if (call_counting) Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); - } - else { + } else { f = FunctorOfTerm(Goal); p = RepPredProp(p0 = Yap_PredPropByFunctorNonThreadLocal(f, mod)); if (EndOfPAEntr(p0)) { @@ -1675,124 +1639,120 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) cglobs->onbranch = cglobs->curbranch; cglobs->or_found = TRUE; do { - arg = ArgOfTerm(1, Goal); - looking_at_commit = IsApplTerm(arg) && - FunctorOfTerm(arg) == FunctorArrow; - if (frst) { - if (optimizing_commit) { - Yap_emit(label_op, l, Zero, &cglobs->cint); - l = ++cglobs->labelno; - } - Yap_emit_3ops(push_or_op, l, Zero, Zero, &cglobs->cint); - if (looking_at_commit && - Yap_is_a_test_pred(ArgOfTerm(1, arg), mod)) { - /* - * let them think they are still the - * first - */ - // Yap_emit(commit_opt_op, l, Zero, &cglobs->cint); - optimizing_commit = TRUE; - Yap_emit_3ops(label_ctl_op, SPECIAL_LABEL_INIT, SPECIAL_LABEL_FAILURE, l, &cglobs->cint); - } - else { - optimizing_commit = FALSE; - cglobs->needs_env = TRUE; - Yap_emit_3ops(either_op, l, Zero, Zero, &cglobs->cint); - Yap_emit(restore_tmps_op, Zero, Zero, &cglobs->cint); - frst = FALSE; - } - } - else { - optimizing_commit = FALSE; - Yap_emit(label_op, l, Zero, &cglobs->cint); - Yap_emit(pushpop_or_op, Zero, Zero, &cglobs->cint); - Yap_emit_3ops(orelse_op, l = ++cglobs->labelno, Zero, Zero, &cglobs->cint); - cglobs->needs_env = TRUE; - } - /* - * if(IsApplTerm(arg) && - * FunctorOfTerm(arg)==FunctorArrow) { - */ - if (looking_at_commit) { - if (!optimizing_commit && !commitflag) { - CACHE_REGS - /* This instruction is placed before - * the disjunction. This means that - * the program counter must point - * correctly, and also that the age - * of variable is older than the - * current branch. - */ - int my_goalno = cglobs->goalno; + arg = ArgOfTerm(1, Goal); + looking_at_commit = + IsApplTerm(arg) && FunctorOfTerm(arg) == FunctorArrow; + if (frst) { + if (optimizing_commit) { + Yap_emit(label_op, l, Zero, &cglobs->cint); + l = ++cglobs->labelno; + } + Yap_emit_3ops(push_or_op, l, Zero, Zero, &cglobs->cint); + if (looking_at_commit && Yap_is_a_test_pred(ArgOfTerm(1, arg), mod)) { + /* + * let them think they are still the + * first + */ + // Yap_emit(commit_opt_op, l, Zero, &cglobs->cint); + optimizing_commit = TRUE; + Yap_emit_3ops(label_ctl_op, SPECIAL_LABEL_INIT, + SPECIAL_LABEL_FAILURE, l, &cglobs->cint); + } else { + optimizing_commit = FALSE; + cglobs->needs_env = TRUE; + Yap_emit_3ops(either_op, l, Zero, Zero, &cglobs->cint); + Yap_emit(restore_tmps_op, Zero, Zero, &cglobs->cint); + frst = FALSE; + } + } else { + optimizing_commit = FALSE; + Yap_emit(label_op, l, Zero, &cglobs->cint); + Yap_emit(pushpop_or_op, Zero, Zero, &cglobs->cint); + Yap_emit_3ops(orelse_op, l = ++cglobs->labelno, Zero, Zero, + &cglobs->cint); + cglobs->needs_env = TRUE; + } + /* + * if(IsApplTerm(arg) && + * FunctorOfTerm(arg)==FunctorArrow) { + */ + if (looking_at_commit) { + if (!optimizing_commit && !commitflag) { + CACHE_REGS + /* This instruction is placed before + * the disjunction. This means that + * the program counter must point + * correctly, and also that the age + * of variable is older than the + * current branch. + */ + int my_goalno = cglobs->goalno; - cglobs->goalno = savegoalno; - commitflag = cglobs->labelno; - commitvar = MkVarTerm(); - if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - savecpc = cglobs->cint.cpc; - savencpc = FirstP->nextInst; - cglobs->cint.cpc = FirstP; - cglobs->onbranch = pop_branch(cglobs); - c_var(commitvar, save_b_flag, 1, 0, cglobs); - push_branch(cglobs->onbranch, commitvar, cglobs); - cglobs->onbranch = cglobs->curbranch; - cglobs->cint.cpc->nextInst = savencpc; - cglobs->cint.cpc = savecpc; - cglobs->goalno = my_goalno; - } - save = cglobs->onlast; - cglobs->onlast = FALSE; - c_goal(ArgOfTerm(1, arg), mod, cglobs); - if (!optimizing_commit) { - c_var((Term) commitvar, commit_b_flag, - 1, 0, cglobs); - } else { - Yap_emit_3ops(label_ctl_op, SPECIAL_LABEL_CLEAR, SPECIAL_LABEL_FAILURE, l, &cglobs->cint); - } - cglobs->onlast = save; - c_goal(ArgOfTerm(2, arg), mod, cglobs); - } - else { - /* standard disjunction */ - c_goal(ArgOfTerm(1, Goal), mod, cglobs); - } - if (!cglobs->onlast) { - Yap_emit(jump_op, m, Zero, &cglobs->cint); - } else { - - } - if (!optimizing_commit || !cglobs->onlast) { - cglobs->goalno = savegoalno + 1; - } - Goal = ArgOfTerm(2, Goal); - ++cglobs->curbranch; - cglobs->onbranch = cglobs->curbranch; - } while (IsNonVarTerm(Goal) && IsApplTerm(Goal) - && (FunctorOfTerm(Goal) == FunctorOr - || FunctorOfTerm(Goal) == FunctorVBar)); + cglobs->goalno = savegoalno; + commitflag = cglobs->labelno; + commitvar = MkVarTerm(); + if (HR == (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + savecpc = cglobs->cint.cpc; + savencpc = FirstP->nextInst; + cglobs->cint.cpc = FirstP; + cglobs->onbranch = pop_branch(cglobs); + c_var(commitvar, save_b_flag, 1, 0, cglobs); + push_branch(cglobs->onbranch, commitvar, cglobs); + cglobs->onbranch = cglobs->curbranch; + cglobs->cint.cpc->nextInst = savencpc; + cglobs->cint.cpc = savecpc; + cglobs->goalno = my_goalno; + } + save = cglobs->onlast; + cglobs->onlast = FALSE; + c_goal(ArgOfTerm(1, arg), mod, cglobs); + if (!optimizing_commit) { + c_var((Term)commitvar, commit_b_flag, 1, 0, cglobs); + } else { + Yap_emit_3ops(label_ctl_op, SPECIAL_LABEL_CLEAR, + SPECIAL_LABEL_FAILURE, l, &cglobs->cint); + } + cglobs->onlast = save; + c_goal(ArgOfTerm(2, arg), mod, cglobs); + } else { + /* standard disjunction */ + c_goal(ArgOfTerm(1, Goal), mod, cglobs); + } + if (!cglobs->onlast) { + Yap_emit(jump_op, m, Zero, &cglobs->cint); + } else { + } + if (!optimizing_commit || !cglobs->onlast) { + cglobs->goalno = savegoalno + 1; + } + Goal = ArgOfTerm(2, Goal); + ++cglobs->curbranch; + cglobs->onbranch = cglobs->curbranch; + } while (IsNonVarTerm(Goal) && IsApplTerm(Goal) && + (FunctorOfTerm(Goal) == FunctorOr || + FunctorOfTerm(Goal) == FunctorVBar)); Yap_emit(pushpop_or_op, Zero, Zero, &cglobs->cint); Yap_emit(label_op, l, Zero, &cglobs->cint); if (!optimizing_commit) { - Yap_emit(orlast_op, Zero, Zero, &cglobs->cint); + Yap_emit(orlast_op, Zero, Zero, &cglobs->cint); } else { - optimizing_commit = FALSE; /* not really necessary */ + optimizing_commit = FALSE; /* not really necessary */ } c_goal(Goal, mod, cglobs); /* --cglobs->onbranch; */ cglobs->onbranch = pop_branch(cglobs); if (!cglobs->onlast) { - Yap_emit(label_op, m, Zero, &cglobs->cint); - if ((cglobs->onlast = save)) - c_goal(MkAtomTerm(AtomTrue), mod, cglobs); + Yap_emit(label_op, m, Zero, &cglobs->cint); + if ((cglobs->onlast = save)) + c_goal(MkAtomTerm(AtomTrue), mod, cglobs); } Yap_emit(pop_or_op, Zero, Zero, &cglobs->cint); return; - } - else if (f == FunctorComma) { + } else if (f == FunctorComma) { int save = cglobs->onlast; Term t2 = ArgOfTerm(2, Goal); @@ -1801,8 +1761,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) cglobs->onlast = save; c_goal(t2, mod, cglobs); return; - } - else if (f == FunctorNot || f == FunctorAltNot) { + } else if (f == FunctorNot || f == FunctorAltNot) { CACHE_REGS CELL label = (cglobs->labelno += 2); CELL end_label = (cglobs->labelno += 2); @@ -1813,9 +1772,9 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) cglobs->needs_env = TRUE; commitvar = MkVarTerm(); if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); } push_branch(cglobs->onbranch, commitvar, cglobs); ++cglobs->curbranch; @@ -1824,7 +1783,7 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) cglobs->onlast = FALSE; c_var(commitvar, save_b_flag, 1, 0, cglobs); Yap_emit_3ops(push_or_op, label, Zero, Zero, &cglobs->cint); - Yap_emit_3ops(either_op, label, Zero, Zero, &cglobs->cint); + Yap_emit_3ops(either_op, label, Zero, Zero, &cglobs->cint); Yap_emit(restore_tmps_op, Zero, Zero, &cglobs->cint); c_goal(ArgOfTerm(1, Goal), mod, cglobs); c_var(commitvar, commit_b_flag, 1, 0, cglobs); @@ -1841,17 +1800,16 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) ++cglobs->goalno; Yap_emit(pop_or_op, Zero, Zero, &cglobs->cint); return; - } - else if (f == FunctorArrow) { + } else if (f == FunctorArrow) { CACHE_REGS Term commitvar; int save = cglobs->onlast; commitvar = MkVarTerm(); if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); } cglobs->onlast = FALSE; c_var(commitvar, save_b_flag, 1, 0, cglobs); @@ -1860,173 +1818,165 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) cglobs->onlast = save; c_goal(ArgOfTerm(2, Goal), mod, cglobs); return; - } - else if (f == FunctorEq) { + } else if (f == FunctorEq) { if (profiling) - Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); else if (call_counting) - Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); c_eq(ArgOfTerm(1, Goal), ArgOfTerm(2, Goal), cglobs); if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(44,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(44, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } return; - } - else if (f == FunctorSafe) { + } else if (f == FunctorSafe) { Ventry *v = (Ventry *)ArgOfTerm(1, Goal); /* This variable must be known before */ v->FlagsOfVE |= SafeVar; return; - } - else if (p->PredFlags & (AsmPredFlag)) { + } else if (p->PredFlags & (AsmPredFlag)) { basic_preds op = p->PredFlags & 0x7f; if (profiling) - Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); else if (call_counting) - Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); if (op >= _atom && op <= _primitive) { - c_test(op, ArgOfTerm(1, Goal), cglobs); - if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + c_test(op, ArgOfTerm(1, Goal), cglobs); + if (cglobs->onlast) { + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(45,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(45, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif - } - return; - } - else if (op >= _plus && op <= _functor) { - if (profiling) - Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); - else if (call_counting) - Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); - if (op == _functor) { - c_functor(Goal, mod, cglobs); - } - else { - c_bifun(op, - ArgOfTerm(1, Goal), - ArgOfTerm(2, Goal), - ArgOfTerm(3, Goal), - Goal, - mod, - cglobs); - } - if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + } + return; + } else if (op >= _plus && op <= _functor) { + if (profiling) + Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); + else if (call_counting) + Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); + if (op == _functor) { + c_functor(Goal, mod, cglobs); + } else { + c_bifun(op, ArgOfTerm(1, Goal), ArgOfTerm(2, Goal), + ArgOfTerm(3, Goal), Goal, mod, cglobs); + } + if (cglobs->onlast) { + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(46,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(46, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif - } - return; + } + return; } else if (op == _p_label_ctl) { - emit_special_label(Goal, cglobs); - return; + emit_special_label(Goal, cglobs); + return; } else { - c_args(Goal, 0, cglobs); + c_args(Goal, 0, cglobs); } } #ifdef BEAM else if (p->PredFlags & BinaryPredFlag && !EAM) { #else - else if (p->PredFlags & BinaryPredFlag ) { + else if (p->PredFlags & BinaryPredFlag) { #endif CACHE_REGS - Term a1 = ArgOfTerm(1,Goal); + Term a1 = ArgOfTerm(1, Goal); if (IsVarTerm(a1) && !IsNewVar(a1)) { - Term a2 = ArgOfTerm(2,Goal); - if (IsVarTerm(a2) && !IsNewVar(a2)) { - cglobs->current_p0 = p0; - c_2vars(bt_flag, a1, 0, a2, 0, (CELL)p0, 0, 0, cglobs); - } - else { - Term t2 = MkVarTerm(); - //c_var(t2, --cglobs->tmpreg, 0, 0, cglobs); - if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - cglobs->current_p0 = p0; - c_eq(t2, a2, cglobs); - c_2vars(bt_flag, a1, 0, t2, 0, (CELL)p0, 0, 0, cglobs); - } + Term a2 = ArgOfTerm(2, Goal); + if (IsVarTerm(a2) && !IsNewVar(a2)) { + cglobs->current_p0 = p0; + c_2vars(bt_flag, a1, 0, a2, 0, (CELL)p0, 0, 0, cglobs); + } else { + Term t2 = MkVarTerm(); + // c_var(t2, --cglobs->tmpreg, 0, 0, cglobs); + if (HR == (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + cglobs->current_p0 = p0; + c_eq(t2, a2, cglobs); + c_2vars(bt_flag, a1, 0, t2, 0, (CELL)p0, 0, 0, cglobs); + } } else { - Term a2 = ArgOfTerm(2,Goal); - Term t1 = MkVarTerm(); - //c_var(t1, --cglobs->tmpreg, 0, 0, cglobs); - if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - c_eq(t1, a1, cglobs); + Term a2 = ArgOfTerm(2, Goal); + Term t1 = MkVarTerm(); + // c_var(t1, --cglobs->tmpreg, 0, 0, cglobs); + if (HR == (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + c_eq(t1, a1, cglobs); - if (IsVarTerm(a2) && !IsNewVar(a2)) { - cglobs->current_p0 = p0; - c_2vars(bt_flag, t1, 0, a2, 0, (CELL)p0, 0, 0, cglobs); - } - else { - Term t2 = MkVarTerm(); - // c_var(t2, --cglobs->tmpreg, 0, 0, cglobs); - if (HR == (CELL *)cglobs->cint.freep0) { - /* oops, too many new variables */ - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch,OUT_OF_TEMPS_BOTCH); - } - c_eq(t2, a2, cglobs); - cglobs->current_p0 = p0; - c_2vars(bt_flag, t1, 0, t2, 0, (CELL)p0, 0, 0, cglobs); - } + if (IsVarTerm(a2) && !IsNewVar(a2)) { + cglobs->current_p0 = p0; + c_2vars(bt_flag, t1, 0, a2, 0, (CELL)p0, 0, 0, cglobs); + } else { + Term t2 = MkVarTerm(); + // c_var(t2, --cglobs->tmpreg, 0, 0, cglobs); + if (HR == (CELL *)cglobs->cint.freep0) { + /* oops, too many new variables */ + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_TEMPS_BOTCH); + } + c_eq(t2, a2, cglobs); + cglobs->current_p0 = p0; + c_2vars(bt_flag, t1, 0, t2, 0, (CELL)p0, 0, 0, cglobs); + } } if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(47,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(47, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } return; } else { if (profiling) - Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(enter_profiling_op, (CELL)p, Zero, &cglobs->cint); else if (call_counting) - Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); + Yap_emit(count_call_op, (CELL)p, Zero, &cglobs->cint); if (f == FunctorExecuteInMod) { - /* compile the first argument only */ - c_arg(1, ArgOfTerm(1,Goal), 1, 0, cglobs); + /* compile the first argument only */ + c_arg(1, ArgOfTerm(1, Goal), 1, 0, cglobs); } else { - c_args(Goal, 0, cglobs); + c_args(Goal, 0, cglobs); } } } @@ -2036,74 +1986,73 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) /* synchronisation means saving the state, so it is never safe in YAPOR */ && !(p->PredFlags & SyncPredFlag) #endif /* YAPOR */ - ) { - Yap_emit(safe_call_op, (CELL) p0, Zero, &cglobs->cint); + ) { + Yap_emit(safe_call_op, (CELL)p0, Zero, &cglobs->cint); if (cglobs->onlast) { Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(48,cglobs->cint.CurrentPred); + PELOCK(48, cglobs->cint.CurrentPred); if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, + &cglobs->cint); else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } - } - else { - if ((p->PredFlags & (AsmPredFlag | - ModuleTransparentPredFlag | - UserCPredFlag)) || - p->FunctorOfPred == FunctorExecuteInMod) { + } else { + if ((p->PredFlags & + (AsmPredFlag | ModuleTransparentPredFlag | UserCPredFlag)) || + p->FunctorOfPred == FunctorExecuteInMod) { #ifdef YAPOR if (p->PredFlags & SyncPredFlag) - Yap_emit(sync_op, (CELL)p, (CELL)(p->ArityOfPE), &cglobs->cint); + Yap_emit(sync_op, (CELL)p, (CELL)(p->ArityOfPE), &cglobs->cint); #endif /* YAPOR */ if (p->FunctorOfPred == FunctorExecuteInMod) { - cglobs->needs_env = TRUE; - Yap_emit_4ops(call_op, (CELL) p0, Zero, Zero, ArgOfTerm(2,Goal), &cglobs->cint); + cglobs->needs_env = TRUE; + Yap_emit_4ops(call_op, (CELL)p0, Zero, Zero, ArgOfTerm(2, Goal), + &cglobs->cint); } else { - cglobs->needs_env = TRUE; - Yap_emit_3ops(call_op, (CELL) p0, Zero, Zero, &cglobs->cint); + cglobs->needs_env = TRUE; + Yap_emit_3ops(call_op, (CELL)p0, Zero, Zero, &cglobs->cint); } /* functor is allowed to call the garbage collector */ if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); - cglobs->or_found = TRUE; + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + cglobs->or_found = TRUE; #ifdef TABLING - PELOCK(49,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - else + PELOCK(49, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + else #endif /* TABLING */ - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } - } - else { + } else { if (cglobs->onlast) { - Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); + Yap_emit(deallocate_op, Zero, Zero, &cglobs->cint); #ifdef TABLING - PELOCK(50,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) { - cglobs->needs_env = TRUE; - Yap_emit_3ops(call_op, (CELL) p0, Zero, Zero, &cglobs->cint); - Yap_emit(table_new_answer_op, Zero, cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); - } - else + PELOCK(50, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) { + cglobs->needs_env = TRUE; + Yap_emit_3ops(call_op, (CELL)p0, Zero, Zero, &cglobs->cint); + Yap_emit(table_new_answer_op, Zero, + cglobs->cint.CurrentPred->ArityOfPE, &cglobs->cint); + } else #endif /* TABLING */ - Yap_emit(execute_op, (CELL) p0, Zero, &cglobs->cint); + Yap_emit(execute_op, (CELL)p0, Zero, &cglobs->cint); #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif - } - else { - cglobs->needs_env = TRUE; - Yap_emit_3ops(call_op, (CELL) p0, Zero, Zero, &cglobs->cint); + } else { + cglobs->needs_env = TRUE; + Yap_emit_3ops(call_op, (CELL)p0, Zero, Zero, &cglobs->cint); } } if (!cglobs->onlast) @@ -2111,18 +2060,16 @@ c_goal(Term Goal, Term mod, compiler_struct *cglobs) } } -static void -c_body(Term Body, Term mod, compiler_struct *cglobs) -{ +static void c_body(Term Body, Term mod, compiler_struct *cglobs) { cglobs->onhead = FALSE; cglobs->BodyStart = cglobs->cint.cpc; cglobs->goalno = 1; - while (IsNonVarTerm(Body) && IsApplTerm(Body) - && FunctorOfTerm(Body) == FunctorComma) { + while (IsNonVarTerm(Body) && IsApplTerm(Body) && + FunctorOfTerm(Body) == FunctorComma) { Term t2 = ArgOfTerm(2, Body); if (!cglobs->cint.success_handler && IsTrueGoal(t2)) { /* optimise the case where some idiot left trues at the end - of the clause. + of the clause. */ Body = ArgOfTerm(1, Body); break; @@ -2130,26 +2077,24 @@ c_body(Term Body, Term mod, compiler_struct *cglobs) c_goal(ArgOfTerm(1, Body), mod, cglobs); Body = t2; #ifdef BEAM - if (EAM) Yap_emit(endgoal_op, Zero, Zero, &cglobs->cint); + if (EAM) + Yap_emit(endgoal_op, Zero, Zero, &cglobs->cint); #endif - } cglobs->onlast = TRUE; c_goal(Body, mod, cglobs); #ifdef BEAM - if (EAM && cglobs->goalno > 1) { - if (cglobs->cint.cpc->op==procceed_op) { - cglobs->cint.cpc->op=endgoal_op; - Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); - } else - Yap_emit(endgoal_op, Zero, Zero, &cglobs->cint); - } + if (EAM && cglobs->goalno > 1) { + if (cglobs->cint.cpc->op == procceed_op) { + cglobs->cint.cpc->op = endgoal_op; + Yap_emit(procceed_op, Zero, Zero, &cglobs->cint); + } else + Yap_emit(endgoal_op, Zero, Zero, &cglobs->cint); + } #endif } -static void -c_head(Term t, compiler_struct *cglobs) -{ +static void c_head(Term t, compiler_struct *cglobs) { Functor f; cglobs->goalno = 0; @@ -2160,30 +2105,30 @@ c_head(Term t, compiler_struct *cglobs) cglobs->space_used = 0; cglobs->space_op = NULL; if (IsAtomTerm(t)) { - Yap_emit(name_op, (CELL) AtomOfTerm(t), Zero, &cglobs->cint); + Yap_emit(name_op, (CELL)AtomOfTerm(t), Zero, &cglobs->cint); #ifdef BEAM if (EAM) { - Yap_emit(run_op,Zero,(UInt) cglobs->cint.CurrentPred,&cglobs->cint); + Yap_emit(run_op, Zero, (UInt)cglobs->cint.CurrentPred, &cglobs->cint); } #endif - Yap_emit(ensure_space_op, Zero , Zero, &cglobs->cint); + Yap_emit(ensure_space_op, Zero, Zero, &cglobs->cint); cglobs->space_op = cglobs->cint.cpc; return; } f = FunctorOfTerm(t); - Yap_emit(name_op, (CELL) NameOfFunctor(f), ArityOfFunctor(f), &cglobs->cint); + Yap_emit(name_op, (CELL)NameOfFunctor(f), ArityOfFunctor(f), &cglobs->cint); #ifdef BEAM - if (EAM) { - Yap_emit(run_op,Zero,(UInt) cglobs->cint.CurrentPred,&cglobs->cint); - } + if (EAM) { + Yap_emit(run_op, Zero, (UInt)cglobs->cint.CurrentPred, &cglobs->cint); + } #endif if (Yap_ExecutionMode == MIXED_MODE_USER) - Yap_emit(native_op, 0, 0, &cglobs->cint); - Yap_emit(ensure_space_op, Zero , Zero, &cglobs->cint); + Yap_emit(native_op, 0, 0, &cglobs->cint); + Yap_emit(ensure_space_op, Zero, Zero, &cglobs->cint); cglobs->space_op = cglobs->cint.cpc; #ifdef BEAM if (EAM) { - Yap_emit(run_op,Zero,(UInt) cglobs->cint.CurrentPred,&cglobs->cint); + Yap_emit(run_op, Zero, (UInt)cglobs->cint.CurrentPred, &cglobs->cint); } #endif if (Yap_ExecutionMode == MIXED_MODE || Yap_ExecutionMode == COMPILED) @@ -2200,10 +2145,7 @@ c_head(Term t, compiler_struct *cglobs) c_args(t, 0, cglobs); } - -inline static bool -usesvar(compiler_vm_op ic) -{ +inline static bool usesvar(compiler_vm_op ic) { if (ic >= get_var_op && ic <= put_val_op) return true; switch (ic) { @@ -2223,9 +2165,8 @@ usesvar(compiler_vm_op ic) if (ic >= unify_s_var_op && ic <= write_s_val_op) return true; #endif - return ((ic >= unify_var_op && ic <= write_val_op) - || - (ic >= unify_last_var_op && ic <= unify_last_val_op)); + return ((ic >= unify_var_op && ic <= write_val_op) || + (ic >= unify_last_var_op && ic <= unify_last_val_op)); } /* @@ -2240,11 +2181,7 @@ inline static bool } */ -inline static bool -usesvar2(compiler_vm_op ic) -{ - return ic == bccall_op; -} +inline static bool usesvar2(compiler_vm_op ic) { return ic == bccall_op; } /* * Do as in the traditional WAM and make sure voids are in @@ -2253,43 +2190,38 @@ usesvar2(compiler_vm_op ic) #define LOCALISE_VOIDS 1 #ifdef LOCALISE_VOIDS -typedef struct env_tmp { - Ventry * Var; +typedef struct env_tmp { + Ventry *Var; struct env_tmp *Next; -} EnvTmp; +} EnvTmp; #endif - -static void - tag_use(Ventry *v USES_REGS) -{ +static void tag_use(Ventry *v USES_REGS) { #ifdef BEAM - if (EAM) { - if (v->NoOfVE == Unassigned || v->KindOfVE!=PermVar) { - v->NoOfVE = PermVar | (LOCAL_nperm++); - v->KindOfVE = PermVar; - v->FlagsOfVE |= PermFlag; - } - } + if (EAM) { + if (v->NoOfVE == Unassigned || v->KindOfVE != PermVar) { + v->NoOfVE = PermVar | (LOCAL_nperm++); + v->KindOfVE = PermVar; + v->FlagsOfVE |= PermFlag; + } + } #endif - if (v->NoOfVE == Unassigned) { - if ((v->AgeOfVE > 1 && (v->AgeOfVE > v->FirstOfVE)) - || v->KindOfVE == PermVar /* + if (v->NoOfVE == Unassigned) { + if ((v->AgeOfVE > 1 && (v->AgeOfVE > v->FirstOfVE)) || + v->KindOfVE == PermVar /* * * || (v->FlagsOfVE & NonVoid && !(v->FlagsOfVE & - * * OnHeadFlag)) - */ ) { - v->NoOfVE = PermVar | (LOCAL_nperm++); - v->KindOfVE = PermVar; - v->FlagsOfVE |= PermFlag; - } else { - v->NoOfVE = v->KindOfVE = TempVar; - } - } + * * OnHeadFlag)) + */) { + v->NoOfVE = PermVar | (LOCAL_nperm++); + v->KindOfVE = PermVar; + v->FlagsOfVE |= PermFlag; + } else { + v->NoOfVE = v->KindOfVE = TempVar; + } + } } -static void -AssignPerm(PInstr *pc, compiler_struct *cglobs) -{ +static void AssignPerm(PInstr *pc, compiler_struct *cglobs) { CACHE_REGS int uses_var; PInstr *opc = NULL; @@ -2300,7 +2232,7 @@ AssignPerm(PInstr *pc, compiler_struct *cglobs) /* The WAM tries to keep voids on the * environment. Traditionally, YAP liberally globalises * voids. - * + * * The new version goes to some length to keep void variables * in environments, but it is dubious that improves * performance, and may actually slow down the system @@ -2309,21 +2241,22 @@ AssignPerm(PInstr *pc, compiler_struct *cglobs) PInstr *tpc = pc->nextInst; #ifdef LOCALISE_VOIDS if (pc->op == put_var_op) { - Ventry *v = (Ventry *) (pc->rnd1); - if (v->AgeOfVE == v->FirstOfVE - && !(v->FlagsOfVE & (GlobalVal|OnHeadFlag|OnLastGoal|NonVoid)) ) { - EnvTmp *x = (EnvTmp *)Yap_AllocCMem(sizeof(*x), &cglobs->cint); - x->Next = EnvTmps; - x->Var = v; - EnvTmps = x; + Ventry *v = (Ventry *)(pc->rnd1); + if (v->AgeOfVE == v->FirstOfVE && + !(v->FlagsOfVE & (GlobalVal | OnHeadFlag | OnLastGoal | NonVoid))) { + EnvTmp *x = (EnvTmp *)Yap_AllocCMem(sizeof(*x), &cglobs->cint); + x->Next = EnvTmps; + x->Var = v; + EnvTmps = x; } } else #endif - if (pc->op == call_op || pc->op == either_op || pc->op == orelse_op || pc->op == push_or_op) { + if (pc->op == call_op || pc->op == either_op || pc->op == orelse_op || + pc->op == push_or_op) { #ifdef LOCALISE_VOIDS pc->ops.opseqt[1] = (CELL)EnvTmps; if (EnvTmps) - EnvTmps = NULL; + EnvTmps = NULL; #endif } pc->nextInst = opc; @@ -2338,31 +2271,31 @@ AssignPerm(PInstr *pc, compiler_struct *cglobs) pc->nextInst = opc; uses_var = usesvar(pc->op); if (uses_var) { - Ventry *v = (Ventry *) (pc->rnd1); + Ventry *v = (Ventry *)(pc->rnd1); - tag_use(v PASS_REGS); - if (usesvar2(pc->op) ) { - Ventry *v2 = (Ventry *) (pc->rnd3); - tag_use(v2 PASS_REGS); + tag_use(v PASS_REGS); + if (usesvar2(pc->op)) { + Ventry *v2 = (Ventry *)(pc->rnd3); + tag_use(v2 PASS_REGS); } } else if (pc->op == empty_call_op) { pc->rnd2 = LOCAL_nperm; - } else if (pc->op == call_op || pc->op == either_op || pc->op == orelse_op || pc->op == push_or_op) { + } else if (pc->op == call_op || pc->op == either_op || + pc->op == orelse_op || pc->op == push_or_op) { #ifdef LOCALISE_VOIDS EnvTmps = (EnvTmp *)(pc->ops.opseqt[1]); while (EnvTmps) { - Ventry *v = EnvTmps->Var; - v->NoOfVE = PermVar | (LOCAL_nperm++); - v->KindOfVE = PermVar; - v->FlagsOfVE |= (PermFlag|SafeVar); - EnvTmps = EnvTmps->Next; + Ventry *v = EnvTmps->Var; + v->NoOfVE = PermVar | (LOCAL_nperm++); + v->KindOfVE = PermVar; + v->FlagsOfVE |= (PermFlag | SafeVar); + EnvTmps = EnvTmps->Next; } #endif pc->rnd2 = LOCAL_nperm; - } else if (pc->op == cut_op || - pc->op == cutexit_op || - pc->op == commit_b_op) { + } else if (pc->op == cut_op || pc->op == cutexit_op || + pc->op == commit_b_op) { pc->rnd2 = LOCAL_nperm; } opc = pc; @@ -2370,24 +2303,21 @@ AssignPerm(PInstr *pc, compiler_struct *cglobs) } while (pc != NULL); } -static CELL * -init_bvarray(int nperm, compiler_struct *cglobs) -{ +static CELL *init_bvarray(int nperm, compiler_struct *cglobs) { CELL *vinfo = NULL; - size_t sz = sizeof(CELL)*(1+nperm/(8*sizeof(CELL))); + size_t sz = sizeof(CELL) * (1 + nperm / (8 * sizeof(CELL))); vinfo = (CELL *)Yap_AllocCMem(sz, &cglobs->cint); memset((void *)vinfo, 0, sz); return vinfo; } -static void -clear_bvarray(int var, CELL *bvarray +static void clear_bvarray(int var, CELL *bvarray #ifdef DEBUG - , compiler_struct *cglobs + , + compiler_struct *cglobs #endif -) -{ - int max = 8*sizeof(CELL); + ) { + int max = 8 * sizeof(CELL); CELL nbit; /* get to the array position */ @@ -2402,7 +2332,6 @@ clear_bvarray(int var, CELL *bvarray CACHE_REGS /* someone had already marked this variable: complain */ LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "compiler internal error: variable initialized twice"; save_machine_regs(); siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); @@ -2413,14 +2342,13 @@ clear_bvarray(int var, CELL *bvarray } /* copy the current state of the perm variable state array to code space */ -static void -add_bvarray_op(PInstr *cp, CELL *bvarray, int env_size, compiler_struct *cglobs) -{ - int i, size = env_size/(8*sizeof(CELL)); +static void add_bvarray_op(PInstr *cp, CELL *bvarray, int env_size, + compiler_struct *cglobs) { + int i, size = env_size / (8 * sizeof(CELL)); CELL *dest; - dest = - Yap_emit_extra_size(mark_initialized_pvars_op, (CELL)env_size, (size+1)*sizeof(CELL), &cglobs->cint); + dest = Yap_emit_extra_size(mark_initialized_pvars_op, (CELL)env_size, + (size + 1) * sizeof(CELL), &cglobs->cint); /* copy the cells to dest */ for (i = 0; i <= size; i++) *dest++ = *bvarray++; @@ -2432,19 +2360,16 @@ typedef struct { int lab; int last; PInstr *pc; -} bventry; +} bventry; #define MAX_DISJUNCTIONS 128 static bventry *bvstack; static int bvindex = 0; -static void -push_bvmap(int label, PInstr *pcpc, compiler_struct *cglobs) -{ +static void push_bvmap(int label, PInstr *pcpc, compiler_struct *cglobs) { if (bvindex == MAX_DISJUNCTIONS) { CACHE_REGS LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "Too many embedded disjunctions"; save_machine_regs(); siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); @@ -2457,42 +2382,36 @@ push_bvmap(int label, PInstr *pcpc, compiler_struct *cglobs) bvindex++; } -static void -reset_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs) -{ +static void reset_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs) { int size, size1, env_size, i; CELL *source; if (bvarray == NULL) - if (bvindex == 0) { - CACHE_REGS - LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; - LOCAL_ErrorMessage = "No embedding in disjunctions"; - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); - } - env_size = (bvstack[bvindex-1].pc)->rnd1; - size = env_size/(8*sizeof(CELL)); - size1 = nperm/(8*sizeof(CELL)); - source = (bvstack[bvindex-1].pc)->arnds; + if (bvindex == 0) { + CACHE_REGS + LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; + LOCAL_ErrorMessage = "No embedding in disjunctions"; + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); + } + env_size = (bvstack[bvindex - 1].pc)->rnd1; + size = env_size / (8 * sizeof(CELL)); + size1 = nperm / (8 * sizeof(CELL)); + source = (bvstack[bvindex - 1].pc)->arnds; for (i = 0; i <= size; i++) *bvarray++ = *source++; - for (i = size+1; i<= size1; i++) + for (i = size + 1; i <= size1; i++) *bvarray++ = (CELL)(0); } -static void -pop_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs) -{ +static void pop_bvmap(CELL *bvarray, int nperm, compiler_struct *cglobs) { if (bvindex == 0) { CACHE_REGS LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "Too few embedded disjunctions"; /* save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); */ + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); */ } reset_bvmap(bvarray, nperm, cglobs); bvindex--; @@ -2504,52 +2423,47 @@ typedef struct { } UnsafeEntry; /* extend to also support variable usage bitmaps for garbage collection */ -static void -CheckUnsafe(PInstr *pc, compiler_struct *cglobs) -{ +static void CheckUnsafe(PInstr *pc, compiler_struct *cglobs) { CACHE_REGS int pending = 0; /* say that all variables are yet to initialize */ CELL *vstat = init_bvarray(LOCAL_nperm, cglobs); - UnsafeEntry *UnsafeStack = - (UnsafeEntry *) Yap_AllocCMem(LOCAL_nperm * sizeof(UnsafeEntry), &cglobs->cint); + UnsafeEntry *UnsafeStack = (UnsafeEntry *)Yap_AllocCMem( + LOCAL_nperm * sizeof(UnsafeEntry), &cglobs->cint); /* keep a copy of previous cglobs->cint.cpc and CodeStart */ PInstr *opc = cglobs->cint.cpc; PInstr *OldCodeStart = cglobs->cint.CodeStart; - + cglobs->cint.CodeStart = cglobs->cint.BlobsStart; cglobs->cint.cpc = cglobs->cint.icpc; bvindex = 0; - bvstack = (bventry *)Yap_AllocCMem(MAX_DISJUNCTIONS * sizeof(bventry), &cglobs->cint); + bvstack = (bventry *)Yap_AllocCMem(MAX_DISJUNCTIONS * sizeof(bventry), + &cglobs->cint); while (pc != NIL) { - switch(pc->op) { - case put_val_op: - { - Ventry *v = (Ventry *) (pc->rnd1); - if ((v->FlagsOfVE & PermFlag) && !(v->FlagsOfVE & SafeVar)) { - UnsafeStack[pending].p = pc; - UnsafeStack[pending++].v = v; - v->FlagsOfVE |= SafeVar; - } - break; - } - case bccall_op: - { - Ventry *v = (Ventry *) (pc->rnd1), - *v3 = (Ventry *) (pc->rnd3); - - if ( (v->FlagsOfVE & PermFlag && pc == v->FirstOpForV) || - (v3->FlagsOfVE & PermFlag && pc == v3->FirstOpForV) ) { - CACHE_REGS - LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; - LOCAL_ErrorMessage = "comparison should not have first instance of variables"; - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); - } + switch (pc->op) { + case put_val_op: { + Ventry *v = (Ventry *)(pc->rnd1); + if ((v->FlagsOfVE & PermFlag) && !(v->FlagsOfVE & SafeVar)) { + UnsafeStack[pending].p = pc; + UnsafeStack[pending++].v = v; + v->FlagsOfVE |= SafeVar; } break; + } + case bccall_op: { + Ventry *v = (Ventry *)(pc->rnd1), *v3 = (Ventry *)(pc->rnd3); + + if ((v->FlagsOfVE & PermFlag && pc == v->FirstOpForV) || + (v3->FlagsOfVE & PermFlag && pc == v3->FirstOpForV)) { + CACHE_REGS + LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; + LOCAL_ErrorMessage = + "comparison should not have first instance of variables"; + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); + } + } break; case put_var_op: case get_var_op: case save_b_op: @@ -2558,21 +2472,20 @@ CheckUnsafe(PInstr *pc, compiler_struct *cglobs) case write_var_op: case save_appl_op: case save_pair_op: - case f_var_op: - { - Ventry *v = (Ventry *) (pc->rnd1); + case f_var_op: { + Ventry *v = (Ventry *)(pc->rnd1); - if (v->FlagsOfVE & PermFlag && pc == v->FirstOpForV) { - /* the second condition covers cases such as save_b_op - in a disjunction */ - clear_bvarray((v->NoOfVE & MaskVarAdrs), vstat + if (v->FlagsOfVE & PermFlag && pc == v->FirstOpForV) { + /* the second condition covers cases such as save_b_op + in a disjunction */ + clear_bvarray((v->NoOfVE & MaskVarAdrs), vstat #ifdef DEBUG - , cglobs + , + cglobs #endif - ); - } + ); } - break; + } break; case push_or_op: Yap_emit(label_op, ++cglobs->labelno, Zero, &cglobs->cint); pc->ops.opseqt[1] = (CELL)cglobs->labelno; @@ -2599,7 +2512,7 @@ CheckUnsafe(PInstr *pc, compiler_struct *cglobs) break; case empty_call_op: /* just get ourselves a label describing how - many permanent variables are alive */ + many permanent variables are alive */ Yap_emit(label_op, ++cglobs->labelno, Zero, &cglobs->cint); pc->rnd1 = (CELL)cglobs->labelno; add_bvarray_op(pc, vstat, pc->rnd2, cglobs); @@ -2607,7 +2520,7 @@ CheckUnsafe(PInstr *pc, compiler_struct *cglobs) case cut_op: case cutexit_op: /* just get ourselves a label describing how - many permanent variables are alive */ + many permanent variables are alive */ Yap_emit(label_op, ++cglobs->labelno, Zero, &cglobs->cint); pc->rnd1 = (CELL)cglobs->labelno; add_bvarray_op(pc, vstat, pc->rnd2, cglobs); @@ -2617,20 +2530,19 @@ CheckUnsafe(PInstr *pc, compiler_struct *cglobs) pc->ops.opseqt[1] = (CELL)cglobs->labelno; add_bvarray_op(pc, vstat, pc->rnd2, cglobs); case deallocate_op: - reset_safe_map: - { - int n = pc->op == call_op ? pc->rnd2 : 0; - int no; + reset_safe_map : { + int n = pc->op == call_op ? pc->rnd2 : 0; + int no; - while (pending) { - Ventry *v = UnsafeStack[--pending].v; + while (pending) { + Ventry *v = UnsafeStack[--pending].v; - v->FlagsOfVE &= ~SafeVar; - no = (v->NoOfVE) & MaskVarAdrs; - if (no >= n) - UnsafeStack[pending].p->op = put_unsafe_op; - } + v->FlagsOfVE &= ~SafeVar; + no = (v->NoOfVE) & MaskVarAdrs; + if (no >= n) + UnsafeStack[pending].p->op = put_unsafe_op; } + } default: break; } @@ -2643,9 +2555,8 @@ CheckUnsafe(PInstr *pc, compiler_struct *cglobs) } static void -CheckVoids(compiler_struct *cglobs) -{ /* establish voids in the head and initial - * uses */ +CheckVoids(compiler_struct *cglobs) { /* establish voids in the head and initial + * uses */ Ventry *ve; compiler_vm_op ic; struct PSEUDO *cpc; @@ -2661,21 +2572,20 @@ CheckVoids(compiler_struct *cglobs) #endif case save_pair_op: case save_appl_op: - ve = ((Ventry *) cpc->rnd1); + ve = ((Ventry *)cpc->rnd1); if ((ve->FlagsOfVE & PermFlag) == 0 && ve->RCountOfVE <= 1) { - ve->NoOfVE = ve->KindOfVE = VoidVar; - if (ic == get_var_op || ic == - save_pair_op || ic == save_appl_op + ve->NoOfVE = ve->KindOfVE = VoidVar; + if (ic == get_var_op || ic == save_pair_op || ic == save_appl_op #ifdef SFUNC - || ic == unify_s_var_op + || ic == unify_s_var_op #endif - ) { - cpc->op = nop_op; - break; - } + ) { + cpc->op = nop_op; + break; + } } if (ic != get_var_op) - break; + break; case get_val_op: case get_atom_op: case get_num_op: @@ -2698,10 +2608,9 @@ CheckVoids(compiler_struct *cglobs) } } -static int -checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) -{ - Ventry *v = (Ventry *) arg; +static int checktemp(Int arg, Int rn, compiler_vm_op ic, + compiler_struct *cglobs) { + Ventry *v = (Ventry *)arg; PInstr *q; Int Needed[MaxTemps]; Int r, target1, target2; @@ -2710,13 +2619,12 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) Int vadr; Int vreg; - cglobs->vadr = vadr = (v->NoOfVE); cglobs->vreg = vreg = vadr & MaskVarAdrs; if (v->KindOfVE == PermVar || v->KindOfVE == VoidVar) return 0; if (v->RCountOfVE == 1) - return 0; + return 0; if (vreg) { --cglobs->Uses[vreg]; return 1; @@ -2724,8 +2632,9 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) /* follow the life of the variable */ q = cglobs->cint.cpc; /* - * for(r=0; rMaxCTemps; ++r) Needed[r] = cglobs->Uses[r]; might be written - * as: + * for(r=0; rMaxCTemps; ++r) Needed[r] = cglobs->Uses[r]; might be + * written + * as: */ np = Needed; rp = cglobs->Uses; @@ -2734,32 +2643,32 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) if (rn > 0 && (ic == get_var_op || ic == put_var_op)) { if (ic == put_var_op) Needed[rn] = 1; - target1 = rn; /* try to leave it where it is */ - } - else + target1 = rn; /* try to leave it where it is */ + } else target1 = cglobs->MaxCTemps; target2 = cglobs->MaxCTemps; n = v->RCountOfVE - 1; while (q != v->LastOpForV && (q = q->nextInst) != NIL) { - if (q->rnd2 <= 0); /* don't try to reuse REGISTER 0 */ + if (q->rnd2 <= 0) + ; /* don't try to reuse REGISTER 0 */ else if ((usesvar(ic = q->op) && arg == q->rnd1) || - (ic == bccall_op && arg == q->rnd3)/*uses_this_var(q, arg)*/) { + (ic == bccall_op && arg == q->rnd3) /*uses_this_var(q, arg)*/) { ic = q->op; --n; if (ic == put_val_op) { - if (target1 == cglobs->MaxCTemps && Needed[q->rnd2] == 0) - target1 = q->rnd2; - else if (target1 != (r = q->rnd2)) { - if (target2 == cglobs->MaxCTemps && Needed[r] == 0) - target2 = r; - else if (target2 > r && cglobs->Uses[r] == 0 && Needed[r] == 0) - target2 = r; - } + if (target1 == cglobs->MaxCTemps && Needed[q->rnd2] == 0) + target1 = q->rnd2; + else if (target1 != (r = q->rnd2)) { + if (target2 == cglobs->MaxCTemps && Needed[r] == 0) + target2 = r; + else if (target2 > r && cglobs->Uses[r] == 0 && Needed[r] == 0) + target2 = r; + } } } #ifdef SFUNC - else if ((ic >= get_var_op && ic <= put_unsafe_op) - || ic == get_s_f_op || ic == put_s_f_op) + else if ((ic >= get_var_op && ic <= put_unsafe_op) || ic == get_s_f_op || + ic == put_s_f_op) Needed[q->rnd2] = 1; #else else if (ic >= get_var_op && ic <= put_unsafe_op) @@ -2774,17 +2683,18 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) target1 = r; } if (target1 == cglobs->MaxCTemps || cglobs->Uses[target1] || Needed[target1]) - if ((target1 = target2) == cglobs->MaxCTemps || cglobs->Uses[target1] || Needed[target1]) { + if ((target1 = target2) == cglobs->MaxCTemps || cglobs->Uses[target1] || + Needed[target1]) { target1 = cglobs->MaxCTemps; do - --target1; + --target1; while (target1 && cglobs->Uses[target1] == 0 && Needed[target1] == 0); ++target1; } if (target1 == cglobs->MaxCTemps) { CACHE_REGS LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; + LOCAL_ErrorMessage = "too many temporaries"; save_machine_regs(); siglongjmp(cglobs->cint.CompilerBotch, COMPILER_ERR_BOTCH); @@ -2793,8 +2703,9 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) v->KindOfVE = TempVar; cglobs->Uses[cglobs->vreg = vreg = target1] = v->RCountOfVE - 1; /* - * for(r=0; rMaxCTemps; ++r) if(cglobs->Contents[r]==vadr) cglobs->Contents[r] = - * NIL; + * for(r=0; rMaxCTemps; ++r) if(cglobs->Contents[r]==vadr) + * cglobs->Contents[r] = + * NIL; */ cp = cglobs->Contents; for (r = 0; r < cglobs->MaxCTemps; ++r) @@ -2804,16 +2715,15 @@ checktemp(Int arg, Int rn, compiler_vm_op ic, compiler_struct *cglobs) return 1; } -static Int -checkreg(Int arg, Int rn, compiler_vm_op ic, int var_arg, compiler_struct *cglobs) -{ +static Int checkreg(Int arg, Int rn, compiler_vm_op ic, int var_arg, + compiler_struct *cglobs) { PInstr *p = cglobs->cint.cpc; Int vreg; if (rn >= 0) return rn; if (var_arg) { - Ventry *v = (Ventry *) arg; + Ventry *v = (Ventry *)arg; vreg = (v->NoOfVE) & MaskVarAdrs; if (v->KindOfVE == PermVar) @@ -2826,7 +2736,7 @@ checkreg(Int arg, Int rn, compiler_vm_op ic, int var_arg, compiler_struct *cglob if (!vreg) { vreg = 1; while (cglobs->Uses[vreg] != 0) { - ++vreg; + ++vreg; } cglobs->Uses[vreg] = v->RCountOfVE; } @@ -2840,7 +2750,8 @@ checkreg(Int arg, Int rn, compiler_vm_op ic, int var_arg, compiler_struct *cglob if (p->op >= get_var_op && p->op <= put_unsafe_op && p->rnd2 == rn) p->rnd2 = vreg; /* only copy variables until you reach a call */ - if (p->op == procceed_op || p->op == call_op || p->op == push_or_op || p->op == pushpop_or_op) + if (p->op == procceed_op || p->op == call_op || p->op == push_or_op || + p->op == pushpop_or_op) break; p = p->nextInst; } @@ -2848,32 +2759,28 @@ checkreg(Int arg, Int rn, compiler_vm_op ic, int var_arg, compiler_struct *cglob } /* Create a bitmap with all live variables */ -static CELL -copy_live_temps_bmap(int max, compiler_struct *cglobs) -{ - unsigned int size = AdjustSize((max|7)/8+1); +static CELL copy_live_temps_bmap(int max, compiler_struct *cglobs) { + unsigned int size = AdjustSize((max | 7) / 8 + 1); int i; CELL *dest = Yap_emit_extra_size(mark_live_regs_op, max, size, &cglobs->cint); - CELL *ptr=dest; + CELL *ptr = dest; *ptr = 0L; - for (i=1; i <= max; i++) { + for (i = 1; i <= max; i++) { /* move to next cell */ - if (i%(8*CellSize) == 0) { + if (i % (8 * CellSize) == 0) { ptr++; *ptr = 0L; } /* set the register live bit */ if (cglobs->Contents[i]) { - int j = i%(8*CellSize); - *ptr |= (1<BodyStart->nextInst; register Ventry *v = cglobs->vtable; @@ -2894,11 +2801,11 @@ c_layout(compiler_struct *cglobs) if (!cglobs->is_a_fact) { while (v != NIL) { if (v->FlagsOfVE & BranchVar) { - v->AgeOfVE = v->FirstOfVE + 1; /* force permanent */ - ++(v->RCountOfVE); - Yap_emit(put_var_op, (CELL) v, Zero, &cglobs->cint); - v->FlagsOfVE &= ~GlobalVal; - v->FirstOpForV = cglobs->cint.cpc; + v->AgeOfVE = v->FirstOfVE + 1; /* force permanent */ + ++(v->RCountOfVE); + Yap_emit(put_var_op, (CELL)v, Zero, &cglobs->cint); + v->FlagsOfVE &= ~GlobalVal; + v->FirstOpForV = cglobs->cint.cpc; } v = v->NextOfVE; } @@ -2917,18 +2824,18 @@ c_layout(compiler_struct *cglobs) CheckUnsafe(cglobs->cint.CodeStart, cglobs); #ifdef DEBUG if (cglobs->pbvars != LOCAL_nperm) { - CACHE_REGS - LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; - LOCAL_Error_Term = TermNil; - LOCAL_ErrorMessage = "wrong number of variables found in bitmap"; - save_machine_regs(); - siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); - } + CACHE_REGS + LOCAL_Error_TYPE = SYSTEM_ERROR_COMPILER; + LOCAL_ErrorMessage = "wrong number of variables found in bitmap"; + save_machine_regs(); + siglongjmp(cglobs->cint.CompilerBotch, OUT_OF_HEAP_BOTCH); + } #endif } } - cglobs->MaxCTemps = cglobs->nvars + cglobs->max_args - cglobs->tmpreg + cglobs->n_common_exps + 2; + cglobs->MaxCTemps = cglobs->nvars + cglobs->max_args - cglobs->tmpreg + + cglobs->n_common_exps + 2; if (cglobs->MaxCTemps >= MaxTemps) cglobs->MaxCTemps = MaxTemps; { @@ -2951,7 +2858,7 @@ c_layout(compiler_struct *cglobs) switch (ic) { case pop_or_op: if (needs_either) - needs_either--; + needs_either--; case either_op: needs_either++; break; @@ -2962,67 +2869,68 @@ c_layout(compiler_struct *cglobs) break; #else case cut_op: - case cutexit_op: - { - int i, max; + case cutexit_op: { + int i, max; - max = 0; - for (i = 1; i < cglobs->MaxCTemps; ++i) { - if (cglobs->Contents[i]) max = i; - } - cglobs->cint.cpc->ops.opseqt[1] = max; + max = 0; + for (i = 1; i < cglobs->MaxCTemps; ++i) { + if (cglobs->Contents[i]) + max = i; } - break; + cglobs->cint.cpc->ops.opseqt[1] = max; + } break; #endif /* TABLING_INNER_CUTS */ case allocate_op: case deallocate_op: if (!cglobs->needs_env) { - cglobs->cint.cpc->op = nop_op; + cglobs->cint.cpc->op = nop_op; } else { #ifdef TABLING - PELOCK(51,cglobs->cint.CurrentPred); - if (is_tabled(cglobs->cint.CurrentPred)) - cglobs->cint.cpc->op = nop_op; - else + PELOCK(51, cglobs->cint.CurrentPred); + if (is_tabled(cglobs->cint.CurrentPred)) + cglobs->cint.cpc->op = nop_op; + else #endif /* TABLING */ - if (cglobs->goalno == 1 && !cglobs->or_found && LOCAL_nperm == 0) - cglobs->cint.cpc->op = nop_op; + if (cglobs->goalno == 1 && !cglobs->or_found && LOCAL_nperm == 0) + cglobs->cint.cpc->op = nop_op; #ifdef TABLING - UNLOCK(cglobs->cint.CurrentPred->PELock); + UNLOCK(cglobs->cint.CurrentPred->PELock); #endif } break; case pop_op: ic = (cglobs->cint.cpc->nextInst)->op; if (ic >= get_var_op && ic <= put_unsafe_op) - cglobs->cint.cpc->op = nop_op; + cglobs->cint.cpc->op = nop_op; break; case get_var_op: --cglobs->Uses[rn]; if (checktemp(arg, rn, ic, cglobs)) { #ifdef BEAM - if (cglobs->vreg == rn && !EAM) + if (cglobs->vreg == rn && !EAM) #else - if (cglobs->vreg == rn) + if (cglobs->vreg == rn) #endif - cglobs->cint.cpc->op = nop_op; + cglobs->cint.cpc->op = nop_op; } if (!cglobs->Uses[rn]) - cglobs->Contents[rn] = cglobs->vadr; + cglobs->Contents[rn] = cglobs->vadr; break; case get_val_op: --cglobs->Uses[rn]; checktemp(arg, rn, ic, cglobs); if (!cglobs->Uses[rn]) - cglobs->Contents[rn] = cglobs->vadr; + cglobs->Contents[rn] = cglobs->vadr; break; case f_0_op: - if (rn_to_kill[0]) --cglobs->Uses[rn_to_kill[0]]; - rn_to_kill[1]=rn_to_kill[0]=0; + if (rn_to_kill[0]) + --cglobs->Uses[rn_to_kill[0]]; + rn_to_kill[1] = rn_to_kill[0] = 0; break; case f_var_op: - if (rn_to_kill[0]) --cglobs->Uses[rn_to_kill[0]]; - rn_to_kill[1]=rn_to_kill[0]=0; + if (rn_to_kill[0]) + --cglobs->Uses[rn_to_kill[0]]; + rn_to_kill[1] = rn_to_kill[0] = 0; case unify_var_op: case unify_val_op: case unify_last_var_op: @@ -3046,16 +2954,16 @@ c_layout(compiler_struct *cglobs) case get_bigint_op: --cglobs->Uses[rn]; /* This is not safe if we are in the middle of a disjunction and there - is something ahead. + is something ahead. */ if (!cglobs->Uses[rn]) - cglobs->Contents[rn] = arg; + cglobs->Contents[rn] = arg; break; case get_list_op: case get_struct_op: --cglobs->Uses[rn]; if (!cglobs->Uses[rn]) - cglobs->Contents[rn] = NIL; + cglobs->Contents[rn] = NIL; break; case put_var_op: case put_unsafe_op: @@ -3072,38 +2980,36 @@ c_layout(compiler_struct *cglobs) #else if (rn && cglobs->Contents[rn] == (Term)cglobs->vadr) #endif - { - cglobs->cint.cpc->op = nop_op; - } + { + cglobs->cint.cpc->op = nop_op; + } cglobs->Contents[rn] = cglobs->vadr; ++cglobs->Uses[rn]; if (rn_kills) { - rn_kills--; - rn_to_kill[rn_kills]=rn; + rn_kills--; + rn_to_kill[rn_kills] = rn; } break; case fetch_args_cv_op: case fetch_args_vc_op: case fetch_args_iv_op: case fetch_args_vi_op: - rn_to_kill[1]=rn_to_kill[0]=0; + rn_to_kill[1] = rn_to_kill[0] = 0; if (cglobs->cint.cpc->nextInst && - cglobs->cint.cpc->nextInst->op == put_val_op && - cglobs->cint.cpc->nextInst->nextInst && - (cglobs->cint.cpc->nextInst->nextInst->op == f_var_op || - cglobs->cint.cpc->nextInst->nextInst->op == f_0_op) ) - rn_kills = 1; + cglobs->cint.cpc->nextInst->op == put_val_op && + cglobs->cint.cpc->nextInst->nextInst && + (cglobs->cint.cpc->nextInst->nextInst->op == f_var_op || + cglobs->cint.cpc->nextInst->nextInst->op == f_0_op)) + rn_kills = 1; break; case f_val_op: #ifdef SFUNC - case write_s_var_op: - { - Ventry *ve = (Ventry *) arg; + case write_s_var_op: { + Ventry *ve = (Ventry *)arg; - if ((ve->FlagsOfVE & PermFlag) == 0 && ve->RCountOfVE <= 1) - cglobs->cint.cpc->op = nop_op; - } - break; + if ((ve->FlagsOfVE & PermFlag) == 0 && ve->RCountOfVE <= 1) + cglobs->cint.cpc->op = nop_op; + } break; case write_s_val_op: #endif case write_var_op: @@ -3125,7 +3031,7 @@ c_layout(compiler_struct *cglobs) case put_bigint_op: rn = checkreg(arg, rn, ic, FALSE, cglobs); if (cglobs->Contents[rn] == arg) - cglobs->cint.cpc->op = nop_op; + cglobs->cint.cpc->op = nop_op; cglobs->Contents[rn] = arg; ++cglobs->Uses[rn]; break; @@ -3140,87 +3046,84 @@ c_layout(compiler_struct *cglobs) cglobs->cut_mark->op = clause_with_cut_op; #endif /* TABLING_INNER_CUTS */ case save_b_op: - case patch_b_op: + case patch_b_op: case save_appl_op: case save_pair_op: checktemp(arg, rn, ic, cglobs); break; case safe_call_op: /* - vsc: The variables will be in use after this!!!! - { - UInt Arity = RepPredProp((Prop) arg)->ArityOfPE; - for (rn = 1; rn <= Arity; ++rn) - --cglobs->Uses[rn]; - } + vsc: The variables will be in use after this!!!! + { + UInt Arity = RepPredProp((Prop) arg)->ArityOfPE; + for (rn = 1; rn <= Arity; ++rn) + --cglobs->Uses[rn]; + } */ break; case call_op: case orelse_op: - case orlast_op: - { - up = cglobs->Uses; - cop = cglobs->Contents; - for (rn = 1; rn < cglobs->MaxCTemps; ++rn) { - *up++ = *cop++ = NIL; - } + case orlast_op: { + up = cglobs->Uses; + cop = cglobs->Contents; + for (rn = 1; rn < cglobs->MaxCTemps; ++rn) { + *up++ = *cop++ = NIL; } - break; - case label_op: - { - up = cglobs->Uses; - cop = cglobs->Contents; - for (rn = 0; rn < cglobs->MaxCTemps; ++rn) { - if (*cop != (TempVar | rn)) { - *up++ = *cop++ = NIL; - } else { - up++; - cop++; - } - } + } break; + case label_op: { + up = cglobs->Uses; + cop = cglobs->Contents; + for (rn = 0; rn < cglobs->MaxCTemps; ++rn) { + if (*cop != (TempVar | rn)) { + *up++ = *cop++ = NIL; + } else { + up++; + cop++; + } } - break; + } break; case restore_tmps_and_skip_op: case restore_tmps_op: /* - This instruction is required by the garbage collector to find out - how many temporaries are live right now. It is also useful when - waking up goals before an either or ! instruction. + This instruction is required by the garbage collector to find out + how many temporaries are live right now. It is also useful when + waking up goals before an either or ! instruction. */ { - PInstr *mycpc = cglobs->cint.cpc, *oldCodeStart = cglobs->cint.CodeStart; - int i, max; + PInstr *mycpc = cglobs->cint.cpc, + *oldCodeStart = cglobs->cint.CodeStart; + int i, max; - /* instructions must be placed at BlobsStart */ - cglobs->cint.CodeStart = cglobs->cint.BlobsStart; - cglobs->cint.cpc = cglobs->cint.icpc; - max = 0; - for (i = 1; i < cglobs->MaxCTemps; ++i) { - if (cglobs->Contents[i]) max = i; - } - Yap_emit(label_op, ++cglobs->labelno, Zero, &cglobs->cint); - mycpc->rnd1 = cglobs->labelno; - rn = copy_live_temps_bmap(max, cglobs); - cglobs->cint.icpc = cglobs->cint.cpc; - cglobs->cint.BlobsStart = cglobs->cint.CodeStart; - cglobs->cint.cpc = mycpc; - cglobs->cint.CodeStart = oldCodeStart; + /* instructions must be placed at BlobsStart */ + cglobs->cint.CodeStart = cglobs->cint.BlobsStart; + cglobs->cint.cpc = cglobs->cint.icpc; + max = 0; + for (i = 1; i < cglobs->MaxCTemps; ++i) { + if (cglobs->Contents[i]) + max = i; + } + Yap_emit(label_op, ++cglobs->labelno, Zero, &cglobs->cint); + mycpc->rnd1 = cglobs->labelno; + rn = copy_live_temps_bmap(max, cglobs); + cglobs->cint.icpc = cglobs->cint.cpc; + cglobs->cint.BlobsStart = cglobs->cint.CodeStart; + cglobs->cint.cpc = mycpc; + cglobs->cint.CodeStart = oldCodeStart; } default: break; } if (cglobs->cint.cpc->nextInst) cglobs->cint.cpc = cglobs->cint.cpc->nextInst; - else return; + else + return; } } -static void -push_allocate(PInstr *pc, PInstr *oldpc) -{ +static void push_allocate(PInstr *pc, PInstr *oldpc) { /* The idea is to push an allocate forward as much as we can. This - delays work in the emulated code, and in the best case we may get rid of + delays work in the emulated code, and in the best case we may get rid of allocates altogether. */ /* we can push the allocate */ @@ -3228,7 +3131,7 @@ push_allocate(PInstr *pc, PInstr *oldpc) PInstr *initial = oldpc, *dealloc_founds[16]; int d_founds = 0; int level = 0; - + while (pc) { switch (pc->op) { case jump_op: @@ -3236,20 +3139,21 @@ push_allocate(PInstr *pc, PInstr *oldpc) case call_op: case safe_call_op: if (!safe) - return; + return; else { - PInstr *where = initial->nextInst->nextInst; - while (d_founds) - dealloc_founds[--d_founds]->op = nop_op; - if (where == pc || oldpc == initial->nextInst) - return; - oldpc->nextInst = initial->nextInst; - initial->nextInst->nextInst = pc; - initial->nextInst = where; - return; + PInstr *where = initial->nextInst->nextInst; + while (d_founds) + dealloc_founds[--d_founds]->op = nop_op; + if (where == pc || oldpc == initial->nextInst) + return; + oldpc->nextInst = initial->nextInst; + initial->nextInst->nextInst = pc; + initial->nextInst = where; + return; } case push_or_op: - /* we cannot just put an allocate here, because it may never be executed */ + /* we cannot just put an allocate here, because it may never be executed + */ level++; safe = FALSE; break; @@ -3257,7 +3161,7 @@ push_allocate(PInstr *pc, PInstr *oldpc) /* last branch and we did not need an allocate so far, cool! */ level--; if (!level) - safe = TRUE; + safe = TRUE; break; case cut_op: case either_op: @@ -3266,7 +3170,7 @@ push_allocate(PInstr *pc, PInstr *oldpc) case deallocate_op: dealloc_founds[d_founds++] = pc; if (d_founds == 16) - return; + return; default: break; } @@ -3275,11 +3179,7 @@ push_allocate(PInstr *pc, PInstr *oldpc) } } - - -static void -c_optimize(PInstr *pc) -{ +static void c_optimize(PInstr *pc) { char onTail; Ventry *v; PInstr *opc = NULL; @@ -3304,55 +3204,51 @@ c_optimize(PInstr *pc) case get_var_op: /* handle clumsy either branches */ if (npc->op == f_0_op) { - npc->rnd1 = pc->rnd1; - npc->op = f_var_op; - pc->op = nop_op; - break; + npc->rnd1 = pc->rnd1; + npc->op = f_var_op; + pc->op = nop_op; + break; } case put_val_op: - case get_val_op: - { - Ventry *ve = (Ventry *) pc->rnd1; + case get_val_op: { + Ventry *ve = (Ventry *)pc->rnd1; - if (ve->KindOfVE == TempVar) { - UInt argno = ve->NoOfVE & MaskVarAdrs; - if (argno && argno == pc->rnd2) { - pc->op = nop_op; - } - } + if (ve->KindOfVE == TempVar) { + UInt argno = ve->NoOfVE & MaskVarAdrs; + if (argno && argno == pc->rnd2) { + pc->op = nop_op; + } } + } onTail = 1; break; - case save_pair_op: - { - Term ve = (Term) pc->rnd1; - PInstr *npc = pc->nextInst; + case save_pair_op: { + Term ve = (Term)pc->rnd1; + PInstr *npc = pc->nextInst; - if (((Ventry *) ve)->RCountOfVE <= 1) - pc->op = nop_op; - else { - *pc = *npc; - pc->nextInst = npc; - npc->op = save_pair_op; - npc->rnd1 = (CELL) ve; - } - } - break; - case save_appl_op: - { - Term ve = (Term) pc->rnd1; - PInstr *npc = pc->nextInst; - - if (((Ventry *) ve)->RCountOfVE <= 1) - pc->op = nop_op; - else { - *pc = *npc; - pc->nextInst = npc; - npc->op = save_appl_op; - npc->rnd1 = (CELL) ve; - } - break; + if (((Ventry *)ve)->RCountOfVE <= 1) + pc->op = nop_op; + else { + *pc = *npc; + pc->nextInst = npc; + npc->op = save_pair_op; + npc->rnd1 = (CELL)ve; } + } break; + case save_appl_op: { + Term ve = (Term)pc->rnd1; + PInstr *npc = pc->nextInst; + + if (((Ventry *)ve)->RCountOfVE <= 1) + pc->op = nop_op; + else { + *pc = *npc; + pc->nextInst = npc; + npc->op = save_appl_op; + npc->rnd1 = (CELL)ve; + } + break; + } case nop_op: break; case unify_var_op: @@ -3364,49 +3260,47 @@ c_optimize(PInstr *pc) * finish the structure for the last instructions to * work correctly. Instead, we will use unify_void * with very little overhead */ - v = (Ventry *) (pc->rnd1); + v = (Ventry *)(pc->rnd1); if (v->KindOfVE == VoidVar && onTail) { pc->op = nop_op; - } - else -#endif /* OLD_SYSTEM */ - onTail = 0; + } else +#endif /* OLD_SYSTEM */ + onTail = 0; break; case unify_val_op: - v = (Ventry *) (pc->rnd1); + v = (Ventry *)(pc->rnd1); if (!(v->FlagsOfVE & GlobalVal)) - pc->op = unify_local_op; + pc->op = unify_local_op; onTail = 0; break; case unify_last_val_op: - v = (Ventry *) (pc->rnd1); + v = (Ventry *)(pc->rnd1); if (!(v->FlagsOfVE & GlobalVal)) - pc->op = unify_last_local_op; + pc->op = unify_last_local_op; onTail = 0; break; case write_val_op: - v = (Ventry *) (pc->rnd1); + v = (Ventry *)(pc->rnd1); if (!(v->FlagsOfVE & GlobalVal)) - pc->op = write_local_op; + pc->op = write_local_op; onTail = 0; break; case pop_op: if (FALSE && onTail == 1) { - pc->op = nop_op; - onTail = 1; - break; - } - else { - PInstr *p = pc->nextInst; + pc->op = nop_op; + onTail = 1; + break; + } else { + PInstr *p = pc->nextInst; - while (p != NIL && p->op == nop_op) - p = p->nextInst; - if (p != NIL && p->op == pop_op) { - pc->rnd1 += p->rnd1; - pc->nextInst = p->nextInst; - } - onTail = 2; - break; + while (p != NIL && p->op == nop_op) + p = p->nextInst; + if (p != NIL && p->op == pop_op) { + pc->rnd1 += p->rnd1; + pc->nextInst = p->nextInst; + } + onTail = 2; + break; } case write_var_op: case unify_atom_op: @@ -3455,15 +3349,15 @@ c_optimize(PInstr *pc) if (pc->op == allocate_op) { push_allocate(pc, opc); break; - } + } opc = pc; pc = pc->nextInst; } } -yamop * -Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) -{ /* compile a prolog clause, copy of clause myst be in ARG1 */ +yamop *Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, + volatile Term src) { /* compile a prolog clause, copy of + clause myst be in ARG1 */ CACHE_REGS /* returns address of code for clause */ Term head, body; @@ -3473,13 +3367,14 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) volatile int maxvnum = 512; int botch_why; /* may botch while doing a different module */ - /* first, initialize cglobs->cint.CompilerBotch to handle all cases of interruptions */ + /* first, initialize cglobs->cint.CompilerBotch to handle all cases of + * interruptions */ compiler_struct cglobs; - - #ifdef TABLING_INNER_CUTS + +#ifdef TABLING_INNER_CUTS PInstr cglobs_cut_mark; cglobs.cut_mark = &cglobs_cut_mark; - #endif /* TABLING_INNER_CUTS */ +#endif /* TABLING_INNER_CUTS */ /* make sure we know there was no error yet */ LOCAL_ErrorMessage = NULL; @@ -3487,28 +3382,26 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) restore_machine_regs(); reset_vars(cglobs.vtable); Yap_ReleaseCMem(&cglobs.cint); - switch(botch_why) { + switch (botch_why) { case OUT_OF_STACK_BOTCH: /* out of local stack, just duplicate the stack */ { - Int osize = 2*sizeof(CELL)*(ASP-HR); - ARG1 = inp_clause; - ARG3 = src; + Int osize = 2 * sizeof(CELL) * (ASP - HR); + ARG1 = inp_clause; + ARG3 = src; - YAPLeaveCriticalSection(); - if (!Yap_gcl(LOCAL_Error_Size, NOfArgs, ENV, gc_P(P,CP))) { - LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; - LOCAL_Error_Term = inp_clause; - } - if (osize > ASP-HR) { - if (!Yap_growstack(2*sizeof(CELL)*(ASP-HR))) { - LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; - LOCAL_Error_Term = inp_clause; - } - } - YAPEnterCriticalSection(); - src = ARG3; - inp_clause = ARG1; + YAPLeaveCriticalSection(); + if (!Yap_gcl(LOCAL_Error_Size, NOfArgs, ENV, gc_P(P, CP))) { + LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; + } + if (osize > ASP - HR) { + if (!Yap_growstack(2 * sizeof(CELL) * (ASP - HR))) { + LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; + } + } + YAPEnterCriticalSection(); + src = ARG3; + inp_clause = ARG1; } break; case OUT_OF_AUX_BOTCH: @@ -3517,8 +3410,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) ARG1 = inp_clause; ARG3 = src; if (!Yap_ExpandPreAllocCodeSpace(LOCAL_Error_Size, NULL, TRUE)) { - LOCAL_Error_TYPE = RESOURCE_ERROR_AUXILIARY_STACK; - LOCAL_Error_Term = inp_clause; + LOCAL_Error_TYPE = RESOURCE_ERROR_AUXILIARY_STACK; } YAPEnterCriticalSection(); src = ARG3; @@ -3526,10 +3418,10 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) break; case OUT_OF_TEMPS_BOTCH: /* out of temporary cells */ - if (maxvnum < 16*1024) { - maxvnum *= 2; + if (maxvnum < 16 * 1024) { + maxvnum *= 2; } else { - maxvnum += 4096; + maxvnum += 4096; } break; case OUT_OF_HEAP_BOTCH: @@ -3538,9 +3430,8 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) ARG3 = src; YAPLeaveCriticalSection(); if (!Yap_growheap(FALSE, LOCAL_Error_Size, NULL)) { - LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; - LOCAL_Error_Term = inp_clause; - return NULL; + LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; + return NULL; } YAPEnterCriticalSection(); src = ARG3; @@ -3551,10 +3442,9 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) ARG1 = inp_clause; ARG3 = src; YAPLeaveCriticalSection(); - if (!Yap_growtrail(LOCAL_TrailTop-(ADDR)TR, FALSE)) { - LOCAL_Error_TYPE = RESOURCE_ERROR_TRAIL; - LOCAL_Error_Term = inp_clause; - return NULL; + if (!Yap_growtrail(LOCAL_TrailTop - (ADDR)TR, FALSE)) { + LOCAL_Error_TYPE = RESOURCE_ERROR_TRAIL; + return NULL; } YAPEnterCriticalSection(); src = ARG3; @@ -3570,24 +3460,25 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) LOCAL_Error_Size = 0; LOCAL_Error_TYPE = YAP_NO_ERROR; /* initialize variables for code generation */ - + cglobs.cint.CodeStart = cglobs.cint.cpc = NULL; cglobs.cint.BlobsStart = cglobs.cint.icpc = NULL; cglobs.cint.dbterml = NULL; cglobs.cint.blks = NULL; cglobs.cint.label_offset = NULL; - cglobs.cint.freep = - cglobs.cint.freep0 = - (char *) (HR + maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps+MaxTemps); + cglobs.cint.freep = cglobs.cint.freep0 = + (char *)(HR + maxvnum + (sizeof(Int) / sizeof(CELL)) * MaxTemps + + MaxTemps); cglobs.cint.success_handler = 0L; - if (ASP <= CellPtr (cglobs.cint.freep) + 256) { + if (ASP <= CellPtr(cglobs.cint.freep) + 256) { cglobs.vtable = NULL; - LOCAL_Error_Size = (256+maxvnum)*sizeof(CELL); + LOCAL_Error_Size = (256 + maxvnum) * sizeof(CELL); save_machine_regs(); - siglongjmp(cglobs.cint.CompilerBotch,3); + siglongjmp(cglobs.cint.CompilerBotch, 3); } - cglobs.Uses = (Int *)(HR+maxvnum); - cglobs.Contents = (Term *)(HR+maxvnum+(sizeof(Int)/sizeof(CELL))*MaxTemps); + cglobs.Uses = (Int *)(HR + maxvnum); + cglobs.Contents = + (Term *)(HR + maxvnum + (sizeof(Int) / sizeof(CELL)) * MaxTemps); cglobs.curbranch = cglobs.onbranch = 0; cglobs.branch_pointer = cglobs.parent_branches; cglobs.or_found = FALSE; @@ -3597,7 +3488,7 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) cglobs.needs_env = FALSE; /* * 2000 added to H in case we need to construct call(G) when G is a - * variable used as a goal + * variable used as a goal */ cglobs.vtable = NULL; cglobs.common_exps = NULL; @@ -3607,39 +3498,40 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) cglobs.hasdbrefs = FALSE; if (IsVarTerm(my_clause)) { LOCAL_Error_TYPE = INSTANTIATION_ERROR; - LOCAL_Error_Term = my_clause; LOCAL_ErrorMessage = "in compiling clause"; return 0; } if (IsApplTerm(my_clause) && FunctorOfTerm(my_clause) == FunctorAssert) { head = ArgOfTerm(1, my_clause); body = ArgOfTerm(2, my_clause); - } - else { + } else { head = my_clause, body = MkAtomTerm(AtomTrue); } - if (IsVarTerm(head) || IsPairTerm(head) || IsIntTerm(head) || IsFloatTerm(head) || IsRefTerm(head)) { + if (IsVarTerm(head) || IsPairTerm(head) || IsIntTerm(head) || + IsFloatTerm(head) || IsRefTerm(head)) { LOCAL_Error_TYPE = TYPE_ERROR_CALLABLE; - LOCAL_Error_Term = head; LOCAL_ErrorMessage = "clause head should be atom or compound term"; return (0); } else { - + /* find out which predicate we are compiling for */ if (IsAtomTerm(head)) { Atom ap = AtomOfTerm(head); cglobs.cint.CurrentPred = RepPredProp(PredPropByAtom(ap, mod)); } else { - cglobs.cint.CurrentPred = RepPredProp(PredPropByFunc(FunctorOfTerm(head),mod)); + cglobs.cint.CurrentPred = + RepPredProp(PredPropByFunc(FunctorOfTerm(head), mod)); } /* insert extra instructions to count calls */ - PELOCK(52,cglobs.cint.CurrentPred); + PELOCK(52, cglobs.cint.CurrentPred); if ((cglobs.cint.CurrentPred->PredFlags & ProfiledPredFlag) || - (PROFILING && (cglobs.cint.CurrentPred->cs.p_code.FirstClause == NIL))) { + (PROFILING && + (cglobs.cint.CurrentPred->cs.p_code.FirstClause == NIL))) { profiling = TRUE; call_counting = FALSE; } else if ((cglobs.cint.CurrentPred->PredFlags & CountPredFlag) || - (CALL_COUNTING && (cglobs.cint.CurrentPred->cs.p_code.FirstClause == NIL))) { + (CALL_COUNTING && + (cglobs.cint.CurrentPred->cs.p_code.FirstClause == NIL))) { call_counting = TRUE; profiling = FALSE; } else { @@ -3655,9 +3547,10 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) if (cglobs.is_a_fact && !cglobs.vtable) { #ifdef TABLING - PELOCK(53,cglobs.cint.CurrentPred); + PELOCK(53, cglobs.cint.CurrentPred); if (is_tabled(cglobs.cint.CurrentPred)) - Yap_emit(table_new_answer_op, Zero, cglobs.cint.CurrentPred->ArityOfPE, &cglobs.cint); + Yap_emit(table_new_answer_op, Zero, cglobs.cint.CurrentPred->ArityOfPE, + &cglobs.cint); else #endif /* TABLING */ Yap_emit(procceed_op, Zero, Zero, &cglobs.cint); @@ -3687,11 +3580,12 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) Yap_emit(allocate_op, Zero, Zero, &cglobs.cint); #ifdef BEAM - if (EAM) Yap_emit(body_op, Zero, Zero, &cglobs.cint); + if (EAM) + Yap_emit(body_op, Zero, Zero, &cglobs.cint); #endif c_body(body, mod, &cglobs); - /* Insert blobs at the very end */ + /* Insert blobs at the very end */ if (cglobs.space_op) cglobs.space_op->rnd1 = cglobs.space_used; @@ -3714,12 +3608,12 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) #endif /* phase 2: classify variables and optimize temporaries */ c_layout(&cglobs); - /* Insert blobs at the very end */ + /* Insert blobs at the very end */ if (cglobs.cint.BlobsStart != NULL) { cglobs.cint.cpc->nextInst = cglobs.cint.BlobsStart; cglobs.cint.BlobsStart = NULL; while (cglobs.cint.cpc->nextInst != NULL) - cglobs.cint.cpc = cglobs.cint.cpc->nextInst; + cglobs.cint.cpc = cglobs.cint.cpc->nextInst; } } /* eliminate superfluous pop's and unify_var's */ @@ -3730,17 +3624,21 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) #endif #ifdef BEAM - { - void codigo_eam(compiler_struct *); - - if (EAM) codigo_eam(&cglobs); - } + { + void codigo_eam(compiler_struct *); + + if (EAM) + codigo_eam(&cglobs); + } #endif /* phase 3: assemble code */ - acode = Yap_assemble(ASSEMBLING_CLAUSE, src, cglobs.cint.CurrentPred, (cglobs.is_a_fact && !cglobs.hasdbrefs && !(cglobs.cint.CurrentPred->PredFlags & TabledPredFlag)), &cglobs.cint, cglobs.labelno+1); + acode = Yap_assemble(ASSEMBLING_CLAUSE, src, cglobs.cint.CurrentPred, + (cglobs.is_a_fact && !cglobs.hasdbrefs && + !(cglobs.cint.CurrentPred->PredFlags & TabledPredFlag)), + &cglobs.cint, cglobs.labelno + 1); /* check first if there was space for us */ - Yap_ReleaseCMem (&cglobs.cint); + Yap_ReleaseCMem(&cglobs.cint); if (acode == NULL) { return NULL; } else { @@ -3749,6 +3647,5 @@ Yap_cclause(volatile Term inp_clause, Int NOfArgs, Term mod, volatile Term src) } #ifdef BEAM - #include "toeam.c" +#include "toeam.c" #endif - diff --git a/C/dbase.c b/C/dbase.c index 8c944d905..195cf6d72 100644 --- a/C/dbase.c +++ b/C/dbase.c @@ -336,19 +336,18 @@ static int recover_from_record_error(int nargs) { goto recover_record; case RESOURCE_ERROR_HEAP: if (!Yap_growheap(FALSE, LOCAL_Error_Size, NULL)) { - Yap_Error(RESOURCE_ERROR_HEAP, LOCAL_Error_Term, LOCAL_ErrorMessage); + Yap_Error(RESOURCE_ERROR_HEAP, TermNil, LOCAL_ErrorMessage); return FALSE; } goto recover_record; case RESOURCE_ERROR_AUXILIARY_STACK: if (!Yap_ExpandPreAllocCodeSpace(LOCAL_Error_Size, NULL, TRUE)) { - Yap_Error(RESOURCE_ERROR_AUXILIARY_STACK, LOCAL_Error_Term, - LOCAL_ErrorMessage); + Yap_Error(RESOURCE_ERROR_AUXILIARY_STACK, TermNil, LOCAL_ErrorMessage); return FALSE; } goto recover_record; default: - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + Yap_Error(LOCAL_Error_TYPE, TermNil, LOCAL_ErrorMessage); return FALSE; } recover_record: @@ -1121,7 +1120,6 @@ static void sf_include(SFKeep *sfp, struct db_globs *dbg) SFKeep *sfp; j += 2; } else { LOCAL_Error_TYPE = TYPE_ERROR_DBTERM; - LOCAL_Error_Term = d0; LOCAL_ErrorMessage = "wrong term in SF"; return (NULL); } @@ -1242,7 +1240,6 @@ static DBRef generate_dberror_msg(int errnumb, UInt sz, char *msg) { CACHE_REGS LOCAL_Error_Size = sz; LOCAL_Error_TYPE = errnumb; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = msg; return NULL; } @@ -2611,7 +2608,6 @@ static int resize_int_keys(UInt new_size) { if (new == NULL) { YAPLeaveCriticalSection(); LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "could not allocate space"; return FALSE; } @@ -2693,7 +2689,6 @@ static PredEntry *new_lu_int_key(Int key) { if (INT_LU_KEYS == NULL) { CACHE_REGS LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "could not allocate space"; return NULL; } @@ -2825,7 +2820,6 @@ static DBProp FetchIntDBPropFromKey(Int key, int flag, int new, if (INT_KEYS == NULL) { CACHE_REGS LOCAL_Error_TYPE = RESOURCE_ERROR_HEAP; - LOCAL_Error_Term = TermNil; LOCAL_ErrorMessage = "could not allocate space"; return NULL; } diff --git a/C/errors.c b/C/errors.c index dba801a01..c1b52d23f 100755 --- a/C/errors.c +++ b/C/errors.c @@ -74,16 +74,17 @@ bool Yap_Warning(const char *s, ...) { return rc; } void Yap_InitError(yap_error_number e, Term t, const char *msg) { - if (LOCAL_ActiveError.status) { + if (LOCAL_ActiveError->status) { Yap_exit(1); } - LOCAL_ActiveError.errorNo = e; - LOCAL_ActiveError.errorFile = NULL; - LOCAL_ActiveError.errorFunction = NULL; - LOCAL_ActiveError.errorLine = 0; + LOCAL_ActiveError->errorNo = e; + LOCAL_ActiveError->errorFile = NULL; + LOCAL_ActiveError->errorFunction = NULL; + LOCAL_ActiveError->errorLine = 0; if (msg) { LOCAL_Error_Size = strlen(msg); - strcpy(LOCAL_ActiveError.errorComment, msg); + LOCAL_ActiveError->errorMsg = malloc(LOCAL_Error_Size + 1); + strcpy(LOCAL_ActiveError->errorMsg, msg); } else { LOCAL_Error_Size = 0; } @@ -158,7 +159,7 @@ bool Yap_HandleError__(const char *file, const char *function, int lineno, return false; } default: - Yap_Error__(file, function, lineno, err, LOCAL_Error_Term, serr); + Yap_Error__(file, function, lineno, err, TermNil, serr); return false; } } @@ -196,7 +197,7 @@ int Yap_SWIHandleError(const char *s, ...) { return FALSE; } default: - Yap_Error(err, LOCAL_Error_Term, serr); + Yap_Error(err, TermNil, serr); return (FALSE); } } @@ -266,8 +267,8 @@ static char tmpbuf[YAP_BUF_SIZE]; } #define END_ERROR_CLASSES() \ - } \ - return TermNil; \ + } \ + return TermNil; \ } #define BEGIN_ERRORS() \ @@ -292,11 +293,44 @@ static char tmpbuf[YAP_BUF_SIZE]; return mkerrorct(B, ts); #define END_ERRORS() \ - } return TermNil; \ + } \ + return TermNil; \ } #include "YapErrors.h" +void Yap_pushErrorContext(yap_error_descriptor_t *new_error) { + new_error->top_error = LOCAL_ActiveError; + LOCAL_ActiveError = new_error; +} + +yap_error_descriptor_t *Yap_popErrorContext(void) { + yap_error_descriptor_t *new_error = LOCAL_ActiveError; + LOCAL_ActiveError = LOCAL_ActiveError->top_error; + return new_error; +} + +void Yap_ThrowError__(const char *file, const char *function, int lineno, + yap_error_number type, Term where, ...) { + va_list ap; + char tmpbuf[MAXPATHLEN]; + + va_start(ap, where); + char *format = va_arg(ap, char *); + if (format != NULL) { +#if HAVE_VSNPRINTF + (void)vsnprintf(tmpbuf, MAXPATHLEN - 1, format, ap); +#else + (void)vsprintf(tnpbuf, format, ap); +#endif + // fprintf(stderr, "warning: "); + Yap_Error__(file, function, lineno, type, where, tmpbuf); + } else { + Yap_Error__(file, function, lineno, type, where); + } + siglongjmp(LOCAL_RestartEnv, 4); +} + /** * @brief Yap_Error * This function handles errors in the C code. Check errors.yap for the @@ -343,17 +377,17 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, /* disallow recursive error handling */ if (LOCAL_PrologMode & InErrorMode) { - fprintf(stderr, "%% ERROR WITHIN ERROR %d: %s\n", LOCAL_CurrentError, - tmpbuf); + fprintf(stderr, "%% ERROR WITHIN ERROR %d: %s\n", LOCAL_Error_TYPE, tmpbuf); Yap_RestartYap(1); } - LOCAL_ActiveError.errorNo = type; - LOCAL_ActiveError.errorAsText = Yap_LookupAtom(Yap_errorName( type )); - LOCAL_ActiveError.errorClass = Yap_errorClass( type); - LOCAL_ActiveError.classAsText = Yap_LookupAtom(Yap_errorClassName( LOCAL_ActiveError.errorClass )); - LOCAL_ActiveError.errorLine = lineno; - LOCAL_ActiveError.errorFunction = function; - LOCAL_ActiveError.errorFile = file; + LOCAL_ActiveError->errorNo = type; + LOCAL_ActiveError->errorAsText = Yap_LookupAtom(Yap_errorName(type)); + LOCAL_ActiveError->errorClass = Yap_errorClass(type); + LOCAL_ActiveError->classAsText = + Yap_LookupAtom(Yap_errorClassName(LOCAL_ActiveError->errorClass)); + LOCAL_ActiveError->errorLine = lineno; + LOCAL_ActiveError->errorFunction = function; + LOCAL_ActiveError->errorFile = file; Yap_find_prolog_culprit(PASS_REGS1); LOCAL_PrologMode |= InErrorMode; Yap_ClearExs(); @@ -380,7 +414,7 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, } if (LOCAL_within_print_message) { /* error within error */ - fprintf(stderr, "%% ERROR WITHIN WARNING %d: %s\n", LOCAL_CurrentError, + fprintf(stderr, "%% ERROR WITHIN WARNING %d: %s\n", LOCAL_Error_TYPE, tmpbuf); LOCAL_PrologMode &= ~InErrorMode; Yap_exit(1); @@ -395,8 +429,8 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, #endif // fprintf(stderr, "warning: "); comment = MkAtomTerm(Yap_LookupAtom(s)); - } else if (LOCAL_ErrorSay && LOCAL_ErrorSay[0]) { - comment = MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorSay)); + } else if (LOCAL_ErrorMessage && LOCAL_ErrorMessage[0]) { + comment = MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorMessage)); } else { comment = TermNil; } @@ -410,7 +444,6 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, if (type == ABORT_EVENT || LOCAL_PrologMode & BootMode) { where = TermNil; LOCAL_PrologMode &= ~AbortMode; - LOCAL_CurrentError = type; LOCAL_PrologMode &= ~InErrorMode; /* make sure failure will be seen at next port */ // no need to lock & unlock @@ -426,7 +459,6 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, } /* Exit Abort Mode, if we were there */ LOCAL_PrologMode &= ~AbortMode; - LOCAL_CurrentError = type; LOCAL_PrologMode |= InErrorMode; if (!(where = Yap_CopyTerm(where))) { where = TermNil; @@ -528,14 +560,10 @@ yamop *Yap_Error__(const char *file, const char *function, int lineno, /* This is used by some complex procedures to detect there was an error */ if (IsAtomTerm(nt[0])) { - strncpy(LOCAL_ErrorSay, (char *)RepAtom(AtomOfTerm(nt[0]))->StrOfAE, - MAX_ERROR_MSG_SIZE); - LOCAL_ErrorMessage = LOCAL_ErrorSay; + LOCAL_ErrorMessage = RepAtom(AtomOfTerm(nt[0]))->StrOfAE; } else { - strncpy(LOCAL_ErrorSay, - (char *)RepAtom(NameOfFunctor(FunctorOfTerm(nt[0])))->StrOfAE, - MAX_ERROR_MSG_SIZE); - LOCAL_ErrorMessage = LOCAL_ErrorSay; + LOCAL_ErrorMessage = + (char *)RepAtom(NameOfFunctor(FunctorOfTerm(nt[0])))->StrOfAE; } nt[1] = TermNil; switch (type) { diff --git a/C/eval.c b/C/eval.c index 4f7569f92..b4c08d13d 100644 --- a/C/eval.c +++ b/C/eval.c @@ -15,23 +15,22 @@ * * *************************************************************************/ #ifdef SCCS -static char SccsId[] = "%W% %G%"; +static char SccsId[] = "%W% %G%"; #endif //! @file eval.c -//! @{ +//! @{ /** @defgroup arithmetic_preds Arithmetic Predicates @ingroup arithmetic */ - - #include "Yap.h" -#include "Yatom.h" + #include "YapHeap.h" +#include "Yatom.h" #include "eval.h" #if HAVE_STDARG_H #include @@ -46,41 +45,39 @@ static char SccsId[] = "%W% %G%"; static Term Eval(Term t1 USES_REGS); -static Term -get_matrix_element(Term t1, Term t2 USES_REGS) -{ +static Term get_matrix_element(Term t1, Term t2 USES_REGS) { if (!IsPairTerm(t2)) { if (t2 == MkAtomTerm(AtomLength)) { Int sz = 1; while (IsApplTerm(t1)) { - Functor f = FunctorOfTerm(t1); - if (NameOfFunctor(f) != AtomNil) { - return MkIntegerTerm(sz); - } - sz *= ArityOfFunctor(f); - t1 = ArgOfTerm(1, t1); + Functor f = FunctorOfTerm(t1); + if (NameOfFunctor(f) != AtomNil) { + return MkIntegerTerm(sz); + } + sz *= ArityOfFunctor(f); + t1 = ArgOfTerm(1, t1); } return MkIntegerTerm(sz); } Yap_ArithError(TYPE_ERROR_EVALUABLE, t2, "X is Y^[A]"); - return FALSE; + return FALSE; } while (IsPairTerm(t2)) { Int indx; Term indxt = Eval(HeadOfTerm(t2) PASS_REGS); if (!IsIntegerTerm(indxt)) { Yap_ArithError(TYPE_ERROR_EVALUABLE, t2, "X is Y^[A]"); - return FALSE; + return FALSE; } indx = IntegerOfTerm(indxt); if (!IsApplTerm(t1)) { Yap_ArithError(TYPE_ERROR_EVALUABLE, t1, "X is Y^[A]"); - return FALSE; + return FALSE; } else { Functor f = FunctorOfTerm(t1); if (ArityOfFunctor(f) < indx) { - Yap_ArithError(TYPE_ERROR_EVALUABLE, t1, "X is Y^[A]"); - return FALSE; + Yap_ArithError(TYPE_ERROR_EVALUABLE, t1, "X is Y^[A]"); + return FALSE; } } t1 = ArgOfTerm(indx, t1); @@ -93,95 +90,90 @@ get_matrix_element(Term t1, Term t2 USES_REGS) return Eval(t1 PASS_REGS); } -static Term -Eval(Term t USES_REGS) -{ +static Term Eval(Term t USES_REGS) { if (IsVarTerm(t)) { - return Yap_ArithError(INSTANTIATION_ERROR,t,"in arithmetic"); + Yap_ArithError(INSTANTIATION_ERROR, t, "in arithmetic"); } else if (IsNumTerm(t)) { return t; } else if (IsAtomTerm(t)) { ExpEntry *p; - Atom name = AtomOfTerm(t); + Atom name = AtomOfTerm(t); if (EndOfPAEntr(p = RepExpProp(Yap_GetExpProp(name, 0)))) { - return Yap_ArithError(TYPE_ERROR_EVALUABLE, takeIndicator(t), - "atom %s in arithmetic expression", - RepAtom(name)->StrOfAE); + Yap_ArithError(TYPE_ERROR_EVALUABLE, takeIndicator(t), + "atom %s in arithmetic expression", + RepAtom(name)->StrOfAE); } return Yap_eval_atom(p->FOfEE); } else if (IsApplTerm(t)) { Functor fun = FunctorOfTerm(t); if (fun == FunctorString) { - const char *s = (const char*)StringOfTerm(t); + const char *s = (const char *)StringOfTerm(t); if (s[1] == '\0') - return MkIntegerTerm(s[0]); - return Yap_ArithError(TYPE_ERROR_EVALUABLE, t, - "string in arithmetic expression"); + return MkIntegerTerm(s[0]); + Yap_ArithError(TYPE_ERROR_EVALUABLE, t, + "string in arithmetic expression"); } else if ((Atom)fun == AtomFoundVar) { - return Yap_ArithError(TYPE_ERROR_EVALUABLE, TermNil, - "cyclic term in arithmetic expression"); + Yap_ArithError(TYPE_ERROR_EVALUABLE, TermNil, + "cyclic term in arithmetic expression"); } else { Int n = ArityOfFunctor(fun); - Atom name = NameOfFunctor(fun); + Atom name = NameOfFunctor(fun); ExpEntry *p; Term t1, t2; - + if (EndOfPAEntr(p = RepExpProp(Yap_GetExpProp(name, n)))) { - return Yap_ArithError(TYPE_ERROR_EVALUABLE, takeIndicator(t), - "functor %s/%d for arithmetic expression", - RepAtom(name)->StrOfAE,n); + Yap_ArithError(TYPE_ERROR_EVALUABLE, takeIndicator(t), + "functor %s/%d for arithmetic expression", + RepAtom(name)->StrOfAE, n); } if (p->FOfEE == op_power && p->ArityOfEE == 2) { - t2 = ArgOfTerm(2, t); - if (IsPairTerm(t2)) { - return get_matrix_element(ArgOfTerm(1, t), t2 PASS_REGS); - } + t2 = ArgOfTerm(2, t); + if (IsPairTerm(t2)) { + return get_matrix_element(ArgOfTerm(1, t), t2 PASS_REGS); + } } *RepAppl(t) = (CELL)AtomFoundVar; - t1 = Eval(ArgOfTerm(1,t) PASS_REGS); + t1 = Eval(ArgOfTerm(1, t) PASS_REGS); if (t1 == 0L) { - *RepAppl(t) = (CELL)fun; - return FALSE; + *RepAppl(t) = (CELL)fun; + return FALSE; } if (n == 1) { - *RepAppl(t) = (CELL)fun; - return Yap_eval_unary(p->FOfEE, t1); + *RepAppl(t) = (CELL)fun; + return Yap_eval_unary(p->FOfEE, t1); } - t2 = Eval(ArgOfTerm(2,t) PASS_REGS); + t2 = Eval(ArgOfTerm(2, t) PASS_REGS); *RepAppl(t) = (CELL)fun; if (t2 == 0L) - return FALSE; - return Yap_eval_binary(p->FOfEE,t1,t2); + return FALSE; + return Yap_eval_binary(p->FOfEE, t1, t2); } - } /* else if (IsPairTerm(t)) */ { + } /* else if (IsPairTerm(t)) */ + { if (TailOfTerm(t) != TermNil) { - return Yap_ArithError(TYPE_ERROR_EVALUABLE, t, - "string must contain a single character to be evaluated as an arithmetic expression"); + Yap_ArithError(TYPE_ERROR_EVALUABLE, t, + "string must contain a single character to be " + "evaluated as an arithmetic expression"); } return Eval(HeadOfTerm(t) PASS_REGS); } } -Term -Yap_InnerEval__(Term t USES_REGS) -{ - return Eval(t PASS_REGS); -} +Term Yap_InnerEval__(Term t USES_REGS) { return Eval(t PASS_REGS); } #ifdef BEAM Int BEAM_is(void); -Int -BEAM_is(void) -{ /* X is Y */ +Int BEAM_is(void) { /* X is Y */ union arith_ret res; blob_type bt; bt = Eval(Deref(XREGS[2]), &res); - if (bt==db_ref_e) return (NULL); - return (EvalToTerm(bt,&res)); + if (bt == db_ref_e) + return (NULL); + return (EvalToTerm(bt, &res)); } #endif @@ -197,21 +189,20 @@ X is 2+3*4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ succeeds with `X = 14`. - Consult @ref arithmetic_operators for the complete list of arithmetic_operators + Consult @ref arithmetic_operators for the complete list of +arithmetic_operators */ /// @memberof is/2 -static Int -p_is( USES_REGS1 ) -{ /* X is Y */ +static Int p_is(USES_REGS1) { /* X is Y */ Term out; yap_error_number err; Term t = Deref(ARG2); if (IsVarTerm(t)) { - Yap_EvalError(INSTANTIATION_ERROR,t, "X is Y"); - return(FALSE); + Yap_EvalError(INSTANTIATION_ERROR, t, "X is Y"); + return (FALSE); } Yap_ClearExs(); do { @@ -221,15 +212,15 @@ p_is( USES_REGS1 ) if (err == RESOURCE_ERROR_STACK) { LOCAL_Error_TYPE = YAP_NO_ERROR; if (!Yap_gcl(LOCAL_Error_Size, 2, ENV, CP)) { - Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); - return FALSE; + Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); + return FALSE; } } else { - Yap_EvalError(err, takeIndicator( ARG2 ), "X is Exp"); + Yap_EvalError(err, takeIndicator(ARG2), "X is Exp"); return FALSE; } } while (TRUE); - return Yap_unify_constant(ARG1,out); + return Yap_unify_constant(ARG1, out); } /** @@ -239,20 +230,18 @@ p_is( USES_REGS1 ) */ /// @memberof isnan/1 -static Int -p_isnan( USES_REGS1 ) -{ /* X isnan Y */ +static Int p_isnan(USES_REGS1) { /* X isnan Y */ Term out = 0L; - + while (!(out = Eval(Deref(ARG1) PASS_REGS))) { if (LOCAL_Error_TYPE == RESOURCE_ERROR_STACK) { LOCAL_Error_TYPE = YAP_NO_ERROR; if (!Yap_gcl(LOCAL_Error_Size, 1, ENV, CP)) { - Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); - return FALSE; + Yap_EvalError(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage); + return FALSE; } } else { - Yap_EvalError(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + Yap_EvalError(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage); return FALSE; } } @@ -274,9 +263,7 @@ p_isnan( USES_REGS1 ) */ /// @memberof isnan/1 -static Int -p_isinf( USES_REGS1 ) -{ /* X is Y */ +static Int p_isinf(USES_REGS1) { /* X is Y */ Term out = 0L; while (!(out = Eval(Deref(ARG1) PASS_REGS))) { @@ -287,7 +274,7 @@ p_isinf( USES_REGS1 ) return FALSE; } } else { - Yap_EvalError(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + Yap_EvalError(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage); return FALSE; } } @@ -312,14 +299,12 @@ True if _Log1_ is the logarithm of the positive number _A1_, */ /// @memberof logsum/3 -static Int -p_logsum( USES_REGS1 ) -{ /* X is Y */ +static Int p_logsum(USES_REGS1) { /* X is Y */ Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); int done = FALSE; Float f1, f2; - + while (!done) { if (IsFloatTerm(t1)) { f1 = FloatOfTerm(t1); @@ -334,16 +319,16 @@ p_logsum( USES_REGS1 ) #endif } else { while (!(t1 = Eval(t1 PASS_REGS))) { - if (LOCAL_Error_TYPE == RESOURCE_ERROR_STACK) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_gcl(LOCAL_Error_Size, 1, ENV, CP)) { - Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); - return FALSE; - } - } else { - Yap_EvalError(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - return FALSE; - } + if (LOCAL_Error_TYPE == RESOURCE_ERROR_STACK) { + LOCAL_Error_TYPE = YAP_NO_ERROR; + if (!Yap_gcl(LOCAL_Error_Size, 1, ENV, CP)) { + Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); + return FALSE; + } + } else { + Yap_EvalError(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage); + return FALSE; + } } } } @@ -362,88 +347,47 @@ p_logsum( USES_REGS1 ) #endif } else { while (!(t2 = Eval(t2 PASS_REGS))) { - if (LOCAL_Error_TYPE == RESOURCE_ERROR_STACK) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_gcl(LOCAL_Error_Size, 2, ENV, CP)) { - Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); - return FALSE; - } - } else { - Yap_EvalError(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - return FALSE; - } + if (LOCAL_Error_TYPE == RESOURCE_ERROR_STACK) { + LOCAL_Error_TYPE = YAP_NO_ERROR; + if (!Yap_gcl(LOCAL_Error_Size, 2, ENV, CP)) { + Yap_EvalError(RESOURCE_ERROR_STACK, ARG2, LOCAL_ErrorMessage); + return FALSE; + } + } else { + Yap_EvalError(LOCAL_Error_TYPE, ARG1, LOCAL_ErrorMessage); + return FALSE; + } } } } if (f1 >= f2) { - Float fi = exp(f2-f1); - return Yap_unify(ARG3,MkFloatTerm(f1+log(1+fi))); + Float fi = exp(f2 - f1); + return Yap_unify(ARG3, MkFloatTerm(f1 + log(1 + fi))); } else { - Float fi = exp(f1-f2); - return Yap_unify(ARG3,MkFloatTerm(f2+log(1+fi))); + Float fi = exp(f1 - f2); + return Yap_unify(ARG3, MkFloatTerm(f2 + log(1 + fi))); } } - -Int -Yap_ArithError__(const char *file, const char *function, int lineno, yap_error_number type, Term where,...) -{ +yamop *Yap_EvalError__(const char *file, const char *function, int lineno, + yap_error_number type, Term where, ...) { CACHE_REGS va_list ap; - char *format; - - if (LOCAL_ArithError) - return 0L; - LOCAL_ArithError = TRUE; - LOCAL_Error_TYPE = type; - LOCAL_Error_File = file; - LOCAL_Error_Function = function; - LOCAL_Error_Lineno = lineno; - LOCAL_Error_Term = where; - if (!LOCAL_ErrorMessage) - LOCAL_ErrorMessage = LOCAL_ErrorSay; - va_start (ap, where); - format = va_arg( ap, char *); - if (format != NULL) { -#if HAVE_VSNPRINTF - (void) vsnprintf(LOCAL_ErrorMessage, MAX_ERROR_MSG_SIZE, format, ap); -#else - (void) vsprintf(LOCAL_ErrorMessage, format, ap); -#endif - } else { - LOCAL_ErrorMessage[0] = '\0'; - } - va_end (ap); - return 0L; -} + char *format, buf[MAX_ERROR_MSG_SIZE]; -yamop * -Yap_EvalError__(const char *file, const char *function, int lineno,yap_error_number type, Term where,...) -{ - CACHE_REGS - va_list ap; - char *format; - - if (LOCAL_ArithError) { - LOCAL_ArithError = YAP_NO_ERROR; - return Yap_Error__(file, function, lineno, LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - } - - if (!LOCAL_ErrorMessage) - LOCAL_ErrorMessage = LOCAL_ErrorSay; - va_start (ap, where); + va_start(ap, where); format = va_arg(ap, char *); if (format != NULL) { -#if HAVE_VSNPRINTF - (void) vsnprintf(LOCAL_ErrorMessage, MAX_ERROR_MSG_SIZE, format, ap); +#if HAVE_VSNPRINTF + (void)vsnprintf(buf, MAX_ERROR_MSG_SIZE, format, ap); #else - (void) vsprintf(LOCAL_ErrorMessage, format, ap); + (void)vsprintf(buf, format, ap); #endif } else { - LOCAL_ErrorMessage[0] = '\0'; + buf[0] = '\0'; } - va_end (ap); - return Yap_Error__(file, function, lineno, type, where, LOCAL_ErrorMessage); + va_end(ap); + return Yap_Error__(file, function, lineno, type, where, buf); } /** @@ -461,11 +405,10 @@ Yap_EvalError__(const char *file, const char *function, int lineno,yap_error_num */ /// @memberof between/3 -static Int cont_between( USES_REGS1 ) -{ - Term t1 = EXTRA_CBACK_ARG(3,1); - Term t2 = EXTRA_CBACK_ARG(3,2); - +static Int cont_between(USES_REGS1) { + Term t1 = EXTRA_CBACK_ARG(3, 1); + Term t2 = EXTRA_CBACK_ARG(3, 2); + Yap_unify(ARG3, t1); if (IsIntegerTerm(t1)) { Int i1; @@ -475,7 +418,7 @@ static Int cont_between( USES_REGS1 ) cut_succeed(); i1 = IntegerOfTerm(t1); tn = add_int(i1, 1 PASS_REGS); - EXTRA_CBACK_ARG(3,1) = tn; + EXTRA_CBACK_ARG(3, 1) = tn; HB = B->cp_h = HR; return TRUE; } else { @@ -489,16 +432,14 @@ static Int cont_between( USES_REGS1 ) t[0] = t1; t[1] = MkIntTerm(1); tn = Eval(Yap_MkApplTerm(FunctorPlus, 2, t) PASS_REGS); - EXTRA_CBACK_ARG(3,1) = tn; + EXTRA_CBACK_ARG(3, 1) = tn; HB = B->cp_h = HR; return TRUE; } } /// @memberof between/3 -static Int -init_between( USES_REGS1 ) -{ +static Int init_between(USES_REGS1) { Term t1 = Deref(ARG1); Term t2 = Deref(ARG2); @@ -510,14 +451,11 @@ init_between( USES_REGS1 ) Yap_EvalError(INSTANTIATION_ERROR, t1, "between/3"); return FALSE; } - if (!IsIntegerTerm(t1) && - !IsBigIntTerm(t1)) { + if (!IsIntegerTerm(t1) && !IsBigIntTerm(t1)) { Yap_EvalError(TYPE_ERROR_INTEGER, t1, "between/3"); return FALSE; } - if (!IsIntegerTerm(t2) && - !IsBigIntTerm(t2) && - t2 != MkAtomTerm(AtomInf) && + if (!IsIntegerTerm(t2) && !IsBigIntTerm(t2) && t2 != MkAtomTerm(AtomInf) && t2 != MkAtomTerm(AtomInfinity)) { Yap_EvalError(TYPE_ERROR_INTEGER, t2, "between/3"); return FALSE; @@ -530,19 +468,20 @@ init_between( USES_REGS1 ) t3 = Deref(ARG3); if (!IsVarTerm(t3)) { if (!IsIntegerTerm(t3)) { - if (!IsBigIntTerm(t3)) { - Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); - return FALSE; - } - cut_fail(); + if (!IsBigIntTerm(t3)) { + Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); + return FALSE; + } + cut_fail(); } else { - Int i3 = IntegerOfTerm(t3); - if (i3 >= i1 && i3 <= i2) - cut_succeed(); - cut_fail(); + Int i3 = IntegerOfTerm(t3); + if (i3 >= i1 && i3 <= i2) + cut_succeed(); + cut_fail(); } } - if (i1 > i2) cut_fail(); + if (i1 > i2) + cut_fail(); if (i1 == i2) { Yap_unify(ARG3, t1); cut_succeed(); @@ -554,16 +493,16 @@ init_between( USES_REGS1 ) t3 = Deref(ARG3); if (!IsVarTerm(t3)) { if (!IsIntegerTerm(t3)) { - if (!IsBigIntTerm(t3)) { - Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); - return FALSE; - } - cut_fail(); + if (!IsBigIntTerm(t3)) { + Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); + return FALSE; + } + cut_fail(); } else { - Int i3 = IntegerOfTerm(t3); - if (i3 >= i1) - cut_succeed(); - cut_fail(); + Int i3 = IntegerOfTerm(t3); + if (i3 >= i1) + cut_succeed(); + cut_fail(); } } } else { @@ -572,28 +511,28 @@ init_between( USES_REGS1 ) if (!IsVarTerm(t3)) { if (!IsIntegerTerm(t3) && !IsBigIntTerm(t3)) { - Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); - return FALSE; + Yap_EvalError(TYPE_ERROR_INTEGER, t3, "between/3"); + return FALSE; } - if (Yap_acmp(t3, t1 PASS_REGS) >= 0 && Yap_acmp(t2,t3 PASS_REGS) >= 0 && P != FAILCODE) - cut_succeed(); + if (Yap_acmp(t3, t1 PASS_REGS) >= 0 && Yap_acmp(t2, t3 PASS_REGS) >= 0 && + P != FAILCODE) + cut_succeed(); cut_fail(); } cmp = Yap_acmp(t1, t2 PASS_REGS); - if (cmp > 0) cut_fail(); + if (cmp > 0) + cut_fail(); if (cmp == 0) { Yap_unify(ARG3, t1); cut_succeed(); } } - EXTRA_CBACK_ARG(3,1) = t1; - EXTRA_CBACK_ARG(3,2) = t2; - return cont_between( PASS_REGS1 ); + EXTRA_CBACK_ARG(3, 1) = t1; + EXTRA_CBACK_ARG(3, 2) = t2; + return cont_between(PASS_REGS1); } -void -Yap_InitEval(void) -{ +void Yap_InitEval(void) { /* here are the arithmetical predicates */ Yap_InitConstExps(); Yap_InitUnaryExps(); diff --git a/C/exec.c b/C/exec.c index 41c79ddeb..9b099872a 100755 --- a/C/exec.c +++ b/C/exec.c @@ -292,7 +292,7 @@ inline static bool do_execute(Term t, Term mod USES_REGS) { Term t2 = ArgOfTerm(2, t); if (IsVarTerm(t2)) return CallMetaCall(t, mod PASS_REGS); - if (!CommaCall(t2, mod)) + if (1 || !CommaCall(t2, mod)) return CallMetaCall(t, mod PASS_REGS); Term t1 = ArgOfTerm(1, t); @@ -315,6 +315,9 @@ inline static bool do_execute(Term t, Term mod USES_REGS) { /* I cannot use the standard macro here because otherwise I would dereference the argument and might skip a svar */ + if (pen->PredFlags & MetaPredFlag) { + return CallMetaCall(t, mod PASS_REGS); + } pt = RepAppl(t) + 1; for (i = 1; i <= arity; i++) { #if YAPOR_SBA @@ -1020,7 +1023,6 @@ static Int protect_stack(USES_REGS1) { static Int setup_call_catcher_cleanup(USES_REGS1) { Term Setup = Deref(ARG1); - Term cmod = CurrentModule; Int oENV = LCL0 - ENV; choiceptr B0 = B; Term t3, t4; @@ -1048,8 +1050,6 @@ static Int setup_call_catcher_cleanup(USES_REGS1) { prune_inner_computation(B0); } // at this point starts actual goal execution.... - cmod = CurrentModule; - rc = Yap_RunTopGoal(Yap_GetFromSlot(h2), false); complete_inner_computation(B); t4 = Yap_GetFromSlot(h4); @@ -1446,7 +1446,6 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) { /* must be done here, otherwise siglongjmp will clobber all the * registers */ - Yap_Error(LOCAL_matherror, TermNil, NULL); /* reset the registers so that we don't have trash in abstract * machine */ Yap_set_fpu_exceptions( @@ -1458,6 +1457,14 @@ static bool exec_absmi(bool top, yap_reset_t reset_mode USES_REGS) { LOCAL_CBorder = OldBorder; return false; } + case 4: { + /* abort */ + /* can be called from anywgerre, must reset registers, + */ + Yap_JumpToEnv(TermDAbort); + P = (yamop *)FAILCODE; + LOCAL_PrologMode = UserMode; + } break; default: /* do nothing */ LOCAL_PrologMode = UserMode; @@ -2003,7 +2010,7 @@ bool is_cleanup_cp(choiceptr cp_b) { } static Int JumpToEnv() { - choiceptr handler = B, oh = NULL; + choiceptr handler = B; /* just keep the throwm object away, we don't need to care about it */ /* careful, previous step may have caused a stack shift, @@ -2021,7 +2028,6 @@ static Int JumpToEnv() { handler->cp_b == NULL)) { break; } - oh = handler; handler = handler->cp_b; } if (LOCAL_PrologMode & AsyncIntMode) { @@ -2074,7 +2080,7 @@ static Int jump_env(USES_REGS1) { Yap_Error(INSTANTIATION_ERROR, t, "throw ball must be bound"); return false; } else if (IsApplTerm(t) && FunctorOfTerm(t) == FunctorError) { - Term t2; + Term t2, te; Yap_find_prolog_culprit(PASS_REGS1); // LOCAL_Error_TYPE = ERROR_EVENT; @@ -2089,7 +2095,7 @@ static Int jump_env(USES_REGS1) { } else { //LOCAL_Error_TYPE = THROW_EVENT; } - LOCAL_ActiveError.prologPredName = NULL; + LOCAL_ActiveError->prologPredName = NULL; Yap_PutException(t); bool out = JumpToEnv(PASS_REGS1); if (B != NULL && P == FAILCODE && B->cp_ap == NOCODE && @@ -2225,10 +2231,11 @@ bool Yap_PutException(Term t) { } bool Yap_ResetException(int wid) { - if (REMOTE_BallTerm(wid)) { - Yap_PopTermFromDB(REMOTE_BallTerm(wid)); + if (REMOTE_ActiveError(wid)->errorTerm) { + Yap_PopTermFromDB(REMOTE_ActiveError(wid)->errorTerm); } - REMOTE_BallTerm(wid) = NULL; + REMOTE_ActiveError(wid)->errorTerm = NULL; + REMOTE_ActiveError(wid)->errorTerm = NULL; return true; } diff --git a/C/flags.c b/C/flags.c index 4b850c0d9..fa1b553e6 100644 --- a/C/flags.c +++ b/C/flags.c @@ -51,9 +51,9 @@ static Term stream(Term inp); static bool getenc(Term inp); static bool typein(Term inp); static bool dqf(Term t2); -static bool set_error_stream( Term inp ); -static bool set_input_stream( Term inp ); -static bool set_output_stream( Term inp ); +static bool set_error_stream(Term inp); +static bool set_input_stream(Term inp); +static bool set_output_stream(Term inp); static void newFlag(Term fl, Term val); static Int current_prolog_flag(USES_REGS1); @@ -173,41 +173,38 @@ static Term isaccess(Term inp) { } static Term stream(Term inp) { - if ( IsVarTerm(inp) ) + if (IsVarTerm(inp)) return inp; - if (Yap_CheckStream( inp, Input_Stream_f | Output_Stream_f | - Append_Stream_f | Socket_Stream_f, "yap_flag/3" ) >= 0) + if (Yap_CheckStream(inp, Input_Stream_f | Output_Stream_f | Append_Stream_f | + Socket_Stream_f, + "yap_flag/3") >= 0) return inp; return 0; - } -static bool -set_error_stream( Term inp ) { - if( IsVarTerm(inp) ) - return Yap_unify( inp, Yap_StreamUserName( LOCAL_c_error_stream ) ); - LOCAL_c_error_stream = Yap_CheckStream( inp, Output_Stream_f | - Append_Stream_f | Socket_Stream_f, "yap_flag/3" ); - return true; -} - -static bool -set_input_stream( Term inp ) { - if( IsVarTerm(inp) ) - return Yap_unify( inp, Yap_StreamUserName( LOCAL_c_input_stream ) ); - LOCAL_c_input_stream = Yap_CheckStream( inp, Input_Stream_f | Socket_Stream_f, "yap_flag/3" ); +static bool set_error_stream(Term inp) { + if (IsVarTerm(inp)) + return Yap_unify(inp, Yap_StreamUserName(LOCAL_c_error_stream)); + LOCAL_c_error_stream = Yap_CheckStream( + inp, Output_Stream_f | Append_Stream_f | Socket_Stream_f, "yap_flag/3"); return true; } -static bool -set_output_stream( Term inp ) { - if( IsVarTerm(inp) ) - return Yap_unify( inp, Yap_StreamUserName( LOCAL_c_output_stream ) ); - LOCAL_c_output_stream = Yap_CheckStream( inp, Output_Stream_f | - Append_Stream_f | Socket_Stream_f, "yap_flag/3" ); +static bool set_input_stream(Term inp) { + if (IsVarTerm(inp)) + return Yap_unify(inp, Yap_StreamUserName(LOCAL_c_input_stream)); + LOCAL_c_input_stream = + Yap_CheckStream(inp, Input_Stream_f | Socket_Stream_f, "yap_flag/3"); return true; } +static bool set_output_stream(Term inp) { + if (IsVarTerm(inp)) + return Yap_unify(inp, Yap_StreamUserName(LOCAL_c_output_stream)); + LOCAL_c_output_stream = Yap_CheckStream( + inp, Output_Stream_f | Append_Stream_f | Socket_Stream_f, "yap_flag/3"); + return true; +} static Term isground(Term inp) { return Yap_IsGroundTerm(inp) ? inp : TermZERO; @@ -870,7 +867,7 @@ static Int cont_prolog_flag(USES_REGS1) { } EXTRA_CBACK_ARG(3, 1) = MkIntTerm(++i); flag = getYapFlag(f); - if (!Yap_unify(f, ARG2)) + if (!Yap_unify(flag, ARG2)) return false; return setYapFlag(f, Deref(ARG3)); } @@ -1175,31 +1172,33 @@ static Int source_mode(USES_REGS1) { if (!current && !Yap_unify_constant(ARG1, TermFalse)) return false; targ = Deref(ARG2); - setYapFlag(TermSource, ARG2); + setYapFlag(TermSource, targ); return true; } static bool setInitialValue(bool bootstrap, flag_func f, const char *s, flag_term *tarr) { errno = 0; + const char *ss = (const char *)s; if (f == booleanFlag) { if (!bootstrap) { return 0; } - if (!strcmp(s, "true")) { + const char *ss = (const char *)s; + if (!strcmp(ss, "true")) { tarr->at = TermTrue; return true; } - if (!strcmp(s, "false")) { + if (!strcmp(ss, "false")) { tarr->at = TermFalse; return true; } - if (!strcmp(s, "on")) { + if (!strcmp(ss, "on")) { tarr->at = TermTrue; return true; } - if (!strcmp(s, "off")) { + if (!strcmp(ss, "off")) { tarr->at = TermFalse; return true; } @@ -1210,7 +1209,7 @@ static bool setInitialValue(bool bootstrap, flag_func f, const char *s, if (!bootstrap) { return 0; } - UInt r = strtoul(s, NULL, 10); + UInt r = strtoul(ss, NULL, 10); Term t; if (errno) { Yap_Error(DOMAIN_ERROR_OUT_OF_RANGE, TermNil, @@ -1229,27 +1228,27 @@ static bool setInitialValue(bool bootstrap, flag_func f, const char *s, if (!bootstrap) { return false; } - if (!strcmp(s, "INT_MAX")) { + if (!strcmp(ss, "INT_MAX")) { tarr->at = MkIntTerm(Int_MAX); return true; } - if (!strcmp(s, "MAX_THREADS")) { + if (!strcmp(ss, "MAX_THREADS")) { tarr->at = MkIntTerm(MAX_THREADS); return true; } - if (!strcmp(s, "MAX_WORKERS")) { + if (!strcmp(ss, "MAX_WORKERS")) { tarr->at = MkIntTerm(MAX_WORKERS); return true; } - if (!strcmp(s, "INT_MIN")) { + if (!strcmp(ss, "INT_MIN")) { tarr->at = MkIntTerm(Int_MIN); return true; } - if (!strcmp(s, "YAP_NUMERIC_VERSION")) { + if (!strcmp(ss, "YAP_NUMERIC_VERSION")) { tarr->at = MkIntTerm(atol(YAP_NUMERIC_VERSION)); return true; } - if (!strcmp(s, "YAP_NUMERIC_VERSION")) { + if (!strcmp(ss, "YAP_NUMERIC_VERSION")) { tarr->at = MkIntTerm(atol(YAP_NUMERIC_VERSION)); return true; } @@ -1297,7 +1296,7 @@ static bool setInitialValue(bool bootstrap, flag_func f, const char *s, return true; } } - } else if (strcmp(s, "@boot") == 0) { + } else if (strcmp(ss, "@boot") == 0) { if (bootstrap) { return true; } @@ -1317,9 +1316,9 @@ static bool setInitialValue(bool bootstrap, flag_func f, const char *s, return false; } CACHE_REGS - encoding_t encoding = ENC_ISO_UTF8; - t0 = - Yap_StringToTerm(s, strlen(s) + 1, &encoding, GLOBAL_MaxPriority, NULL); + const unsigned char *us = (const unsigned char *)s; + t0 = Yap_BufferToTermWithPrioBindings(us, strlen(s) + 1, TermNil, + GLOBAL_MaxPriority, 0L); if (!t0) return false; if (IsAtomTerm(t0) || IsIntTerm(t0)) { @@ -1369,7 +1368,7 @@ do_prolog_flag_property(Term tflag, args = Yap_ArgList2ToVector(opts, prolog_flag_property_defs, PROLOG_FLAG_PROPERTY_END); if (args == NULL) { - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, NULL); + Yap_Error(LOCAL_Error_TYPE, opts, NULL); return false; } if (!IsAtomTerm(tflag)) { @@ -1434,7 +1433,7 @@ do_prolog_flag_property(Term tflag, } } // UNLOCK(GLOBAL_Prolog_Flag[sno].prolog_flaglock); - free(args); + free(args); return rc; } @@ -1533,14 +1532,14 @@ static Int do_create_prolog_flag(USES_REGS1) { args = Yap_ArgList2ToVector(opts, prolog_flag_property_defs, PROLOG_FLAG_PROPERTY_END); if (args == NULL) { - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, NULL); + Yap_Error(LOCAL_Error_TYPE, opts, NULL); return false; } fv = GetFlagProp(AtomOfTerm(tflag)); if (fv) { if (args[PROLOG_FLAG_PROPERTY_KEEP].used && args[PROLOG_FLAG_PROPERTY_KEEP].tvalue == TermTrue) { - free(args); + free(args); return true; } } else { @@ -1570,7 +1569,7 @@ static Int do_create_prolog_flag(USES_REGS1) { fv->type = isground; } break; case PROLOG_FLAG_PROPERTY_SCOPE: - free(args); + free(args); return false; case PROLOG_FLAG_PROPERTY_END: break; @@ -1621,8 +1620,9 @@ void Yap_InitFlags(bool bootstrap) { while (f->name != NULL) { bool itf = setInitialValue(bootstrap, f->def, f->init, LOCAL_Flags + LOCAL_flagCount); - // Term itf = Yap_StringToTerm(f->init, strlen(f->init)+1, - // EBC_ISO_UTF8, GLOBAL_MaxPriority, &tp); + // Term itf = Yap_BufferToTermWithPrioBindings(f->init, + // strlen(f->init)+1, + // LOBAL_MaxPriority, &tp); if (itf) { initFlag(f, LOCAL_flagCount, false); } @@ -1633,7 +1633,7 @@ void Yap_InitFlags(bool bootstrap) { if (GLOBAL_Stream[StdInStream].status & Readline_Stream_f) { setBooleanGlobalPrologFlag(READLINE_FLAG, true); } - + if (!bootstrap) { Yap_InitCPredBack("current_prolog_flag", 2, 1, current_prolog_flag, cont_yap_flag, 0); diff --git a/C/globals.c b/C/globals.c index 07b74511c..9897a3221 100644 --- a/C/globals.c +++ b/C/globals.c @@ -1654,7 +1654,8 @@ static Int p_nb_queue_close(USES_REGS1) { return Yap_unify(ARG3, ARG2); } out = Yap_unify(ARG3, qp[QUEUE_TAIL]) && Yap_unify(ARG2, qp[QUEUE_HEAD]); - qp[QUEUE_HEAD] = qp[QUEUE_TAIL] = RESET_VARIABLE(qp + QUEUE_TAIL); + RESET_VARIABLE(qp + QUEUE_TAIL); + qp[QUEUE_HEAD] = qp[QUEUE_TAIL] = (CELL)(qp + QUEUE_TAIL); qp[QUEUE_SIZE] = MkIntTerm(0); return out; } diff --git a/C/gmp_support.c b/C/gmp_support.c index 5de3d4f8b..167802cb1 100644 --- a/C/gmp_support.c +++ b/C/gmp_support.c @@ -32,7 +32,7 @@ MkBigAndClose(MP_INT *new) Term t = Yap_MkBigIntTerm(new); mpz_clear(new); if (t == TermNil) { - return Yap_ArithError(RESOURCE_ERROR_STACK, t, ">>/2"); + Yap_ArithError(RESOURCE_ERROR_STACK, t, ">>/2"); } return t; } @@ -43,7 +43,7 @@ MkRatAndClose(MP_RAT *new) Term t = Yap_MkBigRatTerm(new); mpq_clear(new); if (t == TermNil) { - return Yap_ArithError(RESOURCE_ERROR_STACK, t, ">>/2"); + Yap_ArithError(RESOURCE_ERROR_STACK, t, ">>/2"); } return t; } @@ -243,7 +243,7 @@ Yap_gmp_div_big_int(Term t, Int i) if (i > 0) { mpz_tdiv_q_ui(&new, &new, i); } else if (i == 0) { - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); } else { /* we do not handle MIN_INT */ mpz_tdiv_q_ui(&new, &new, -i); @@ -253,7 +253,7 @@ Yap_gmp_div_big_int(Term t, Int i) if (i > 0) { mpz_fdiv_q_ui(&new, &new, i); } else if (i == 0) { - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); } else { /* we do not handle MIN_INT */ mpz_fdiv_q_ui(&new, &new, -i); @@ -285,7 +285,7 @@ Yap_gmp_div2_big_int(Term t, Int i) if (i > 0) { mpz_fdiv_q_ui(&new, &new, i); } else if (i == 0) { - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, MkIntTerm(0), "// /2"); } else { /* we do not handle MIN_INT */ mpz_fdiv_q_ui(&new, &new, -i); @@ -311,7 +311,7 @@ Yap_gmp_and_int_big(Int i, Term t) CELL *pt = RepAppl(t); MP_INT *b; if (pt[1] != BIG_INT) { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "/\\/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "/\\/2"); } b = Yap_BigIntOfTerm(t); @@ -328,7 +328,7 @@ Yap_gmp_ior_int_big(Int i, Term t) CELL *pt = RepAppl(t); MP_INT *b; if (pt[1] != BIG_INT) { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "\\/ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "\\/ /2"); } b = Yap_BigIntOfTerm(t); @@ -367,7 +367,7 @@ Yap_gmp_xor_int_big(Int i, Term t) CELL *pt = RepAppl(t); MP_INT *b; if (pt[1] != BIG_INT) { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "#/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "#/2"); } b = Yap_BigIntOfTerm(t); @@ -394,7 +394,7 @@ Yap_gmp_sll_big_int(Term t, Int i) mpz_init(&new); if (i == Int_MIN) { CACHE_REGS - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, MkIntegerTerm(i), "< 0) { @@ -992,7 +992,7 @@ Yap_gmp_exp_int_big(Int i, Term t) CACHE_REGS CELL *pt = RepAppl(t); if (pt[1] == BIG_INT) { - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t, "^/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t, "^/2"); } else { MP_INT *b = Yap_BigIntOfTerm(t); Float dbl = mpz_get_d(b); @@ -1009,7 +1009,7 @@ Yap_gmp_exp_big_big(Term t1, Term t2) Float dbl1, dbl2; if (pt1[1] == BIG_INT && pt2[1] == BIG_INT) { - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, "^/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, "^/2"); } else { if (pt1[1] != BIG_INT) { dbl1 = mpz_get_d(Yap_BigIntOfTerm(t1)); @@ -1476,7 +1476,7 @@ Yap_gmp_unot_big(Term t) mpz_com(&new, &new); return MkBigAndClose(&new); } else { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "#/1"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "#/1"); } } @@ -1571,7 +1571,7 @@ Yap_gmp_float_fractional_part(Term t) { CELL *pt = RepAppl(t); if (pt[1] == BIG_INT) { - return Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_fractional_part(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_fractional_part(%f)", FloatOfTerm(t)); } else { MP_RAT *b = Yap_BigRatOfTerm(t); MP_RAT new; @@ -1591,7 +1591,7 @@ Yap_gmp_float_integer_part(Term t) { CELL *pt = RepAppl(t); if (pt[1] == BIG_INT) { - return Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_integer_part(%f)", FloatOfTerm(t)); + Yap_ArithError(TYPE_ERROR_FLOAT, t, "X is float_integer_part(%f)", FloatOfTerm(t)); } else { MP_RAT *b = Yap_BigRatOfTerm(t); MP_INT new; @@ -1624,12 +1624,12 @@ Yap_gmp_lsb(Term t) if (pt[1] == BIG_INT) { MP_INT *big = Yap_BigIntOfTerm(t); if ( mpz_sgn(big) <= 0 ) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, "lsb/1 received negative bignum"); } return MkIntegerTerm(mpz_scan1(big,0)); } else { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "lsb"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "lsb"); } } @@ -1641,12 +1641,12 @@ Yap_gmp_msb(Term t) if (pt[1] == BIG_INT) { MP_INT *big = Yap_BigIntOfTerm(t); if ( mpz_sgn(big) <= 0 ) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, "msb/1 received negative bignum"); } return MkIntegerTerm(mpz_sizeinbase(big,2)); } else { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount"); } } @@ -1658,17 +1658,17 @@ Yap_gmp_popcount(Term t) if (pt[1] == BIG_INT) { MP_INT *big = Yap_BigIntOfTerm(t); if ( mpz_sgn(big) <= 0 ) { - return Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, + Yap_ArithError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, t, "popcount/1 received negative bignum"); } return MkIntegerTerm(mpz_popcount(big)); } else { - return Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount"); + Yap_ArithError(TYPE_ERROR_INTEGER, t, "popcount"); } } char * -Yap_mpz_to_string(MP_INT *b, char *s, size_t sz, int base) +Yap_mpz_to_string( MP_INT *b, char *s, size_t sz, int base) { if (s) { size_t size = mpz_sizeinbase(b, base); diff --git a/C/grow.c b/C/grow.c index 953ea53f4..13e30ad11 100755 --- a/C/grow.c +++ b/C/grow.c @@ -749,9 +749,7 @@ AdjustScannerStacks(TokEntry **tksp, VarEntry **vep USES_REGS) break; case Var_tok: case String_tok: - case WString_tok: case BQString_tok: - case WBQString_tok: if (IsOldTrail(tks->TokInfo)) tks->TokInfo = TrailAdjust(tks->TokInfo); break; @@ -834,7 +832,7 @@ static_growheap(size_t esize, bool fix_code, struct intermediates *cip, tr_fr_pt fprintf( stderr, "%% Worker Id %d:\n", worker_id); #endif fprintf( stderr, "%% Database Overflow %d\n", LOCAL_heap_overflows); - fprintf( stderr, "%% growing the heap %ld bytes\n", size); + fprintf( stderr, "%% growing the heap " Int_FORMAT " bytes\n", size); } /* CreepFlag is set to force heap expansion */ if ( Yap_only_has_signal( YAP_CDOVF_SIGNAL) ) { @@ -978,7 +976,7 @@ static_growglobal(size_t request, CELL **ptr, CELL *hsplit USES_REGS) fprintf(stderr, "%% Worker Id %d:\n", worker_id); #endif fprintf(stderr, "%% %cO %s Overflow %d\n", vb_msg1, vb_msg2, LOCAL_delay_overflows); - fprintf(stderr, "%% %cO growing the stacks %ld bytes\n", vb_msg1, size); + fprintf(stderr, "%% %cO growing the stacks " UInt_FORMAT " bytes\n", vb_msg1, size); } ASP -= 256; YAPEnterCriticalSection(); @@ -1796,7 +1794,7 @@ static int do_growtrail(size_t esize, bool contiguous_only, bool in_parser, tr_f fprintf(stderr, "%% Trail:%8ld cells (%p-%p)\n", (unsigned long int)(TR-(tr_fr_ptr)LOCAL_TrailBase),LOCAL_TrailBase,TR); #endif - fprintf(stderr, "%% growing the trail %ld bytes\n", size); + fprintf(stderr, "%% growing the trail " UInt_FORMAT " bytes\n", size); } LOCAL_ErrorMessage = NULL; if (!GLOBAL_AllowTrailExpansion) { diff --git a/C/learn2 b/C/learn2 new file mode 100644 index 000000000..7d931f0c6 --- /dev/null +++ b/C/learn2 @@ -0,0 +1,43 @@ +#!/usr/local/bin/python3.4 +import os, sys +if 'LD_LIBRARY_PATH' not in os.environ: + os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib' + try: + os.execv(sys.argv[0], sys.argv) + except Exception as exc: + print( 'Failed re-exec:', exc ) + sys.exit(1) +# +# import yourmodule +print( 'Success:', os.environ['LD_LIBRARY_PATH'] +# your program goes here + +import matplotlib +matplotlib.use('Agg') + + +#import sys, os +sys.path = sys.path + [os.getcwd()] + +sys.druwid_root = os.path.abspath(os.path.dirname(__file__)) + + +import dru.druwid +import dru.druplot +from dru.shell import AlephShell + +cq = dru.druwid.ClauseQueue() + +learner = dru.druwid.Aleph( cq ) + +# +# initialize engine +# +def main(): + if not learner: + print("Nothing to do, bye!") + exit(2) + AlephShell(learner).cmdloop() + +if __name__ == "__main__": + main() diff --git a/C/load_dl.c b/C/load_dl.c index d0ad81787..0a437d589 100755 --- a/C/load_dl.c +++ b/C/load_dl.c @@ -127,7 +127,8 @@ void *Yap_LoadForeignFile(char *file, int flags) { if (out == NULL) { const char *m_os = dlerror(); if (m_os) { - strncpy(LOCAL_ErrorSay, m_os, MAX_ERROR_MSG_SIZE - 1); + LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE); + strncpy(LOCAL_ErrorMessage, m_os, MAX_ERROR_MSG_SIZE - 1); } else { LOCAL_ErrorMessage = "dlopen failed"; } @@ -177,7 +178,8 @@ static Int LoadForeign(StringList ofiles, StringList libs, char *proc_name, NULL) #endif { - strcpy(LOCAL_ErrorSay, dlerror()); + LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE); + strcpy(LOCAL_ErrorMessage, dlerror()); return LOAD_FAILLED; } libs = libs->next; @@ -192,7 +194,8 @@ static Int LoadForeign(StringList ofiles, StringList libs, char *proc_name, /* dlopen wants to follow the LD_CONFIG_PATH */ const char *file = AtomName(ofiles->name); if (!Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true)) { - strcpy(LOCAL_ErrorSay, + LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE); + strcpy(LOCAL_ErrorMessage, "%% Trying to open unexisting file in LoadForeign"); return LOAD_FAILLED; } @@ -217,7 +220,7 @@ static Int LoadForeign(StringList ofiles, StringList libs, char *proc_name, } if (!*init_proc) { - strcpy(LOCAL_ErrorSay, "Could not locate initialization routine"); + LOCAL_ErrorMessage = "Could not locate initialization routine"; return LOAD_FAILLED; } diff --git a/C/load_dll.c b/C/load_dll.c index 98facdb65..ea881df06 100755 --- a/C/load_dll.c +++ b/C/load_dll.c @@ -45,10 +45,10 @@ Yap_LoadForeignFile(char *file, int flags) void *ptr= (void *)LoadLibrary(file); if (!ptr) { CACHE_REGS - LOCAL_ErrorSay[0]='\0'; + LOCAL_ErrorMessage = NULL; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorSay, 256, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256, NULL); } return ptr; @@ -86,13 +86,13 @@ LoadForeign(StringList ofiles, StringList libs, if (!Yap_findFile(file, NULL, NULL, LOCAL_FileNameBuf, true, YAP_OBJ, true, true) && (handle=LoadLibrary(LOCAL_FileNameBuf)) != 0) { - LOCAL_ErrorSay[0]=~'\0'; + LOCAL_ErrorMessage = NULL; if (*init_proc == NULL) *init_proc = (YapInitProc)GetProcAddress((HMODULE)handle, proc_name); } else { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorSay, 256, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LOCAL_ErrorMessage, 256, NULL); //fprintf(stderr,"WinError: %s\n", LOCAL_ErrorSay); } @@ -124,7 +124,7 @@ LoadForeign(StringList ofiles, StringList libs, } if(*init_proc == NULL) { - strcpy(LOCAL_ErrorSay,"Could not locate initialization routine"); + LOCAL_ErrorMessage = "Could not locate initialization routine"; return LOAD_FAILLED; } diff --git a/C/load_foreign.c b/C/load_foreign.c index 472d65e76..a1dd5fea7 100644 --- a/C/load_foreign.c +++ b/C/load_foreign.c @@ -140,7 +140,8 @@ p_open_shared_object( USES_REGS1 ) { s = (char *)RepAtom(AtomOfTerm(t))->StrOfAE; if ((handle = Yap_LoadForeignFile(s, IntegerOfTerm(tflags)))==NULL) { - Yap_Error(EXISTENCE_ERROR_SOURCE_SINK,t,"open_shared_object_failed for %s with %s\n", s, LOCAL_ErrorSay); + Yap_Error(EXISTENCE_ERROR_SOURCE_SINK,t,"open_shared_object_failed for %s" + " with %s\n", s, LOCAL_ErrorMessage); return FALSE; } else { return Yap_unify(MkIntegerTerm((Int)handle),ARG3); diff --git a/C/modules.c b/C/modules.c index 5709ba07f..a35cd917b 100644 --- a/C/modules.c +++ b/C/modules.c @@ -370,16 +370,57 @@ static Int new_system_module(USES_REGS1) { } static Int strip_module(USES_REGS1) { - Term t1 = Deref(ARG1), tmod = CurrentModule; - if (tmod == PROLOG_MODULE) { - tmod = TermProlog; - } - t1 = Yap_StripModule(t1, &tmod); - if (!t1) { + Term t1 = Deref(ARG1), tmod = CurrentModule; + if (tmod == PROLOG_MODULE) { + tmod = TermProlog; + } + t1 = Yap_StripModule(t1, &tmod); + if (!t1) { + Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module"); + return FALSE; + } + return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod); +} + +static Int yap_strip_clause(USES_REGS1) { + Functor f; + Term t1 = Deref(ARG1), tmod = LOCAL_SourceModule; + if (tmod == PROLOG_MODULE) { + tmod = TermProlog; + } + t1 = Yap_StripModule(t1, &tmod); + if (IsVarTerm(t1)) { + Yap_Error(INSTANTIATION_ERROR, t1, "trying to obtain module"); + return false; + } else if (IsVarTerm(tmod)) { + Yap_Error(INSTANTIATION_ERROR, tmod, "trying to obtain module"); + return false; + } else if (IsIntTerm(t1) || (IsApplTerm(t1) && IsExtensionFunctor((f = FunctorOfTerm(t1))))) { Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module"); - return FALSE; - } - return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod); + return false; + } else if (!IsAtomTerm(tmod)) { + Yap_Error(TYPE_ERROR_ATOM, tmod, "trying to obtain module"); + return false; + } + if (f == FunctorAssert || f == FunctorDoubleArrow) { + Term thmod = tmod; + Term th = ArgOfTerm(1, t1); + th = Yap_StripModule(th, &thmod); + if (IsVarTerm(th)) { + Yap_Error(INSTANTIATION_ERROR, t1, "trying to obtain module"); + return false; + } else if (IsVarTerm(thmod)) { + Yap_Error(INSTANTIATION_ERROR, thmod, "trying to obtain module"); + return false; + } else if (IsIntTerm(th) || (IsApplTerm(th) && IsExtensionFunctor(FunctorOfTerm(t1)))) { + Yap_Error(TYPE_ERROR_CALLABLE, t1, "trying to obtain module"); + return false; + }else if (!IsAtomTerm(thmod)) { + Yap_Error(TYPE_ERROR_ATOM, thmod, "trying to obtain module"); + return false; + } + } + return Yap_unify(ARG3, t1) && Yap_unify(ARG2, tmod); } Term Yap_YapStripModule(Term t, Term *modp) { @@ -564,13 +605,14 @@ void Yap_InitModulesC(void) { SafePredFlag | SyncPredFlag); Yap_InitCPred("$change_module", 1, change_module, SafePredFlag | SyncPredFlag); - Yap_InitCPred("strip_module", 3, strip_module, SafePredFlag | SyncPredFlag); + Yap_InitCPred("strip_module", 3, strip_module, SafePredFlag | SyncPredFlag); + Yap_InitCPred("$yap_strip_module", 3, yap_strip_module, SafePredFlag | SyncPredFlag); Yap_InitCPred("source_module", 1, source_module, SafePredFlag | SyncPredFlag); Yap_InitCPred("current_source_module", 2, current_source_module, SafePredFlag | SyncPredFlag); - Yap_InitCPred("$yap_strip_module", 3, yap_strip_module, - SafePredFlag | SyncPredFlag); - Yap_InitCPred("context_module", 1, context_module, 0); + Yap_InitCPred("$yap_strip_clause", 3, yap_strip_clause, + SafePredFlag | SyncPredFlag); + Yap_InitCPred("context_module", 1, context_module, 0); Yap_InitCPred("$is_system_module", 1, is_system_module, SafePredFlag); Yap_InitCPred("$copy_operators", 2, copy_operators, 0); Yap_InitCPred("new_system_module", 1, new_system_module, SafePredFlag); diff --git a/C/parser.c b/C/parser.c index b2ccbdc8b..e4001d273 100755 --- a/C/parser.c +++ b/C/parser.c @@ -8,9 +8,9 @@ * * ************************************************************************** * * -* File: parser.c * +* File: parser.c * * Last rev: * -* mods: * +* mods: * * comments: Prolog's parser * * * *************************************************************************/ @@ -138,11 +138,11 @@ dot with single quotes. */ #include "Yap.h" -#include "Yatom.h" #include "YapHeap.h" #include "YapText.h" -#include "yapio.h" +#include "Yatom.h" #include "eval.h" +#include "yapio.h" /* stuff we want to use in standard YAP code */ #include "iopreds.h" #if HAVE_STRING_H @@ -163,23 +163,26 @@ dot with single quotes. typedef struct jmp_buff_struct { sigjmp_buf JmpBuff; } JMPBUFF; static void GNextToken(CACHE_TYPE1); -static void checkfor(wchar_t, JMPBUFF *, encoding_t CACHE_TYPE); -static Term ParseArgs(Atom, wchar_t, JMPBUFF *, Term, encoding_t, Term CACHE_TYPE); +static void checkfor(Term, JMPBUFF *, encoding_t CACHE_TYPE); +static Term ParseArgs(Atom, Term, JMPBUFF *, Term, encoding_t, Term CACHE_TYPE); static Term ParseList(JMPBUFF *, encoding_t, Term CACHE_TYPE); static Term ParseTerm(int, JMPBUFF *, encoding_t, Term CACHE_TYPE); -const char *Yap_tokRep(TokEntry *tokptr, encoding_t enc); +extern Term Yap_tokRep(void* tokptr); +extern const char * Yap_tokText(void *tokptr); static void syntax_msg(const char *msg, ...) { CACHE_REGS va_list ap; - - if (LOCAL_toktide == LOCAL_tokptr) { - char out[YAP_FILENAME_MAX]; + if (!LOCAL_ErrorMessage || + (LOCAL_Error_TYPE == SYNTAX_ERROR && + LOCAL_ActiveError->prologParserLine < LOCAL_tokptr->TokPos)) { + if (!LOCAL_ErrorMessage) { + LOCAL_ErrorMessage = malloc(1024 + 1); + } + LOCAL_ActiveError->prologParserLine = LOCAL_tokptr->TokPos; va_start(ap, msg); - vsnprintf(out, YAP_FILENAME_MAX - 1, msg, ap); - LOCAL_Error_Term = MkStringTerm( out ); - LOCAL_Error_TYPE = SYNTAX_ERROR; + vsnprintf(LOCAL_ErrorMessage, MAX_ERROR_MSG_SIZE, msg, ap); va_end(ap); } } @@ -225,11 +228,12 @@ static void syntax_msg(const char *msg, ...) { #define FAIL siglongjmp(FailBuff->JmpBuff, 1) -VarEntry * -Yap_LookupVar(const char *var) /* lookup variable in variables table */ +VarEntry *Yap_LookupVar(const char *var) /* lookup variable in variables table + * */ { CACHE_REGS VarEntry *p; + Atom vat = Yap_LookupAtom(var); #if DEBUG if (GLOBAL_Option[4]) @@ -245,7 +249,7 @@ Yap_LookupVar(const char *var) /* lookup variable in variables table */ CELL hpv = p->hv; if (hv == hpv) { Int scmp; - if ((scmp = strcmp(var, p->VarRep)) == 0) { + if ((scmp = strcmp(var, RepAtom(p->VarRep)->StrOfAE)) == 0) { p->refs++; return (p); } else if (scmp < 0) { @@ -263,22 +267,21 @@ Yap_LookupVar(const char *var) /* lookup variable in variables table */ p = p->VarRight; } } - p = (VarEntry *)Yap_AllocScannerMemory(strlen(var) + sizeof(VarEntry)); + p = (VarEntry *)Yap_AllocScannerMemory(sizeof(VarEntry)); *op = p; p->VarLeft = p->VarRight = NULL; p->hv = hv; p->refs = 1L; - strcpy(p->VarRep, var); + p->VarRep = vat; } else { /* anon var */ - p = (VarEntry *)Yap_AllocScannerMemory(sizeof(VarEntry) + 2); + p = (VarEntry *)Yap_AllocScannerMemory(sizeof(VarEntry)); p->VarLeft = LOCAL_AnonVarTable; LOCAL_AnonVarTable = p; p->VarRight = NULL; p->refs = 0L; p->hv = 1L; - p->VarRep[0] = '_'; - p->VarRep[1] = '\0'; + p->VarRep = vat; } p->VarAdr = TermNil; return (p); @@ -286,11 +289,11 @@ Yap_LookupVar(const char *var) /* lookup variable in variables table */ static Term VarNames(VarEntry *p, Term l USES_REGS) { if (p != NULL) { - if (strcmp(p->VarRep, "_") != 0) { + if (strcmp(RepAtom(p->VarRep)->StrOfAE, "_") != 0) { Term t[2]; Term o; - t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); + t[0] = MkAtomTerm(p->VarRep); if (!IsVarTerm(p->VarAdr)) p->VarAdr = MkVarTerm(); t[1] = p->VarAdr; @@ -317,11 +320,11 @@ Term Yap_VarNames(VarEntry *p, Term l) { static Term Singletons(VarEntry *p, Term l USES_REGS) { if (p != NULL) { - if (p->VarRep[0] != '_' && p->refs == 1) { + if (RepAtom(p->VarRep)->StrOfAE[0] != '_' && p->refs == 1) { Term t[2]; Term o; - t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); + t[0] = MkAtomTerm(p->VarRep); t[1] = p->VarAdr; o = Yap_MkApplTerm(FunctorEq, 2, t); o = MkPairTerm(o, @@ -364,6 +367,7 @@ static Term Variables(VarEntry *p, Term l USES_REGS) { Term Yap_Variables(VarEntry *p, Term l) { CACHE_REGS + l = Variables(LOCAL_AnonVarTable, l PASS_REGS); return Variables(p, l PASS_REGS); } @@ -379,7 +383,7 @@ static int IsPrefixOp(Atom op, int *pptr, int *rpptr, Term cmod USES_REGS) { } if ((p = opp->Prefix) != 0) { READ_UNLOCK(opp->OpRWLock); - *pptr = *rpptr = p &MaskPrio; + *pptr = *rpptr = p & MaskPrio; if (p & DcrrpFlag) --*rpptr; return TRUE; @@ -394,19 +398,20 @@ int Yap_IsPrefixOp(Atom op, int *pptr, int *rpptr) { return IsPrefixOp(op, pptr, rpptr, CurrentModule PASS_REGS); } -static int IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr, Term cmod USES_REGS) { +static int IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr, + Term cmod USES_REGS) { int p; OpEntry *opp = Yap_GetOpProp(op, INFIX_OP, cmod PASS_REGS); if (!opp) - return FALSE; + return false; if (opp->OpModule && opp->OpModule != cmod) { READ_UNLOCK(opp->OpRWLock); - return FALSE; + return false; } if ((p = opp->Infix) != 0) { READ_UNLOCK(opp->OpRWLock); - *pptr = *rpptr = *lpptr = p &MaskPrio; + *pptr = *rpptr = *lpptr = p & MaskPrio; if (p & DcrrpFlag) --*rpptr; if (p & DcrlpFlag) @@ -435,7 +440,7 @@ static int IsPosfixOp(Atom op, int *pptr, int *lpptr, Term cmod USES_REGS) { } if ((p = opp->Posfix) != 0) { READ_UNLOCK(opp->OpRWLock); - *pptr = *lpptr = p &MaskPrio; + *pptr = *lpptr = p & MaskPrio; if (p & DcrlpFlag) --*lpptr; return (TRUE); @@ -459,12 +464,14 @@ inline static void GNextToken(USES_REGS1) { LOCAL_tokptr = LOCAL_tokptr->TokNext; } -inline static void checkfor(wchar_t c, JMPBUFF *FailBuff, encoding_t enc USES_REGS) { - if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || - LOCAL_tokptr->TokInfo != (Term)c) { +inline static void checkfor(Term c, JMPBUFF *FailBuff, + encoding_t enc USES_REGS) { + if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || LOCAL_tokptr->TokInfo != c) { char s[1024]; - strncpy(s, Yap_tokRep(LOCAL_tokptr, enc), 1023); - syntax_msg("line %d: expected to find \'%c\', found %s", LOCAL_tokptr->TokPos, c, s); + strncpy(s, Yap_tokText(LOCAL_tokptr), 1023); + syntax_msg("line %d: expected to find " + "\'%c....................................\', found %s", + LOCAL_tokptr->TokPos, c, s); FAIL; } NextToken; @@ -472,7 +479,8 @@ inline static void checkfor(wchar_t c, JMPBUFF *FailBuff, encoding_t enc USES_RE #ifdef O_QUASIQUOTATIONS -static int is_quasi_quotation_syntax(Term goal, Atom *pat, encoding_t enc, Term cmod) { +static int is_quasi_quotation_syntax(Term goal, Atom *pat, encoding_t enc, + Term cmod) { CACHE_REGS Term m = cmod, t; Atom at; @@ -520,12 +528,12 @@ static int get_quasi_quotation(term_t t, unsigned char **here, } } - return FALSE; // errorWarning("end_of_file_in_quasi_quotation", 0, _PL_rd); + return false; // errorWarning("end_of_file_in_quasi_quotation", 0, _PL_rd); } #endif /*O_QUASIQUOTATIONS*/ -static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, - Term arg1, encoding_t enc, Term cmod USES_REGS) { +static Term ParseArgs(Atom a, Term close, JMPBUFF *FailBuff, Term arg1, + encoding_t enc, Term cmod USES_REGS) { int nargs = 0; Term *p, t; Functor func; @@ -544,12 +552,12 @@ static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, func = Yap_MkFunctor(a, 1); if (func == NULL) { - syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos ); + syntax_msg("line %d: Heap Overflow", LOCAL_tokptr->TokPos); FAIL; } t = Yap_MkApplTerm(func, nargs, p); if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos ); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); return TermNil; } NextToken; @@ -559,15 +567,15 @@ static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, while (1) { Term *tp = (Term *)ParserAuxSp; if (ParserAuxSp + 1 > LOCAL_TrailTop) { - syntax_msg("line %d: Trail Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Trail Overflow", LOCAL_tokptr->TokPos); FAIL; } - *tp++ = Unsigned(ParseTerm(999, FailBuff, enc,cmod PASS_REGS)); + *tp++ = Unsigned(ParseTerm(999, FailBuff, enc, cmod PASS_REGS)); ParserAuxSp = (char *)tp; ++nargs; if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok)) break; - if (((int)LOCAL_tokptr->TokInfo) != ',') + if (LOCAL_tokptr->TokInfo != TermComma) break; NextToken; } @@ -577,12 +585,12 @@ static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, * order */ if (HR > ASP - (nargs + 1)) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } func = Yap_MkFunctor(a, nargs); if (func == NULL) { - syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Heap Overflow", LOCAL_tokptr->TokPos); FAIL; } #ifdef SFUNC @@ -597,7 +605,7 @@ static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, t = Yap_MkApplTerm(func, nargs, p); #endif if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); return TermNil; } /* check for possible overflow against local stack */ @@ -606,7 +614,8 @@ static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, } static Term MakeAccessor(Term t, Functor f USES_REGS) { - UInt arity = ArityOfFunctor(FunctorOfTerm(t)), i; + UInt arity = ArityOfFunctor(FunctorOfTerm(t)); + int i; Term tf[2], tl = TermNil; tf[1] = ArgOfTerm(1, t); @@ -626,34 +635,35 @@ loop: HR += 2; to_store[0] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS); if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { - if (((int)LOCAL_tokptr->TokInfo) == ',') { + if (LOCAL_tokptr->TokInfo == TermComma) { NextToken; { /* check for possible overflow against local stack */ if (HR > ASP - 4096) { to_store[1] = TermNil; - syntax_msg("line %d: Stack Overflow" ,LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } else { to_store[1] = AbsPair(HR); goto loop; } } - } else if (((int)LOCAL_tokptr->TokInfo) == '|') { + } else if (LOCAL_tokptr->TokInfo == TermVBar) { NextToken; to_store[1] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS); } else { to_store[1] = MkAtomTerm(AtomNil); } } else { - syntax_msg("line %d: looking for symbol ',','|' got symbol '%s'",LOCAL_tokptr->TokPos, - Yap_tokRep(LOCAL_tokptr, enc)); + syntax_msg("line %d: looking for symbol ',','|' got symbol '%s'", + LOCAL_tokptr->TokPos, Yap_tokText(LOCAL_tokptr)); FAIL; } return (o); } -static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USES_REGS) { +static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, + Term cmod USES_REGS) { /* parse term with priority prio */ Volatile Term t; Volatile Functor func; @@ -667,7 +677,7 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE NextToken; /* special rules apply for +1, -2.3, etc... */ if (LOCAL_tokptr->Tok == Number_tok) { - if ((Atom)t == AtomMinus) { + if (t == TermMinus) { t = LOCAL_tokptr->TokInfo; if (IsIntTerm(t)) t = MkIntTerm(-IntOfTerm(t)); @@ -685,12 +695,12 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE } } if ((LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || - Unsigned(LOCAL_tokptr->TokInfo) != 'l') && - IsPrefixOp((Atom)t, &opprio, &oprprio, cmod PASS_REGS)) { + LOCAL_tokptr->TokInfo != Terml) && + IsPrefixOp(AtomOfTerm(t), &opprio, &oprprio, cmod PASS_REGS)) { if (LOCAL_tokptr->Tok == Name_tok) { - Atom at = (Atom)LOCAL_tokptr->TokInfo; + Atom at = AtomOfTerm(LOCAL_tokptr->TokInfo); #ifndef _MSC_VER - if ((Atom)t == AtomPlus) { + if (t == TermPlus) { if (at == AtomInf) { t = MkFloatTerm(INFINITY); NextToken; @@ -700,7 +710,7 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE NextToken; break; } - } else if ((Atom)t == AtomMinus) { + } else if (t == TermMinus) { if (at == AtomInf) { t = MkFloatTerm(-INFINITY); NextToken; @@ -717,25 +727,23 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE /* try to parse as a prefix operator */ TRY( /* build appl on the heap */ - func = Yap_MkFunctor((Atom)t, 1); if (func == NULL) { - syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + func = Yap_MkFunctor(AtomOfTerm(t), 1); if (func == NULL) { + syntax_msg("line %d: Heap Overflow", LOCAL_tokptr->TokPos); FAIL; - } - t = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS); + } t = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS); t = Yap_MkApplTerm(func, 1, &t); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } curprio = opprio; , break;) } } if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && - Unsigned(LOCAL_tokptr->TokInfo) == 'l') - t = ParseArgs((Atom)t, ')', FailBuff, 0L, enc, cmod PASS_REGS); - else - t = MkAtomTerm((Atom)t); + LOCAL_tokptr->TokInfo == Terml) + t = ParseArgs(AtomOfTerm(t), TermEndBracket, FailBuff, 0L, enc, + cmod PASS_REGS); break; case Number_tok: @@ -744,9 +752,9 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE break; case String_tok: /* build list on the heap */ - t = LOCAL_tokptr->TokInfo; - NextToken; - break; + t = LOCAL_tokptr->TokInfo; + NextToken; + break; case Var_tok: varinfo = (VarEntry *)(LOCAL_tokptr->TokInfo); @@ -757,33 +765,34 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE break; case Error_tok: - syntax_msg("line %d: found ill-formed \"%s\"",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + syntax_msg("line %d: found ill-formed \"%s\"", LOCAL_tokptr->TokPos, + Yap_tokText(LOCAL_tokptr)); FAIL; case Ponctuation_tok: - switch ((int)LOCAL_tokptr->TokInfo) { + switch (RepAtom(AtomOfTerm(LOCAL_tokptr->TokInfo))->StrOfAE[0]) { case '(': case 'l': /* non solo ( */ NextToken; t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS); - checkfor(')', FailBuff, enc PASS_REGS); + checkfor(TermEndBracket, FailBuff, enc PASS_REGS); break; case '[': NextToken; if (LOCAL_tokptr->Tok == Ponctuation_tok && - (int)LOCAL_tokptr->TokInfo == ']') { + LOCAL_tokptr->TokInfo == TermEndSquareBracket) { t = TermNil; NextToken; break; } t = ParseList(FailBuff, enc, cmod PASS_REGS); - checkfor(']', FailBuff, enc PASS_REGS); + checkfor(TermEndSquareBracket, FailBuff, enc PASS_REGS); break; case '{': NextToken; if (LOCAL_tokptr->Tok == Ponctuation_tok && - (int)LOCAL_tokptr->TokInfo == '}') { + (int)LOCAL_tokptr->TokInfo == TermEndCurlyBracket) { t = MkAtomTerm(AtomBraces); NextToken; break; @@ -792,13 +801,14 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE t = Yap_MkApplTerm(FunctorBraces, 1, &t); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } - checkfor('}', FailBuff, enc PASS_REGS); + checkfor(TermEndCurlyBracket, FailBuff, enc PASS_REGS); break; default: - syntax_msg("line %d: unexpected ponctuation signal %s",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + syntax_msg("line %d: unexpected ponctuation signal %s", + LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr)); FAIL; } break; @@ -843,12 +853,12 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS); if (LOCAL_tokptr->Tok != QuasiQuotes_tok) { syntax_msg("expected to find quasi quotes, got \"%s\"", , - Yap_tokRep(LOCAL_tokptr, enc)); + Yap_tokText(LOCAL_tokptr)); FAIL; } if (!(is_quasi_quotation_syntax(t, &at))) { syntax_msg("bad quasi quotation syntax, at \"%s\"", - Yap_tokRep(LOCAL_tokptr, enc)); + Yap_tokText(LOCAL_tokptr)); FAIL; } /* Arg 2: the content */ @@ -858,7 +868,7 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE if (!get_quasi_quotation(Yap_InitSlot(ArgOfTerm(2, tn)), &qq->text, qq->text + strlen((const char *)qq->text))) { syntax_msg("could not get quasi quotation, at \"%s\"", - Yap_tokRep(LOCAL_tokptr, enc)); + Yap_tokText(LOCAL_tokptr)); FAIL; } if (positions) { @@ -870,7 +880,7 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE qq->mid.charno + 2, /* end of | token */ PL_INTPTR, qqend - 2)) /* end minus "|}" */ syntax_msg("failed to unify quasi quotation, at \"%s\"", - Yap_tokRep(LOCAL_tokptr, enc)); + Yap_tokText(LOCAL_tokptr)); FAIL; } @@ -889,33 +899,35 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE NextToken; break; default: - syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + syntax_msg("line %d: expected operator, got \'%s\'", LOCAL_tokptr->TokPos, + Yap_tokText(LOCAL_tokptr)); FAIL; } /* main loop to parse infix and posfix operators starts here */ while (true) { + Atom name; if (LOCAL_tokptr->Tok == Ord(Name_tok) && - Yap_HasOp((Atom)(LOCAL_tokptr->TokInfo))) { - Atom save_opinfo = opinfo = (Atom)(LOCAL_tokptr->TokInfo); + Yap_HasOp((name = AtomOfTerm(LOCAL_tokptr->TokInfo)))) { + Atom save_opinfo = opinfo = name; if (IsInfixOp(save_opinfo, &opprio, &oplprio, &oprprio, cmod PASS_REGS) && opprio <= prio && oplprio >= curprio) { /* try parsing as infix operator */ Volatile int oldprio = curprio; TRY3( - func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 2); + func = Yap_MkFunctor(save_opinfo, 2); if (func == NULL) { - syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Heap Overflow", LOCAL_tokptr->TokPos); FAIL; } NextToken; { Term args[2]; args[0] = t; - args[1] = ParseTerm(oprprio, FailBuff,enc, cmod PASS_REGS); + args[1] = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS); t = Yap_MkApplTerm(func, 2, args); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } }, @@ -923,18 +935,18 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE opinfo = save_opinfo; continue;, opinfo = save_opinfo; curprio = oldprio;) } - if (IsPosfixOp(opinfo, &opprio, &oplprio, cmod PASS_REGS) && opprio <= prio && - oplprio >= curprio) { + if (IsPosfixOp(opinfo, &opprio, &oplprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { /* parse as posfix operator */ - Functor func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 1); + Functor func = Yap_MkFunctor(AtomOfTerm(LOCAL_tokptr->TokInfo), 1); if (func == NULL) { - syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Heap Overflow", LOCAL_tokptr->TokPos); FAIL; } t = Yap_MkApplTerm(func, 1, &t); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } curprio = opprio; @@ -944,8 +956,7 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE break; } if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { - if (Unsigned(LOCAL_tokptr->TokInfo) == ',' && prio >= 1000 && - curprio <= 999) { + if (LOCAL_tokptr->TokInfo == TermComma && prio >= 1000 && curprio <= 999) { Volatile Term args[2]; NextToken; args[0] = t; @@ -953,13 +964,14 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE t = Yap_MkApplTerm(FunctorComma, 2, args); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } curprio = 1000; continue; - } else if (Unsigned(LOCAL_tokptr->TokInfo) == '|' && - IsInfixOp(AtomVBar, &opprio, &oplprio, &oprprio, cmod PASS_REGS) && + } else if (LOCAL_tokptr->TokInfo == TermVBar && + IsInfixOp(AtomVBar, &opprio, &oplprio, &oprprio, + cmod PASS_REGS) && opprio <= prio && oplprio >= curprio) { Volatile Term args[2]; NextToken; @@ -968,37 +980,42 @@ static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USE t = Yap_MkApplTerm(FunctorVBar, 2, args); /* check for possible overflow against local stack */ if (HR > ASP - 4096) { - syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + syntax_msg("line %d: Stack Overflow", LOCAL_tokptr->TokPos); FAIL; } curprio = opprio; continue; - } else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' && - IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio, cmod PASS_REGS) && + } else if (LOCAL_tokptr->TokInfo == TermBeginBracket && + IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio, + cmod PASS_REGS) && opprio <= prio && oplprio >= curprio) { - t = ParseArgs(AtomEmptyBrackets, ')', FailBuff, t, enc, cmod PASS_REGS); + t = ParseArgs(AtomEmptyBrackets, TermEndBracket, FailBuff, t, enc, + cmod PASS_REGS); curprio = opprio; continue; - } else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' && - IsPosfixOp(AtomEmptySquareBrackets, &opprio, - &oplprio, cmod PASS_REGS) && + } else if (LOCAL_tokptr->TokInfo == TermBeginSquareBracket && + IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio, + cmod PASS_REGS) && opprio <= prio && oplprio >= curprio) { - t = ParseArgs(AtomEmptySquareBrackets, ']', FailBuff, t, enc, cmod PASS_REGS); + t = ParseArgs(AtomEmptySquareBrackets, TermEndSquareBracket, FailBuff, + t, enc, cmod PASS_REGS); t = MakeAccessor(t, FunctorEmptySquareBrackets PASS_REGS); curprio = opprio; continue; - } else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' && - IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, - &oplprio, cmod PASS_REGS) && + } else if (LOCAL_tokptr->TokInfo == TermBeginCurlyBracket && + IsPosfixOp(AtomBraces, &opprio, &oplprio, + cmod PASS_REGS) && opprio <= prio && oplprio >= curprio) { - t = ParseArgs(AtomEmptyCurlyBrackets, '}', FailBuff, t, enc, cmod PASS_REGS); - t = MakeAccessor(t, FunctorEmptyCurlyBrackets PASS_REGS); + t = ParseArgs(AtomBraces, TermEndCurlyBracket, FailBuff, t, + enc, cmod PASS_REGS); + t = MakeAccessor(t, FunctorBraces PASS_REGS); curprio = opprio; continue; } } - if (LOCAL_tokptr->Tok <= Ord(WString_tok)) { - syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + if (LOCAL_tokptr->Tok <= Ord(String_tok)) { + syntax_msg("line %d: expected operator, got \'%s\'", LOCAL_tokptr->TokPos, + Yap_tokText(LOCAL_tokptr)); FAIL; } break; @@ -1011,6 +1028,7 @@ Term Yap_Parse(UInt prio, encoding_t enc, Term cmod) { Volatile Term t; JMPBUFF FailBuff; yhandle_t sls = Yap_StartSlots(); + LOCAL_toktide = LOCAL_tokptr; if (!sigsetjmp(FailBuff.JmpBuff, 0)) { @@ -1027,22 +1045,23 @@ Term Yap_Parse(UInt prio, encoding_t enc, Term cmod) { } #endif Yap_CloseSlots(sls); - if (LOCAL_tokptr != NULL && LOCAL_tokptr->Tok != Ord(eot_tok)) { - LOCAL_Error_TYPE = SYNTAX_ERROR; - LOCAL_ErrorMessage = "term does not end on . "; - t = 0; - } - if (t != 0 && LOCAL_Error_TYPE == SYNTAX_ERROR) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - LOCAL_ErrorMessage = NULL; - } - // if (LOCAL_tokptr->Tok != Ord(eot_tok)) - // return (0L); - return t; } - Yap_CloseSlots(sls); - - return (0); + if (LOCAL_tokptr != NULL && LOCAL_tokptr->Tok != Ord(eot_tok)) { + LOCAL_Error_TYPE = SYNTAX_ERROR; + if (LOCAL_tokptr->TokNext) { + LOCAL_ErrorMessage = "operator misssing . "; + } else { + LOCAL_ErrorMessage = "term does not end on . "; + } + t = 0; + } + if (t != 0 && LOCAL_Error_TYPE == SYNTAX_ERROR) { + LOCAL_Error_TYPE = YAP_NO_ERROR; + LOCAL_ErrorMessage = NULL; + } + // if (LOCAL_tokptr->Tok != Ord(eot_tok)) + // return (0L); + return t; } //! @} diff --git a/C/pold.c b/C/pold.c new file mode 100755 index 000000000..82c35294e --- /dev/null +++ b/C/pold.c @@ -0,0 +1,1047 @@ +/************************************************************************* +* * +* YAP Prolog * +* * +* Yap Prolog was developed at NCCUP - Universidade do Porto * +* * +* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * +* * +************************************************************************** +* * +* File: parser.c * +* Last rev: * +* mods: * +* comments: Prolog's parser * +* * +*************************************************************************/ +#ifdef SCCS +static char SccsId[] = "%W% %G%"; +#endif + +/** + +@defgroup YAPSyntax YAP Syntax +@ingroup YAPProgramming +@{ + +We will describe the syntax of YAP at two levels. We first will +describe the syntax for Prolog terms. In a second level we describe +the \a tokens from which Prolog \a terms are +built. + +@defgroup Formal_Syntax Syntax of Terms +@ingroup Syntax +@{ + +Below, we describe the syntax of YAP terms from the different +classes of tokens defined above. The formalism used will be BNF, +extended where necessary with attributes denoting integer precedence or +operator type. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + term +----> subterm(1200) end_of_term_marker + + subterm(N) ----> term(M) [M <= N] + + term(N) ----> op(N, fx) subterm(N-1) + | op(N, fy) subterm(N) + | subterm(N-1) op(N, xfx) subterm(N-1) + | subterm(N-1) op(N, xfy) subterm(N) + | subterm(N) op(N, yfx) subterm(N-1) + | subterm(N-1) op(N, xf) + | subterm(N) op(N, yf) + + term(0) ----> atom '(' arguments ')' + | '(' subterm(1200) ')' + | '{' subterm(1200) '}' + | list + | string + | number + | atom + | variable + + arguments ----> subterm(999) + | subterm(999) ',' arguments + + list ----> '[]' + | '[' list_expr ']' + + list_expr ----> subterm(999) + | subterm(999) list_tail + + list_tail ----> ',' list_expr + | ',..' subterm(999) + | '|' subterm(999) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Notes: + + + \a op(N,T) denotes an atom which has been previously declared with type + \a T and base precedence \a N. + + + Since ',' is itself a pre-declared operator with type \a xfy and + precedence 1000, is \a subterm starts with a '(', \a op must be + followed by a space to avoid ambiguity with the case of a functor + followed by arguments, e.g.: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ (a,b) [the same as '+'(','(a,b)) of arity one] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + versus + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++(a,b) [the same as '+'(a,b) of arity two] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +In the first rule for term(0) no blank space should exist between +\a atom and '('. + + + +Each term to be read by the YAP parser must end with a single +dot, followed by a blank (in the sense mentioned in the previous +paragraph). When a name consisting of a single dot could be taken for +the end of term marker, the ambiguity should be avoided by surrounding the +dot with single quotes. + +@} + +*/ + +/* + * Description: + * + * parser: produces a prolog term from an array of tokens + * + * parser usage: the parser takes its input from an array of token descriptions + * addressed by the global variable 'tokptr' and produces a Term as result. A + * macro 'NextToken' should be defined in 'yap.h' for advancing 'tokptr' from + * one token to the next. In the distributed version this macro also updates + * a variable named 'toktide' for keeping track of how far the parser went + * before failling with a syntax error. The parser should be invoked with + * 'tokptr' pointing to the first token. The last token should have type + * 'eot_tok'. The parser return either a Term. Syntactic errors are signaled + * by a return value 0. The parser builds new terms on the 'global stack' and + * also uses an auxiliary stack pointed to by 'AuxSp'. In the distributed + * version this auxiliary stack is assumed to grow downwards. This + * assumption, however, is only relevant to routine 'ParseArgs', and to the + * variable toktide. conclusion: set tokptr pointing to first token set AuxSp + * Call Parse + * + * VSC: Working whithout known bugs in 87/4/6 + * + * LD: -I or +I evaluated by parser 87/4/28 + * + * LD: parser extended 87/4/28 + * + */ + +#include "Yap.h" +#include "Yatom.h" +#include "YapHeap.h" +#include "YapText.h" +#include "yapio.h" +#include "eval.h" +/* stuff we want to use in standard YAP code */ +#include "iopreds.h" +#if HAVE_STRING_H +#include +#endif +#if HAVE_STDARG_H +#include +#endif + +#ifdef __STDC__XXX +#define Volatile volatile +#else +#define Volatile +#endif + +/* weak backtraking mechanism based on long_jump */ + +typedef struct jmp_buff_struct { sigjmp_buf JmpBuff; } JMPBUFF; + +static void GNextToken(CACHE_TYPE1); +static void checkfor(wchar_t, JMPBUFF *, encoding_t CACHE_TYPE); +static Term ParseArgs(Atom, wchar_t, JMPBUFF *, Term, encoding_t, Term CACHE_TYPE); +static Term ParseList(JMPBUFF *, encoding_t, Term CACHE_TYPE); +static Term ParseTerm(int, JMPBUFF *, encoding_t, Term CACHE_TYPE); + +const char *Yap_tokRep(TokEntry *tokptr, encoding_t enc); + +static void syntax_msg(const char *msg, ...) { + CACHE_REGS + va_list ap; + + if (LOCAL_toktide == LOCAL_tokptr) { + LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE+1); + va_start(ap, msg); + vsnprintf(LOCAL_ErrorMessage, YAP_FILENAME_MAX , msg, ap); + LOCAL_Error_TYPE = SYNTAX_ERROR; + va_end(ap); + } +} + +#define TRY(S, P) \ + { \ + Volatile JMPBUFF *saveenv, newenv; \ + Volatile TokEntry *saveT = LOCAL_tokptr; \ + Volatile CELL *saveH = HR; \ + Volatile int savecurprio = curprio; \ + saveenv = FailBuff; \ + if (!sigsetjmp(newenv.JmpBuff, 0)) { \ + FailBuff = &newenv; \ + S; \ + FailBuff = saveenv; \ + P; \ + } else { \ + FailBuff = saveenv; \ + HR = saveH; \ + curprio = savecurprio; \ + LOCAL_tokptr = saveT; \ + } \ + } + +#define TRY3(S, P, F) \ + { \ + Volatile JMPBUFF *saveenv, newenv; \ + Volatile TokEntry *saveT = LOCAL_tokptr; \ + Volatile CELL *saveH = HR; \ + saveenv = FailBuff; \ + if (!sigsetjmp(newenv.JmpBuff, 0)) { \ + FailBuff = &newenv; \ + S; \ + FailBuff = saveenv; \ + P; \ + } else { \ + FailBuff = saveenv; \ + HR = saveH; \ + LOCAL_tokptr = saveT; \ + F \ + } \ + } + +#define FAIL siglongjmp(FailBuff->JmpBuff, 1) + +VarEntry * +Yap_LookupVar(const char *var) /* lookup variable in variables table */ +{ + CACHE_REGS + VarEntry *p; + +#if DEBUG + if (GLOBAL_Option[4]) + fprintf(stderr, "[LookupVar %s]", var); +#endif + if (var[0] != '_' || var[1] != '\0') { + VarEntry **op = &LOCAL_VarTable; + UInt hv; + + p = LOCAL_VarTable; + hv = HashFunction((unsigned char *)var) % AtomHashTableSize; + while (p != NULL) { + CELL hpv = p->hv; + if (hv == hpv) { + Int scmp; + if ((scmp = strcmp(var, p->VarRep)) == 0) { + p->refs++; + return (p); + } else if (scmp < 0) { + op = &(p->VarLeft); + p = p->VarLeft; + } else { + op = &(p->VarRight); + p = p->VarRight; + } + } else if (hv < hpv) { + op = &(p->VarLeft); + p = p->VarLeft; + } else { + op = &(p->VarRight); + p = p->VarRight; + } + } + p = (VarEntry *)Yap_AllocScannerMemory(strlen(var) + sizeof(VarEntry)); + *op = p; + p->VarLeft = p->VarRight = NULL; + p->hv = hv; + p->refs = 1L; + strcpy(p->VarRep, var); + } else { + /* anon var */ + p = (VarEntry *)Yap_AllocScannerMemory(sizeof(VarEntry) + 2); + p->VarLeft = LOCAL_AnonVarTable; + LOCAL_AnonVarTable = p; + p->VarRight = NULL; + p->refs = 0L; + p->hv = 1L; + p->VarRep[0] = '_'; + p->VarRep[1] = '\0'; + } + p->VarAdr = TermNil; + return (p); +} + +static Term VarNames(VarEntry *p, Term l USES_REGS) { + if (p != NULL) { + if (strcmp(p->VarRep, "_") != 0) { + Term t[2]; + Term o; + + t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); + if (!IsVarTerm(p->VarAdr)) + p->VarAdr = MkVarTerm(); + t[1] = p->VarAdr; + o = Yap_MkApplTerm(FunctorEq, 2, t); + o = MkPairTerm(o, VarNames(p->VarRight, + VarNames(p->VarLeft, l PASS_REGS) PASS_REGS)); + if (HR > ASP - 4096) { + save_machine_regs(); + siglongjmp(LOCAL_IOBotch, 1); + } + return (o); + } else { + return VarNames(p->VarRight, VarNames(p->VarLeft, l PASS_REGS) PASS_REGS); + } + } else { + return (l); + } +} + +Term Yap_VarNames(VarEntry *p, Term l) { + CACHE_REGS + return VarNames(p, l PASS_REGS); +} + +static Term Singletons(VarEntry *p, Term l USES_REGS) { + if (p != NULL) { + if (p->VarRep[0] != '_' && p->refs == 1) { + Term t[2]; + Term o; + + t[0] = MkAtomTerm(Yap_LookupAtom(p->VarRep)); + t[1] = p->VarAdr; + o = Yap_MkApplTerm(FunctorEq, 2, t); + o = MkPairTerm(o, + Singletons(p->VarRight, + Singletons(p->VarLeft, l PASS_REGS) PASS_REGS)); + if (HR > ASP - 4096) { + save_machine_regs(); + siglongjmp(LOCAL_IOBotch, 1); + } + return (o); + } else { + return Singletons(p->VarRight, + Singletons(p->VarLeft, l PASS_REGS) PASS_REGS); + } + } else { + return (l); + } +} + +Term Yap_Singletons(VarEntry *p, Term l) { + CACHE_REGS + return Singletons(p, l PASS_REGS); +} + +static Term Variables(VarEntry *p, Term l USES_REGS) { + if (p != NULL) { + Term o; + o = MkPairTerm( + p->VarAdr, + Variables(p->VarRight, Variables(p->VarLeft, l PASS_REGS) PASS_REGS)); + if (HR > ASP - 4096) { + save_machine_regs(); + siglongjmp(LOCAL_IOBotch, 1); + } + return (o); + } else { + return (l); + } +} + +Term Yap_Variables(VarEntry *p, Term l) { + CACHE_REGS + return Variables(p, l PASS_REGS); +} + +static int IsPrefixOp(Atom op, int *pptr, int *rpptr, Term cmod USES_REGS) { + int p; + + OpEntry *opp = Yap_GetOpProp(op, PREFIX_OP, cmod PASS_REGS); + if (!opp) + return FALSE; + if (opp->OpModule && opp->OpModule != cmod) { + READ_UNLOCK(opp->OpRWLock); + return FALSE; + } + if ((p = opp->Prefix) != 0) { + READ_UNLOCK(opp->OpRWLock); + *pptr = *rpptr = p &MaskPrio; + if (p & DcrrpFlag) + --*rpptr; + return TRUE; + } else { + READ_UNLOCK(opp->OpRWLock); + return FALSE; + } +} + +int Yap_IsPrefixOp(Atom op, int *pptr, int *rpptr) { + CACHE_REGS + return IsPrefixOp(op, pptr, rpptr, CurrentModule PASS_REGS); +} + +static int IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr, Term cmod USES_REGS) { + int p; + + OpEntry *opp = Yap_GetOpProp(op, INFIX_OP, cmod PASS_REGS); + if (!opp) + return FALSE; + if (opp->OpModule && opp->OpModule != cmod) { + READ_UNLOCK(opp->OpRWLock); + return FALSE; + } + if ((p = opp->Infix) != 0) { + READ_UNLOCK(opp->OpRWLock); + *pptr = *rpptr = *lpptr = p &MaskPrio; + if (p & DcrrpFlag) + --*rpptr; + if (p & DcrlpFlag) + --*lpptr; + return TRUE; + } else { + READ_UNLOCK(opp->OpRWLock); + return FALSE; + } +} + +int Yap_IsInfixOp(Atom op, int *pptr, int *lpptr, int *rpptr) { + CACHE_REGS + return IsInfixOp(op, pptr, lpptr, rpptr, CurrentModule PASS_REGS); +} + +static int IsPosfixOp(Atom op, int *pptr, int *lpptr, Term cmod USES_REGS) { + int p; + + OpEntry *opp = Yap_GetOpProp(op, POSFIX_OP, cmod PASS_REGS); + if (!opp) + return FALSE; + if (opp->OpModule && opp->OpModule != cmod) { + READ_UNLOCK(opp->OpRWLock); + return FALSE; + } + if ((p = opp->Posfix) != 0) { + READ_UNLOCK(opp->OpRWLock); + *pptr = *lpptr = p &MaskPrio; + if (p & DcrlpFlag) + --*lpptr; + return (TRUE); + } else { + READ_UNLOCK(opp->OpRWLock); + return (FALSE); + } +} + +int Yap_IsPosfixOp(Atom op, int *pptr, int *lpptr) { + CACHE_REGS + return IsPosfixOp(op, pptr, lpptr, CurrentModule PASS_REGS); +} + +inline static void GNextToken(USES_REGS1) { + if (LOCAL_tokptr->Tok == Ord(eot_tok)) + return; + if (LOCAL_tokptr == LOCAL_toktide) { + LOCAL_toktide = LOCAL_tokptr = LOCAL_tokptr->TokNext; + } else + LOCAL_tokptr = LOCAL_tokptr->TokNext; +} + +inline static void checkfor(wchar_t c, JMPBUFF *FailBuff, encoding_t enc USES_REGS) { + if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || + LOCAL_tokptr->TokInfo != (Term)c) { + char s[1024]; + strncpy(s, Yap_tokRep(LOCAL_tokptr, enc), 1023); + syntax_msg("line %d: expected to find \'%c\', found %s", LOCAL_tokptr->TokPos, c, s); + FAIL; + } + NextToken; +} + +#ifdef O_QUASIQUOTATIONS + +static int is_quasi_quotation_syntax(Term goal, Atom *pat, encoding_t enc, Term cmod) { + CACHE_REGS + Term m = cmod, t; + Atom at; + UInt arity; + Functor f; + + t = Yap_StripModule(goal, &m); + f = FunctorOfTerm(t); + *pat = at = NameOfFunctor(f); + arity = ArityOfFunctor(f); + if (arity > 0) + return TRUE; + return FALSE; +} + +static int get_quasi_quotation(term_t t, unsigned char **here, + unsigned char *ein) { + unsigned char *in, *start = *here; + + for (in = start; in <= ein; in++) { + if (in[0] == '}' && in[-1] == '|') { + *here = in + 1; /* after } */ + in--; /* Before | */ + + if (LOCAL_quasi_quotations) /* option; must return strings */ + { + PL_chars_t txt; + int rc; + + txt.text.t = (char *)start; + txt.length = in - start; + txt.storage = PL_CHARS_HEAP; + txt.encoding = ENC_UTF8; + txt.canonical = FALSE; + + rc = PL_unify_text(t, 0, &txt, PL_CODE_LIST); + PL_free_text(&txt); + + return rc; + } else { + return PL_unify_term(t, PL_FUNCTOR, FUNCTOR_dquasi_quotation3, + PL_POINTER, LOCAL, PL_INTPTR, (intptr_t)(start), + PL_INTPTR, (intptr_t)(in - start)); + } + } + } + + return FALSE; // errorWarning("end_of_file_in_quasi_quotation", 0, _PL_rd); +} +#endif /*O_QUASIQUOTATIONS*/ + +static Term ParseArgs(Atom a, wchar_t close, JMPBUFF *FailBuff, + Term arg1, encoding_t enc, Term cmod USES_REGS) { + int nargs = 0; + Term *p, t; + Functor func; +#ifdef SFUNC + SFEntry *pe = (SFEntry *)Yap_GetAProp(a, SFProperty); +#endif + + NextToken; + p = (Term *)ParserAuxSp; + if (arg1) { + *p = arg1; + nargs++; + ParserAuxSp = (char *)(p + 1); + if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && + LOCAL_tokptr->TokInfo == close) { + + func = Yap_MkFunctor(a, 1); + if (func == NULL) { + syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos ); + FAIL; + } + t = Yap_MkApplTerm(func, nargs, p); + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos ); + return TermNil; + } + NextToken; + return t; + } + } + while (1) { + Term *tp = (Term *)ParserAuxSp; + if (ParserAuxSp + 1 > LOCAL_TrailTop) { + syntax_msg("line %d: Trail Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + *tp++ = Unsigned(ParseTerm(999, FailBuff, enc,cmod PASS_REGS)); + ParserAuxSp = (char *)tp; + ++nargs; + if (LOCAL_tokptr->Tok != Ord(Ponctuation_tok)) + break; + if (((int)LOCAL_tokptr->TokInfo) != ',') + break; + NextToken; + } + ParserAuxSp = (char *)p; + /* + * Needed because the arguments for the functor are placed in reverse + * order + */ + if (HR > ASP - (nargs + 1)) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + func = Yap_MkFunctor(a, nargs); + if (func == NULL) { + syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + FAIL; + } +#ifdef SFUNC + if (pe) + t = MkSFTerm(Yap_MkFunctor(a, SFArity), nargs, p, pe->NilValue); + else + t = Yap_MkApplTerm(Yap_MkFunctor(a, nargs), nargs, p); +#else + if (a == AtomDBref && nargs == 2) + t = MkDBRefTerm((DBRef)IntegerOfTerm(p[0])); + else + t = Yap_MkApplTerm(func, nargs, p); +#endif + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + return TermNil; + } + /* check for possible overflow against local stack */ + checkfor(close, FailBuff, enc PASS_REGS); + return t; +} + +static Term MakeAccessor(Term t, Functor f USES_REGS) { + UInt arity = ArityOfFunctor(FunctorOfTerm(t)), i; + Term tf[2], tl = TermNil; + + tf[1] = ArgOfTerm(1, t); + for (i = arity; i > 1; i--) { + tl = MkPairTerm(ArgOfTerm(i, t), tl); + } + tf[0] = tl; + return Yap_MkApplTerm(f, 2, tf); +} + +static Term ParseList(JMPBUFF *FailBuff, encoding_t enc, Term cmod USES_REGS) { + Term o; + CELL *to_store; + o = AbsPair(HR); +loop: + to_store = HR; + HR += 2; + to_store[0] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS); + if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { + if (((int)LOCAL_tokptr->TokInfo) == ',') { + NextToken; + { + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + to_store[1] = TermNil; + syntax_msg("line %d: Stack Overflow" ,LOCAL_tokptr->TokPos); + FAIL; + } else { + to_store[1] = AbsPair(HR); + goto loop; + } + } + } else if (((int)LOCAL_tokptr->TokInfo) == '|') { + NextToken; + to_store[1] = ParseTerm(999, FailBuff, enc, cmod PASS_REGS); + } else { + to_store[1] = MkAtomTerm(AtomNil); + } + } else { + syntax_msg("line %d: looking for symbol ',','|' got symbol '%s'",LOCAL_tokptr->TokPos, + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + return (o); +} + +static Term ParseTerm(int prio, JMPBUFF *FailBuff, encoding_t enc, Term cmod USES_REGS) { + /* parse term with priority prio */ + Volatile Term t; + Volatile Functor func; + Volatile VarEntry *varinfo; + Volatile int curprio = 0, opprio, oplprio, oprprio; + Volatile Atom opinfo; + + switch (LOCAL_tokptr->Tok) { + case Name_tok: + t = LOCAL_tokptr->TokInfo; + NextToken; + /* special rules apply for +1, -2.3, etc... */ + if (LOCAL_tokptr->Tok == Number_tok) { + if ((Atom)t == AtomMinus) { + t = LOCAL_tokptr->TokInfo; + if (IsIntTerm(t)) + t = MkIntTerm(-IntOfTerm(t)); + else if (IsFloatTerm(t)) + t = MkFloatTerm(-FloatOfTerm(t)); +#ifdef USE_GMP + else if (IsBigIntTerm(t)) { + t = Yap_gmp_neg_big(t); + } +#endif + else + t = MkLongIntTerm(-LongIntOfTerm(t)); + NextToken; + break; + } + } + if ((LOCAL_tokptr->Tok != Ord(Ponctuation_tok) || + Unsigned(LOCAL_tokptr->TokInfo) != 'l') && + IsPrefixOp((Atom)t, &opprio, &oprprio, cmod PASS_REGS)) { + if (LOCAL_tokptr->Tok == Name_tok) { + Atom at = (Atom)LOCAL_tokptr->TokInfo; +#ifndef _MSC_VER + if ((Atom)t == AtomPlus) { + if (at == AtomInf) { + t = MkFloatTerm(INFINITY); + NextToken; + break; + } else if (at == AtomNan) { + t = MkFloatTerm(NAN); + NextToken; + break; + } + } else if ((Atom)t == AtomMinus) { + if (at == AtomInf) { + t = MkFloatTerm(-INFINITY); + NextToken; + break; + } else if (at == AtomNan) { + t = MkFloatTerm(NAN); + NextToken; + break; + } + } +#endif + } + if (opprio <= prio) { + /* try to parse as a prefix operator */ + TRY( + /* build appl on the heap */ + func = Yap_MkFunctor((Atom)t, 1); if (func == NULL) { + syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + t = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS); + t = Yap_MkApplTerm(func, 1, &t); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } curprio = opprio; + , break;) + } + } + if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok) && + Unsigned(LOCAL_tokptr->TokInfo) == 'l') + t = ParseArgs((Atom)t, ')', FailBuff, 0L, enc, cmod PASS_REGS); + else + t = MkAtomTerm((Atom)t); + break; + + case Number_tok: + t = LOCAL_tokptr->TokInfo; + NextToken; + break; + + case String_tok: /* build list on the heap */ + t = LOCAL_tokptr->TokInfo; + NextToken; + break; + + case Var_tok: + varinfo = (VarEntry *)(LOCAL_tokptr->TokInfo); + if ((t = varinfo->VarAdr) == TermNil) { + t = varinfo->VarAdr = MkVarTerm(); + } + NextToken; + break; + + case Error_tok: + syntax_msg("line %d: found ill-formed \"%s\"",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + + case Ponctuation_tok: + + switch ((int)LOCAL_tokptr->TokInfo) { + case '(': + case 'l': /* non solo ( */ + NextToken; + t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS); + checkfor(')', FailBuff, enc PASS_REGS); + break; + case '[': + NextToken; + if (LOCAL_tokptr->Tok == Ponctuation_tok && + (int)LOCAL_tokptr->TokInfo == ']') { + t = TermNil; + NextToken; + break; + } + t = ParseList(FailBuff, enc, cmod PASS_REGS); + checkfor(']', FailBuff, enc PASS_REGS); + break; + case '{': + NextToken; + if (LOCAL_tokptr->Tok == Ponctuation_tok && + (int)LOCAL_tokptr->TokInfo == '}') { + t = MkAtomTerm(AtomBraces); + NextToken; + break; + } + t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS); + t = Yap_MkApplTerm(FunctorBraces, 1, &t); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + checkfor('}', FailBuff, enc PASS_REGS); + break; + default: + syntax_msg("line %d: unexpected ponctuation signal %s",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + break; + +#if QQ + case QuasiQuotes_tok: { + qq_t *qq = (qq_t *)(LOCAL_tokptr->TokInfo); + term_t pv, positions = LOCAL_subtpos, to; + Atom at; + Term tn; + CELL *tnp; + + // from SWI, enter the list + /* prepare (if we are the first in term) */ + if (!LOCAL_varnames) + LOCAL_varnames = PL_new_term_ref(); + if (!LOCAL_qq) { + if (LOCAL_quasi_quotations) { + LOCAL_qq = LOCAL_quasi_quotations; + } else { + if (!(LOCAL_qq = PL_new_term_ref())) + return FALSE; + } + // create positions term + if (positions) { + if (!(pv = PL_new_term_refs(3)) || + !PL_unify_term(positions, PL_FUNCTOR, + FUNCTOR_quasi_quotation_position5, PL_INTPTR, + qq->start.charno, PL_VARIABLE, PL_TERM, + pv + 0, // leave three open slots + PL_TERM, pv + 1, PL_TERM, pv + 2)) + return FALSE; + } else + pv = 0; + /* push type */ + + if (!(LOCAL_qq_tail = PL_copy_term_ref(LOCAL_qq))) + return FALSE; + } + + NextToken; + t = ParseTerm(GLOBAL_MaxPriority, FailBuff, enc, cmod PASS_REGS); + if (LOCAL_tokptr->Tok != QuasiQuotes_tok) { + syntax_msg("expected to find quasi quotes, got \"%s\"", , + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + if (!(is_quasi_quotation_syntax(t, &at))) { + syntax_msg("bad quasi quotation syntax, at \"%s\"", + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + /* Arg 2: the content */ + tn = Yap_MkNewApplTerm(SWIFunctorToFunctor(FUNCTOR_quasi_quotation4), 4); + tnp = RepAppl(tn) + 1; + tnp[0] = MkAtomTerm(at); + if (!get_quasi_quotation(Yap_InitSlot(ArgOfTerm(2, tn)), &qq->text, + qq->text + strlen((const char *)qq->text))) { + syntax_msg("could not get quasi quotation, at \"%s\"", + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + if (positions) { + intptr_t qqend = qq->end.charno; + + // set_range_position(positions, -1, qqend PASS_LD); + if (!PL_unify_term(Yap_InitSlot(ArgOfTerm(2, t)), PL_FUNCTOR, + FUNCTOR_minus2, PL_INTPTR, + qq->mid.charno + 2, /* end of | token */ + PL_INTPTR, qqend - 2)) /* end minus "|}" */ + syntax_msg("failed to unify quasi quotation, at \"%s\"", + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + + tnp[2] = Yap_GetFromSlot(LOCAL_varnames); /* Arg 3: the var dictionary */ + /* Arg 4: the result */ + t = ArgOfTerm(4, tn); + if (!(to = PL_new_term_ref()) || + !PL_unify_list(LOCAL_qq_tail, to, LOCAL_qq_tail) || + !PL_unify(to, Yap_InitSlot(tn))) { + syntax_msg("failed to unify quasi quotation, at \"%s\"", + Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + } +#endif + NextToken; + break; + default: + syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + + /* main loop to parse infix and posfix operators starts here */ + while (true) { + if (LOCAL_tokptr->Tok == Ord(Name_tok) && + Yap_HasOp((Atom)(LOCAL_tokptr->TokInfo))) { + Atom save_opinfo = opinfo = (Atom)(LOCAL_tokptr->TokInfo); + if (IsInfixOp(save_opinfo, &opprio, &oplprio, &oprprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { + /* try parsing as infix operator */ + Volatile int oldprio = curprio; + TRY3( + func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 2); + if (func == NULL) { + syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + FAIL; + } NextToken; + { + Term args[2]; + args[0] = t; + args[1] = ParseTerm(oprprio, FailBuff,enc, cmod PASS_REGS); + t = Yap_MkApplTerm(func, 2, args); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + }, + curprio = opprio; + opinfo = save_opinfo; continue;, opinfo = save_opinfo; + curprio = oldprio;) + } + if (IsPosfixOp(opinfo, &opprio, &oplprio, cmod PASS_REGS) && opprio <= prio && + oplprio >= curprio) { + /* parse as posfix operator */ + Functor func = Yap_MkFunctor((Atom)LOCAL_tokptr->TokInfo, 1); + if (func == NULL) { + syntax_msg("line %d: Heap Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + t = Yap_MkApplTerm(func, 1, &t); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + curprio = opprio; + NextToken; + continue; + } + break; + } + if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)) { + if (Unsigned(LOCAL_tokptr->TokInfo) == ',' && prio >= 1000 && + curprio <= 999) { + Volatile Term args[2]; + NextToken; + args[0] = t; + args[1] = ParseTerm(1000, FailBuff, enc, cmod PASS_REGS); + t = Yap_MkApplTerm(FunctorComma, 2, args); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + curprio = 1000; + continue; + } else if (Unsigned(LOCAL_tokptr->TokInfo) == '|' && + IsInfixOp(AtomVBar, &opprio, &oplprio, &oprprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { + Volatile Term args[2]; + NextToken; + args[0] = t; + args[1] = ParseTerm(oprprio, FailBuff, enc, cmod PASS_REGS); + t = Yap_MkApplTerm(FunctorVBar, 2, args); + /* check for possible overflow against local stack */ + if (HR > ASP - 4096) { + syntax_msg("line %d: Stack Overflow",LOCAL_tokptr->TokPos); + FAIL; + } + curprio = opprio; + continue; + } else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' && + IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { + t = ParseArgs(AtomEmptyBrackets, ')', FailBuff, t, enc, cmod PASS_REGS); + curprio = opprio; + continue; + } else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' && + IsPosfixOp(AtomEmptySquareBrackets, &opprio, + &oplprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { + t = ParseArgs(AtomEmptySquareBrackets, ']', FailBuff, t, enc, cmod PASS_REGS); + t = MakeAccessor(t, FunctorEmptySquareBrackets PASS_REGS); + curprio = opprio; + continue; + } else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' && + IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, + &oplprio, cmod PASS_REGS) && + opprio <= prio && oplprio >= curprio) { + t = ParseArgs(AtomEmptyCurlyBrackets, '}', FailBuff, t, enc, cmod PASS_REGS); + t = MakeAccessor(t, FunctorEmptyCurlyBrackets PASS_REGS); + curprio = opprio; + continue; + } + } + if (LOCAL_tokptr->Tok <= Ord(WString_tok)) { + syntax_msg("line %d: expected operator, got \'%s\'",LOCAL_tokptr->TokPos, Yap_tokRep(LOCAL_tokptr, enc)); + FAIL; + } + break; + } + return t; +} + +Term Yap_Parse(UInt prio, encoding_t enc, Term cmod) { + CACHE_REGS + Volatile Term t; + JMPBUFF FailBuff; + yhandle_t sls = Yap_StartSlots(); + + if (!sigsetjmp(FailBuff.JmpBuff, 0)) { + + t = ParseTerm(prio, &FailBuff, enc, cmod PASS_REGS); +#if DEBUG + if (GLOBAL_Option['p' - 'a' + 1]) { + Yap_DebugPutc(stderr, '['); + if (t == 0) + Yap_DebugPlWrite(MkIntTerm(0)); + else + Yap_DebugPlWrite(t); + Yap_DebugPutc(stderr, ']'); + Yap_DebugPutc(stderr, '\n'); + } +#endif + Yap_CloseSlots(sls); + if (LOCAL_tokptr != NULL && LOCAL_tokptr->Tok != Ord(eot_tok)) { + LOCAL_Error_TYPE = SYNTAX_ERROR; + LOCAL_ErrorMessage = "term does not end on . "; + t = 0; + } + if (t != 0 && LOCAL_Error_TYPE == SYNTAX_ERROR) { + LOCAL_Error_TYPE = YAP_NO_ERROR; + LOCAL_ErrorMessage = NULL; + } + // if (LOCAL_tokptr->Tok != Ord(eot_tok)) + // return (0L); + return t; + } + Yap_CloseSlots(sls); + + return (0); +} + +//! @} diff --git a/C/prim_absmi_insts.h b/C/prim_absmi_insts.h index 419bb48cf..fc10ba1a4 100644 --- a/C/prim_absmi_insts.h +++ b/C/prim_absmi_insts.h @@ -8,7 +8,6 @@ { #endif /* INDENT_CODE */ - Op(p_plus_vv, xxx); BEGD(d0); BEGD(d1); @@ -23,17 +22,10 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) + IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_plus(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -41,17 +33,13 @@ BEGP(pt0); deref_body(d0, pt0, plus_vv_unk, plus_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is _+B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, plus_vv_nvar_unk, plus_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -63,33 +51,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, plus_vc_unk); - plus_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) + d1); - } - else { - saveregs(); - d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + plus_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) + d1); + } else { + saveregs(); + d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, plus_vc_unk, plus_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A + " Int_FORMAT, PREG->y_u.xxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -109,38 +87,27 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) + IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_plus(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, plus_y_vv_unk, plus_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, plus_y_vv_nvar_unk, plus_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A+B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -152,36 +119,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, plus_y_vc_unk); - plus_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) + d1); - } - else { - saveregs(); - d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + plus_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) + d1); + } else { + saveregs(); + d0 = p_plus(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, plus_y_vc_unk, plus_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A + " Int_FORMAT, PREG->y_u.yxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -201,17 +158,10 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) - IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_minus(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -219,17 +169,13 @@ BEGP(pt0); deref_body(d0, pt0, minus_vv_unk, minus_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, minus_vv_nvar_unk, minus_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); ENDD(d1); @@ -241,33 +187,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, minus_cv_unk); - minus_cv_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(d1 - IntOfTerm(d0)); - } - else { - saveregs(); - d0 = p_minus(MkIntegerTerm(d1),Yap_Eval(d0) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + minus_cv_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(d1 - IntOfTerm(d0)); + } else { + saveregs(); + d0 = p_minus(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, minus_cv_unk, minus_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is " Int_FORMAT "-A", PREG->y_u.xxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -287,38 +223,27 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) - IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_minus(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, minus_y_vv_unk, minus_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, minus_y_vv_nvar_unk, minus_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A-B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -330,36 +255,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, minus_y_cv_unk); - minus_y_cv_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(d1 - IntOfTerm(d0)); - } - else { - saveregs(); - d0 = p_minus(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + minus_y_cv_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(d1 - IntOfTerm(d0)); + } else { + saveregs(); + d0 = p_minus(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, minus_y_cv_unk, minus_y_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is " Int_FORMAT "-A", PREG->y_u.yxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -379,17 +294,9 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = times_int(IntOfTerm(d0), IntOfTerm(d1) PASS_REGS); - } - else { + } else { saveregs(); d0 = p_times(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -397,17 +304,13 @@ BEGP(pt0); deref_body(d0, pt0, times_vv_unk, times_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, times_vv_nvar_unk, times_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -419,33 +322,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, times_vc_unk); - times_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = times_int(IntOfTerm(d0), d1 PASS_REGS); - } - else { - saveregs(); - d0 = p_times(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + times_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = times_int(IntOfTerm(d0), d1 PASS_REGS); + } else { + saveregs(); + d0 = p_times(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, times_vc_unk, times_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A* " Int_FORMAT, PREG->y_u.xxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -465,38 +358,27 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = times_int(IntOfTerm(d0), IntOfTerm(d1) PASS_REGS); - } - else { + } else { saveregs(); d0 = p_times(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, times_y_vv_unk, times_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, times_y_vv_nvar_unk, times_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A*B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -508,36 +390,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, times_y_vc_unk); - times_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = times_int(IntOfTerm(d0), d1 PASS_REGS); - } - else { - saveregs(); - d0 = p_times(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + times_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = times_int(IntOfTerm(d0), d1 PASS_REGS); + } else { + saveregs(); + d0 = p_times(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, times_y_vc_unk, times_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A* " Int_FORMAT, PREG->y_u.yxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -558,23 +430,13 @@ if (IsIntTerm(d0) && IsIntTerm(d1)) { Int div = IntOfTerm(d1); if (div == 0) { - saveregs(); - Yap_NilError(EVALUATION_ERROR_ZERO_DIVISOR,"// /2"); - setregs(); - FAIL(); + Yap_AsmError(EVALUATION_ERROR_ZERO_DIVISOR,d1); } d0 = MkIntTerm(IntOfTerm(d0) / div); - } - else { + } else { saveregs(); d0 = p_div(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -582,17 +444,13 @@ BEGP(pt0); deref_body(d0, pt0, div_vv_unk, div_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, div_vv_nvar_unk, div_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -604,33 +462,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, div_vc_unk); - div_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntTerm(IntOfTerm(d0) / d1); - } - else { - saveregs(); - d0 = p_div(Yap_Eval(d0),MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + div_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntTerm(IntOfTerm(d0) / d1); + } else { + saveregs(); + d0 = p_div(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, div_vc_unk, div_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -641,39 +489,27 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, div_cv_unk); - div_cv_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - Int div = IntOfTerm(d0); - if (div == 0){ - saveregs(); - Yap_NilError(EVALUATION_ERROR_ZERO_DIVISOR,"// /2"); - setregs(); - FAIL(); - } - d0 = MkIntegerTerm(d1 / div); - } - else { - saveregs(); - d0 = p_div(MkIntegerTerm(d1),Yap_Eval(d0) PASS_REGS); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } + div_cv_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + Int div = IntOfTerm(d0); + if (div == 0) { + Yap_AsmError(EVALUATION_ERROR_ZERO_DIVISOR,d0); + FAIL(); } + d0 = MkIntegerTerm(d1 / div); + } else { + saveregs(); + d0 = p_div(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, div_cv_unk, div_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is " Int_FORMAT "// A", PREG->y_u.xxn.c); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -694,44 +530,31 @@ if (IsIntTerm(d0) && IsIntTerm(d1)) { Int div = IntOfTerm(d1); if (div == 0) { - saveregs(); - Yap_NilError(EVALUATION_ERROR_ZERO_DIVISOR,"// /2"); - setregs(); + Yap_AsmError(EVALUATION_ERROR_ZERO_DIVISOR, d0); FAIL(); } d0 = MkIntTerm(IntOfTerm(d0) / div); - } - else { + } else { saveregs(); d0 = p_div(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, div_y_vv_unk, div_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, div_y_vv_nvar_unk, div_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -743,36 +566,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, div_y_vc_unk); - div_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntTerm(IntOfTerm(d0)/d1); - } - else { - saveregs(); - d0 = p_div(Yap_Eval(d0),MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + div_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntTerm(IntOfTerm(d0) / d1); + } else { + saveregs(); + d0 = p_div(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, div_y_vc_unk, div_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A//B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -783,49 +596,36 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, div_y_cv_unk); - div_y_cv_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - Int div = IntOfTerm(d0); - if (div == 0) { - saveregs(); - Yap_NilError(EVALUATION_ERROR_ZERO_DIVISOR,"// /2"); - setregs(); - FAIL(); - } - d0 = MkIntegerTerm(d1 / div); - } - else { - saveregs(); - d0 = p_div(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } + div_y_cv_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + Int div = IntOfTerm(d0); + if (div == 0) { + Yap_AsmError(EVALUATION_ERROR_ZERO_DIVISOR,d0); + FAIL(); } + d0 = MkIntegerTerm(d1 / div); + } else { + saveregs(); + d0 = p_div(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, div_y_cv_unk, div_y_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is " Int_FORMAT "// A", PREG->y_u.yxn.c); - setregs(); + Yap_AbsmiError(INSTANTIATION_ERROR); FAIL(); ENDP(pt0); ENDD(d0); ENDOp(); - Op(p_and_vv, xxx); BEGD(d0); BEGD(d1); @@ -840,17 +640,10 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) & IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_and(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -858,17 +651,13 @@ BEGP(pt0); deref_body(d0, pt0, and_vv_unk, and_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, and_vv_nvar_unk, and_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -880,33 +669,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, and_vc_unk); - and_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) & d1); - } - else { - saveregs(); - d0 = p_and(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + and_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) & d1); + } else { + saveregs(); + d0 = p_and(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, and_vc_unk, and_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A /\\ " Int_FORMAT , PREG->y_u.xxn.c); - setregs(); + Yap_AbsmiError(INSTANTIATION_ERROR); FAIL(); ENDP(pt0); ENDD(d0); @@ -926,38 +705,27 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) & IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_and(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, and_y_vv_unk, and_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, and_y_vv_nvar_unk, and_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A/\\B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -969,42 +737,31 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, and_y_vc_unk); - and_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) & d1); - } - else { - saveregs(); - d0 = p_and(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + and_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) & d1); + } else { + saveregs(); + d0 = p_and(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, and_y_vc_unk, and_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A /\\ " Int_FORMAT , PREG->y_u.yxn.c); - setregs(); + Yap_AbsmiError(INSTANTIATION_ERROR); FAIL(); ENDP(pt0); ENDD(d0); ENDOp(); - Op(p_or_vv, xxx); BEGD(d0); BEGD(d1); @@ -1019,17 +776,10 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) | IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_or(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); @@ -1037,17 +787,13 @@ BEGP(pt0); deref_body(d0, pt0, or_vv_unk, or_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A\\/B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, or_vv_nvar_unk, or_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A\\/B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -1059,32 +805,22 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, or_vc_unk); - or_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) | d1); - } - else { - saveregs(); - d0 = p_or(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + or_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) | d1); + } else { + saveregs(); + d0 = p_or(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, or_vc_unk, or_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A \\/ " Int_FORMAT , PREG->y_u.xxn.c); - setregs(); + Yap_AbsmiError(INSTANTIATION_ERROR); FAIL(); ENDP(pt0); ENDD(d0); @@ -1104,38 +840,27 @@ /* d0 and d1 are where I want them */ if (IsIntTerm(d0) && IsIntTerm(d1)) { d0 = MkIntegerTerm(IntOfTerm(d0) | IntOfTerm(d1)); - } - else { + } else { saveregs(); d0 = p_or(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } } BEGP(pt0); pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, or_y_vv_unk, or_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A\\/B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, or_y_vv_nvar_unk, or_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A\\/B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -1147,36 +872,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, or_y_vc_unk); - or_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntegerTerm(IntOfTerm(d0) | d1); - } - else { - saveregs(); - d0 = p_or(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + or_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntegerTerm(IntOfTerm(d0) | d1); + } else { + saveregs(); + d0 = p_or(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, or_y_vc_unk, or_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A \\/ " Int_FORMAT , PREG->y_u.yxn.c); - setregs(); + Yap_AbsmiError(INSTANTIATION_ERROR); FAIL(); ENDP(pt0); ENDD(d0); @@ -1199,36 +914,25 @@ if (i2 < 0) d0 = MkIntegerTerm(SLR(IntOfTerm(d0), -i2)); else - d0 = do_sll(IntOfTerm(d0),i2 PASS_REGS); - } - else { + d0 = do_sll(IntOfTerm(d0), i2 PASS_REGS); + } else { saveregs(); d0 = p_sll(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); } - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } XREG(PREG->y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_vv_unk, sll_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.xxn.xi); /* first check pt1 */ deref_head(d0, sll_vc_unk); - sll_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = do_sll(IntOfTerm(d0), (Int)d1 PASS_REGS); - } - else { - saveregs(); - d0 = p_sll(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + sll_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = do_sll(IntOfTerm(d0), (Int)d1 PASS_REGS); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_sll(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); setregs(); - FAIL(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_vc_unk, sll_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.xxn.xi); /* first check pt1 */ deref_head(d0, sll_cv_unk); - sll_cv_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - Int i2 = IntOfTerm(d0); - if (i2 < 0) - d0 = MkIntegerTerm(SLR(d1, -i2)); - else - d0 = do_sll(d1,i2 PASS_REGS); - } - else { - saveregs(); - d0 = p_sll(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + sll_cv_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + Int i2 = IntOfTerm(d0); + if (i2 < 0) + d0 = MkIntegerTerm(SLR(d1, -i2)); + else + d0 = do_sll(d1, i2 PASS_REGS); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_sll(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); setregs(); - FAIL(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_cv_unk, sll_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_y_vv_unk, sll_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.yxn.xi); /* first check pt1 */ deref_head(d0, sll_y_vc_unk); - sll_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = do_sll(IntOfTerm(d0), Yap_Eval(d1) PASS_REGS); - } - else { - saveregs(); - d0 = p_sll(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + sll_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = do_sll(IntOfTerm(d0), Yap_Eval(d1) PASS_REGS); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_sll(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); setregs(); - FAIL(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_y_vc_unk, sll_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.yxn.xi); /* first check pt1 */ deref_head(d0, sll_y_cv_unk); - sll_y_cv_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - Int i2 = IntOfTerm(d0); - if (i2 < 0) - d0 = MkIntegerTerm(SLR(d1, -i2)); - else - d0 = do_sll(d1,i2 PASS_REGS); - } - else { - saveregs(); - d0 = p_sll(MkIntegerTerm(d1), Yap_Eval(0) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + sll_y_cv_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + Int i2 = IntOfTerm(d0); + if (i2 < 0) + d0 = MkIntegerTerm(SLR(d1, -i2)); + else + d0 = do_sll(d1, i2 PASS_REGS); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_sll(MkIntegerTerm(d1), Yap_Eval(0) PASS_REGS); setregs(); - FAIL(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, sll_y_cv_unk, sll_y_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A<y_u.xxx.x) = d0; PREG = NEXTOP(PREG, xxx); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_vv_unk, slr_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, slr_vv_nvar_unk, slr_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -1512,33 +1153,23 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, slr_vc_unk); - slr_vc_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntTerm(SLR(IntOfTerm(d0), d1)); - } - else { - saveregs(); - d0 = p_slr(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + slr_vc_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntTerm(SLR(IntOfTerm(d0), d1)); + } else { + saveregs(); + d0 = p_slr(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_vc_unk, slr_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -1549,37 +1180,27 @@ d0 = XREG(PREG->y_u.xxn.xi); /* first check pt1 */ deref_head(d0, slr_cv_unk); - slr_cv_nvar: - { - Int d1 = PREG->y_u.xxn.c; - if (IsIntTerm(d0)) { - Int i2 = IntOfTerm(d0); - if (i2 < 0) - d0 = do_sll(d1, -i2 PASS_REGS); - else - d0 = MkIntegerTerm(SLR(d1, i2)); - } - else { - saveregs(); - d0 = p_slr(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + slr_cv_nvar : { + Int d1 = PREG->y_u.xxn.c; + if (IsIntTerm(d0)) { + Int i2 = IntOfTerm(d0); + if (i2 < 0) + d0 = do_sll(d1, -i2 PASS_REGS); + else + d0 = MkIntegerTerm(SLR(d1, i2)); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_slr(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); setregs(); - FAIL(); } + } XREG(PREG->y_u.xxn.x) = d0; PREG = NEXTOP(PREG, xxn); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_cv_unk, slr_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -1603,38 +1224,27 @@ d0 = do_sll(IntOfTerm(d0), -i2 PASS_REGS); else d0 = MkIntTerm(SLR(IntOfTerm(d0), i2)); - } - else { + } else { saveregs(); d0 = p_slr(Yap_Eval(d0), Yap_Eval(d1) PASS_REGS); setregs(); } BEGP(pt0); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } pt0 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_y_vv_unk, slr_y_vv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); BEGP(pt0); deref_body(d1, pt0, slr_y_vv_nvar_unk, slr_y_vv_nvar_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); FAIL(); ENDP(pt0); ENDD(d1); @@ -1646,36 +1256,26 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, slr_y_vc_unk); - slr_y_vc_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - d0 = MkIntTerm(SLR(IntOfTerm(d0), d1)); - } - else { - saveregs(); - d0 = p_slr(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); - setregs(); - if (d0 == 0L) { - saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); - setregs(); - FAIL(); - } - } + slr_y_vc_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + d0 = MkIntTerm(SLR(IntOfTerm(d0), d1)); + } else { + saveregs(); + d0 = p_slr(Yap_Eval(d0), MkIntegerTerm(d1) PASS_REGS); + setregs(); } + } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_y_vc_unk, slr_y_vc_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt0); ENDD(d0); ENDOp(); @@ -1685,40 +1285,34 @@ d0 = XREG(PREG->y_u.yxn.xi); /* first check pt1 */ deref_head(d0, slr_y_cv_unk); - slr_y_cv_nvar: - { - Int d1 = PREG->y_u.yxn.c; - if (IsIntTerm(d0)) { - Int i2 = IntOfTerm(d0); - if (i2 < 0) - d0 = do_sll(d1, -i2 PASS_REGS); - else - d0 = MkIntegerTerm(SLR(d1, i2)); - } - else { - saveregs(); - d0 = p_slr(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); - setregs(); - } - } - if (d0 == 0L) { + slr_y_cv_nvar : { + Int d1 = PREG->y_u.yxn.c; + if (IsIntTerm(d0)) { + Int i2 = IntOfTerm(d0); + if (i2 < 0) + d0 = do_sll(d1, -i2 PASS_REGS); + else + d0 = MkIntegerTerm(SLR(d1, i2)); + } else { saveregs(); - Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, LOCAL_ErrorMessage); + d0 = p_slr(MkIntegerTerm(d1), Yap_Eval(d0) PASS_REGS); setregs(); + } + } + if (d0 == 0L) { + Yap_AsmError(LOCAL_Error_TYPE,d0); FAIL(); } BEGP(pt0); pt0 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt0,d0); + INITIALIZE_PERMVAR(pt0, d0); ENDP(pt0); GONext(); BEGP(pt0); deref_body(d0, pt0, slr_y_cv_unk, slr_y_cv_nvar); - saveregs(); - Yap_NilError(INSTANTIATION_ERROR, "X is A>>B"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); FAIL(); ENDP(pt0); ENDD(d0); @@ -1782,13 +1376,12 @@ } } } - exec_bin_cmp_xx: - { - CmpPredicate f = PREG->y_u.plxxs.p->cs.d_code; - saveregs(); - d0 = (CELL) (f) (d0,d1); - setregs(); - } + exec_bin_cmp_xx : { + CmpPredicate f = PREG->y_u.plxxs.p->cs.d_code; + saveregs(); + d0 = (CELL)(f)(d0, d1); + setregs(); + } if (PREG == FAILCODE) { JMPNext(); } @@ -1857,13 +1450,12 @@ } } } - exec_bin_cmp_yx: - { - CmpPredicate f = PREG->y_u.plxys.p->cs.d_code; - saveregs(); - d0 = (CELL) (f) (d0,d1); - setregs(); - } + exec_bin_cmp_yx : { + CmpPredicate f = PREG->y_u.plxys.p->cs.d_code; + saveregs(); + d0 = (CELL)(f)(d0, d1); + setregs(); + } if (!d0 || PREG == FAILCODE) { if (PREG != FAILCODE) PREG = PREG->y_u.plxys.f; @@ -1930,13 +1522,12 @@ } } } - exec_bin_cmp_xy: - { - CmpPredicate f = PREG->y_u.plxys.p->cs.d_code; - saveregs(); - d0 = (CELL) (f) (d0,d1); - setregs(); - } + exec_bin_cmp_xy : { + CmpPredicate f = PREG->y_u.plxys.p->cs.d_code; + saveregs(); + d0 = (CELL)(f)(d0, d1); + setregs(); + } if (!d0 || PREG == FAILCODE) { if (PREG != FAILCODE) PREG = PREG->y_u.plxys.f; @@ -2006,13 +1597,12 @@ } } } - exec_bin_cmp_yy: - { - CmpPredicate f = PREG->y_u.plyys.p->cs.d_code; - saveregs(); - d0 = (CELL) (f) (d0,d1); - setregs(); - } + exec_bin_cmp_yy : { + CmpPredicate f = PREG->y_u.plyys.p->cs.d_code; + saveregs(); + d0 = (CELL)(f)(d0, d1); + setregs(); + } if (!d0 || PREG == FAILCODE) { if (PREG != FAILCODE) PREG = PREG->y_u.plyys.f; @@ -2049,8 +1639,10 @@ Op(p_dif, l); #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorDiff,0)),XREGS+1); -#endif /* LOW_LEVEL_TRACE */ + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorDiff, 0)), + XREGS + 1); +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); BEGD(d1); d0 = ARG1; @@ -2091,7 +1683,7 @@ * be trailed */ HBREG = HR; - B = (choiceptr) HR; + B = (choiceptr)HR; B->cp_h = HR; SET_BB(B); save_hb(); @@ -2117,8 +1709,8 @@ if (IsVarTerm(d1)) { #if defined(YAPOR_SBA) && defined(YAPOR) /* clean up the trail when we backtrack */ - if (Unsigned((Int)(d1)-(Int)(H_FZ)) > - Unsigned((Int)(B_FZ)-(Int)(H_FZ))) { + if (Unsigned((Int)(d1) - (Int)(H_FZ)) > + Unsigned((Int)(B_FZ) - (Int)(H_FZ))) { RESET_VARIABLE(STACK_TO_SBA(d1)); } else #endif @@ -2127,9 +1719,9 @@ #ifdef MULTI_ASSIGNMENT_VARIABLES } else /* if (IsApplTerm(d1)) */ { CELL *pt = RepAppl(d1); - /* AbsAppl means */ - /* multi-assignment variable */ - /* so the next cell is the old value */ +/* AbsAppl means */ +/* multi-assignment variable */ +/* so the next cell is the old value */ #ifdef FROZEN_STACKS pt[0] = TrailVal(--TR); #else @@ -2177,8 +1769,10 @@ #endif #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorSame,0)),XREGS+1); -#endif /* LOW_LEVEL_TRACE */ + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorSame, 0)), + XREGS + 1); +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); BEGD(d1); d0 = ARG1; @@ -2200,7 +1794,7 @@ } BEGD(d2); always_save_pc(); - d2 = iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1); + d2 = iequ_complex(RepPair(d0) - 1, RepPair(d0) + 1, RepPair(d1) - 1); if (d2 == false) { PREG = PREG->y_u.l.l; GONext(); @@ -2248,7 +1842,8 @@ PREG = PREG->y_u.l.l; GONext(); } - if (strcmp((char *)(RepAppl(d0)+2),(char *)(RepAppl(d1)+2)) == 0) { + if (strcmp((char *)(RepAppl(d0) + 2), (char *)(RepAppl(d1) + 2)) == + 0) { PREG = NEXTOP(PREG, l); GONext(); } @@ -2261,7 +1856,7 @@ PREG = PREG->y_u.l.l; GONext(); } - if (Yap_gmp_tcmp_big_big(d0,d1) == 0) { + if (Yap_gmp_tcmp_big_big(d0, d1) == 0) { PREG = NEXTOP(PREG, l); GONext(); } @@ -2291,7 +1886,8 @@ } always_save_pc(); BEGD(d2); - d2 = iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)); + d2 = iequ_complex(RepAppl(d0), RepAppl(d0) + ArityOfFunctor(f0), + RepAppl(d1)); if (d2 == false) { PREG = PREG->y_u.l.l; GONext(); @@ -2342,7 +1938,7 @@ ENDD(d0); #ifdef COROUTINING - /* Problem: have I got an environment or not? */ + /* Problem: have I got an environment or not? */ NoStackEq: PROCESS_INT(interrupt_eq, do_eq); #endif @@ -2350,16 +1946,16 @@ ENDOp(); #endif /* INLINE_BIG_COMPARISONS */ - Op(p_arg_vv, xxx); #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { HR[0] = XREG(PREG->y_u.xxx.x1); HR[1] = XREG(PREG->y_u.xxx.x2); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),HR); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorArg, 0)), HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.xxx.x1); deref_head(d0, arg_arg1_unk); @@ -2370,11 +1966,9 @@ else if (IsLongIntTerm(d0)) { d0 = LongIntOfTerm(d0); } else { - if (IsBigIntTerm( d0 )) + if (IsBigIntTerm(d0)) FAIL(); - saveregs(); - Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER, d0); FAIL(); } @@ -2389,18 +1983,15 @@ BEGP(pt0); pt0 = RepAppl(d1); d1 = *pt0; - if (IsExtensionFunctor((Functor) d1)) { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + if (IsExtensionFunctor((Functor)d1)) { + Yap_AsmError(TYPE_ERROR_COMPOUND, AbsAppl(pt0)); FAIL(); } - if ((Int)d0 <= 0 || - (Int)d0 > ArityOfFunctor((Functor) d1)) { + if ((Int)d0 <= 0 || (Int)d0 > ArityOfFunctor((Functor)d1)) { /* don't complain here for Prolog compatibility if ((Int)d0 <= 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, +Yap_AsmError( DOMAIN_ERROR_NOT_LESS_THAN_ZERO ); MkIntegerTerm(d0),"arg 1 of arg/3"); setregs(); } @@ -2411,35 +2002,29 @@ PREG = NEXTOP(PREG, xxx); GONext(); ENDP(pt0); - } - else if (IsPairTerm(d1)) { + } else if (IsPairTerm(d1)) { BEGP(pt0); pt0 = RepPair(d1); if (d0 != 1 && d0 != 2) { if ((Int)d0 < 0) { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, - MkIntegerTerm(d0),"arg 1 of arg/3"); - setregs(); + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(d0) ); } FAIL(); } - XREG(PREG->y_u.xxx.x) = pt0[d0-1]; + XREG(PREG->y_u.xxx.x) = pt0[d0 - 1]; PREG = NEXTOP(PREG, xxx); GONext(); ENDP(pt0); - } - else { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + } else { + Yap_AsmError(TYPE_ERROR_COMPOUND, d1); FAIL(); } BEGP(pt0); deref_body(d1, pt0, arg_arg2_unk, arg_arg2_nvar); saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3");; + Yap_AsmError(INSTANTIATION_ERROR,d1); + ; setregs(); ENDP(pt0); FAIL(); @@ -2448,7 +2033,8 @@ BEGP(pt0); deref_body(d0, pt0, arg_arg1_unk, arg_arg1_nvar); saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3");; + Yap_AsmError(INSTANTIATION_ERROR,d0); + ; setregs(); ENDP(pt0); FAIL(); @@ -2460,13 +2046,14 @@ if (Yap_do_low_level_trace) { CELL *Ho = HR; Term t = MkIntegerTerm(PREG->y_u.xxn.c); - HR[0] = t; + HR[0] = t; HR[1] = XREG(PREG->y_u.xxn.xi); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),HR); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorArg, 0)), HR); HR = Ho; } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = PREG->y_u.xxn.c; /* d0 now got the argument we want */ @@ -2480,18 +2067,15 @@ BEGP(pt0); pt0 = RepAppl(d1); d1 = *pt0; - if (IsExtensionFunctor((Functor) d1)) { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + if (IsExtensionFunctor((Functor)d1)) { + Yap_AsmError(TYPE_ERROR_COMPOUND,XREG(PREG->y_u.xxn.xi)); FAIL(); } - if ((Int)d0 <= 0 || - (Int)d0 > ArityOfFunctor((Functor) d1)) { + if ((Int)d0 <= 0 || (Int)d0 > ArityOfFunctor((Functor)d1)) { /* don't complain here for Prolog compatibility if ((Int)d0 <= 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, +Yap_AsmError( DOMAIN_ERROR_NOT_LESS_THAN_ZERO ); MkIntegerTerm(d0),"arg 1 of arg/3"); setregs(); } @@ -2502,36 +2086,28 @@ PREG = NEXTOP(PREG, xxn); GONext(); ENDP(pt0); - } - else if (IsPairTerm(d1)) { + } else if (IsPairTerm(d1)) { BEGP(pt0); pt0 = RepPair(d1); if (d0 != 1 && d0 != 2) { if ((Int)d0 < 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, - MkIntegerTerm(d0),"arg 1 of arg/3"); - setregs(); + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, XREG(PREG->y_u.xxn.xi)); } FAIL(); } - XREG(PREG->y_u.xxn.x) = pt0[d0-1]; + XREG(PREG->y_u.xxn.x) = pt0[d0 - 1]; PREG = NEXTOP(PREG, xxn); GONext(); ENDP(pt0); - } - else { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + } else { + Yap_AsmError(TYPE_ERROR_COMPOUND, XREG(PREG->y_u.xxn.xi)); FAIL(); } BEGP(pt0); deref_body(d1, pt0, arg_arg2_vc_unk, arg_arg2_vc_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3");; - setregs(); + Yap_AsmError(INSTANTIATION_ERROR, XREG(PREG->y_u.xxn.xi)); ENDP(pt0); FAIL(); ENDD(d1); @@ -2545,10 +2121,11 @@ HR[0] = XREG(PREG->y_u.yxx.x1); HR[1] = XREG(PREG->y_u.yxx.x2); HR[2] = YREG[PREG->y_u.yxx.y]; - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),HR); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorArg, 0)), HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.yxx.x1); deref_head(d0, arg_y_arg1_unk); @@ -2559,11 +2136,9 @@ else if (IsLongIntTerm(d0)) { d0 = LongIntOfTerm(d0); } else { - if (IsBigIntTerm( d0 )) + if (IsBigIntTerm(d0)) FAIL(); - saveregs(); - Yap_Error(TYPE_ERROR_INTEGER,d0,"arg 1 of arg/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER, XREG(PREG->y_u.yxx.x1)); FAIL(); } @@ -2578,18 +2153,15 @@ BEGP(pt0); pt0 = RepAppl(d1); d1 = *pt0; - if (IsExtensionFunctor((Functor) d1)) { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + if (IsExtensionFunctor((Functor)d1)) { + Yap_AsmError(TYPE_ERROR_COMPOUND,XREG(PREG->y_u.yxx.x2)); FAIL(); } - if ((Int)d0 <= 0 || - (Int)d0 > ArityOfFunctor((Functor) d1)) { + if ((Int)d0 <= 0 || (Int)d0 > ArityOfFunctor((Functor)d1)) { /* don't complain here for Prolog compatibility if ((Int)d0 <= 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, +Yap_AsmError( DOMAIN_ERROR_NOT_LESS_THAN_ZERO ); MkIntegerTerm(d0),"arg 1 of arg/3"); saveregs(); } @@ -2599,52 +2171,42 @@ BEGP(pt1); pt1 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt1,pt0[d0]); + INITIALIZE_PERMVAR(pt1, pt0[d0]); ENDP(pt1); GONext(); ENDP(pt0); - } - else if (IsPairTerm(d1)) { + } else if (IsPairTerm(d1)) { BEGP(pt0); pt0 = RepPair(d1); if (d0 != 1 && d0 != 2) { if ((Int)d0 < 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, - MkIntegerTerm(d0),"arg 1 of arg/3"); - setregs(); + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, YREG[PREG->y_u.yxx.y]); } FAIL(); } BEGP(pt1); pt1 = YREG + PREG->y_u.yxx.y; PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt1,pt0[d0-1]); + INITIALIZE_PERMVAR(pt1, pt0[d0 - 1]); GONext(); ENDP(pt1); ENDP(pt0); - } - else { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + } else { + Yap_AsmError(TYPE_ERROR_COMPOUND, d1); FAIL(); } BEGP(pt0); deref_body(d1, pt0, arg_y_arg2_unk, arg_y_arg2_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3");; - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt0); FAIL(); ENDD(d1); BEGP(pt0); deref_body(d0, pt0, arg_y_arg1_unk, arg_y_arg1_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "arg 1 of arg/3");; - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt0); FAIL(); ENDD(d0); @@ -2655,14 +2217,15 @@ if (Yap_do_low_level_trace) { CELL *Ho = HR; Term t = MkIntegerTerm(PREG->y_u.yxn.c); - HR[0] = t; + HR[0] = t; HR[1] = XREG(PREG->y_u.yxn.xi); HR[2] = YREG[PREG->y_u.yxn.y]; - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorArg,0)),HR); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorArg, 0)), HR); HR = Ho; } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = PREG->y_u.yxn.c; /* d0 now got the argument we want */ @@ -2676,20 +2239,14 @@ BEGP(pt0); pt0 = RepAppl(d1); d1 = *pt0; - if (IsExtensionFunctor((Functor) d1)) { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); - FAIL(); + if (IsExtensionFunctor((Functor)d1)) { + Yap_AsmError(TYPE_ERROR_COMPOUND, XREG(PREG->y_u.yxn.xi)); + FAIL(); } - if ((Int)d0 <= 0 || - (Int)d0 > ArityOfFunctor((Functor) d1)) { + if ((Int)d0 <= 0 || (Int)d0 > ArityOfFunctor((Functor)d1)) { /* don't complain here for Prolog compatibility if ((Int)d0 <= 0) { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, - MkIntegerTerm(d0),"arg 1 of arg/3"); - setregs(); +Yap_AsmError( DOMAIN_ERROR_NOT_LESS_THAN_ZERO ); } */ FAIL(); @@ -2697,43 +2254,35 @@ BEGP(pt1); pt1 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt1,pt0[d0]); + INITIALIZE_PERMVAR(pt1, pt0[d0]); ENDP(pt1); GONext(); ENDP(pt0); - } - else if (IsPairTerm(d1)) { + } else if (IsPairTerm(d1)) { BEGP(pt0); pt0 = RepPair(d1); if (d0 != 1 && d0 != 2) { if ((Int)d0 < 0) { saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, - MkIntegerTerm(d0),"arg 1 of arg/3"); - setregs(); + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, YREG[PREG->y_u.yxn.y]); } FAIL(); } BEGP(pt1); pt1 = YREG + PREG->y_u.yxn.y; PREG = NEXTOP(PREG, yxn); - INITIALIZE_PERMVAR(pt1,pt0[d0-1]); + INITIALIZE_PERMVAR(pt1, pt0[d0 - 1]); ENDP(pt1); GONext(); ENDP(pt0); - } - else { - saveregs(); - Yap_Error(TYPE_ERROR_COMPOUND, d1, "arg 2 of arg/3"); - setregs(); + } else { + Yap_AsmError(TYPE_ERROR_COMPOUND,YREG[PREG->y_u.yxn.y]); FAIL(); } BEGP(pt0); deref_body(d1, pt0, arg_y_arg2_vc_unk, arg_y_arg2_vc_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1,"arg 2 of arg/3");; - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt0); FAIL(); ENDD(d1); @@ -2742,17 +2291,19 @@ ENDOp(); Op(p_func2s_vv, xxx); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { RESET_VARIABLE(HR); HR[1] = XREG(PREG->y_u.xxx.x1); HR[2] = XREG(PREG->y_u.xxx.x2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ - /* We have to build the structure */ +#endif /* LOW_LEVEL_TRACE */ + /* We have to build the structure */ BEGD(d0); d0 = XREG(PREG->y_u.xxx.x1); deref_head(d0, func2s_unk); @@ -2768,55 +2319,51 @@ else { saveregs(); if (IsBigIntTerm(d1)) { - Yap_Error(RESOURCE_ERROR_STACK, d1, "functor/3"); + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK,d1); } else { - Yap_Error(TYPE_ERROR_INTEGER, d1, "functor/3"); + setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER,d1); } - setregs(); FAIL(); } if (!IsAtomicTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxx.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx), Osbpp), l); GONext(); - } - else if ((Int)d1 > 0) { + } else if ((Int)d1 > 0) { /* now let's build a compound term */ if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } BEGP(pt1); if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 0, YREG, NEXTOP(NEXTOP(PREG,xxx),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); - setregs(); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 0, YREG, + NEXTOP(NEXTOP(PREG, xxx), Osbpp))) { + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1 ); JMPNext(); } else { setregs(); @@ -2833,24 +2380,19 @@ /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxx.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx), Osbpp), l); GONext(); - } else if ((Int)d1 == 0) { + } else if ((Int)d1 == 0) { XREG(PREG->y_u.xxx.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxx), Osbpp), l); GONext(); - } else { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); - setregs(); - FAIL(); + } else { + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(d1)); } BEGP(pt1); deref_body(d1, pt1, func2s_unk2, func2s_nvar2); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt1); /* Oops, third argument was unbound */ FAIL(); @@ -2858,9 +2400,7 @@ BEGP(pt1); deref_body(d0, pt1, func2s_unk, func2s_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -2868,16 +2408,18 @@ ENDOp(); Op(p_func2s_cv, xxc); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s_cv: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { RESET_VARIABLE(HR); HR[1] = PREG->y_u.xxc.c; HR[2] = XREG(PREG->y_u.xxc.xi); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); /* We have to build the structure */ d0 = PREG->y_u.xxc.c; @@ -2892,48 +2434,47 @@ else { saveregs(); if (IsBigIntTerm(d1)) { - Yap_Error(RESOURCE_ERROR_STACK, d1, "functor/3"); + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); } else { - Yap_Error(TYPE_ERROR_INTEGER,d1,"functor/3"); + setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER, d1); } - setregs(); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxc.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc), Osbpp), l); GONext(); } else if ((Int)d1 > 0) { /* now let's build a compound term */ if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } BEGP(pt1); if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 0, YREG, NEXTOP(NEXTOP(PREG,xxc),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); - setregs(); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 0, YREG, + NEXTOP(NEXTOP(PREG, xxc), Osbpp))) { + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); JMPNext(); } else { setregs(); @@ -2950,24 +2491,19 @@ /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxc.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc), Osbpp), l); GONext(); - } else if (d1 == 0) { + } else if (d1 == 0) { XREG(PREG->y_u.xxc.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxc), Osbpp), l); GONext(); - } else { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); - setregs(); - FAIL(); + } else { + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,d1); } BEGP(pt1); deref_body(d1, pt1, func2s_unk2_cv, func2s_nvar2_cv); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt1); /* Oops, third argument was unbound */ FAIL(); @@ -2976,7 +2512,7 @@ ENDOp(); Op(p_func2s_vc, xxn); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s_vc: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { @@ -2987,11 +2523,13 @@ RESET_VARIABLE(HR); HR[1] = XREG(PREG->y_u.xxn.xi); HR[2] = ti; - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); HR = hi; } -#endif /* LOW_LEVEL_TRACE */ - /* We have to build the structure */ +#endif /* LOW_LEVEL_TRACE */ + /* We have to build the structure */ BEGD(d0); d0 = XREG(PREG->y_u.xxn.xi); deref_head(d0, func2s_unk_vc); @@ -2999,51 +2537,46 @@ BEGD(d1); d1 = PREG->y_u.xxn.c; if (!IsAtomicTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxn.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn), Osbpp), l); GONext(); } /* now let's build a compound term */ if (d1 == 0) { XREG(PREG->y_u.xxn.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn), Osbpp), l); GONext(); } if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } BEGP(pt1); if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gc(0, YREG, NEXTOP(NEXTOP(PREG,xxn),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); - setregs(); + if (!Yap_gc(0, YREG, NEXTOP(NEXTOP(PREG, xxn), Osbpp))) { + setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); JMPNext(); } else { setregs(); @@ -3061,14 +2594,12 @@ /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ XREG(PREG->y_u.xxn.x) = d0; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, xxn), Osbpp), l); GONext(); BEGP(pt1); deref_body(d0, pt1, func2s_unk_vc, func2s_nvar_vc); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3076,17 +2607,19 @@ ENDOp(); Op(p_func2s_y_vv, yxx); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s_y: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { RESET_VARIABLE(HR); HR[1] = XREG(PREG->y_u.yxx.x1); HR[2] = XREG(PREG->y_u.yxx.x2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ - /* We have to build the structure */ +#endif /* LOW_LEVEL_TRACE */ + /* We have to build the structure */ BEGD(d0); d0 = XREG(PREG->y_u.yxx.x1); deref_head(d0, func2s_y_unk); @@ -3102,55 +2635,52 @@ else { saveregs(); if (IsBigIntTerm(d1)) { - Yap_Error(RESOURCE_ERROR_STACK, d1, "functor/3"); + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); } else { - Yap_Error(TYPE_ERROR_INTEGER,d1,"functor/3"); + setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER, d1); } - setregs(); FAIL(); } if (!IsAtomicTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; BEGP(pt1); pt1 = YREG + PREG->y_u.yxx.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); } else if ((Int)d1 > 0) { /* now let's build a compound term */ if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM, d0); FAIL(); } BEGP(pt1); if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 0, YREG, NEXTOP(NEXTOP(PREG,yxx),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 0, YREG, + NEXTOP(NEXTOP(PREG, yxx), Osbpp))) { setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); JMPNext(); } else { setregs(); @@ -3168,29 +2698,24 @@ /* Ding, ding, we made it */ BEGP(pt1); pt1 = YREG + PREG->y_u.yxx.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); - } else if (d1 == 0) { + } else if (d1 == 0) { BEGP(pt1); pt1 = YREG + PREG->y_u.yxx.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxx), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); - } else { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); - setregs(); - FAIL(); + } else { + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(d1)); } BEGP(pt1); deref_body(d1, pt1, func2s_y_unk2, func2s_y_nvar2); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt1); /* Oops, third argument was unbound */ FAIL(); @@ -3198,9 +2723,7 @@ BEGP(pt1); deref_body(d0, pt1, func2s_y_unk, func2s_y_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3208,17 +2731,19 @@ ENDOp(); Op(p_func2s_y_cv, yxc); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s_y_cv: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { RESET_VARIABLE(HR); HR[1] = PREG->y_u.yxc.c; HR[2] = XREG(PREG->y_u.yxc.xi); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ - /* We have to build the structure */ +#endif /* LOW_LEVEL_TRACE */ + /* We have to build the structure */ BEGD(d0); d0 = PREG->y_u.yxc.c; /* we do, let's get the third argument */ @@ -3230,54 +2755,49 @@ if (IsIntegerTerm(d1)) { d1 = IntegerOfTerm(d1); } else { - saveregs(); if (IsBigIntTerm(d1)) { - Yap_Error(RESOURCE_ERROR_STACK, d1, "functor/3"); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); } else { - Yap_Error(TYPE_ERROR_INTEGER,d1,"functor/3"); + Yap_AsmError(TYPE_ERROR_INTEGER, d1); } - setregs(); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ BEGP(pt1); pt1 = YREG + PREG->y_u.yxc.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); - } - else if ((Int)d1 > 0) { + } else if ((Int)d1 > 0) { /* now let's build a compound term */ if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); } if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); BEGP(pt1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 0, YREG, NEXTOP(NEXTOP(PREG,yxc),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 0, YREG, + NEXTOP(NEXTOP(PREG, yxc), Osbpp))) { setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); JMPNext(); } else { setregs(); @@ -3295,29 +2815,24 @@ /* Ding, ding, we made it */ BEGP(pt1); pt1 = YREG + PREG->y_u.yxc.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); - } else if (d1 == 0) { + } else if (d1 == 0) { BEGP(pt1); pt1 = YREG + PREG->y_u.yxc.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxc), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); - } else { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); - setregs(); - FAIL(); + } else { + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(d1)); } BEGP(pt1); deref_body(d1, pt1, func2s_y_unk_cv, func2s_y_nvar_cv); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt1); /* Oops, third argument was unbound */ FAIL(); @@ -3326,7 +2841,7 @@ ENDOp(); Op(p_func2s_y_vc, yxn); - /* A1 is a variable */ + /* A1 is a variable */ restart_func2s_y_vc: #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { @@ -3337,11 +2852,13 @@ RESET_VARIABLE(HR); HR[1] = XREG(PREG->y_u.yxn.xi); HR[2] = ti; - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); HR = hi; } -#endif /* LOW_LEVEL_TRACE */ - /* We have to build the structure */ +#endif /* LOW_LEVEL_TRACE */ + /* We have to build the structure */ BEGD(d0); d0 = XREG(PREG->y_u.yxn.xi); deref_head(d0, func2s_y_unk_vc); @@ -3349,63 +2866,57 @@ BEGD(d1); d1 = PREG->y_u.yxn.c; if (!IsAtomicTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); } /* We made it!!!!! we got in d0 the name, in d1 the arity and * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ BEGP(pt1); pt1 = YREG + PREG->y_u.yxn.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); } if (d1 == 0) { BEGP(pt1); pt1 = YREG + PREG->y_u.yxn.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); GONext(); } if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); } /* now let's build a compound term */ if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); } BEGP(pt1); if (!IsAtomTerm(d0)) { FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); pt1 = HR; *pt1++ = d0; d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { /* make sure we have something to show for our trouble */ saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 0, YREG, NEXTOP(NEXTOP(PREG,yxn),Osbpp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); - setregs(); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 0, YREG, + NEXTOP(NEXTOP(PREG, yxn), Osbpp))) { + setregs(); + Yap_AsmError(RESOURCE_ERROR_STACK, d1); JMPNext(); } else { setregs(); @@ -3423,17 +2934,15 @@ /* Ding, ding, we made it */ BEGP(pt1); pt1 = YREG + PREG->y_u.yxn.y; - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn),Osbpp),l); - INITIALIZE_PERMVAR(pt1,d0); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, yxn), Osbpp), l); + INITIALIZE_PERMVAR(pt1, d0); ENDP(pt1); ENDD(d1); GONext(); BEGP(pt1); deref_body(d0, pt1, func2s_y_unk_vc, func2s_y_nvar_vc); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3444,11 +2953,13 @@ #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { HR[0] = XREG(PREG->y_u.xxx.x); - RESET_VARIABLE(HR+1); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + RESET_VARIABLE(HR + 1); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.xxx.x); deref_head(d0, func2f_xx_unk); @@ -3479,9 +2990,7 @@ BEGP(pt1); deref_body(d0, pt1, func2f_xx_unk, func2f_xx_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3492,18 +3001,20 @@ #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { HR[0] = XREG(PREG->y_u.xxy.x); - RESET_VARIABLE(HR+1); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + RESET_VARIABLE(HR + 1); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.xxy.x); deref_head(d0, func2f_xy_unk); func2f_xy_nvar: if (IsApplTerm(d0)) { Functor d1 = FunctorOfTerm(d0); - CELL *pt0 = YREG+PREG->y_u.xxy.y2; + CELL *pt0 = YREG + PREG->y_u.xxy.y2; if (IsExtensionFunctor(d1)) { XREG(PREG->y_u.xxy.x1) = d0; PREG = NEXTOP(PREG, xxy); @@ -3515,13 +3026,13 @@ INITIALIZE_PERMVAR(pt0, MkIntegerTerm(ArityOfFunctor(d1))); GONext(); } else if (IsPairTerm(d0)) { - CELL *pt0 = YREG+PREG->y_u.xxy.y2; + CELL *pt0 = YREG + PREG->y_u.xxy.y2; XREG(PREG->y_u.xxy.x1) = TermDot; PREG = NEXTOP(PREG, xxy); INITIALIZE_PERMVAR(pt0, MkIntTerm(2)); GONext(); } else { - CELL *pt0 = YREG+PREG->y_u.xxy.y2; + CELL *pt0 = YREG + PREG->y_u.xxy.y2; XREG(PREG->y_u.xxy.x1) = d0; PREG = NEXTOP(PREG, xxy); INITIALIZE_PERMVAR(pt0, MkIntTerm(0)); @@ -3530,9 +3041,7 @@ BEGP(pt1); deref_body(d0, pt1, func2f_xy_unk, func2f_xy_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3543,18 +3052,20 @@ #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { HR[0] = XREG(PREG->y_u.yxx.x2); - RESET_VARIABLE(HR+1); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + RESET_VARIABLE(HR + 1); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.yxx.x2); deref_head(d0, func2f_yx_unk); func2f_yx_nvar: if (IsApplTerm(d0)) { Functor d1 = FunctorOfTerm(d0); - CELL *pt0 = YREG+PREG->y_u.yxx.y; + CELL *pt0 = YREG + PREG->y_u.yxx.y; if (IsExtensionFunctor(d1)) { XREG(PREG->y_u.yxx.x1) = MkIntTerm(0); PREG = NEXTOP(PREG, yxx); @@ -3563,16 +3074,16 @@ } XREG(PREG->y_u.yxx.x1) = MkIntegerTerm(ArityOfFunctor(d1)); PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0, MkAtomTerm(NameOfFunctor(d1))); + INITIALIZE_PERMVAR(pt0, MkAtomTerm(NameOfFunctor(d1))); GONext(); } else if (IsPairTerm(d0)) { - CELL *pt0 = YREG+PREG->y_u.yxx.y; + CELL *pt0 = YREG + PREG->y_u.yxx.y; XREG(PREG->y_u.yxx.x1) = MkIntTerm(2); PREG = NEXTOP(PREG, yxx); - INITIALIZE_PERMVAR(pt0 ,TermDot); + INITIALIZE_PERMVAR(pt0, TermDot); GONext(); } else { - CELL *pt0 = YREG+PREG->y_u.yxx.y; + CELL *pt0 = YREG + PREG->y_u.yxx.y; XREG(PREG->y_u.yxx.x1) = MkIntTerm(0); PREG = NEXTOP(PREG, yxx); INITIALIZE_PERMVAR(pt0, d0); @@ -3581,9 +3092,7 @@ BEGP(pt1); deref_body(d0, pt1, func2f_yx_unk, func2f_yx_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3594,22 +3103,24 @@ #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) { HR[0] = XREG(PREG->y_u.yyx.x); - RESET_VARIABLE(HR+1); - RESET_VARIABLE(HR+2); - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),HR); + RESET_VARIABLE(HR + 1); + RESET_VARIABLE(HR + 2); + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + HR); } -#endif /* LOW_LEVEL_TRACE */ +#endif /* LOW_LEVEL_TRACE */ BEGD(d0); d0 = XREG(PREG->y_u.yyx.x); deref_head(d0, func2f_yy_unk); func2f_yy_nvar: if (IsApplTerm(d0)) { Functor d1 = FunctorOfTerm(d0); - CELL *pt0 = YREG+PREG->y_u.yyx.y1; - CELL *pt1 = YREG+PREG->y_u.yyx.y2; + CELL *pt0 = YREG + PREG->y_u.yyx.y1; + CELL *pt1 = YREG + PREG->y_u.yyx.y2; if (IsExtensionFunctor(d1)) { PREG = NEXTOP(PREG, yyx); - INITIALIZE_PERMVAR(pt0, d0); + INITIALIZE_PERMVAR(pt0, d0); INITIALIZE_PERMVAR(pt1, MkIntTerm(0)); GONext(); } @@ -3618,15 +3129,15 @@ INITIALIZE_PERMVAR(pt1, MkIntegerTerm(ArityOfFunctor(d1))); GONext(); } else if (IsPairTerm(d0)) { - CELL *pt0 = YREG+PREG->y_u.yyx.y1; - CELL *pt1 = YREG+PREG->y_u.yyx.y2; + CELL *pt0 = YREG + PREG->y_u.yyx.y1; + CELL *pt1 = YREG + PREG->y_u.yyx.y2; PREG = NEXTOP(PREG, yyx); INITIALIZE_PERMVAR(pt0, TermDot); INITIALIZE_PERMVAR(pt1, MkIntTerm(2)); GONext(); } else { - CELL *pt0 = YREG+PREG->y_u.yyx.y1; - CELL *pt1 = YREG+PREG->y_u.yyx.y2; + CELL *pt0 = YREG + PREG->y_u.yyx.y1; + CELL *pt1 = YREG + PREG->y_u.yyx.y2; PREG = NEXTOP(PREG, yyx); INITIALIZE_PERMVAR(pt0, d0); INITIALIZE_PERMVAR(pt1, MkIntTerm(0)); @@ -3635,9 +3146,7 @@ BEGP(pt1); deref_body(d0, pt1, func2f_yy_unk, func2f_yy_nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); @@ -3647,8 +3156,10 @@ Op(p_functor, e); #ifdef LOW_LEVEL_TRACER if (Yap_do_low_level_trace) - low_level_trace(enter_pred,RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor,0)),XREGS+1); -#endif /* LOW_LEVEL_TRACE */ + low_level_trace(enter_pred, + RepPredProp(Yap_GetPredPropByFunc(FunctorFunctor, 0)), + XREGS + 1); +#endif /* LOW_LEVEL_TRACE */ restart_functor: BEGD(d0); d0 = ARG1; @@ -3658,21 +3169,19 @@ BEGD(d1); if (IsApplTerm(d0)) { d1 = *RepAppl(d0); - if (IsExtensionFunctor((Functor) d1)) { - if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt ) { + if (IsExtensionFunctor((Functor)d1)) { + if (d1 <= (CELL)FunctorDouble && d1 >= (CELL)FunctorLongInt) { d1 = MkIntTerm(0); } else FAIL(); } else { - d0 = MkAtomTerm(NameOfFunctor((Functor) d1)); - d1 = MkIntTerm(ArityOfFunctor((Functor) d1)); + d0 = MkAtomTerm(NameOfFunctor((Functor)d1)); + d1 = MkIntTerm(ArityOfFunctor((Functor)d1)); } - } - else if (IsPairTerm(d0)) { + } else if (IsPairTerm(d0)) { d0 = TermDot; d1 = MkIntTerm(2); - } - else { + } else { d1 = MkIntTerm(0); } /* d1 and d0 now have the two arguments */ @@ -3687,7 +3196,8 @@ if (d0 != d1) { FAIL(); } - /* I have to this here so that I don't have a jump to a closing bracket */ + /* I have to this here so that I don't have a jump to a closing bracket + */ d0 = arity; goto func_bind_x3; @@ -3695,7 +3205,8 @@ deref_body(d1, pt0, func_nvar_unk, func_nvar_nvar); /* A2 is a variable, go and bind it */ YapBind(pt0, d0); - /* I have to this here so that I don't have a jump to a closing bracket */ + /* I have to this here so that I don't have a jump to a closing bracket + */ d0 = arity; ENDP(pt0); func_bind_x3: @@ -3708,20 +3219,18 @@ FAIL(); } /* Done */ - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbmp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e), Osbmp), l); GONext(); BEGP(pt0); deref_body(d1, pt0, func_nvar3_unk, func_nvar3_nvar); /* A3 is a variable, go and bind it */ - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbmp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e), Osbmp), l); YapBind(pt0, d0); /* Done */ GONext(); - ENDP(pt0); - } ENDD(d1); @@ -3741,78 +3250,65 @@ if (IsIntTerm(d1)) d1 = IntOfTerm(d1); else { - saveregs(); - Yap_Error(TYPE_ERROR_INTEGER,ARG3,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_INTEGER, d1); FAIL(); } if (!IsAtomicTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); + Yap_AsmError(TYPE_ERROR_ATOM,d0); FAIL(); - } /* We made it!!!!! we got in d0 the name, in d1 the arity and - * in pt0 the variable to bind it to. */ + } /* We made it!!!!! we got in d0 the name, in d1 the arity and + * in pt0 the variable to bind it to. */ if (d0 == TermDot && d1 == 2) { RESET_VARIABLE(HR); - RESET_VARIABLE(HR+1); + RESET_VARIABLE(HR + 1); d0 = AbsPair(HR); HR += 2; - } - else if ((Int)d1 > 0) { + } else if ((Int)d1 > 0) { /* now let's build a compound term */ - if (!IsAtomTerm(d0)) { - saveregs(); - Yap_Error(TYPE_ERROR_ATOM,d0,"functor/3"); - setregs(); - FAIL(); - } - BEGP(pt1); - if (!IsAtomTerm(d0)) { - FAIL(); - } - else - d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1); - pt1 = HR; - *pt1++ = d0; - d0 = AbsAppl(HR); - if (pt1+d1 > ENV || pt1+d1 > (CELL *)B) { - /* make sure we have something to show for our trouble */ - saveregs(); - if (!Yap_gcl((1+d1)*sizeof(CELL), 3, YREG, NEXTOP(NEXTOP(PREG,e),Osbmp))) { - Yap_NilError(RESOURCE_ERROR_STACK,LOCAL_ErrorMessage); - setregs(); - JMPNext(); - } else { - setregs(); - } - goto restart_functor; /* */ - } - while ((Int)d1--) { - RESET_VARIABLE(pt1); - pt1++; - } - /* done building the term */ - HR = pt1; - ENDP(pt1); - } else if ((Int)d1 < 0) { - saveregs(); - Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),"functor/3"); - setregs(); - FAIL(); + if (!IsAtomTerm(d0)) { + Yap_AsmError(TYPE_ERROR_ATOM,d0); + FAIL(); + } + BEGP(pt1); + if (!IsAtomTerm(d0)) { + FAIL(); + } else + d0 = (CELL)Yap_MkFunctor(AtomOfTerm(d0), (Int)d1); + pt1 = HR; + *pt1++ = d0; + d0 = AbsAppl(HR); + if (pt1 + d1 > ENV || pt1 + d1 > (CELL *)B) { + /* make sure we have something to show for our trouble */ + saveregs(); + if (!Yap_gcl((1 + d1) * sizeof(CELL), 3, YREG, + NEXTOP(NEXTOP(PREG, e), Osbmp))) { + setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); + } else { + setregs(); + } + goto restart_functor; /* */ + } + while ((Int)d1--) { + RESET_VARIABLE(pt1); + pt1++; + } + /* done building the term */ + HR = pt1; + ENDP(pt1); + } else if ((Int)d1 < 0) { + Yap_AsmError(DOMAIN_ERROR_NOT_LESS_THAN_ZERO, MkIntegerTerm(d1)); + FAIL(); } /* else if arity is 0 just pass d0 through */ /* Ding, ding, we made it */ - PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e),Osbpp),l); + PREG = NEXTOP(NEXTOP(NEXTOP(PREG, e), Osbpp), l); YapBind(pt0, d0); GONext(); - BEGP(pt1); deref_body(d1, pt1, func_var_3unk, func_var_3nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d1, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d1); ENDP(pt1); /* Oops, third argument was unbound */ FAIL(); @@ -3820,13 +3316,10 @@ BEGP(pt1); deref_body(d0, pt1, func_var_2unk, func_var_2nvar); - saveregs(); - Yap_Error(INSTANTIATION_ERROR, d0, "functor/3"); - setregs(); + Yap_AsmError(INSTANTIATION_ERROR,d0); ENDP(pt1); /* Oops, second argument was unbound too */ FAIL(); ENDP(pt0); ENDD(d0); ENDOp(); - diff --git a/C/qlyr.c b/C/qlyr.c index 61c83a48a..4fbf46662 100755 --- a/C/qlyr.c +++ b/C/qlyr.c @@ -688,22 +688,7 @@ static void ReadHash(FILE *stream) { Atom at; qlf_tag_t tg = read_tag(stream); - if (tg == QLY_ATOM_WIDE) { - wchar_t *rep = (wchar_t *)AllocTempSpace(); - UInt len; - - len = read_UInt(stream); - if (!EnoughTempSpace(len)) - QLYR_ERROR(OUT_OF_TEMP_SPACE); - read_bytes(stream, rep, (len + 1) * sizeof(wchar_t)); - while (!(at = Yap_LookupWideAtom(rep))) { - if (!Yap_growheap(FALSE, 0, NULL)) { - exit(1); - } - } - if (at == NIL) - QLYR_ERROR(OUT_OF_ATOM_SPACE); - } else if (tg == QLY_ATOM) { + if (tg == QLY_ATOM) { char *rep = (char *)AllocTempSpace(); UInt len; diff --git a/C/qlyw.c b/C/qlyw.c index 153a75289..b186a0e81 100755 --- a/C/qlyw.c +++ b/C/qlyw.c @@ -505,7 +505,6 @@ DBRefAdjust__ (DBRef dbt USES_REGS) #define rehash(oldcode, NOfE, KindOfEntries) -#define RestoreSWIHash() static void RestoreFlags( UInt NFlags ) { @@ -584,15 +583,9 @@ SaveHash(FILE *stream) if (a->val) { Atom at = a->val; CHECK(save_UInt(stream, (UInt)at)); - if (IsWideAtom(at)) { - CHECK(save_tag(stream, QLY_ATOM_WIDE)); - CHECK(save_UInt(stream, wcslen(RepAtom(at)->WStrOfAE))); - CHECK(save_bytes(stream, at->WStrOfAE, (wcslen(at->WStrOfAE)+1)*sizeof(wchar_t))); - } else { CHECK(save_tag(stream, QLY_ATOM)); CHECK(save_UInt(stream, strlen((char *)RepAtom(at)->StrOfAE))); CHECK(save_bytes(stream, (char *)at->StrOfAE, (strlen((char *)at->StrOfAE)+1)*sizeof(char))); - } } } save_tag(stream, QLY_START_FUNCTORS); diff --git a/C/save.c b/C/save.c index a30849ef2..5e3326316 100755 --- a/C/save.c +++ b/C/save.c @@ -165,9 +165,11 @@ static Int do_SYSTEM_ERROR_INTERNAL(yap_error_number etype, const char *msg) { CACHE_REGS + LOCAL_ErrorMessage = malloc(MAX_ERROR_MSG_SIZE+1); #if HAVE_SNPRINTF #if HAVE_STRERROR - snprintf(LOCAL_ErrorSay,MAX_ERROR_MSG_SIZE,"%s (%s when reading %s)", msg, strerror(errno), LOCAL_FileNameBuf); + snprintf(LOCAL_ErrorMessage,MAX_ERROR_MSG_SIZE,"%s (%s when reading %s)", msg, + strerror(errno), LOCAL_FileNameBuf); #else snprintf(LOCAL_ErrorSay,MAX_ERROR_MSG_SIZE,"%s, (system error %d when reading %s)",msg,errno,LOCAL_FileNameBuf); #endif @@ -178,7 +180,6 @@ do_SYSTEM_ERROR_INTERNAL(yap_error_number etype, const char *msg) sprintf(LOCAL_ErrorSay,"%s, (system error %d when reading %s)",msg,errno,LOCAL_FileNameBuf); #endif #endif - LOCAL_ErrorMessage = LOCAL_ErrorSay; LOCAL_Error_TYPE = etype; return -1; } @@ -685,8 +686,7 @@ check_header(CELL *info, CELL *ATrail, CELL *AStack, CELL *AHeap USES_REGS) } } if (strcmp(pp, msg) != 0) { - LOCAL_ErrorMessage = LOCAL_ErrorSay; - strncpy(LOCAL_ErrorMessage, "saved state ", MAX_ERROR_MSG_SIZE); + strncpy(LOCAL_ErrorMessage, "saved state ", MAX_ERROR_MSG_SIZE-1); strncat(LOCAL_ErrorMessage, LOCAL_FileNameBuf, MAX_ERROR_MSG_SIZE-1); strncat(LOCAL_ErrorMessage, " failed to match version ID", MAX_ERROR_MSG_SIZE-1); LOCAL_Error_TYPE = SYSTEM_ERROR_SAVED_STATE; diff --git a/C/scanner.c b/C/scanner.c index 1f54342e0..122c35f82 100755 --- a/C/scanner.c +++ b/C/scanner.c @@ -435,7 +435,7 @@ writing, writing a BOM can be requested using the option #define my_islower(C) (C >= 'a' && C <= 'z') static Term float_send(char *, int); -static Term get_num(int *, int *, struct stream_desc *, char *, UInt, int); +static Term get_num(int *, int *, struct stream_desc *, int); static void Yap_setCurrentSourceLocation(struct stream_desc *s) { CACHE_REGS @@ -457,6 +457,7 @@ static void Yap_setCurrentSourceLocation(struct stream_desc *s) { char_kind_t Yap_chtype0[NUMBER_OF_CHARS + 1] = { EF, /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si + */ BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, BS, @@ -584,7 +585,7 @@ static TokEntry *AuxSpaceError__(TokEntry *p, TokEntry *l, return l; } -static void * InitScannerMemory(void) { +static void *InitScannerMemory(void) { CACHE_REGS LOCAL_ErrorMessage = NULL; LOCAL_Error_Size = 0; @@ -630,18 +631,6 @@ static char *AllocScannerMemory(unsigned int size) { return AuxSpScan; } -static void PopScannerMemory(char *block, unsigned int size) { - CACHE_REGS - if (block == LOCAL_ScannerStack - size) { - LOCAL_ScannerStack -= size; - } else if (block == (char *)(LOCAL_ScannerExtraBlocks + 1)) { - struct scanner_extra_alloc *ptr = LOCAL_ScannerExtraBlocks; - - LOCAL_ScannerExtraBlocks = ptr->next; - free(ptr); - } -} - char *Yap_AllocScannerMemory(unsigned int size) { /* I assume memory has been initialized */ return AllocScannerMemory(size); @@ -880,15 +869,34 @@ static int num_send_error_message(char s[]) { return TermNil; } +#define number_overflow() \ + { \ + size_t nsz = min(max_size * 2, max_size); \ + char *nbuf; \ + \ + if (buf == buf0) { \ + nbuf = malloc(nsz); \ + } else { \ + nbuf = realloc(buf, nsz); \ + } \ + if (!nbuf) { \ + return num_send_error_message("Number Too Long"); \ + } else { \ + left = nsz - max_size; \ + max_size = nsz; \ + buf = nbuf; \ + } \ + } + /* reads a number, either integer or float */ -static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, - UInt max_size, int sign) { - char *sp = s; +static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, int sign) { int ch = *chp; Int val = 0L, base = ch - '0'; int might_be_float = TRUE, has_overflow = FALSE; const unsigned char *decimalpoint; + char buf0[256], *sp = buf0, *buf = buf0; + int max_size = 254, left = 254; *sp++ = ch; ch = getchr(inp_stream); @@ -898,9 +906,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, */ if (chtype(ch) == NU) { *sp++ = ch; - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); base = 10 * base + ch - '0'; ch = getchr(inp_stream); } @@ -909,9 +916,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, return num_send_error_message("Admissible bases are 0..36"); } might_be_float = FALSE; - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; ch = getchr(inp_stream); if (base == 0) { @@ -939,9 +945,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, int chval = (chtype(ch) == NU ? ch - '0' : (my_isupper(ch) ? ch - 'A' : ch - 'a') + 10); - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; val = oval * base + chval; if (oval != (val - chval) / base) /* overflow */ @@ -951,9 +956,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, } } else if (ch == 'x' && base == 0) { might_be_float = FALSE; - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; ch = getchr(inp_stream); while (my_isxdigit(ch, 'F', 'f')) { @@ -961,9 +965,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, int chval = (chtype(ch) == NU ? ch - '0' : (my_isupper(ch) ? ch - 'A' : ch - 'a') + 10); - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; val = val * 16 + chval; if (oval != (val - chval) / 16) /* overflow */ @@ -986,9 +989,8 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, while (chtype(ch) == NU) { Int oval = val; if (!(val == 0 && ch == '0') || has_overflow) { - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; } if (ch - '0' >= base) { @@ -1019,7 +1021,7 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, *chbuffp = '.'; *chp = ch; if (has_overflow) - return read_int_overflow(s, base, val, sign); + return read_int_overflow(buf, base, val, sign); if (sign == -1) return MkIntegerTerm(-val); return MkIntegerTerm(val); @@ -1034,30 +1036,26 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, /* translate . to current locale */ while ((dc = *dp++) != '\0') { *sp++ = dc; - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); } /* numbers after . */ if (chtype(ch) == NU) { do { - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; } while (chtype(ch = getchr(inp_stream)) == NU); } } if (ch == 'e' || ch == 'E') { - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; ch = getchr(inp_stream); if (ch == '-') { - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = '-'; ch = getchr(inp_stream); } else if (ch == '+') { @@ -1066,34 +1064,33 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, if (chtype(ch) != NU) { CACHE_REGS if (has_dot) - return float_send(s, sign); + return float_send(buf, sign); return MkIntegerTerm(sign * val); } do { - if (--max_size == 0) { - return num_send_error_message("Number Too Long"); - } + if (--left == 0) + number_overflow(); *sp++ = ch; } while (chtype(ch = getchr(inp_stream)) == NU); } *sp = '\0'; *chp = ch; - return float_send(s, sign); + return float_send(buf, sign); } else if (has_overflow) { *sp = '\0'; /* skip base */ *chp = ch; - if (s[0] == '0' && s[1] == 'x') - return read_int_overflow(s + 2, 16, val, sign); - else if (s[0] == '0' && s[1] == 'o') - return read_int_overflow(s + 2, 8, val, sign); - else if (s[0] == '0' && s[1] == 'b') - return read_int_overflow(s + 2, 2, val, sign); - if (s[1] == '\'') - return read_int_overflow(s + 2, base, val, sign); - if (s[2] == '\'') - return read_int_overflow(s + 3, base, val, sign); - return read_int_overflow(s, base, val, sign); + if (buf[0] == '0' && buf[1] == 'x') + return read_int_overflow(buf + 2, 16, val, sign); + else if (buf[0] == '0' && buf[1] == 'o') + return read_int_overflow(buf + 2, 8, val, sign); + else if (buf[0] == '0' && buf[1] == 'b') + return read_int_overflow(buf + 2, 2, val, sign); + if (buf[1] == '\'') + return read_int_overflow(buf + 2, base, val, sign); + if (buf[2] == '\'') + return read_int_overflow(buf + 3, base, val, sign); + return read_int_overflow(buf, base, val, sign); } else { CACHE_REGS *chp = ch; @@ -1103,13 +1100,12 @@ static Term get_num(int *chp, int *chbuffp, StreamDesc *inp_stream, char *s, /* given a function getchr scan until we either find the number or end of file */ -Term Yap_scan_num(StreamDesc *inp) { +Term Yap_scan_num(StreamDesc *inp, bool error_on) { CACHE_REGS Term out; int sign = 1; int ch, cherr; - char *ptr, *mp; - int kind; + char *ptr; void *old_tr = TR; InitScannerMemory(); @@ -1119,10 +1115,12 @@ Term Yap_scan_num(StreamDesc *inp) { LOCAL_Error_TYPE = RESOURCE_ERROR_TRAIL; return 0; } -#if HAVE_ISWBLANK - while (iswblank( ch = getchr(inp) )); +#if HAVE_ISWSPACE + while (iswspace(ch = getchr(inp))) + ; #else - while (isspace( ch = getchr(inp) )); + while (isspace(ch = getchr(inp))) + ; #endif TokEntry *tokptr = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); tokptr->TokPos = GetCurInpPos(inp); @@ -1136,69 +1134,27 @@ Term Yap_scan_num(StreamDesc *inp) { cherr = '\0'; if (ASP - HR < 1024) { Yap_clean_tokenizer(old_tr, NULL, NULL); - LOCAL_ErrorMessage = "Stack Overflow"; + LOCAL_ErrorMessage = "Stack Overflow"; LOCAL_Error_TYPE = RESOURCE_ERROR_STACK; return 0; } - out = get_num(&ch, &cherr, inp, ptr, 4096, sign); /* */ - } - if (LOCAL_ErrorMessage != NULL || ch != -1 || cherr) { - CACHE_REGS - char *s = ptr; - int sign = 1; - + out = get_num(&ch, &cherr, inp, sign); /* */ + } else { out = 0; - if (s[0] == '+') { - s++; - } - if (s[0] == '-') { - s++; - sign = -1; - } - if (strcmp(s, "inf") == 0) { - if (sign > 0) { - out = MkFloatTerm(INFINITY); - } else { - out = MkFloatTerm(-INFINITY); - } - } - if (strcmp(s, "nan") == 0) { - if (sign > 0) { - out = MkFloatTerm(NAN); - } else { - out = MkFloatTerm(-NAN); - } - } - if (out == 0) { - TokEntry *e, *ef; - size_t len = strlen(ptr); - mp = AllocScannerMemory(len + 1); - tokptr->Tok = Ord(kind = String_tok); - tokptr->TokInfo = Unsigned(mp); - e = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); - ef = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); - tokptr->TokNext = e; - e->Tok = Error_tok; - if (!LOCAL_ErrorMessage) { - LOCAL_ErrorMessage = - "syntax error while converting from a string to a number"; - } - e->TokInfo = MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorMessage)); - e->TokPos = GetCurInpPos(inp); - e->TokNext = ef; - ef->Tok = Ord(kind = eot_tok); - ef->TokInfo = TermSyntaxError; - ef->TokPos = GetCurInpPos(inp); - ef->TokNext = NULL; - LOCAL_tokptr = tokptr; - LOCAL_toktide = e; - LOCAL_ErrorMessage = NULL; - LOCAL_Error_Term = Yap_syntax_error(e, inp - GLOBAL_Stream); - LOCAL_Error_TYPE = SYNTAX_ERROR; - } } - PopScannerMemory(ptr, 4096); - Yap_clean_tokenizer(old_tr, NULL, NULL); +#if HAVE_ISWSPACE + while (iswspace(ch = getchr(inp))) + ; +#else + while (isspace(ch = getchr(inp))) + ; +#endif + if (LOCAL_ErrorMessage != NULL || ch != -1 || cherr) { + Yap_clean_tokenizer(old_tr, NULL, NULL); + if (error_on) + Yap_Error(SYNTAX_ERROR, ARG2, "converting number"); + return 0; + } return out; } @@ -1215,61 +1171,88 @@ Term Yap_scan_num(StreamDesc *inp) { return l; \ } -const char *Yap_tokRep(TokEntry *tokptr, encoding_t encoding) { +Term Yap_tokRep(void *tokptre) { CACHE_REGS + TokEntry *tokptr = tokptre; Term info = tokptr->TokInfo; - char *buf = LOCAL_FileNameBuf2; - size_t length; - UInt flags = 0; switch (tokptr->Tok) { case Name_tok: - if (IsWideAtom((Atom)info)) { - wchar_t *wc = RepAtom((Atom)info)->WStrOfAE; - Term s = Yap_WCharsToString(wc PASS_REGS); - return StringOfTerm(s); + if (!info) { + info = TermNil; } - return RepAtom((Atom)info)->StrOfAE; + return Yap_MkApplTerm(Yap_MkFunctor(AtomAtom, 1), 1, &info); + case QuasiQuotes_tok: + info = MkAtomTerm(Yap_LookupAtom("")); + return Yap_MkApplTerm(Yap_MkFunctor(AtomAtom, 1), 1, &info); case Number_tok: - return Yap_TermToString(info, &length, encoding, flags); + return Yap_MkApplTerm(Yap_MkFunctor(AtomAtom, 1), 1, &info); + break; case Var_tok: { + Term t[2]; VarEntry *varinfo = (VarEntry *)info; - varinfo->VarAdr = TermNil; - return varinfo->VarRep; + if ((t[0] = varinfo->VarAdr) == TermNil) { + t[0] = varinfo->VarAdr = MkVarTerm(); + } + t[1] = MkAtomTerm((Atom)(varinfo->VarRep)); + return Yap_MkApplTerm(Yap_MkFunctor(AtomGVar, 2), 2, t); } case String_tok: + return Yap_MkApplTerm(Yap_MkFunctor(AtomString, 1), 1, &info); case BQString_tok: - return (char *)info; - case WString_tok: - case WBQString_tok: { - wchar_t *op = (wchar_t *)info; - wchar_t c; - unsigned char *bp = (unsigned char *)buf; - while ((c = *op++)) { - bp += put_utf8(bp, c); - } - bp[0] = '\0'; - return buf; - } + return Yap_MkApplTerm(Yap_MkFunctor(AtomString, 1), 1, &info); case Error_tok: - return ""; + return MkAtomTerm(AtomError); case eot_tok: - return ""; - case Ponctuation_tok: { - buf[1] = '\0'; - if ((info) == 'l') { - buf[0] = '('; - } else { - buf[0] = (char)info; - } + return MkAtomTerm(Yap_LookupAtom("EOT")); + case Ponctuation_tok: + if (info == Terml) + return TermBeginBracket; + else + return info; } - return buf; + return TermDot; +} + +const char *Yap_tokText(void *tokptre) { + CACHE_REGS + TokEntry *tokptr = tokptre; + Term info = tokptr->TokInfo; + + switch (tokptr->Tok) { + case eot_tok: + return "EOT"; + case Ponctuation_tok: + if (info == Terml) + return "("; + case Error_tok: + case BQString_tok: + case String_tok: + case Name_tok: + return AtomOfTerm(info)->StrOfAE; case QuasiQuotes_tok: - case WQuasiQuotes_tok: return ""; - default: - return "??"; + case Number_tok: + if (IsIntegerTerm(info)) { + char *s = Malloc(36); + snprintf(s, 35, Int_FORMAT, IntegerOfTerm(info)); + return s; + } else if (IsFloatTerm(info)) { + char *s = Malloc(64); + snprintf(s, 63, "%6g", FloatOfTerm(info)); + return s; + } else { + size_t len = Yap_gmp_to_size(info, 10); + char *s = Malloc(len + 2); + return Yap_gmp_to_string(info, s, len + 1, 10); + } + break; + case Var_tok: + if (info == 0) + return "[]"; + return ((Atom)info)->StrOfAE; } + return "."; } static void open_comment(int ch, StreamDesc *inp_stream USES_REGS) { @@ -1320,52 +1303,8 @@ static void mark_eof(struct stream_desc *inp_stream) { inp_stream->status |= Push_Eof_Stream_f; } -static wchar_t *ch_to_wide(char *base, char *charp) { - CACHE_REGS - int n = charp - base, i; - wchar_t *nb = (wchar_t *)base; - - if ((nb + n) + 1024 > (wchar_t *)AuxSp) { - LOCAL_Error_TYPE = RESOURCE_ERROR_AUXILIARY_STACK; - LOCAL_ErrorMessage = - "Heap Overflow While Scanning: please increase code space (-h)"; - return NULL; - } - for (i = n; i > 0; i--) { - nb[i - 1] = (unsigned char)base[i - 1]; - } - return nb + n; -} - #define add_ch_to_buff(ch) \ - if (wcharp) { \ - *wcharp++ = (ch); \ - if (wcharp >= (wchar_t *)AuxSp - 1024) \ - goto huge_var_error; \ - charp = (char *)wcharp; \ - } else { \ - if (ch > MAX_ISO_LATIN1 && !wcharp) { \ - /* does not fit in ISO-LATIN */ \ - wcharp = ch_to_wide(TokImage, charp); \ - if (!wcharp) \ - goto huge_var_error; \ - *wcharp++ = (ch); \ - charp = (char *)wcharp; \ - } else { \ - if (charp >= (char *)AuxSp - 1024) \ - goto huge_var_error; \ - *charp++ = ch; \ - } \ - } - -#define add_ch_to_utf8_buff(ch) \ - { \ - if ((ch & 0xff) == ch) { \ - *charp++ = ch; \ - } else { \ - charp = _PL__put_utf8(charp, chr); \ - } \ - } + { charp += put_utf8(charp, ch); } TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, Term *tposp) { @@ -1374,9 +1313,9 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, TokEntry *t, *l, *p; enum TokenKinds kind; int solo_flag = TRUE; - int ch; - wchar_t *wcharp; + int32_t ch, och; struct qq_struct_t *cur_qq = NULL; + int sign = 1; InitScannerMemory(); LOCAL_VarTable = NULL; @@ -1392,11 +1331,10 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, LOCAL_StartLineCount = inp_stream->linecount; LOCAL_StartLinePos = inp_stream->linepos; do { - wchar_t och, pch; int quote, isvar; - char *charp, *mp; - unsigned int len; - char *TokImage = NULL; + unsigned char *charp, *mp; + size_t len; + unsigned char *TokImage = NULL; t = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); t->TokNext = NULL; @@ -1418,14 +1356,11 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, case CC: if (store_comments) { - CHECK_SPACE(); open_comment(ch, inp_stream PASS_REGS); continue_comment: while ((ch = getchr(inp_stream)) != 10 && chtype(ch) != EF) { - CHECK_SPACE(); extend_comment(ch PASS_REGS); } - CHECK_SPACE(); extend_comment(ch PASS_REGS); if (chtype(ch) != EF) { ch = getchr(inp_stream); @@ -1446,7 +1381,6 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, while (chtype(ch) == BS) { ch = getchr(inp_stream); } - CHECK_SPACE(); *tposp = Yap_StreamPosition(inp_stream - GLOBAL_Stream); Yap_setCurrentSourceLocation(inp_stream); } @@ -1460,27 +1394,31 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, case UC: case UL: - case LC: - och = ch; + case LC: { + int32_t och = ch; ch = getchr(inp_stream); + size_t sz = 512; + TokImage = Malloc(sz PASS_REGS); scan_name: - TokImage = (char *)((AtomEntry *)(Yap_PreAllocCodeSpace()))->StrOfAE; - charp = TokImage; - wcharp = NULL; + charp = (unsigned char *)TokImage; isvar = (chtype(och) != LC); add_ch_to_buff(och); for (; chtype(ch) <= NU; ch = getchr(inp_stream)) { - if (charp == (char *)AuxSp - 1024) { - huge_var_error: - return AuxSpaceError(p, l, "Code Space Overflow due to huge atom"); - /* huge atom or variable, we are in trouble */ + if (charp == TokImage + (sz - 1)) { + unsigned char *p0 = TokImage; + sz = min(sz * 2, sz + MBYTE); + TokImage = Realloc(p0, sz); + if (TokImage == NULL) { + return CodeSpaceError(t, p, l); + } + charp = TokImage - (charp - p0); } add_ch_to_buff(ch); } while (ch == '\'' && isvar && trueGlobalPrologFlag(VARIABLE_NAMES_MAY_END_WITH_QUOTES_FLAG)) { - if (charp == (char *)AuxSp - 1024) { - goto huge_var_error; + if (charp == (unsigned char *)AuxSp - 1024) { + return CodeSpaceError(t, p, l); } add_ch_to_buff(ch); ch = getchr(inp_stream); @@ -1489,42 +1427,37 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, if (!isvar) { Atom ae; /* don't do this in iso */ - if (wcharp) { - ae = Yap_LookupWideAtom((wchar_t *)TokImage); - } else { - ae = Yap_LookupAtom(TokImage); - } + ae = Yap_ULookupAtom(TokImage); + Free(TokImage); if (ae == NIL) { return CodeSpaceError(t, p, l); } - t->TokInfo = Unsigned(ae); - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); + t->TokInfo = MkAtomTerm(ae); if (ch == '(') solo_flag = FALSE; t->Tok = Ord(kind = Name_tok); } else { - VarEntry *ve = Yap_LookupVar(TokImage); + VarEntry *ve = Yap_LookupVar((const char *)TokImage); + Free(TokImage); t->TokInfo = Unsigned(ve); if (cur_qq) { ve->refs++; } - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); t->Tok = Ord(kind = Var_tok); } - break; + + } break; case NU: { int cherr; - int cha = ch; - char *ptr; + int cha; + sign = 1; + scan_number: + cha = ch; cherr = 0; - if (!(ptr = AllocScannerMemory(4096))) { - return TrailSpaceError(t, l); - } CHECK_SPACE(); - if ((t->TokInfo = get_num(&cha, &cherr, inp_stream, ptr, 4096, 1)) == - 0L) { + if ((t->TokInfo = get_num(&cha, &cherr, inp_stream, sign)) == 0L) { if (p) { p->Tok = eot_tok; t->TokInfo = TermError; @@ -1532,7 +1465,6 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, /* serious error now */ return l; } - PopScannerMemory(ptr, 4096); ch = cha; if (cherr) { TokEntry *e; @@ -1552,6 +1484,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, case 'e': case 'E': och = cherr; + TokImage = Malloc(1024 PASS_REGS); goto scan_name; break; case '=': @@ -1561,7 +1494,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, TokEntry *e2; t->Tok = Ord(Var_tok); - t->TokInfo = Unsigned(Yap_LookupVar("E")); + t->TokInfo = (Term)Yap_LookupVar("E"); t->TokPos = GetCurInpPos(inp_stream); e2 = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); if (e2 == NULL) { @@ -1584,10 +1517,17 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, { TokEntry *e2; + if (chtype(ch) == NU) { + if (och == '-') + sign = -1; + else + sign = 1; + goto scan_number; + } t->Tok = Name_tok; if (ch == '(') solo_flag = FALSE; - t->TokInfo = Unsigned(AtomE); + t->TokInfo = MkAtomTerm(AtomE); t->TokPos = GetCurInpPos(inp_stream); e2 = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); if (e2 == NULL) { @@ -1611,18 +1551,19 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, case QT: case DC: quoted_string: - TokImage = (char *)((AtomEntry *)(Yap_PreAllocCodeSpace()))->StrOfAE; + TokImage = Malloc(1048); charp = TokImage; quote = ch; len = 0; ch = getchrq(inp_stream); - wcharp = NULL; + size_t sz = 1024; while (TRUE) { - if (charp + 1024 > (char *)AuxSp) { - LOCAL_Error_TYPE = RESOURCE_ERROR_AUXILIARY_STACK; - LOCAL_ErrorMessage = - "Heap Overflow While Scanning: please increase code space (-h)"; + if (charp > TokImage + (sz - 1)) { + TokImage = Realloc(TokImage, min(sz * 2, sz + MBYTE)); + if (TokImage == NULL) { + return CodeSpaceError(t, p, l); + } break; } if (ch == 10 && trueGlobalPrologFlag(ISO_FLAG)) { @@ -1630,7 +1571,9 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, LOCAL_ErrorMessage = "layout character \n inside quotes"; break; } - + if (ch == EOFCHAR) { + break; + } if (ch == quote) { ch = getchrq(inp_stream); if (ch != quote) @@ -1646,75 +1589,46 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, if (scan_next) { ch = getchrq(inp_stream); } - } else if (chtype(ch) == EF && ch <= MAX_ISO_LATIN1) { - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); - mark_eof(inp_stream); - t->Tok = Ord(kind = eot_tok); - t->TokInfo = TermEof; - break; } else { add_ch_to_buff(ch); ch = getchrq(inp_stream); } ++len; - if (charp > (char *)AuxSp - 1024) { - /* Not enough space to read in the string. */ - return AuxSpaceError( - t, l, "not enough space to read in string or quoted atom"); + } + *charp = '\0'; + if (quote == '"') { + t->TokInfo = Yap_CharsToTDQ((char *)TokImage, CurrentModule, + LOCAL_encoding PASS_REGS); + if (!(t->TokInfo)) { + return CodeSpaceError(t, p, l); } - } - if (wcharp) { - *wcharp = '\0'; + Free(TokImage); + t->Tok = Ord(kind = String_tok); + } else if (quote == '`') { + t->TokInfo = Yap_CharsToTBQ((char *)TokImage, CurrentModule, + LOCAL_encoding PASS_REGS); + if (!(t->TokInfo)) { + return CodeSpaceError(t, p, l); + } + Free(TokImage); + t->Tok = Ord(kind = String_tok); } else { - *charp = '\0'; + t->TokInfo = MkAtomTerm(Yap_ULookupAtom(TokImage)); + if (!(t->TokInfo)) { + return CodeSpaceError(t, p, l); + } + Free(TokImage); + t->Tok = Ord(kind = Name_tok); + if (ch == '(') + solo_flag = false; } - if (quote == '"' ) { - if (wcharp) { - t->TokInfo = Yap_WCharsToTDQ((wchar_t *)TokImage, - CurrentModule - PASS_REGS); - } else { - t->TokInfo = Yap_CharsToTDQ(TokImage, CurrentModule, LOCAL_encoding - PASS_REGS); - } - if (!(t->TokInfo)) { - return CodeSpaceError(t, p, l); - } - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); - t->Tok = Ord(kind = String_tok); - } else if (quote == '`') { - if (wcharp) { - t->TokInfo = Yap_WCharsToTBQ((wchar_t *)TokImage, - CurrentModule PASS_REGS); - } else { - t->TokInfo = Yap_CharsToTBQ(TokImage, CurrentModule, - LOCAL_encoding - PASS_REGS); - } - if (!(t->TokInfo)) { - return CodeSpaceError(t, p, l); - } - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); - t->Tok = Ord(kind = String_tok); - } else { - if (wcharp) { - t->TokInfo = Unsigned(Yap_LookupWideAtom((wchar_t *)TokImage)); - } else { - t->TokInfo = Unsigned(Yap_LookupAtom(TokImage)); - } - if (!(t->TokInfo)) { - return CodeSpaceError(t, p, l); - } - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); - t->Tok = Ord(kind = Name_tok); - if (ch == '(') - solo_flag = false; - } - break; + break; case BS: if (ch == '\0') { + int pch; t->Tok = Ord(kind = eot_tok); + pch = Yap_peek(inp_stream - GLOBAL_Stream); if (chtype(pch) == EF) { mark_eof(inp_stream); t->TokInfo = TermEof; @@ -1726,21 +1640,15 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, } else ch = getchr(inp_stream); break; - case SY: + case SY: { + int pch; if (ch == '.' && (pch = Yap_peek(inp_stream - GLOBAL_Stream)) && (chtype(pch) == BS || chtype(pch) == EF || pch == '%')) { t->Tok = Ord(kind = eot_tok); // consume... if (pch == '%') { - t->TokInfo = TermNewLine; - return l; - } - ch = getchr(inp_stream); - if (chtype(ch) == EF) { - mark_eof(inp_stream); - t->TokInfo = TermEof; - } else { t->TokInfo = TermNewLine; + return l; } return l; } @@ -1754,11 +1662,11 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, if (ch == '%') { t->TokInfo = TermNewLine; return l; - } + } if (chtype(ch) == EF) { mark_eof(inp_stream); - t->TokInfo = TermEof; - } else { + t->TokInfo = TermEof; + } else { t->TokInfo = TermNewLine; } return l; @@ -1804,14 +1712,15 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, } goto restart; } + } enter_symbol: if (och == '.' && (chtype(ch) == BS || chtype(ch) == EF || ch == '%')) { t->Tok = Ord(kind = eot_tok); - if (ch == '%') { + if (ch == '%') { t->TokInfo = TermNewLine; return l; } - if (chtype(ch) == EF) { + if (chtype(ch) == EF) { mark_eof(inp_stream); t->TokInfo = TermEof; } else { @@ -1820,31 +1729,29 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, return l; } else { Atom ae; - - TokImage = (char *)((AtomEntry *)(Yap_PreAllocCodeSpace()))->StrOfAE; + sz = 1024; + TokImage = Malloc(sz); charp = TokImage; - wcharp = NULL; add_ch_to_buff(och); for (; chtype(ch) == SY; ch = getchr(inp_stream)) { - if (charp == (char *)AuxSp - 1024) { - goto huge_var_error; + if (charp >= TokImage + (sz - 10)) { + sz = min(sz * 2, sz + MBYTE); + TokImage = Realloc(TokImage, sz); + if (!TokImage) + return CodeSpaceError(t, p, l); } add_ch_to_buff(ch); } add_ch_to_buff('\0'); - if (wcharp) { - ae = Yap_LookupWideAtom((wchar_t *)TokImage); - } else { - ae = Yap_LookupAtom(TokImage); - } + ae = Yap_ULookupAtom(TokImage); if (ae == NIL) { return CodeSpaceError(t, p, l); } - t->TokInfo = Unsigned(ae); + t->TokInfo = MkAtomTerm(ae); if (t->TokInfo == (CELL)NIL) { return CodeSpaceError(t, p, l); } - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); + Free(TokImage); t->Tok = Ord(kind = Name_tok); if (ch == '(') solo_flag = false; @@ -1854,11 +1761,11 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, break; case SL: { - char chs[2]; + unsigned char chs[2]; chs[0] = ch; chs[1] = '\0'; ch = getchr(inp_stream); - t->TokInfo = Unsigned(Yap_LookupAtom(chs)); + t->TokInfo = MkAtomTerm(Yap_ULookupAtom(chs)); t->Tok = Ord(kind = Name_tok); if (ch == '(') solo_flag = FALSE; @@ -1867,19 +1774,25 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, case BK: och = ch; ch = getchr(inp_stream); - t->TokInfo = och; + { + unsigned char chs[10]; + TokImage = charp = chs; + add_ch_to_buff(och); + charp[0] = '\0'; + t->TokInfo = MkAtomTerm(Yap_ULookupAtom(chs)); + } if (och == '(') { while (chtype(ch) == BS) { ch = getchr(inp_stream); - }; + } if (ch == ')') { - t->TokInfo = Unsigned(AtomEmptyBrackets); + t->TokInfo = TermEmptyBrackets; t->Tok = Ord(kind = Name_tok); ch = getchr(inp_stream); solo_flag = FALSE; break; } else if (!solo_flag) { - t->TokInfo = 'l'; + t->TokInfo = Terml; solo_flag = TRUE; } } else if (och == '[') { @@ -1887,7 +1800,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, ch = getchr(inp_stream); }; if (ch == ']') { - t->TokInfo = Unsigned(AtomNil); + t->TokInfo = TermNil; t->Tok = Ord(kind = Name_tok); ch = getchr(inp_stream); solo_flag = FALSE; @@ -1931,7 +1844,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, ch = getchr(inp_stream); }; if (ch == '}') { - t->TokInfo = Unsigned(AtomBraces); + t->TokInfo = TermBraces; t->Tok = Ord(kind = Name_tok); ch = getchr(inp_stream); solo_flag = FALSE; @@ -1960,12 +1873,11 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, qq->mid.charno = inp_stream->charcount - 1; t->Tok = Ord(kind = QuasiQuotes_tok); ch = getchr(inp_stream); - - TokImage = Yap_PreAllocCodeSpace(); + sz = 1024; + TokImage = Malloc(sz); if (!TokImage) { LOCAL_ErrorMessage = "not enough heap space to read in a quasi quoted atom"; - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); t->Tok = Ord(kind = eot_tok); t->TokInfo = TermError; return l; @@ -1974,35 +1886,34 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, quote = ch; len = 0; ch = getchrq(inp_stream); - wcharp = NULL; while (TRUE) { if (ch == '|') { ch = getchrq(inp_stream); if (ch != '}') { } else { - charp = (char *)put_utf8((unsigned char *)charp, och); - charp = (char *)put_utf8((unsigned char *)charp, ch); + charp += put_utf8((unsigned char *)charp, och); + charp += put_utf8((unsigned char *)charp, ch); /* we're done */ break; } } else if (chtype(ch) == EF) { - Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); + Free(TokImage); mark_eof(inp_stream); t->Tok = Ord(kind = eot_tok); t->TokInfo = TermOutOfHeapError; break; } else { - charp = (char *)put_utf8((unsigned char *)charp, ch); + charp += put_utf8(charp, ch); ch = getchrq(inp_stream); } - if (charp > (char *)AuxSp - 1024) { + if (charp > (unsigned char *)AuxSp - 1024) { /* Not enough space to read in the string. */ return AuxSpaceError( t, l, "not enough space to read in string or quoted atom"); } } - len = charp - TokImage; + len = charp - (unsigned char *)TokImage; mp = malloc(len + 1); if (mp == NULL) { LOCAL_ErrorMessage = "not enough heap space to read in quasi quote"; @@ -2011,7 +1922,7 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, t->TokInfo = TermOutOfHeapError; return l; } - strncpy(mp, TokImage, len + 1); + strncpy((char *)mp, (const char *)TokImage, len + 1); qq->text = (unsigned char *)mp; Yap_ReleasePreAllocCodeSpace((CODEADDR)TokImage); if (inp_stream->status & Seekable_Stream_f) { @@ -2046,13 +1957,6 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, t->Tok = Ord(kind = eot_tok); t->TokInfo = TermEof; } -#if DEBUG - if (GLOBAL_Option[2]) { - static int n; - fprintf(stderr, "[Token %d %s %d]", Ord(kind), - Yap_tokRep(t, inp_stream->encoding),n++); - } -#endif if (LOCAL_ErrorMessage) { /* insert an error token to inform the system of what happened */ TokEntry *e = (TokEntry *)AllocScannerMemory(sizeof(TokEntry)); @@ -2072,12 +1976,10 @@ TokEntry *Yap_tokenizer(struct stream_desc *inp_stream, bool store_comments, return (l); } -int vsc_count; - void Yap_clean_tokenizer(TokEntry *tokstart, VarEntry *vartable, VarEntry *anonvartable) { CACHE_REGS - struct scanner_extra_alloc *ptr = LOCAL_ScannerExtraBlocks; + struct scanner_extra_alloc *ptr = LOCAL_ScannerExtraBlocks; while (ptr) { struct scanner_extra_alloc *next = ptr->next; free(ptr); diff --git a/C/signals.c b/C/signals.c index 9fe5c8d60..cdc3f36cd 100755 --- a/C/signals.c +++ b/C/signals.c @@ -25,18 +25,18 @@ static char SccsId[] = "%W% %G%"; #include #endif #if _WIN32 -#include #include +#include #endif -#include "Yatom.h" #include "YapHeap.h" +#include "Yatom.h" #include "eval.h" #include "yapio.h" #ifdef TABLING #include "tab.macros.h" #endif /* TABLING */ -#include #include +#include #if HAVE_STRING_H #include #endif @@ -63,7 +63,11 @@ static yap_signals InteractSIGINT(int ch) { #endif switch (ch) { case 'a': - /* abort computation */ +/* abort computation */ +#if PUSH_REGS +// restore_absmi_regs(&Yap_standard_regs); +#endif + siglongjmp(LOCAL_RestartEnv, 4); return YAP_ABORT_SIGNAL; case 'b': /* continue */ @@ -183,35 +187,32 @@ inline static bool get_signal(yap_signals sig USES_REGS) { #endif } -bool Yap_DisableInterrupts(int wid) -{ +bool Yap_DisableInterrupts(int wid) { LOCAL_InterruptsDisabled = true; YAPEnterCriticalSection(); return true; } -bool Yap_EnableInterrupts(int wid) -{ +bool Yap_EnableInterrupts(int wid) { LOCAL_InterruptsDisabled = false; YAPLeaveCriticalSection(); return true; } - /** Function called to handle delayed interrupts. */ -int Yap_HandleInterrupts(void) { +bool Yap_HandleSIGINT(void) { CACHE_REGS yap_signals sig; - if (get_signal(YAP_INT_SIGNAL PASS_REGS)) { + do { if ((sig = ProcessSIGINT()) != YAP_NO_SIGNAL) do_signal(worker_id, sig PASS_REGS); LOCAL_PrologMode &= ~InterruptMode; - return 1; - } - return 0; + return true; + } while (get_signal(YAP_INT_SIGNAL PASS_REGS)); + return false; } static Int p_creep(USES_REGS1) { diff --git a/C/stack.c b/C/stack.c index 21a5ef335..e8a6ec09e 100644 --- a/C/stack.c +++ b/C/stack.c @@ -1074,40 +1074,40 @@ bool set_clause_info(yamop *codeptr, PredEntry *pp) { Term ts[2]; void *begin; if (pp->ArityOfPE == 0) { - LOCAL_ActiveError.prologPredName = (Atom)pp->FunctorOfPred; - LOCAL_ActiveError.prologPredArity = 0; + LOCAL_ActiveError->prologPredName = (Atom)pp->FunctorOfPred; + LOCAL_ActiveError->prologPredArity = 0; } else { - LOCAL_ActiveError.prologPredName = NameOfFunctor(pp->FunctorOfPred); - LOCAL_ActiveError.prologPredArity = pp->ArityOfPE; + LOCAL_ActiveError->prologPredName = NameOfFunctor(pp->FunctorOfPred); + LOCAL_ActiveError->prologPredArity = pp->ArityOfPE; } - LOCAL_ActiveError.prologPredModule = + LOCAL_ActiveError->prologPredModule = (pp->ModuleOfPred ? pp->ModuleOfPred : TermProlog); - LOCAL_ActiveError.prologPredFile = pp->src.OwnerFile; + LOCAL_ActiveError->prologPredFile = pp->src.OwnerFile; if (codeptr->opc == UNDEF_OPCODE) { - LOCAL_ActiveError.prologPredFirstLine = 0; - LOCAL_ActiveError.prologPredLine = 0; - LOCAL_ActiveError.prologPredLastLine = 0; + LOCAL_ActiveError->prologPredFirstLine = 0; + LOCAL_ActiveError->prologPredLine = 0; + LOCAL_ActiveError->prologPredLastLine = 0; return true; } else if (pp->cs.p_code.NOfClauses) { - if ((LOCAL_ActiveError.prologPredCl = + if ((LOCAL_ActiveError->prologPredCl = find_code_in_clause(pp, codeptr, &begin, NULL)) <= 0) { - LOCAL_ActiveError.prologPredLine = 0; + LOCAL_ActiveError->prologPredLine = 0; } else { - LOCAL_ActiveError.prologPredLine = IntegerOfTerm(clause_loc(begin, pp)); + LOCAL_ActiveError->prologPredLine = IntegerOfTerm(clause_loc(begin, pp)); } if (pp->PredFlags & LogUpdatePredFlag) { - LOCAL_ActiveError.prologPredFirstLine = IntegerOfTerm( + LOCAL_ActiveError->prologPredFirstLine = IntegerOfTerm( ts[0] = clause_loc( ClauseCodeToLogUpdClause(pp->cs.p_code.FirstClause), pp)); - LOCAL_ActiveError.prologPredLastLine = IntegerOfTerm( + LOCAL_ActiveError->prologPredLastLine = IntegerOfTerm( ts[1] = clause_loc(ClauseCodeToLogUpdClause(pp->cs.p_code.LastClause), pp)); } else { - LOCAL_ActiveError.prologPredFirstLine = IntegerOfTerm( + LOCAL_ActiveError->prologPredFirstLine = IntegerOfTerm( ts[0] = clause_loc( ClauseCodeToStaticClause(pp->cs.p_code.FirstClause), pp)); - LOCAL_ActiveError.prologPredLastLine = IntegerOfTerm( + LOCAL_ActiveError->prologPredLastLine = IntegerOfTerm( ts[1] = clause_loc(ClauseCodeToStaticClause(pp->cs.p_code.LastClause), pp)); } diff --git a/C/stdpreds.c b/C/stdpreds.c index c912c0147..e62665634 100755 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -1099,24 +1099,25 @@ void Yap_show_statistics(void) { #endif frag = (100.0 * (heap_space_taken - HeapUsed)) / heap_space_taken; - fprintf(stderr, "Code Space: %ld (%ld bytes needed, %ld bytes used, " + fprintf(stderr, "Code Space: " UInt_FORMAT " (" UInt_FORMAT + " bytes needed, " UInt_FORMAT " bytes used, " "fragmentation %.3f%%).\n", - (unsigned long int)(Unsigned(H0) - Unsigned(Yap_HeapBase)), - (unsigned long int)(Unsigned(HeapTop) - Unsigned(Yap_HeapBase)), - (unsigned long int)(HeapUsed), frag); - fprintf(stderr, "Stack Space: %ld (%ld for Global, %ld for local).\n", - (unsigned long int)(sizeof(CELL) * (LCL0 - H0)), - (unsigned long int)(sizeof(CELL) * (HR - H0)), - (unsigned long int)(sizeof(CELL) * (LCL0 - ASP))); - fprintf(stderr, "Trail Space: %ld (%ld used).\n", - (unsigned long int)(sizeof(tr_fr_ptr) * (Unsigned(LOCAL_TrailTop) - - Unsigned(LOCAL_TrailBase))), - (unsigned long int)(sizeof(tr_fr_ptr) * - (Unsigned(TR) - Unsigned(LOCAL_TrailBase)))); - fprintf(stderr, "Runtime: %lds.\n", (unsigned long int)(runtime(PASS_REGS1))); - fprintf(stderr, "Cputime: %lds.\n", (unsigned long int)(Yap_cputime())); + Unsigned(H0) - Unsigned(Yap_HeapBase), + Unsigned(HeapTop) - Unsigned(Yap_HeapBase), Unsigned(HeapUsed), frag); + fprintf(stderr, "Stack Space: " UInt_FORMAT " (" UInt_FORMAT + " for Global, " UInt_FORMAT " for local).\n", + Unsigned(sizeof(CELL) * (LCL0 - H0)), + Unsigned(sizeof(CELL) * (HR - H0)), + Unsigned(sizeof(CELL) * (LCL0 - ASP))); + fprintf( + stderr, "Trail Space: " UInt_FORMAT " (" UInt_FORMAT " used).\n", + Unsigned(sizeof(tr_fr_ptr) * + (Unsigned(LOCAL_TrailTop) - Unsigned(LOCAL_TrailBase))), + Unsigned(sizeof(tr_fr_ptr) * (Unsigned(TR) - Unsigned(LOCAL_TrailBase)))); + fprintf(stderr, "Runtime: " UInt_FORMAT "\n", runtime(PASS_REGS1)); + fprintf(stderr, "Cputime: " UInt_FORMAT "\n", Yap_cputime()); - fprintf(stderr, "Walltime: " UInt_F ".\n", (UInt)(Yap_walltime() / 1000)); + fprintf(stderr, "Walltime: %" PRIu64 ".\n", Yap_walltime() / (UInt)1000); } static Int p_statistics_heap_max(USES_REGS1) { diff --git a/C/text.c b/C/text.c index 08e523b03..648ca6c2a 100644 --- a/C/text.c +++ b/C/text.c @@ -35,77 +35,138 @@ inline static size_t min_size(size_t i, size_t j) { return (i < j ? i : j); } #define NAN (0.0 / 0.0) #endif -#define MAX_PATHNAME 2048 +#define MAX_PATHNAME 2048 +struct mblock { + struct mblock *prev, *next; + int lvl; + size_t sz; +}; typedef struct TextBuffer_manager { void *buf, *ptr; size_t sz; - struct TextBuffer_manager *prev; + struct mblock *first[16]; + struct mblock *last[16]; int lvl; } text_buffer_t; -int lvl; +int push_text_stack(USES_REGS1) { return LOCAL_TextBuffer->lvl++; } -/** - * TextBuffer is allocated as a chain of blocks, They area - * recovered at the end if the translation. - */ -INLINE_ONLY inline int init_alloc(int line) { - // printf("l=%d\n",lvl); - if (lvl ) - return; - while (LOCAL_TextBuffer->prev ) { - struct TextBuffer_manager *old = LOCAL_TextBuffer; - LOCAL_TextBuffer = LOCAL_TextBuffer->prev; - free(old); +int pop_text_stack(int i) { + int lvl = LOCAL_TextBuffer->lvl; + while (lvl > i) { + struct mblock *p = LOCAL_TextBuffer->first[lvl]; + while (p) { + struct mblock *np = p->next; + free(p); + p = np; + } + LOCAL_TextBuffer->first[lvl] = NULL; + LOCAL_TextBuffer->last[lvl] = NULL; + lvl--; } - LOCAL_TextBuffer->sz = (YAP_FILENAME_MAX + 1); - LOCAL_TextBuffer->buf = LOCAL_TextBuffer->ptr = (void *)(LOCAL_TextBuffer + 1 ); - return lvl++; -} - -INLINE_ONLY inline int mark_stack(void) { -return lvl; } - -INLINE_ONLY inline void restore_stack(int i ) {lvl = i;} \ -INLINE_ONLY inline void unprotect_stack(int i) { -lvl = i;} - -static void *Malloc(size_t sz USES_REGS) { - sz = ALIGN_BY_TYPE(sz, CELL); - void *o = LOCAL_TextBuffer->ptr; - if ((char*)LOCAL_TextBuffer->ptr+sz>(char*)LOCAL_TextBuffer->buf + LOCAL_TextBuffer->sz) { - size_t nsz = max(sz*4/3,YAP_FILENAME_MAX + 1); - struct TextBuffer_manager *new = malloc(sizeof(struct TextBuffer_manager)+nsz); - new->prev = LOCAL_TextBuffer; - new->buf = (struct TextBuffer_manager *)new+1; - new->ptr = new->buf + sz; - new->sz = nsz; - LOCAL_TextBuffer= new; - return new->buf; - } - LOCAL_TextBuffer->ptr += sz; - return o; + LOCAL_TextBuffer->lvl = lvl; + return lvl; } - void *Yap_InitTextAllocator( void ) -{ - struct TextBuffer_manager *new = malloc(sizeof(struct TextBuffer_manager)\ - +MAX_PATHNAME*2 ); - new->prev = NULL; - new->ptr = new->buf = (struct TextBuffer_manager *)new+1; - new->sz = MAX_PATHNAME*2; - LOCAL_TextBuffer = new; - new->lvl = 0; - return new; +void *protected_pop_text_stack(int i, void *protected, bool tmp, + size_t sz USES_REGS) { + void *out = protected; + int lvl = LOCAL_TextBuffer->lvl; + while (lvl > i) { + struct mblock *p = LOCAL_TextBuffer->first[lvl]; + while (p) { + struct mblock *np = p->next; + if (p + 1 == protected) { + if (tmp) + out = LOCAL_FileNameBuf; + else + out = p; + memcpy(out, protected, sz); + } else { + free(p); + } + p = np; + } + LOCAL_TextBuffer->first[lvl] = NULL; + LOCAL_TextBuffer->last[lvl] = NULL; + lvl--; + } + LOCAL_TextBuffer->lvl = lvl; + return out; } +// void pop_text_stack(int i) { LOCAL_TextBuffer->lvl = i; } +void *Malloc(size_t sz USES_REGS) { + int lvl = LOCAL_TextBuffer->lvl; + if (sz == 0) + sz = 1024; + sz = ALIGN_BY_TYPE(sz + sizeof(struct mblock), CELL); + struct mblock *o = malloc(sz); + o->prev = LOCAL_TextBuffer->last[lvl]; + if (o->prev) { + o->prev->next = o; + } + if (LOCAL_TextBuffer->first[lvl]) { + LOCAL_TextBuffer->last[lvl] = o; + } else { + LOCAL_TextBuffer->first[lvl] = LOCAL_TextBuffer->last[lvl] = o; + } + o->next = NULL; + o->sz = sz; + o->lvl = lvl; + return o + 1; +} + +void *Realloc(void *pt, size_t sz USES_REGS) { + sz = ALIGN_BY_TYPE(sz + sizeof(struct mblock), CELL); + struct mblock *old = pt, *o; + old--; + int lvl = old->lvl; + o = realloc(old, sz); + if (o->prev) + o->prev->next = o; + if (o->next) + o->next->prev = o; + if (LOCAL_TextBuffer->first[lvl] == old) { + LOCAL_TextBuffer->first[lvl] = o; + } + if (LOCAL_TextBuffer->last[lvl] == old) { + LOCAL_TextBuffer->last[lvl] = o; + } + return o + 1; +} + +void Free(void *pt USES_REGS) { + struct mblock *o = pt; + o--; + if (o->prev) + o->prev->next = o->next; + if (o->next) + o->next->prev = o->prev; + int lvl = o->lvl; + if (LOCAL_TextBuffer->first[lvl] == o) { + if (LOCAL_TextBuffer->last[lvl] == o) { + LOCAL_TextBuffer->first[lvl] = LOCAL_TextBuffer->last[lvl] = NULL; + } + LOCAL_TextBuffer->first[lvl] = o->next; + } else if (LOCAL_TextBuffer->last[lvl] == o) { + LOCAL_TextBuffer->last[lvl] = o->prev; + } + free(o); +} + +void *Yap_InitTextAllocator(void) { + struct TextBuffer_manager *new = calloc(sizeof(struct TextBuffer_manager), 1); + return new; +} static size_t MaxTmp(USES_REGS1) { - return ((char*)LOCAL_TextBuffer->buf + LOCAL_TextBuffer->sz) - (char*)LOCAL_TextBuffer->ptr; + return ((char *)LOCAL_TextBuffer->buf + LOCAL_TextBuffer->sz) - + (char *)LOCAL_TextBuffer->ptr; } static Term Globalize(Term v USES_REGS) { @@ -170,15 +231,7 @@ static Int SkipListCodes(unsigned char **bufp, Term *l, Term **tailp, (*atoms)++; if (*atoms < length) { *tailp = l; - return -TYPE_ERROR_NUMBER; - } - if (IsWideAtom(AtomOfTerm(hd))) { - int ch; - if ((RepAtom(AtomOfTerm(hd))->WStrOfAE)[1] != '\0') { - length = -REPRESENTATION_ERROR_CHARACTER; - } - ch = RepAtom(AtomOfTerm(hd))->WStrOfAE[0]; - *wide = true; + return -REPRESENTATION_ERROR_CHARACTER_CODE; } else { AtomEntry *ae = RepAtom(AtomOfTerm(hd)); if ((ae->StrOfAE)[1] != '\0') { @@ -191,10 +244,10 @@ static Int SkipListCodes(unsigned char **bufp, Term *l, Term **tailp, } else if (IsIntegerTerm(hd)) { ch = IntegerOfTerm(hd); if (*atoms) - length = -TYPE_ERROR_ATOM; + length = -REPRESENTATION_ERROR_CHARACTER; else if (ch < 0) { *tailp = l; - length = -DOMAIN_ERROR_NOT_LESS_THAN_ZERO; + length = -REPRESENTATION_ERROR_CHARACTER_CODE; } else { *wide |= ch > 0x80; } @@ -276,7 +329,6 @@ static unsigned char *to_buffer(unsigned char *buf, Term t, seq_tv_t *inp, n = SkipListCodes(&bufc, &t, &r, atoms, widep, inp PASS_REGS); if (n < 0) { LOCAL_Error_TYPE = -n; - LOCAL_Error_Term = *r; return NULL; } *lenp = n; @@ -350,7 +402,6 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) { YAP_STRING_BIG)) == inp->type) { LOCAL_Error_TYPE = TYPE_ERROR_NUMBER; } - LOCAL_Error_Term = inp->val.t; } } if (LOCAL_Error_TYPE != YAP_NO_ERROR) @@ -360,37 +411,32 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) { // this is a term, extract to a buffer, and representation is wide // Yap_DebugPlWriteln(inp->val.t); Atom at = AtomOfTerm(inp->val.t); - if (IsWideAtom(at)) { - inp->val.w = at->WStrOfAE; - return wchar2utf8(inp, lengp); - } else { - inp->val.c = at->StrOfAE; - return latin2utf8(inp, lengp); - } + if (lengp) + *lengp = strlen_utf8(at->UStrOfAE); + return at->UStrOfAE; } if (IsStringTerm(inp->val.t) && inp->type & YAP_STRING_STRING) { // this is a term, extract to a buffer, and representation is wide // Yap_DebugPlWriteln(inp->val.t); + if (lengp) + *lengp = strlen_utf8(UStringOfTerm(inp->val.t)); return (unsigned char *)UStringOfTerm(inp->val.t); } if (((inp->type & (YAP_STRING_CODES | YAP_STRING_ATOMS)) == (YAP_STRING_CODES | YAP_STRING_ATOMS)) && IsPairOrNilTerm(inp->val.t)) { // Yap_DebugPlWriteln(inp->val.t); - return inp->val.uc = - Yap_ListToBuffer(s0, inp->val.t, inp, &wide, lengp PASS_REGS); + return Yap_ListToBuffer(s0, inp->val.t, inp, &wide, lengp PASS_REGS); // this is a term, extract to a sfer, and representation is wide } if (inp->type & YAP_STRING_CODES && IsPairOrNilTerm(inp->val.t)) { // Yap_DebugPlWriteln(inp->val.t); - return inp->val.uc = Yap_ListOfCodesToBuffer(s0, inp->val.t, inp, &wide, - lengp PASS_REGS); + return Yap_ListOfCodesToBuffer(s0, inp->val.t, inp, &wide, lengp PASS_REGS); // this is a term, extract to a sfer, and representation is wide } if (inp->type & YAP_STRING_ATOMS && IsPairOrNilTerm(inp->val.t)) { // Yap_DebugPlWriteln(inp->val.t); - return inp->val.uc = Yap_ListOfAtomsToBuffer(s0, inp->val.t, inp, &wide, - lengp PASS_REGS); + return Yap_ListOfAtomsToBuffer(s0, inp->val.t, inp, &wide, lengp PASS_REGS); // this is a term, extract to a buffer, and representation is wide } if (inp->type & YAP_STRING_INT && IsIntegerTerm(inp->val.t)) { @@ -406,22 +452,27 @@ unsigned char *Yap_readText(seq_tv_t *inp, size_t *lengp) { AUX_ERROR(inp->val.t, 2 * MaxTmp(PASS_REGS1), s, char); } *lengp = strlen(s); - Malloc(*lengp); - return inp->val.uc = (unsigned char *)s; + return (unsigned char *)s; } if (inp->type & YAP_STRING_FLOAT && IsFloatTerm(inp->val.t)) { char *s; + size_t sz = 1024; // Yap_DebugPlWriteln(inp->val.t); - if (s0) + if (s0) { s = (char *)s0; - else - s = Malloc(0); - AUX_ERROR(inp->val.t, MaxTmp(PASS_REGS1), s, char); - if (!Yap_FormatFloat(FloatOfTerm(inp->val.t), &s, MaxTmp() - 1)) { - AUX_ERROR(inp->val.t, 2 * MaxTmp(PASS_REGS1), s, char); + sz = strlen(s); + } else + s = Malloc(sz); + if (!s) + AUX_ERROR(inp->val.t, MaxTmp(PASS_REGS1), s, char); + while (!Yap_FormatFloat(FloatOfTerm(inp->val.t), &s, sz - 1)) { + if (s0) { + s = Malloc(sz = 1024); + s0 = NULL; + } else + s = Realloc(s, sz + 1024); } *lengp = strlen(s); - Malloc(*lengp); return inp->val.uc = (unsigned char *)s; } #if USE_GMP @@ -526,19 +577,20 @@ static Term write_atoms(void *s0, seq_tv_t *out, size_t leng USES_REGS) { unsigned char *s = s0, *lim = s + strnlen((char *)s, max); unsigned char *cp = s; - wchar_t w[2]; - w[1] = '\0'; + unsigned char w[10], *wp = w; LOCAL_TERM_ERROR(t, 2 * (lim - s)); while (cp < lim && *cp) { utf8proc_int32_t chr; CELL *cl; - cp += get_utf8(cp, -1, &chr); - if (chr == '\0') + s += get_utf8(s, 1, &chr); + if (chr == '\0') { + wp[0] = '\0'; break; - w[0] = chr; + } + wp += put_utf8(w, chr); cl = HR; HR += 2; - cl[0] = MkAtomTerm(Yap_LookupMaybeWideAtom(w)); + cl[0] = MkAtomTerm(Yap_ULookupAtom(w)); cl[1] = AbsPair(HR); sz++; if (sz == max) @@ -574,8 +626,7 @@ static Term write_codes(void *s0, seq_tv_t *out, size_t leng USES_REGS) { unsigned char *s = s0, *lim = s + strlen((char *)s); unsigned char *cp = s; - wchar_t w[2]; - w[1] = '\0'; + LOCAL_TERM_ERROR(t, 2 * (lim - s)); while (*cp) { utf8proc_int32_t chr; @@ -607,34 +658,18 @@ static Term write_codes(void *s0, seq_tv_t *out, size_t leng USES_REGS) { } static Atom write_atom(void *s0, seq_tv_t *out, size_t leng USES_REGS) { - { - unsigned char *s = s0; - utf8proc_int32_t chr; - while (*s && get_utf8(s, -1, &chr) == 1) - s++; - if (*s == '\0') - return out->val.a = Yap_LookupAtom((char *)s0); - s = s0; - size_t l = strlen(s0); - wchar_t *wbuf = Malloc(sizeof(wchar_t) * ((l + 1))), *wptr = wbuf; - Atom at; - if (!wbuf) - return NULL; - while (*s) { - utf8proc_int32_t chr; - int off = get_utf8(s, -1, &chr); - if (off < 0) { - s++; - continue; - } - s++; - *wptr++ = chr; - } - *wptr++ = '\0'; - - at = Yap_LookupMaybeWideAtom(wbuf); - out->val.a = at; - return at; + unsigned char *s = s0; + int32_t ch; + if (leng == 0) { + return Yap_LookupAtom(""); + } + if (strlen_utf8(s0) <= leng) { + return Yap_LookupAtom(s0); + } else { + size_t n = get_utf8(s, 1, &ch); + unsigned char *buf = Malloc(n + 1); + memcpy(buf, s0, n + 1); + return Yap_ULookupAtom(buf); } } @@ -711,31 +746,34 @@ static size_t write_length(const unsigned char *s0, seq_tv_t *out, return leng; } -static Term write_number(unsigned char *s, seq_tv_t *out, int size USES_REGS) { +static Term write_number(unsigned char *s, seq_tv_t *out, int size, + bool error_on USES_REGS) { Term t; - int i = mark_stack(); - t = Yap_StringToNumberTerm((char *)s, &out->enc); - restore_stack(i); + int i = push_text_stack(); + t = Yap_StringToNumberTerm((char *)s, &out->enc, error_on); + pop_text_stack(i); return t; } static Term string_to_term(void *s, seq_tv_t *out, size_t leng USES_REGS) { Term o; - int i = mark_stack(); - o = out->val.t = - Yap_StringToTerm(s, strlen(s) + 1, &out->enc, GLOBAL_MaxPriority, NULL); - restore_stack(i); + o = out->val.t = Yap_BufferToTerm(s, strlen(s) + 1, TermNil); return o; } bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) { /* we know what the term is */ + if (out->type == 0) { + return true; + } + if (out->type & YAP_STRING_TERM) { if ((out->val.t = string_to_term(inp, out, leng PASS_REGS)) != 0L) return out->val.t != 0; } if (out->type & (YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG)) { - if ((out->val.t = write_number(inp, out, leng PASS_REGS)) != 0L) { + if ((out->val.t = write_number( + inp, out, leng, !(out->type & YAP_STRING_ATOM)PASS_REGS)) != 0L) { // Yap_DebugPlWriteln(out->val.t); return true; @@ -745,7 +783,7 @@ bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) { return false; } if (out->type & (YAP_STRING_ATOM)) { - if (write_atom(inp, out, leng PASS_REGS) != NIL) { + if ((out->val.a = write_atom(inp, out, leng PASS_REGS)) != NIL) { Atom at = out->val.a; if (at && (out->type & YAP_STRING_OUTPUT_TERM)) out->val.t = MkAtomTerm(at); @@ -786,10 +824,10 @@ bool write_Text(unsigned char *inp, seq_tv_t *out, size_t leng USES_REGS) { // Yap_DebugPlWriteln(out->val.t); return out->val.a != NULL; case YAP_STRING_INT | YAP_STRING_FLOAT | YAP_STRING_BIG: - out->val.t = write_number(inp, out, leng PASS_REGS); + out->val.t = write_number(inp, out, leng, true PASS_REGS); // Yap_DebugPlWriteln(out->val.t); return out->val.t != 0; - default: {} + default: { return true; } } return false; } @@ -825,9 +863,8 @@ bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) { bool rc; size_t leng; - int l = init_alloc(__LINE__); /* - f//printf(stderr, "[ %d ", n++) ; + f//printfmark(stderr, "[ %d ", n++) ; if (inp->type & (YAP_STRING_TERM|YAP_STRING_ATOM|YAP_STRING_ATOMS_CODES |YAP_STRING_STRING)) //Yap_DebugPlWriteln(inp->val.t); @@ -850,26 +887,22 @@ bool Yap_CVT_Text(seq_tv_t *inp, seq_tv_t *out USES_REGS) { } if (!buf) { - unprotect_stack(0); return 0L; } if (out->type & (YAP_STRING_UPCASE | YAP_STRING_DOWNCASE)) { if (out->type & YAP_STRING_UPCASE) { if (!upcase(buf, out)) { - unprotect_stack(0); return false; } } if (out->type & YAP_STRING_DOWNCASE) { if (!downcase(buf, out)) { - unprotect_stack(0); return false; } } } rc = write_Text(buf, out, leng PASS_REGS); - unprotect_stack(l); /* fprintf(stderr, " -> "); if (!rc) fprintf(stderr, "NULL"); else if (out->type & @@ -899,8 +932,8 @@ static int cmp_Text(const unsigned char *s1, const unsigned char *s2, int l) { return 0; } -static unsigned char *concat(int n, unsigned char *sv[] USES_REGS) { - char *buf; +static unsigned char *concat(int n, void *sv[] USES_REGS) { + void *buf; unsigned char *buf0; size_t room = 0; int i; @@ -909,11 +942,14 @@ static unsigned char *concat(int n, unsigned char *sv[] USES_REGS) { room += strlen((char *)sv[i]); } buf = Malloc(room + 1); - buf0 = (unsigned char *)buf; + buf0 = buf; for (i = 0; i < n; i++) { - char *s = (char *)sv[i]; - buf = strcpy(buf, s); - buf += strlen(s); +#if _WIN32 || defined(__ANDROID__) + strcpy(buf, sv[i]); + buf = (char *)buf + strlen(buf); +#else + buf = stpcpy(buf, sv[i]); +#endif } return buf0; } @@ -935,14 +971,13 @@ static void *slice(size_t min, size_t max, unsigned char *buf USES_REGS) { // // Out must be an atom or a string bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) { - unsigned char **bufv; + void **bufv; unsigned char *buf; - size_t leng; int i; - int l = init_alloc(__LINE__); + size_t leng; + bufv = Malloc(tot * sizeof(unsigned char *)); if (!bufv) { - unprotect_stack(0); return NULL; } for (i = 0; i < tot; i++) { @@ -950,14 +985,12 @@ bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) { unsigned char *nbuf = Yap_readText(inp + i, &leng PASS_REGS); if (!nbuf) { - unprotect_stack(0); return NULL; } bufv[i] = nbuf; } buf = concat(tot, bufv PASS_REGS); - bool rc = write_Text(buf, out, leng PASS_REGS); - unprotect_stack(l); + bool rc = write_Text(buf, out, strlen_utf8(buf) PASS_REGS); return rc; } @@ -965,12 +998,11 @@ bool Yap_Concat_Text(int tot, seq_tv_t inp[], seq_tv_t *out USES_REGS) { bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp, seq_tv_t outv[] USES_REGS) { unsigned char *buf; - int l = init_alloc(__LINE__); + size_t l; + inp->type |= YAP_STRING_IN_TMP; buf = Yap_readText(inp, &l PASS_REGS); if (!buf) { - unprotect_stack(0); - return false; } if (!cuts) { @@ -981,11 +1013,9 @@ bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp, if (outv[0].val.t) { buf0 = Yap_readText(outv, &l0 PASS_REGS); if (!buf0) { - unprotect_stack(0); return false; } if (cmp_Text(buf, buf0, l0) != 0) { - unprotect_stack(0); return false; } l1 = l - l0; @@ -993,26 +1023,21 @@ bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp, buf1 = slice(l0, l, buf PASS_REGS); bool rc = write_Text(buf1, outv + 1, l1 PASS_REGS); if (!rc) { - unprotect_stack(0); return false; } - unprotect_stack(l); return rc; } else /* if (outv[1].val.t) */ { buf1 = Yap_readText(outv + 1, &l1 PASS_REGS); if (!buf1) { - unprotect_stack(0); return false; } l0 = l - l1; if (cmp_Text(skip_utf8((const unsigned char *)buf, l0), buf1, l1) != 0) { - unprotect_stack(0); return false; } buf0 = slice(0, l0, buf PASS_REGS); bool rc = write_Text(buf0, outv, l0 PASS_REGS); - unprotect_stack((rc ? 0 : l + 0)); return rc; } } @@ -1023,20 +1048,20 @@ bool Yap_Splice_Text(int n, size_t cuts[], seq_tv_t *inp, next = 0; else next = cuts[i - 1]; + if (i > 0 && cuts[i] == 0) + break; void *bufi = slice(next, cuts[i], buf PASS_REGS); if (!write_Text(bufi, outv + i, cuts[i] - next PASS_REGS)) { - unprotect_stack(0); return false; } } - unprotect_stack(l); return true; } /** * Function to convert a generic text term (string, atom, list of codes, list -of +of< atoms) into a buff er. * @@ -1055,10 +1080,7 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) { inp.val.t = t; if (IsAtomTerm(t) && t != TermNil) { inp.type = YAP_STRING_ATOM; - if (IsWideAtom(AtomOfTerm(t))) - inp.enc = ENC_WCHAR; - else - inp.enc = ENC_ISO_LATIN1; + inp.enc = ENC_ISO_UTF8; } else if (IsStringTerm(t)) { inp.type = YAP_STRING_STRING; inp.enc = ENC_ISO_UTF8; @@ -1090,7 +1112,7 @@ const char *Yap_TextTermToText(Term t, char *buf, size_t len, encoding_t enc) { const char *Yap_PredIndicatorToUTF8String(PredEntry *ap) { CACHE_REGS Atom at; - arity_t arity; + arity_t arity = 0; Functor f; char *s, *smax, *s0; s = s0 = malloc(1024); diff --git a/C/utilpreds.c b/C/utilpreds.c index c6a1166e4..e537d93a9 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -799,22 +799,12 @@ Atom export_atom(Atom at, char **hpp, char *buf, size_t len) ptr = (char *)AdjustSize((CELL*)ptr, buf); p0 = ptr; - if (IsWideAtom(at)) { - wchar_t *wptr = (wchar_t *)ptr; - *wptr++ = -1; - sz = wcslen(RepAtom(at)->WStrOfAE); - if (sizeof(wchar_t)*(sz+1) >= len) - return (Atom)NULL; - wcsncpy(wptr, RepAtom(at)->WStrOfAE, len); - *hpp = (char *)(wptr+(sz+1)); - } else { - *ptr++ = 0; + *ptr++ = 0; sz = strlen(RepAtom(at)->StrOfAE); - if (sz + 1 + sizeof(wchar_t) >= len) + if (sz + 1 >= len) return (Atom)NULL; strcpy(ptr, RepAtom(at)->StrOfAE); *hpp = ptr+(sz+1); - } return (Atom)(p0-buf); } @@ -1179,10 +1169,8 @@ addAtom(Atom t, char *buf) if (!*s) { return Yap_LookupAtom(s+1); - } else { - wchar_t *w = (wchar_t *)s; - return Yap_LookupWideAtom(w+1); } + return NULL; } static UInt @@ -3386,19 +3374,6 @@ addAtomToHash(CELL *st, Atom at) { unsigned int len; - if (IsWideAtom(at)) { - wchar_t *c = RepAtom(at)->WStrOfAE; - int ulen = wcslen(c); - len = ulen*sizeof(wchar_t); - if (len % CellSize == 0) { - len /= CellSize; - } else { - len /= CellSize; - len++; - } - st[len-1] = 0L; - wcsncpy((wchar_t *)st, c, ulen); - } else { char *c = RepAtom(at)->StrOfAE; int ulen = strlen(c); /* fix hashing over empty atom */ @@ -3413,7 +3388,6 @@ addAtomToHash(CELL *st, Atom at) } st[len-1] = 0L; strncpy((char *)st, c, ulen); - } return st+len; } diff --git a/C/write.c b/C/write.c index 04325ed0d..91064bdd7 100644 --- a/C/write.c +++ b/C/write.c @@ -187,12 +187,6 @@ inline static void wrputs(char *s, StreamDesc *stream) { wrputc(c, stream); } -static void wrputws(wchar_t *s, wrf stream) /* writes a string */ -{ - while (*s) - wrputc(*s++, stream); -} - #ifdef USE_GMP static char *ensure_space(size_t sz) { @@ -571,9 +565,12 @@ static void write_string(const unsigned char *s, qt = '"'; wrputc(qt, stream); do { - ptr += get_utf8(ptr, -1, &chr); + int delta; + ptr += (delta = get_utf8(ptr, -1, &chr) ); + if (chr == '\0') break; + if (delta == 0) {chr = *ptr++; } write_quoted(chr, qt, stream); } while (TRUE); wrputc(qt, stream); @@ -589,22 +586,7 @@ static void putAtom(Atom atom, int Quote_illegal, struct write_globs *wglb) { wrputblob(RepAtom(atom), Quote_illegal, wglb); return; } - if (IsWideAtom(atom)) { - wchar_t *ws = RepAtom(atom)->WStrOfAE; - - if (Quote_illegal) { - wrputc('\'', stream); - while (*ws) { - wchar_t ch = *ws++; - write_quoted(ch, '\'', stream); - } - wrputc('\'', stream); - } else { - wrputws(ws, stream); - } - return; - } - s = (unsigned char *)RepAtom(atom)->StrOfAE; + s = RepAtom(atom)->UStrOfAE; /* #define CRYPT_FOR_STEVE 1*/ #ifdef CRYPT_FOR_STEVE if (Yap_GetValue(AtomCryptAtoms) != TermNil && @@ -624,7 +606,8 @@ static void putAtom(Atom atom, int Quote_illegal, struct write_globs *wglb) { if (Quote_illegal && !legalAtom(s)) { wrputc('\'', stream); while (*s) { - wchar_t ch = *s++; + int32_t ch; + s += get_utf8(s, 1, &ch); write_quoted(ch, '\'', stream); } wrputc('\'', stream); @@ -1032,7 +1015,7 @@ static void writeTerm(Term t, int p, int depth, int rinfixarg, } } else if (!wglb->Ignore_ops && (Arity == 1 || - ((atom == AtomEmptyBrackets || atom == AtomEmptyCurlyBrackets || + ((atom == AtomEmptyBrackets || atom == AtomCurly || atom == AtomEmptySquareBrackets) && Yap_IsListTerm(ArgOfTerm(1, t)))) && Yap_IsPosfixOp(atom, &op, &lp)) { @@ -1067,7 +1050,7 @@ static void writeTerm(Term t, int p, int depth, int rinfixarg, wrputc('(', wglb->stream); } else if (atom == AtomEmptySquareBrackets) { wrputc('[', wglb->stream); - } else if (atom == AtomEmptyCurlyBrackets) { + } else if (atom == AtomCurly) { wrputc('{', wglb->stream); } lastw = separator; @@ -1076,7 +1059,7 @@ static void writeTerm(Term t, int p, int depth, int rinfixarg, wrputc(')', wglb->stream); } else if (atom == AtomEmptySquareBrackets) { wrputc(']', wglb->stream); - } else if (atom == AtomEmptyCurlyBrackets) { + } else if (atom == AtomCurly) { wrputc('}', wglb->stream); } lastw = separator; diff --git a/C/yap-args.c b/C/yap-args.c index 27af5bdce..7ec1cc274 100755 --- a/C/yap-args.c +++ b/C/yap-args.c @@ -369,8 +369,7 @@ X_API YAP_file_type_t YAP_parse_yap_arguments(int argc, char *argv[], p++; } } else { - YAP_SetOutputMessage(); - + YAP_SetOutputMessage(); } break; #endif @@ -446,13 +445,13 @@ X_API YAP_file_type_t YAP_parse_yap_arguments(int argc, char *argv[], break; case 'n': if (!strcmp("nosignals", p)) { - iap->PrologShouldHandleInterrupts = FALSE; + iap->PrologCannotHandleInterrupts = true; break; } break; case '-': if (!strcmp("-nosignals", p)) { - iap->PrologShouldHandleInterrupts = FALSE; + iap->PrologCannotHandleInterrupts = true; break; } else if (!strncmp("-home=", p, strlen("-home="))) { GLOBAL_Home = p + strlen("-home="); diff --git a/CMakeLists.txt b/CMakeLists.txt index ebfd177ff..0887f25b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,3 @@ -# Sets the minimum version of CMake required to build the native -# library. You should either keep the default value or only pass a # value of 3.4.0 or lower. # Sets the minimum version of CMake required to build the native @@ -8,15 +6,20 @@ project( YAP ) +if (ANDROID) + set(YAP_APP_DIR "${CMAKE_SOURCE_DIR}/../..") + cmake_policy(VERSION 3.4) + +else () cmake_minimum_required(VERSION 2.8) - -# cmake_policy(VERSION 3.4) - +include(CMakeToolsHelpers OPTIONAL) +endif() set( - CMAKE_MODULE_PATH - "${CMAKE_SOURCE_DIR}" - "${CMAKE_SOURCE_DIR}/cmake") + CMAKE_MODULE_PATH + "${CMAKE_SOURCE_DIR}" + "${CMAKE_SOURCE_DIR}/cmake" + ) include(CheckIncludeFiles) include(CheckLibraryExists) @@ -28,11 +31,28 @@ include(MacroOptionalFindPackage) include(MacroLogFeature) include(FindPackageHandleStandardArgs) include (GNUInstallDirs) + # Creates and names a library, sets it as either STATIC # or SHARED, and provides the relative paths to its source code. # You can define multiple libraries, and CMake builds it for you. # Gradle automatically packages shared libraries with your APK. +#cross-compilation support +# Search packages for host system instead of packages for target system +# in case of cross compilation these macro should be defined by toolchain file +if(NOT COMMAND find_host_package) + macro(find_host_package) + find_package(${ARGN}) + endmacro() +endif() +if(NOT COMMAND find_host_program) + macro(find_host_program) + find_program(${ARGN}) + endmacro() +endif() + +option(BUILD_SHARED_LIBS "Build shared library" ON) +set (CMAKE_POSITION_INDEPENDENT_CODE TRUE) include(Prelims NO_POLICY_SCOPE) @@ -40,10 +60,15 @@ include(Sources NO_POLICY_SCOPE) include(Model NO_POLICY_SCOPE) -include_directories ( utf8proc packages/myddas packages/myddas/sqlite3 ) +include_directories ( utf8proc packages/myddas packages/myddas/sqlite3/src) + if (ANDROID) - include_directories ( packages/myddas/sqlite3/Android/jni/sqlite/nativehelper packages/myddas/sqlite3/Android/jni/sqlite ) -endif (ANDROID) + include_directories ( + packages/myddas/sqlite3/src/Android/jni/sqlite + packages/myddas/sqlite3/src/Android/jni/sqlite/nativehelper + ) + endif (ANDROID) + add_definitions(-DUSE_MYDDAS=1 -DMYDDAS_SQLITE3=1) if (MYSQL_FOUND) @@ -58,39 +83,21 @@ if (MYSQL_POSTGRES) add_definitions(= -DMYDDAS_POSTGRES=1) endif() -if (ANDROID) - # - # SWIG_FOUND - set to true if SWIG is found - # SWIG_DIR - t he directory where swig is installed - # SWIG_EXECUTABLE - the path to the swig executable - # SWIG_VERSION - the version number of the swig executable - # - - # -set (SWIG_SOURCES ${CMAKE_SOURCE_DIR}/packages/swig/yap.i) -set (SWIG_CXX ${CMAKE_BINARY_DIR}/yap_swig.cpp) -find_host_package (SWIG) -macro_log_feature (SWIG_FOUND "Swig" - "Use SWIG Language Interface " -"http://www.swig.org" ON) - - - add_custom_command (OUTPUT ${SWIG_CXX} - COMMAND ${SWIG_EXECUTABLE} -c++ -java -package pt.up.yap.lib -outdir ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/../../../../../src/generated/java -I${CMAKE_SOURCE_DIR}/CXX -o ${SWIG_CXX} - ${SWIG_SOURCES} - ) + if (ANDROID) ADD_SUBDIRECTORY(os) ADD_SUBDIRECTORY(OPTYap) ADD_SUBDIRECTORY(packages/myddas) - ADD_SUBDIRECTORY(library/random) - ADD_SUBDIRECTORY(library/system) ADD_SUBDIRECTORY(utf8proc) ADD_SUBDIRECTORY(CXX) + +set (SWIG_FILES ${CMAKE_SOURCE_DIR}/../generated/jni/yap_wrap.cpp ) + else () set(YLIBS + $ $ $ $ @@ -103,21 +110,24 @@ else () endif () if (WIN32) - list (APPEND YLIBS $) + list (APPEND YLIBS $) +endif() + + +add_component (core + ${ENGINE_SOURCES} + ${SWIG_FILES} + ${C_INTERFACE_SOURCES} + ${STATIC_SOURCES} + ${ALL_SOURCES} + ) - endif() add_library( # Sets the name of the library. libYap # Sets the library as a shared library. SHARED - - ${ENGINE_SOURCES} - ${SWIG_CXX} - ${C_INTERFACE_SOURCES} - ${STATIC_SOURCES} - ${ALL_SOURCES} ${YLIBS} ${WINDLLS} ) @@ -131,7 +141,7 @@ endif (USE_READLINE) if (ANDROID) - add_dependencies(libYap plmyddas) + add_dependencies(libYap plmyddas ) target_link_libraries(libYap android log) diff --git a/CXX/yapa.hh b/CXX/yapa.hh index e1b955817..212d40492 100644 --- a/CXX/yapa.hh +++ b/CXX/yapa.hh @@ -23,8 +23,6 @@ enum PropTag { MUTEX_TAG = MutexProperty, // 0xFFF6, /// A typed array, may be in-db or in-stack deped ARRAY_TAG = ArrayProperty, // 0xFFF7, - /// atom does not fit ISO-LATIN-1 - WIDE_TAG = WideAtomProperty, // 0xFFF8, /// module MODULE_TAG = ModProperty, // 0xFFFA, /// the original SICStus blackboard @@ -59,14 +57,14 @@ class YAPAtom { /// construct new YAPAtom from Atom YAPAtom( Atom at ) { a = at; } public: - /// construct new YAPAtom from string - YAPAtom( const char * s) { a = Yap_LookupAtom( s ); } + /// construct new YAPAtom from UTF-8 string + YAPAtom( const char * s) { a = Yap_LookupAtom( s ); } + /// construct new YAPAtom from UTF-8 string + YAPAtom( const wchar_t * s) { CACHE_REGS a = UTF32ToAtom( s PASS_REGS ); } /// construct new YAPAtom from wide string -YAPAtom( const wchar_t * s) { a = Yap_LookupMaybeWideAtom( s ); } + //YAPAtom( const wchar_t * s) { a = Yap_LookupMaybeWideAtom( s ); } /// construct new YAPAtom from max-length string YAPAtom( const char * s, size_t len) { a = Yap_LookupAtomWithLength( s, len ); } - /// construct new YAPAtom from max-length wide string - YAPAtom( const wchar_t * s, size_t len) { a = Yap_LookupMaybeWideAtomWithLength( s, len ); } /// get name of atom const char *getName(void); /// get name of (other way) diff --git a/CXX/yapdb.hh b/CXX/yapdb.hh index f80ae3fd4..d7b6e1c3d 100644 --- a/CXX/yapdb.hh +++ b/CXX/yapdb.hh @@ -97,7 +97,7 @@ public: /// Note: Python confuses the 3 constructors, /// use YAPFunctorFromWideString inline YAPFunctor(const wchar_t *s, uintptr_t arity) { - f = Yap_MkFunctor(Yap_LookupWideAtom(s), arity); + CACHE_REGS f = Yap_MkFunctor(UTF32ToAtom(s PASS_REGS), arity); } ~YAPFunctor(){}; /// Getter: extract name of functor as an atom @@ -137,8 +137,10 @@ protected: CACHE_REGS BACKUP_MACHINE_REGS(); Term *modp = NULL; - - out = Yap_StringToTerm(s0, strlen(s0) + 1, &LOCAL_encoding, 1200, &names); +names = MkVarTerm (); + const unsigned char *us = (const unsigned char *)s0; + out = + Yap_BufferToTermWithPrioBindings(us, strlen(s0), TermNil, 1200, names); // extern char *s0; // fprintf(stderr,"ap=%p arity=%d text=%s", ap, ap->ArityOfPE, s); // Yap_DebugPlWrite(out); @@ -217,13 +219,15 @@ public: /// char */module constructor for predicates. /// inline YAPPredicate(const char *at, uintptr_t arity) { - ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), CurrentModule)); + ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), + CurrentModule)); }; /// char */module constructor for predicates. /// inline YAPPredicate(const char *at, uintptr_t arity, YAPTerm mod) { - ap = RepPredProp(PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), mod.t)); + ap = RepPredProp( + PredPropByFunc(Yap_MkFunctor(Yap_LookupAtom(at), arity), mod.t)); }; /// char */module constructor for predicates. @@ -266,8 +270,8 @@ public: */ class YAPPrologPredicate : public YAPPredicate { public: - YAPPrologPredicate(YAPTerm t) : YAPPredicate(t) {}; - YAPPrologPredicate(const char *s, arity_t arity): YAPPredicate(s, arity) {}; + YAPPrologPredicate(YAPTerm t) : YAPPredicate(t){}; + YAPPrologPredicate(const char *s, arity_t arity) : YAPPredicate(s, arity){}; /// add a new clause void *assertClause(YAPTerm clause, bool last = true, YAPTerm source = YAPTerm()); diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index 5b0ed2072..69c70bc8b 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -162,6 +162,8 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f, YAPTerm ts[]) : YAPTerm() { RECOVER_H(); } +#if 0 + YAPApplTerm::YAPApplTerm(const char *f, std::vector ts) : YAPTerm() { BACKUP_H(); arity_t arity = ts.size(); @@ -179,29 +181,32 @@ YAPApplTerm::YAPApplTerm(YAPFunctor f) : YAPTerm() { mk(Yap_MkNewApplTerm(f.f, arity)); RECOVER_H(); } + #endif + YAPFunctor YAPApplTerm::getFunctor() { return YAPFunctor(FunctorOfTerm(gt())); } -YAPTerm &YAPTerm::operator[](arity_t i) { +Term &YAPTerm::operator[](arity_t i) { BACKUP_MACHINE_REGS(); Term t0 = gt(); Term tf = 0; if (IsApplTerm(t0)) { - Functor f = FunctorOfTerm(t0); - if (IsExtensionFunctor(f)) - return *new YAPTerm(); - tf = ArgOfTerm(i + 1, t0); + // Functor f = FunctorOfTerm(t0); + // if (IsExtensionFunctor(f)) + // return 0; + RECOVER_MACHINE_REGS(); + return RepAppl(t0)[(i + 1)]; } else if (IsPairTerm(t0)) { if (i == 0) tf = HeadOfTerm(t0); else if (i == 1) tf = TailOfTerm(t0); + RECOVER_MACHINE_REGS(); + return RepPair(tf)[i]; } - RECOVER_MACHINE_REGS(); - return *new YAPTerm(tf); } -YAPTerm &YAPListTerm::operator[](arity_t i) { +Term &YAPListTerm::operator[](arity_t i) { BACKUP_MACHINE_REGS(); Term t0 = gt(); Term tf = 0; @@ -215,7 +220,7 @@ YAPTerm &YAPListTerm::operator[](arity_t i) { } } RECOVER_MACHINE_REGS(); - return *new YAPTerm(tf); + return RepPair(tf)[i]; } YAPPairTerm::YAPPairTerm(YAPTerm th, YAPTerm tl) : YAPTerm() { @@ -231,11 +236,6 @@ YAPPairTerm::YAPPairTerm() : YAPTerm() { RECOVER_H(); } -Term YAPTerm::gt() { CACHE_REGS return Yap_GetFromSlot(t); } - -void YAPTerm::mk(Term t0) { CACHE_REGS t= Yap_InitSlot(t0); } - - YAP_tag_t YAPTerm::tag() { Term tt = gt(); if (IsVarTerm(tt)) { @@ -280,24 +280,24 @@ YAP_tag_t YAPTerm::tag() { } } -YAPTerm YAPTerm::deepCopy() { +Term YAPTerm::deepCopy() { yhandle_t tn; BACKUP_MACHINE_REGS(); tn = Yap_CopyTerm(gt()); RECOVER_MACHINE_REGS(); - return *new YAPTerm(tn); + return (tn); } -YAPListTerm YAPListTerm::dup() { +Term YAPListTerm::dup() { yhandle_t tn; BACKUP_MACHINE_REGS(); tn = Yap_CopyTerm(gt()); RECOVER_MACHINE_REGS(); - return *new YAPListTerm(tn); + return tn; } intptr_t YAPTerm::numberVars(intptr_t i0, bool skip_singletons) { @@ -309,77 +309,7 @@ intptr_t YAPTerm::numberVars(intptr_t i0, bool skip_singletons) { return i; } -bool YAPTerm::exactlyEqual(YAPTerm t1) { - bool out; - BACKUP_MACHINE_REGS(); - - out = Yap_eq(gt(), t1.term()); - - RECOVER_MACHINE_REGS(); - return out; -} - -bool YAPTerm::unify(YAPTerm t1) { - intptr_t out; - BACKUP_MACHINE_REGS(); - - out = Yap_unify(gt(), t1.term()); - - RECOVER_MACHINE_REGS(); - return out; -} - -bool YAPTerm::unifiable(YAPTerm t1) { - intptr_t out; - BACKUP_MACHINE_REGS(); - - out = Yap_Unifiable(gt(), t1.term()); - - RECOVER_MACHINE_REGS(); - return out; -} - -bool YAPTerm::variant(YAPTerm t1) { - intptr_t out; - BACKUP_MACHINE_REGS(); - - out = Yap_Variant(gt(), t1.term()); - - RECOVER_MACHINE_REGS(); - return out; -} - -intptr_t YAPTerm::hashTerm(size_t sz, size_t depth, bool variant) { - intptr_t out; - - BACKUP_MACHINE_REGS(); - - out = Yap_TermHash(gt(), sz, depth, variant); - - RECOVER_MACHINE_REGS(); - return out; -} - -const char *YAPTerm::text() { - CACHE_REGS - size_t length = 0; - encoding_t enc = LOCAL_encoding; - char *os; - - BACKUP_MACHINE_REGS(); - if (!(os = Yap_TermToString(Yap_GetFromSlot(t), &length, enc, - Handle_vars_f))) { - RECOVER_MACHINE_REGS(); - return 0; - } - RECOVER_MACHINE_REGS(); - length = strlen(os) + 1; - char *sm = (char *)malloc(length + 1); - strcpy(sm, os); - return sm; -} - -const char *YAPQuery::text() { return goal.text(); } +const char *YAPQuery::text() { return YAPTerm(goal).text(); } YAPIntegerTerm::YAPIntegerTerm(intptr_t i) { CACHE_REGS Term tn = MkIntegerTerm(i); @@ -402,42 +332,16 @@ YAPTerm::YAPTerm(void *ptr) { mk(MkIntegerTerm((Int)ptr)); } -YAPTerm YAPListTerm::car() { +Term YAPListTerm::car() { Term to = gt(); if (IsPairTerm(to)) - return YAPTerm(HeadOfTerm(to)); + return (HeadOfTerm(to)); else { Yap_Error(TYPE_ERROR_LIST, to, ""); throw YAPError(); } } -YAPTerm::YAPTerm(YAPFunctor f, YAPTerm ts[]) { - CACHE_REGS - BACKUP_H(); - Functor fun = f.f; - arity_t arity = ArityOfFunctor(fun); - while (HR + arity > ASP - 1024) { - RECOVER_H(); - if (!Yap_dogc(0, NULL PASS_REGS)) { - t = TermNil; - } - BACKUP_H(); - } - if (fun == FunctorDot) { - t = AbsPair(HR); - HR[0] = ts[0].term(); - HR[1] = ts[1].term(); - } else { - t = AbsAppl(HR); - *HR++ = (CELL)fun; - for (arity_t i = 0; i < arity; i++) { - HR[i] = ts[i].term(); - } - RECOVER_H(); - } -} - YAPListTerm::YAPListTerm(YAPTerm ts[], arity_t n) { CACHE_REGS BACKUP_H(); @@ -462,40 +366,34 @@ YAPVarTerm::YAPVarTerm() { mk(MkVarTerm()); } -const char *YAPAtom::getName(void) { - return Yap_AtomToUTF8Text( a, nullptr ); -} +const char *YAPAtom::getName(void) { return Yap_AtomToUTF8Text(a, nullptr); } - - - - void YAPQuery::openQuery() { - CACHE_REGS - arity_t arity = ap->ArityOfPE; - if (arity) { - Term *ts; - Term t = goal.term(); - if (IsPairTerm(t)) { - ts = RepPair(t); - } else { - ts = RepAppl(t) + 1; - } - for (arity_t i = 0; i < arity; i++) { - XREGS[i + 1] = ts[i]; - } - } - // oq = LOCAL_execution; - // LOCAL_execution = this; - q_open = true; - q_state = 0; - q_flags = true; // PL_Q_PASS_EXCEPTION; - - q_p = P; - q_cp = CP; - // make sure this is safe - q_handles = Yap_StartSlots(); +void YAPQuery::openQuery() { + CACHE_REGS + arity_t arity = ap->ArityOfPE; + if (arity) { + Term *ts; + Term t = goal; + if (IsPairTerm(t)) { + ts = RepPair(t); + } else { + ts = RepAppl(t) + 1; } + for (arity_t i = 0; i < arity; i++) { + XREGS[i + 1] = ts[i]; + } + } + // oq = LOCAL_execution; + // LOCAL_execution = this; + q_open = true; + q_state = 0; + q_flags = true; // PL_Q_PASS_EXCEPTION; + q_p = P; + q_cp = CP; + // make sure this is safe + q_handles = Yap_StartSlots(); +} bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) { CACHE_REGS @@ -505,8 +403,9 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) { YAP_dogoalinfo q; Term terr; jmp_buf q_env; + for (arity_t i = 0; i < arity; i++) - Yap_XREGS[i + 1] = ts[i].term(); + XREGS[i + 1] = ts[i].term(); q.CurSlot = Yap_StartSlots(); q.p = P; q.cp = CP; @@ -519,20 +418,13 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) { } return false; } - // don't forget, on success these l); -if (!result) { - YAP_LeaveGoal(false, &q); - } else { - YAP_LeaveGoal(FALSE, &q); - } + // don't forget, on success these bindings will still be there); + YAP_LeaveGoal(false, &q); RECOVER_MACHINE_REGS(); return result; } -bool YAPEngine::goalt(YAPTerm Yt) { - return Yt.term(); - } - +bool YAPEngine::goalt(YAPTerm Yt) { return Yt.term(); } bool YAPEngine::goal(Term t) { CACHE_REGS @@ -566,7 +458,6 @@ bool YAPEngine::goal(Term t) { // don't forget, on success these guys may create slots __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); - result = (bool)YAP_EnterGoal(ap, nullptr, &q); if ((terr = Yap_GetException())) { YAP_LeaveGoal(false, &q); @@ -586,43 +477,47 @@ bool YAPEngine::goal(Term t) { void YAPEngine::release() { BACKUP_MACHINE_REGS(); - YAP_LeaveGoal(FALSE, &q); + YAP_LeaveGoal(FALSE, &q); RECOVER_MACHINE_REGS(); - } +} Term YAPEngine::fun(Term t) { CACHE_REGS BACKUP_MACHINE_REGS(); Term tmod = CurrentModule, *ts = nullptr; - PredEntry *ap ; - arity_t arity = arity; + PredEntry *ap; + arity_t arity; Functor f; jmp_buf q_env; Atom name; - BACKUP_MACHINE_REGS(); - if (IsApplTerm(t)) { + if (IsApplTerm(t)) { ts = RepAppl(t) + 1; f = (Functor)ts[-1]; - name = NameOfFunctor(f); - arity =ArityOfFunctor(f); + name = NameOfFunctor(f); + arity = ArityOfFunctor(f); for (arity_t i = 0; i < arity; i++) XREGS[i + 1] = ts[i]; } else if (IsAtomTerm(t)) { name = AtomOfTerm(t); f = nullptr; - } else if (IsAtomTerm(t)) { + arity = 0; + } else if (IsPairTerm(t)) { XREGS[1] = ts[0]; XREGS[2] = ts[1]; + arity = 2; name = AtomDot; f = FunctorDot; - } - XREGS[arity+1] = MkVarTerm(); - arity ++; - f = Yap_MkFunctor(name,arity); - ap = (PredEntry *)(PredPropByFunc(f,tmod)); - q.CurSlot = Yap_StartSlots(); + } else { + Yap_Error(TYPE_ERROR_CALLABLE, t, 0); + return 0L; + } + XREGS[arity + 1] = MkVarTerm(); + arity++; + f = Yap_MkFunctor(name, arity); + ap = (PredEntry *)(PredPropByFunc(f, tmod)); + q.CurSlot = Yap_StartSlots(); q.p = P; q.cp = CP; // make sure this is safe @@ -630,7 +525,7 @@ Term YAPEngine::fun(Term t) { if (setjmp(q_env)) { Term terr; - if ((terr = Yap_PeekException())) { + if ((terr = Yap_PeekException())) { YAP_LeaveGoal(false, &q); Yap_CloseHandles(q.CurSlot); throw YAPError(); @@ -639,23 +534,22 @@ Term YAPEngine::fun(Term t) { } // don't forget, on success these guys may create slots __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); - - if ((o = (Term)YAP_EnterGoal(ap, nullptr, &q))==0) + + if ((o = (Term)YAP_EnterGoal(ap, nullptr, &q)) == 0) return 0; Term terr; if ((terr = Yap_GetException())) { YAP_LeaveGoal(false, &q); - Yap_CloseHandles(q.CurSlot); + Yap_CloseHandles(q.CurSlot); throw YAPError(); } - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %d", result); + __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %ld", o); - Term result; t = Yap_GetFromSlot(q.CurSlot); Yap_CloseHandles(q.CurSlot); if (!t) { YAP_LeaveGoal(false, &q); - result = 0; + t = 0; } RECOVER_MACHINE_REGS(); return t; @@ -665,41 +559,43 @@ YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[]) : YAPPredicate(f, mod) { /* ignore flags for now */ BACKUP_MACHINE_REGS(); - goal = YAPTerm(f, ts); - vnames = YAPListTerm(); + goal = YAPApplTerm(f, ts).gt(); + names = TermNil; openQuery(); RECOVER_MACHINE_REGS(); } +#if 0 YAPQuery::YAPQuery(YAPFunctor f, YAPTerm ts[]) : YAPPredicate(f) { - /* ignore flags for now */ + /* ignore flags for now */ BACKUP_MACHINE_REGS(); - goal = YAPTerm(f, ts); - vnames = YAPListTerm(); + goal = YAPApplTerm(f, ts).gt(); + names = TermNil; openQuery(); RECOVER_MACHINE_REGS(); } +#endif YAPQuery::YAPQuery(YAPPredicate p, YAPTerm ts[]) : YAPPredicate(p.ap) { BACKUP_MACHINE_REGS(); - goal = YAPTerm(YAPFunctor(ap->FunctorOfPred), ts); - vnames = YAPListTerm(); + goal = YAPApplTerm(YAPFunctor(p.ap->FunctorOfPred), ts).term(); + names = TermNil; openQuery(); RECOVER_MACHINE_REGS(); } -YAPListTerm YAPQuery::namedVars() { +Term YAPQuery::namedVars() { CACHE_REGS - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %d", - vnames.text(), LOCAL_CurSlot); - return vnames; // should be o + __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %ld", + names.text(), LOCAL_CurSlot); + return (names); // should be o } -YAPListTerm YAPQuery::namedVarsCopy() { +Term YAPQuery::namedVarsCopy() { CACHE_REGS - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %s %d", - vnames.text(), LOCAL_CurSlot); - return YAPListTerm(YAP_CopyTerm(vnames.term())); // should be o + __android_log_print(NDROID_LOG_INFO, "YAPDroid", "vnames %s %ld", + names.text(), LOCAL_CurSlot); + return (YAP_CopyTerm(names)); // should be o } bool YAPQuery::next() { @@ -728,7 +624,7 @@ bool YAPQuery::next() { result = (bool)YAP_RetryGoal(&q_h); } if (result) { - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %d %s %d", + __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "vnames %d %s %ld", q_state, vnames.text(), LOCAL_CurSlot); } else { __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "fail"); @@ -871,8 +767,7 @@ void YAPEngine::doInit(YAP_file_type_t BootMode) { YAPEngine::YAPEngine(char *savedState, char *bootFile, size_t stackSize, size_t trailSize, size_t maxStackSize, size_t maxTrailSize, char *libDir, char *goal, char *topLevel, bool script, - bool fastBoot, - bool embedded, + bool fastBoot, bool embedded, YAPCallback *cb) : _callback(0) { // a single engine can be active @@ -1000,12 +895,12 @@ void *YAPPrologPredicate::assertClause(YAPTerm cl, bool last, YAPTerm source) { void *YAPPrologPredicate::assertFact(YAPTerm *cl, bool last) { CACHE_REGS - arity_t i; + arity_t i; RECOVER_MACHINE_REGS(); Term tt = AbsAppl(HR); *HR++ = (CELL)(ap->FunctorOfPred); - for (i = 0; i < ap->ArityOfPE; i++,cl++) - *HR++ = cl->gt(); + for (i = 0; i < ap->ArityOfPE; i++, cl++) + *HR++ = cl->gt(); yamop *codeaddr = Yap_cclause(tt, ap->ArityOfPE, Yap_CurrentModule(), tt); /* vsc: give the number of arguments to cclause in case there is overflow */ @@ -1029,37 +924,37 @@ const char *YAPError::text() { char buf[256]; std::string s = ""; - if (LOCAL_ActiveError.errorFunction) { - s += LOCAL_ActiveError.errorFile; + if (LOCAL_ActiveError->errorFunction) { + s += LOCAL_ActiveError->errorFile; s += ":"; - sprintf(buf, "%ld", (long int)LOCAL_ActiveError.errorLine); + sprintf(buf, "%ld", (long int)LOCAL_ActiveError->errorLine); s += buf; s += ":0 in C-code"; } - if (LOCAL_ActiveError.prologPredLine) { + if (LOCAL_ActiveError->prologPredLine) { s += "\n"; - s += LOCAL_ActiveError.prologPredFile->StrOfAE; + s += LOCAL_ActiveError->prologPredFile->StrOfAE; s += ":"; - sprintf(buf, "%ld", (long int)LOCAL_ActiveError.prologPredLine); - s += buf; // std::to_string(LOCAL_ActiveError.prologPredLine) ; - // YAPIntegerTerm(LOCAL_ActiveError.prologPredLine).text(); + sprintf(buf, "%ld", (long int)LOCAL_ActiveError->prologPredLine); + s += buf; // std::to_string(LOCAL_ActiveError->prologPredLine) ; + // YAPIntegerTerm(LOCAL_ActiveError->prologPredLine).text(); s += ":0 "; - s += LOCAL_ActiveError.prologPredModule; + s += LOCAL_ActiveError->prologPredModule; s += ":"; - s += (LOCAL_ActiveError.prologPredName)->StrOfAE; + s += (LOCAL_ActiveError->prologPredName)->StrOfAE; s += "/"; - sprintf(buf, "%ld", (long int)LOCAL_ActiveError.prologPredArity); - s += // std::to_string(LOCAL_ActiveError.prologPredArity); + sprintf(buf, "%ld", (long int)LOCAL_ActiveError->prologPredArity); + s += // std::to_string(LOCAL_ActiveError->prologPredArity); buf; } s += " error "; - if (LOCAL_ActiveError.classAsText != nullptr) - s += LOCAL_ActiveError.classAsText->StrOfAE; + if (LOCAL_ActiveError->classAsText != nullptr) + s += LOCAL_ActiveError->classAsText->StrOfAE; s += "."; - s += LOCAL_ActiveError.errorAsText->StrOfAE; + s += LOCAL_ActiveError->errorAsText->StrOfAE; s += ".\n"; - if (LOCAL_ActiveError.errorTerm) { - Term t = Yap_PopTermFromDB(LOCAL_ActiveError.errorTerm); + if (LOCAL_ActiveError->errorTerm) { + Term t = Yap_PopTermFromDB(LOCAL_ActiveError->errorTerm); if (t) { s += "error term is: "; s += YAPTerm(t).text(); @@ -1070,23 +965,21 @@ const char *YAPError::text() { return s.c_str(); } -void YAPEngine::reSet() - { +void YAPEngine::reSet() { /* ignore flags for now */ BACKUP_MACHINE_REGS(); Yap_RebootHandles(worker_id); - while (B->cp_b) B= B->cp_b; - P = FAILCODE; - Yap_exec_absmi(true, YAP_EXEC_ABSMI); - /* recover stack space */ - HR = B->cp_h; - TR = B->cp_tr; + while (B->cp_b) + B = B->cp_b; + P = FAILCODE; + Yap_exec_absmi(true, YAP_EXEC_ABSMI); + /* recover stack space */ + HR = B->cp_h; + TR = B->cp_tr; #ifdef DEPTH_LIMIT - DEPTH = B->cp_depth; + DEPTH = B->cp_depth; #endif /* DEPTH_LIMIT */ - YENV = ENV = B->cp_env; + YENV = ENV = B->cp_env; RECOVER_MACHINE_REGS(); - } - - +} diff --git a/CXX/yapie.hh b/CXX/yapie.hh index f85723bb9..1c425cc8e 100644 --- a/CXX/yapie.hh +++ b/CXX/yapie.hh @@ -15,17 +15,17 @@ public: YAPError(){}; /// we just know the error number /// exact error ID - yap_error_number getID() { return LOCAL_ActiveError.errorNo; }; + yap_error_number getID() { return LOCAL_ActiveError->errorNo; }; /// class of error yap_error_class_number getErrorClass() { - return Yap_errorClass(LOCAL_ActiveError.errorNo); + return Yap_errorClass(LOCAL_ActiveError->errorNo); }; /// where in the code things happened; - const char *getFile() { return LOCAL_ActiveError.errorFile; }; + const char *getFile() { return LOCAL_ActiveError->errorFile; }; /// predicate things happened; - Int getLine() { return LOCAL_ActiveError.errorLine; }; + Int getLine() { return LOCAL_ActiveError->errorLine; }; /// the term that caused the bug - // YAPTerm getCulprit(LOCAL_ActiveError.errorFile){}; + // YAPTerm getCulprit(LOCAL_ActiveError->errorFile){}; /// text describing the Error const char *text(); }; diff --git a/CXX/yapq.hh b/CXX/yapq.hh index fc9ee6fed..d06392c80 100644 --- a/CXX/yapq.hh +++ b/CXX/yapq.hh @@ -22,10 +22,9 @@ class YAPQuery : public YAPPredicate { int q_flags; YAP_dogoalinfo q_h; YAPQuery *oq; - YAPListTerm vnames; - YAPTerm goal; + Term names; + Term goal; // temporaries - Term tgoal, names; void openQuery(); @@ -46,21 +45,19 @@ public: /// /// It is given a functor, and an array of terms that must have at least /// the same arity as the functor. Works within the current module. - YAPQuery(YAPFunctor f, YAPTerm t[]); + //YAPQuery(YAPFunctor f, YAPTerm t[]); /// string constructor without varnames /// /// It is given a string, calls the parser and obtains a Prolog term that /// should be a callable /// goal. - inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, names) { + inline YAPQuery(const char *s) : YAPPredicate(s, goal, names) { BACKUP_H(); - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %d", + __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %ld", LOCAL_CurSlot); if (!ap) return; - goal = YAPTerm(tgoal); - vnames = YAPListTerm(names); - __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text()); + __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", vnames.text()); openQuery(); RECOVER_H(); }; @@ -69,8 +66,8 @@ public: /// It is given an atom, and a Prolog term that should be a callable /// goal, say `main`, `init`, `live`. inline YAPQuery(YAPAtom g) : YAPPredicate(g) { - goal = YAPAtomTerm(g); - vnames = YAPListTerm(); + goal = YAPAtomTerm(g).gt(); + names = TermNil; openQuery(); }; @@ -96,9 +93,9 @@ public: /// finish the current query: undo all bindings. void close(); /// query variables. - YAPListTerm namedVars(); + Term namedVars(); /// query variables, but copied out - YAPListTerm namedVarsCopy(); + Term namedVarsCopy(); /// convert a ref to a binding. YAPTerm getTerm(yhandle_t t); /// simple YAP Query; diff --git a/CXX/yapt.hh b/CXX/yapt.hh index 44f7b8b51..5a46dce13 100644 --- a/CXX/yapt.hh +++ b/CXX/yapt.hh @@ -2,9 +2,23 @@ #ifndef YAPT_HH #define YAPT_HH 1 -extern "C" Term YAP_ReadBuffer(const char *s, Term *tp); +#include "config.h" + +extern "C" { +Term YAP_ReadBuffer(const char *s, Term *tp); +#if defined(SWIGPYTHON) && 0 +#include +extern Term pythonToYAP(PyObject *inp); +#define YAPTerm _YAPTERM +#elifndef HAVE_PYTHON_H +typdef struct { int no_python; } PyObject; +#else +#include +#endif +}; class YAPError; + /** * @brief Generic Prolog Term */ @@ -18,20 +32,41 @@ class YAPTerm { friend class YAPListTerm; protected: - yhandle_t t; /// handle to term, equivalent to term_t - void mk(Term t0); /// internal method to convert from term to handle - Term gt(); /// get handle and obtain term + yhandle_t t; /// handle to term, equivalent to term_t public: - virtual ~YAPTerm(){ LOCAL_HandleBase[t] = TermFreeTerm; - while ( LOCAL_HandleBase[LOCAL_CurSlot-1] == TermFreeTerm) - LOCAL_CurSlot--; - } - YAPTerm(Term tn) { - mk(tn); - } /// private method to convert from Term (internal YAP representation) to + virtual ~YAPTerm() { + // fprintf(stderr,"-%d,%lx,%p ",t,LOCAL_HandleBase[t] ,HR); + // Yap_DebugPlWriteln(LOCAL_HandleBase[t]); } + // LOCAL_HandleBase[t] = TermFreeTerm; + // while ( LOCAL_HandleBase[LOCAL_CurSlot-1] == TermFreeTerm) + LOCAL_CurSlot--; + }; + + Term gt() { + CACHE_REGS + // fprintf(stderr,"?%d,%lx,%p\n",t,LOCAL_HandleBase[t], HR); + // Yap_DebugPlWriteln(LOCAL_HandleBase[t]); + return Yap_GetFromSlot(t); + }; + + void mk(Term t0) { + CACHE_REGS t = Yap_InitSlot(t0); + // fprintf(stderr,"+%d,%lx,%p,%p",t,t0,HR,ASP); Yap_DebugPlWriteln(t0); + }; + + YAPTerm(Term tn) { mk(tn); }; + YAPTerm(PyObject *inp) { +#ifdef SWIGPYTHON + Term tinp = pythonToYAP(inp); + t = Yap_InitSlot(tinp); +#else + t = 0; +#endif + } + /// private method to convert from Term (internal YAP representation) to /// YAPTerm // do nothing constructor - YAPTerm() { mk(MkVarTerm()); } + YAPTerm() { mk(MkVarTerm()); }; // YAPTerm(yhandle_t i) { t = i; }; /// pointer to term YAPTerm(void *ptr); @@ -42,32 +77,73 @@ public: } /// construct a term out of an integer (if you know object type use /// YAPIntegerTerm) - YAPTerm(long int num) { mk(MkIntegerTerm(num)); } + /// YAPTerm(long int num) { mk(MkIntegerTerm(num)); } /// construct a term out of an integer (if you know object type use /// YAPIntegerTerm) - YAPTerm(double num) { mk(MkFloatTerm(num)); } + /// YAPTerm(double num) { mk(MkFloatTerm(num)); } /// parse string s and construct a term. - YAPTerm(YAPFunctor f, YAPTerm ts[]); + /// YAPTerm(YAPFunctor f, YAPTerm ts[]); /// extract the tag of a term, after dereferencing. YAP_tag_t tag(); /// copy the term ( term copy ) - YAPTerm deepCopy(); + Term deepCopy(); /// numbervars ( int start, bool process=false ) intptr_t numberVars(intptr_t start, bool skip_singletons = false); inline Term term() { return gt(); } /// from YAPTerm to Term (internal YAP representation) + inline void bind(Term b) { LOCAL_HandleBase[t] = b; } + inline void bind(YAPTerm *b) { LOCAL_HandleBase[t] = b->term(); } + /// from YAPTerm to Term (internal YAP representation) /// fetch a sub-term - YAPTerm &operator[](size_t n); + Term &operator[](size_t n); // const YAPTerm *vars(); /// this term is == to t1 - virtual bool exactlyEqual(YAPTerm t1); - virtual bool unify(YAPTerm t1); /// t = t1 - virtual bool unifiable(YAPTerm t1); /// we can unify t and t1 - virtual bool variant( - YAPTerm t1); /// t =@= t1, the two terms are equal up to variable renaming - virtual intptr_t hashTerm(size_t sz, size_t depth, - bool variant); /// term hash, + virtual bool exactlyEqual(YAPTerm t1) { + bool out; + BACKUP_MACHINE_REGS(); + out = Yap_eq(gt(), t1.term()); + RECOVER_MACHINE_REGS(); + return out; + }; + + /// t = t1 + virtual bool unify(YAPTerm t1) { + intptr_t out; + BACKUP_MACHINE_REGS(); + out = Yap_unify(gt(), t1.term()); + RECOVER_MACHINE_REGS(); + return out; + }; + + /// we can unify t and t1 + virtual bool unifiable(YAPTerm t1) { + bool out; + BACKUP_MACHINE_REGS(); + out = Yap_eq(gt(), t1.term()); + RECOVER_MACHINE_REGS(); + return out; + }; + + /// t =@= t1, the two terms are equal up to variable renamingvirtual bool + /// variant( + inline virtual YAP_Term variant(YAPTerm t1) { + intptr_t out; + BACKUP_MACHINE_REGS(); + out = Yap_Variant(gt(), t1.term()); + RECOVER_MACHINE_REGS(); + return out; + }; + + virtual intptr_t hashTerm(size_t sz, size_t depth, bool variant) { + intptr_t out; + + BACKUP_MACHINE_REGS(); + out = Yap_TermHash(gt(), sz, depth, variant); + RECOVER_MACHINE_REGS(); + return out; + }; + /// term hash, virtual bool isVar() { return IsVarTerm(gt()); } /// type check for unound virtual bool isAtom() { return IsAtomTerm(gt()); } /// type check for atom virtual bool isInteger() { @@ -88,19 +164,19 @@ public: virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list /// extract the argument i of the term, where i in 1...arity - virtual YAPTerm getArg(arity_t i) { + virtual Term getArg(arity_t i) { BACKUP_MACHINE_REGS(); + Term tf = 0; Term t0 = gt(); - YAPTerm tf; if (IsApplTerm(t0)) - tf = YAPTerm(ArgOfTerm(i, t0)); + tf = (ArgOfTerm(i, t0)); else if (IsPairTerm(t0)) { if (i == 1) - tf = YAPTerm(HeadOfTerm(t0)); + tf = (HeadOfTerm(t0)); else if (i == 2) - tf = YAPTerm(TailOfTerm(t0)); + tf = (TailOfTerm(t0)); } else { - tf = YAPTerm((Term)0); + tf = ((Term)0); } RECOVER_MACHINE_REGS(); return tf; @@ -123,7 +199,24 @@ public: } /// return a string with a textual representation of the term - virtual const char *text(); + virtual const char *text(){ + CACHE_REGS + size_t length = 0; + encoding_t enc = LOCAL_encoding; + char *os; + + BACKUP_MACHINE_REGS(); + if (!(os = Yap_TermToString(Yap_GetFromSlot(t), &length, enc, + Handle_vars_f))) { + RECOVER_MACHINE_REGS(); + return 0; + } + RECOVER_MACHINE_REGS(); + length = strlen(os) + 1; + char *sm = (char *)malloc(length + 1); + strcpy(sm, os); + return sm; +}; /// return a handle to the term inline yhandle_t handle() { return t; }; @@ -170,15 +263,15 @@ class YAPApplTerm : public YAPTerm { public: ~YAPApplTerm() {} - YAPApplTerm(YAPFunctor f, YAPTerm ts[]); - YAPApplTerm(const char *s, std::vector ts); - YAPApplTerm(YAPFunctor f); + YAPApplTerm(YAPFunctor f, YAPTerm ts[]); + //YAPApplTerm(const char *s, std::vector ts); + //YAPApplTerm(YAPFunctor f); YAPFunctor getFunctor(); - YAPTerm getArg(arity_t i) { + Term getArg(arity_t i) { BACKUP_MACHINE_REGS(); Term t0 = gt(); - YAPTerm tf; - tf = YAPTerm(ArgOfTerm(i, t0)); + Term tf; + tf = ArgOfTerm(i, t0); RECOVER_MACHINE_REGS(); return tf; }; @@ -209,8 +302,8 @@ class YAPPairTerm : public YAPTerm { public: YAPPairTerm(YAPTerm hd, YAPTerm tl); YAPPairTerm(); - YAPTerm getHead() { return YAPTerm(HeadOfTerm(gt())); } - YAPTerm getTail() { return YAPTerm(TailOfTerm(gt())); } + Term getHead() { return (HeadOfTerm(gt())); } + Term getTail() { return (TailOfTerm(gt())); } }; /** @@ -267,20 +360,20 @@ public: return Yap_SkipList(&t1, &tailp); } /// Extract the nth element. - YAPTerm &operator[](size_t n); + Term &operator[](size_t n); /// Extract the first element of a list. /// /// @param[in] the list - YAPTerm car(); + Term car(); /// Extract the tail elements of a list. /// /// @param[in] the list - YAPListTerm cdr() { + Term cdr() { Term to = gt(); if (IsPairTerm(to)) - return YAPListTerm(TailOfTerm(to)); + return (TailOfTerm(to)); else if (to == TermNil) - return YAPListTerm(); + return TermNil; /* error */ Yap_Error(TYPE_ERROR_LIST, t, 0); throw YAPError(); @@ -288,7 +381,7 @@ public: /// copy a list. /// /// @param[in] the list - YAPListTerm dup(); + Term dup(); /// Check if the list is empty. /// @@ -325,8 +418,6 @@ class YAPAtomTerm : public YAPTerm { // Constructor: receives a C-atom; YAPAtomTerm(Atom a) { mk(MkAtomTerm(a)); } YAPAtomTerm(Term t) : YAPTerm(t) { IsAtomTerm(t); } - // Getter for Prolog atom - Term getTerm() { return t; } public: // Constructor: receives an atom; diff --git a/GIT b/GIT deleted file mode 100644 index 6bd7e5185..000000000 --- a/GIT +++ /dev/null @@ -1,10 +0,0 @@ - -You need at least git-1.6 to install the development version. - -Please proceed as follows for the main branch: - -git clone git://gitorious.org/yap-git/mainline.git yap -cd yap-6 -git submodule init -git submodule update - diff --git a/H/ATOMS b/H/ATOMS index c5c3da9a2..c43c033f1 100644 --- a/H/ATOMS +++ b/H/ATOMS @@ -29,9 +29,14 @@ A Arrow N "->" A AttributedModule N "attributes_module" A DoubleArrow N "-->" A Assert N ":-" -A EmptyBrackets N "()" +A BeginBracket N "(" +A EndBracket N ")" +A BeginSquareBracket N "[" +A EndSquareBracket N "]" +A BeginCurlyBracket N "{" +A EndCurlyBracket N "}" +A EmptyBrackets N "()" A EmptySquareBrackets N "[]" -A EmptyCurlyBrackets N "{}" A Asserta N "asserta" A AssertaStatic N "asserta_static" A Assertz N "assertz" @@ -68,6 +73,7 @@ A Chars N "chars" A Charset N "charset" A ChType F "$char_type" A CleanCall F "$clean_call" +A Close N "close" A Colon N ":" A CodeSpace N "code_space" A Codes N "codes" @@ -89,7 +95,7 @@ A Csult F "$csult" A CurrentModule F "$current_module" A Cut N "!" A CutBy F "$cut_by" -A DAbort F "$abort" +A DAbort N "abort" A DBLoad F "$db_load" A DBREF N "DBRef" A DBReference N "db_reference" @@ -190,6 +196,7 @@ A Id N "id" A Ignore N "ignore" A Inf N "inf" A Infinity N "infinity" +A Info N "info" A InitGoal F "$init_goal" A InitProlog F "$init_prolog" A InStackExpansion N "in stack expansion" @@ -201,6 +208,7 @@ A Integer N "integer" A InternalCompilerError N "internal_compiler_error" A Is N "is" A J N "j" +A l N "l" A Key N "key" A LDLibraryPath N "LD_LIBRARY_PATH" A LONGINT N "LongInt" @@ -286,6 +294,7 @@ A PastEndOfStream N "past_end_of_stream" A PermissionError N "permission_error" A Pi N "pi" A Pipe N "pipe" +A Priority N "priority" A Plus N "+" A Pointer N "pointer" A Portray F "portray" @@ -488,9 +497,9 @@ F Dot6 Dot 6 F Dot7 Dot 7 F Dot8 Dot 8 F Dot9 Dot 9 +F DoubleArrow DoubleArrow 2 F DoubleSlash DoubleSlash 2 F EmptySquareBrackets EmptySquareBrackets 2 -F EmptyCurlyBrackets EmptyCurlyBrackets 2 F Eq Eq 2 F Error Error 2 F EvaluationError EvaluationError 1 @@ -517,6 +526,10 @@ F HandleThrow HandleThrow 3 F Hat Hat 2 F I I 2 F Id Id 1 +F Info1 Info 1 +F Info2 Info 2 +F Info3 Info 3 +F Info4 Info 4 F Is Is 2 F J J 2 F LastExecuteWithin LastExecuteWithin 1 @@ -534,11 +547,13 @@ F NBQueue Queue 4 F Not Not 1 F Obj Obj 1 F Or Semic 2 +F Output Output 1 F PermissionError PermissionError 3 F Plus Plus 2 F Portray Portray 1 F PrintMessage PrintMessage 2 F Procedure Procedure 5 +F Priority Priority 1 F PrologConstraint Prolog 2 F ProtectStack ProtectStack 4 F Query Query 1 diff --git a/H/Atoms.h b/H/Atoms.h index 988e68f4a..0cdcda777 100644 --- a/H/Atoms.h +++ b/H/Atoms.h @@ -59,7 +59,6 @@ typedef struct AtomEntryStruct { union { unsigned char uUStrOfAE[MIN_ARRAY]; /* representation of atom as a string */ char uStrOfAE[MIN_ARRAY]; /* representation of atom as a string */ - wchar_t uWStrOfAE[MIN_ARRAY]; /* representation of atom as a string */ struct atom_blob blob[MIN_ARRAY]; } rep; } AtomEntry; @@ -75,14 +74,12 @@ typedef struct ExtraAtomEntryStruct { union { unsigned char uUStrOfAE[4]; /* representation of atom as a string */ char uStrOfAE[4]; /* representation of atom as a string */ - wchar_t uWStrOfAE[2]; /* representation of atom as a string */ struct atom_blob blob[2]; } rep; } ExtraAtomEntry; #define UStrOfAE rep.uUStrOfAE #define StrOfAE rep.uStrOfAE -#define WStrOfAE rep.uWStrOfAE /* Props and Atoms are stored in chains, ending with a NIL */ #ifdef USE_OFFSETS diff --git a/H/LOCALS b/H/LOCALS index f4ced4a9e..26ad866d9 100755 --- a/H/LOCALS +++ b/H/LOCALS @@ -79,7 +79,6 @@ UInt GlobalArenaOverflows =0L Int ArenaOverflows =0L Int DepthArenas =0 -int ArithError =FALSE struct pred_entry* LastAssertedPred =NULL struct pred_entry* TmpPred =NULL char* ScannerStack =NULL @@ -194,13 +193,10 @@ ADDR LocalBase void ADDR GlobalBase void ADDR TrailBase void ADDR TrailTop void -char* ErrorMessage void -Term Error_Term void -/** error handling info, designed to be easy to pass to the foreign world */ -struct yap_error_descriptor ActiveError void +/* error handling info, designed to be easy to pass to the foreign world */ +yap_error_descriptor_t* ActiveError =calloc(sizeof(yap_error_descriptor_t),1) /// pointer to an exception term, from throw -struct DB_TERM* BallTerm =NULL jmp_buf IOBotch void TokEntry* tokptr void @@ -217,7 +213,7 @@ sigjmp_buf RestartEnv void char FileNameBuf[YAP_FILENAME_MAX+1] void char FileNameBuf2[YAP_FILENAME_MAX+1] void -struct TextBuffer_manager* TextBuffer =Yap_InitTextAllocator() +struct TextBuffer_manager* TextBuffer =Yap_InitTextAllocator() // Prolog State UInt BreakLevel =0 @@ -239,10 +235,8 @@ YAP_ULONG_LONG 2opcount[_std_top+1][_std_top+1] void struct db_globs* s_dbg void //eval.c -yap_error_number matherror =YAP_NO_ERROR Term mathtt void char* mathstring =NULL -yap_error_number CurrentError =YAP_NO_ERROR //grow.c int heap_overflows =0 diff --git a/H/ScannerTypes.h b/H/ScannerTypes.h index e760a67cb..c1667f7d9 100644 --- a/H/ScannerTypes.h +++ b/H/ScannerTypes.h @@ -3,13 +3,10 @@ typedef enum TokenKinds { Number_tok, Var_tok, String_tok, - WString_tok, BQString_tok, - WBQString_tok, Ponctuation_tok, Error_tok, QuasiQuotes_tok, - WQuasiQuotes_tok, eot_tok } tkinds; @@ -29,5 +26,5 @@ typedef struct VARSTRUCT { CELL hv; UInt refs; struct VARSTRUCT *VarLeft, *VarRight; - char VarRep[1]; + Atom VarRep; } VarEntry; diff --git a/H/Yap.h b/H/Yap.h index 442ed9603..07bd31a3d 100755 --- a/H/Yap.h +++ b/H/Yap.h @@ -462,6 +462,7 @@ extern ADDR Yap_HeapBase; /* This is ok for Linux, should be ok for everyone */ #define YAP_FILENAME_MAX 1024 + /************************************************************************************************* Debugging Support *************************************************************************************************/ @@ -853,3 +854,5 @@ inline static void LOG0(const char *f, int l, const char *fmt, ...) { extern bool Yap_embedded, Yap_Server; #endif /* YAP_H */ + +#include "YapText.h" diff --git a/H/YapFlags.h b/H/YapFlags.h index f13ef7dcc..81869b5b6 100644 --- a/H/YapFlags.h +++ b/H/YapFlags.h @@ -204,7 +204,7 @@ typedef struct x_el { } xarg; typedef struct struct_param { - char *name; + const char *name; flag_func type; int id; } param_t; diff --git a/H/YapGFlagInfo.h b/H/YapGFlagInfo.h index a544e9066..84e7a2e92 100644 --- a/H/YapGFlagInfo.h +++ b/H/YapGFlagInfo.h @@ -524,7 +524,7 @@ and _Patch_ is the patch number. */ YAP_FLAG(VERSION_DATA_FLAG, "version_data", false, ro, YAP_TVERSION, NULL), /**< -`version ` Read-only flag that returns an a compound term with the +`version ` Read-only flag that returns a compound term with the current version of YAP. The term will have the name `yap` and arity 4, the first argument will be the major version, the second the minor version, the third the patch number, and the diff --git a/H/YapText.h b/H/YapText.h index 436e0690e..267667df0 100644 --- a/H/YapText.h +++ b/H/YapText.h @@ -31,6 +31,22 @@ #include "../utf8proc/utf8proc.h" #include "Yap.h" +/// allocate a temporary text block +/// +extern void *Malloc(size_t sz USES_REGS); +extern void *Realloc(void *buf, size_t sz USES_REGS); +extern void Free(void *buf USES_REGS); + +extern int push_text_stack(USES_REGS1); +extern int pop_text_stack(int lvl USES_REGS); +extern void *protected_pop_text_stack(int lvl, void *safe, bool tmp, + size_t sz USES_REGS); + +#ifndef min +#define min(x, y) (x < y ? x : y) +#endif + +#define MBYTE (1024 * 1024) /* Character types for tokenizer and write.c */ @@ -142,13 +158,21 @@ INLINE_ONLY EXTERN inline char_kind_t chtype(Int ch) { #define __android_log_print(...) #endif -inline static utf8proc_ssize_t get_utf8(const utf8proc_uint8_t *ptr, size_t n, - utf8proc_int32_t *valp) { +INLINE_ONLY inline EXTERN utf8proc_ssize_t get_utf8(const utf8proc_uint8_t *ptr, + size_t n, + utf8proc_int32_t *valp); + +INLINE_ONLY inline EXTERN utf8proc_ssize_t get_utf8(const utf8proc_uint8_t *ptr, + size_t n, + utf8proc_int32_t *valp) { return utf8proc_iterate(ptr, n, valp); } -inline static utf8proc_ssize_t put_utf8(utf8proc_uint8_t *ptr, - utf8proc_int32_t val) { +INLINE_ONLY inline EXTERN utf8proc_ssize_t put_utf8(utf8proc_uint8_t *ptr, + utf8proc_int32_t val); + +INLINE_ONLY inline EXTERN utf8proc_ssize_t put_utf8(utf8proc_uint8_t *ptr, + utf8proc_int32_t val) { return utf8proc_encode_char(val, ptr); } @@ -178,7 +202,7 @@ inline static utf8proc_ssize_t strlen_utf8(const utf8proc_uint8_t *pt) { return rc; else if (b > 0) { pt += l; - rc += l; + rc++; } else { pt++; } @@ -274,7 +298,8 @@ inline static int cmpn_utf8(const utf8proc_uint8_t *pt1, #define SURROGATE_OFFSET \ ((uint32_t)0x10000 - (uint32_t)(0xD800 << 10) - (uint32_t)0xDC00) -const char *Yap_tokRep(TokEntry *tokptr, encoding_t enc); +extern const char *Yap_tokText(void *tokptr); +extern Term Yap_tokRep(void *tokptr); // standard strings @@ -658,6 +683,17 @@ static inline Term Yap_AtomicToTDQ(Term t0, Term mod USES_REGS) { return out.val.t; } +static inline wchar_t *Yap_AtomToWide(Atom at USES_REGS) { + seq_tv_t inp, out; + inp.val.a = at; + inp.type = YAP_STRING_ATOM; + out.val.uc = NULL; + out.type = YAP_STRING_WCHARS; + if (!Yap_CVT_Text(&inp, &out PASS_REGS)) + return NIL; + return out.val.w; +} + static inline Term Yap_AtomicToTBQ(Term t0, Term mod USES_REGS) { seq_tv_t inp, out; @@ -1350,6 +1386,18 @@ static inline Term Yap_UTF8ToString(const char *s USES_REGS) { return MkStringTerm(s); } +static inline Atom UTF32ToAtom(const wchar_t *s USES_REGS) { + seq_tv_t inp, out; + + inp.val.w0 = s; + inp.type = YAP_STRING_WCHARS; + out.type = YAP_STRING_ATOM; + out.max = -1; + if (!Yap_CVT_Text(&inp, &out PASS_REGS)) + return 0L; + return out.val.a; +} + static inline Term Yap_WCharsToListOfCodes(const wchar_t *s USES_REGS) { seq_tv_t inp, out; inp.val.w0 = s; diff --git a/H/Yapproto.h b/H/Yapproto.h index 59ed9e29d..5759e71f1 100755 --- a/H/Yapproto.h +++ b/H/Yapproto.h @@ -35,9 +35,6 @@ extern struct operator_entry * extern Atom Yap_LookupAtom(const char *); extern Atom Yap_ULookupAtom(const unsigned char *); extern Atom Yap_LookupAtomWithLength(const char *, size_t); -extern Atom Yap_LookupUTF8Atom(const unsigned char *); -extern Atom Yap_LookupMaybeWideAtom(const wchar_t *); -extern Atom Yap_LookupMaybeWideAtomWithLength(const wchar_t *, size_t); extern Atom Yap_FullLookupAtom(const char *); extern void Yap_LookupAtomWithAddress(const char *, struct AtomEntryStruct *); extern Prop Yap_NewPredPropByFunctor(struct FunctorEntryStruct *, Term); @@ -447,6 +444,8 @@ extern intptr_t system_thread_id(void); extern void Yap_InitLowLevelTrace(void); #endif +extern void *Yap_InitTextAllocator( void ); + /* udi.c */ extern void Yap_udi_init(void); extern void Yap_udi_abolish(struct pred_entry *); diff --git a/H/Yatom.h b/H/Yatom.h index 95495915a..d5f5d9018 100755 --- a/H/Yatom.h +++ b/H/Yatom.h @@ -198,58 +198,6 @@ INLINE_ONLY inline EXTERN PropFlags IsGlobalProperty(int flags) { return (PropFlags)((flags == GlobalProperty)); } -/* Wide Atom property */ -typedef struct { - Prop NextOfPE; /* used to chain properties */ - PropFlags KindOfPE; /* kind of property */ - UInt SizeOfAtom; /* index in module table */ -} WideAtomEntry; - -#if USE_OFFSETS_IN_PROPS - -INLINE_ONLY inline EXTERN WideAtomEntry *RepWideAtomProp(Prop p); - -INLINE_ONLY inline EXTERN WideAtomEntry *RepWideAtomProp(Prop p) { - return (WideAtomEntry *)(AtomBase + Unsigned(p)); -} - -INLINE_ONLY inline EXTERN Prop AbsWideAtomProp(WideAtomEntry *p); - -INLINE_ONLY inline EXTERN Prop AbsWideAtomProp(WideAtomEntry *p) { - return (Prop)(Addr(p) - AtomBase); -} - -#else - -INLINE_ONLY inline EXTERN WideAtomEntry *RepWideAtomProp(Prop p); - -INLINE_ONLY inline EXTERN WideAtomEntry *RepWideAtomProp(Prop p) { - return (WideAtomEntry *)(p); -} - -INLINE_ONLY inline EXTERN Prop AbsWideAtomProp(WideAtomEntry *p); - -INLINE_ONLY inline EXTERN Prop AbsWideAtomProp(WideAtomEntry *p) { - return (Prop)(p); -} - -#endif - -#define WideAtomProperty ((PropFlags)0xfff8) - -INLINE_ONLY inline EXTERN bool IsWideAtomProperty(PropFlags); - -INLINE_ONLY inline EXTERN bool IsWideAtomProperty(PropFlags flags) { - return (flags == WideAtomProperty); -} - -INLINE_ONLY inline EXTERN bool IsWideAtom(Atom); - -INLINE_ONLY inline EXTERN bool IsWideAtom(Atom at) { - return RepAtom(at)->PropsOfAE != NIL && - IsWideAtomProperty(RepWideAtomProp(RepAtom(at)->PropsOfAE)->KindOfPE); -} - /** Module property: low-level data used to manage modes. Includes lists of pedicates, operators and other well-defIned @@ -1609,15 +1557,8 @@ INLINE_ONLY EXTERN inline void AddPropToAtom(AtomEntry *, PropEntry *p); INLINE_ONLY EXTERN inline void AddPropToAtom(AtomEntry *ae, PropEntry *p) { /* old properties should be always last, and wide atom properties should always be first */ - if (ae->PropsOfAE != NIL && - RepProp(ae->PropsOfAE)->KindOfPE == WideAtomProperty) { - PropEntry *pp = RepProp(ae->PropsOfAE); - p->NextOfPE = pp->NextOfPE; - pp->NextOfPE = AbsProp(p); - } else { p->NextOfPE = ae->PropsOfAE; ae->PropsOfAE = AbsProp(p); - } } // auxiliary functions diff --git a/H/absmi.h b/H/absmi.h index d103ee25a..9b7a79113 100755 --- a/H/absmi.h +++ b/H/absmi.h @@ -99,7 +99,8 @@ register struct yami *P1REG asm("bp"); /* can't use yamop before Yap.h */ #define LIMITED_PREFETCH 1 #endif /* __x86_64__ */ -#if defined(__arm__) || defined(__thumb__) || defined(mips) || defined(__mips64) || defined(__aarch64__) +#if defined(__arm__) || defined(__thumb__) || defined(mips) || \ + defined(__mips64) || defined(__aarch64__) #define Y_IN_MEM 1 #define S_IN_MEM 1 @@ -215,13 +216,13 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define BEGP(TMP) \ { \ - register CELL *TMP + register CELL *TMP #define ENDP(TMP) } #define BEGD(TMP) \ { \ - register CELL TMP + register CELL TMP #define ENDD(TMP) } @@ -229,7 +230,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define BEGCHO(TMP) \ { \ - register choiceptr TMP + register choiceptr TMP #define ENDCHO(TMP) } @@ -242,7 +243,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define CACHE_Y(A) \ { \ - register CELL *S_YREG = ((CELL *)(A)) + register CELL *S_YREG = ((CELL *)(A)) #define ENDCACHE_Y() \ YREG = S_YREG; \ @@ -258,7 +259,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define CACHE_Y(A) \ { \ - YREG = ((CELL *)(A)) + YREG = ((CELL *)(A)) #define ENDCACHE_Y() } @@ -268,7 +269,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define CACHE_Y_AS_ENV(A) \ { \ - register CELL *ENV_YREG = (A) + register CELL *ENV_YREG = (A) #define FETCH_Y_FROM_ENV(A) ENV_YREG = (A) @@ -292,7 +293,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define CACHE_Y_AS_ENV(A) \ { \ - YREG = (A) + YREG = (A) #define FETCH_Y_FROM_ENV(A) (A) @@ -345,7 +346,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define CACHE_TR(A) \ { \ - register tr_fr_ptr S_TR = (A) + register tr_fr_ptr S_TR = (A) #define RESTORE_TR() TR = S_TR @@ -467,7 +468,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define ALWAYS_START_PREFETCH(TYPE) \ { \ register void *to_go; \ - DO_PREFETCH(TYPE) + DO_PREFETCH(TYPE) #if YAP_JIT #define ALWAYS_LOOKAHEAD(WHAT) \ @@ -487,7 +488,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define ALWAYS_START_PREFETCH_W(TYPE) \ { \ register void *to_go; \ - DO_PREFETCH_W(TYPE) + DO_PREFETCH_W(TYPE) #else @@ -909,14 +910,14 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { (ExpEnv.config_struc.current_displacement) \ ? print_instruction(PREG, ON_PROFILED_INTERPRETER) \ : print_instruction(PREG, ON_INTERPRETER); \ - START_PREFETCH(Type) + START_PREFETCH(Type) #define OpW(Label, Type) \ _##Label : { \ (ExpEnv.config_struc.current_displacement) \ ? print_instruction(PREG, ON_PROFILED_INTERPRETER) \ : print_instruction(PREG, ON_INTERPRETER); \ - START_PREFETCH_W(Type) + START_PREFETCH_W(Type) #define BOp(Label, Type) \ _##Label : { \ @@ -929,7 +930,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { (ExpEnv.config_struc.current_displacement) \ ? print_instruction(PREG, ON_PROFILED_INTERPRETER) \ : print_instruction(PREG, ON_INTERPRETER); \ - INIT_PREFETCH() + INIT_PREFETCH() #define OpRW(Label, Type) \ _##Label : { \ @@ -942,12 +943,12 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define Op(Label, Type) \ _##Label : { \ print_instruction(PREG, ON_INTERPRETER); \ - START_PREFETCH(Type) + START_PREFETCH(Type) #define OpW(Label, Type) \ _##Label : { \ print_instruction(PREG, ON_INTERPRETER); \ - START_PREFETCH_W(Type) + START_PREFETCH_W(Type) #define BOp(Label, Type) \ _##Label : { \ @@ -956,7 +957,7 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define PBOp(Label, Type) \ _##Label : { \ print_instruction(PREG, ON_INTERPRETER); \ - INIT_PREFETCH() + INIT_PREFETCH() #define OpRW(Label, Type) \ _##Label : { \ @@ -968,17 +969,17 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define Op(Label, Type) \ _##Label : { \ - START_PREFETCH(Type) + START_PREFETCH(Type) #define OpW(Label, Type) \ _##Label : { \ - START_PREFETCH_W(Type) + START_PREFETCH_W(Type) #define BOp(Label, Type) _##Label : { #define PBOp(Label, Type) \ _##Label : { \ - INIT_PREFETCH() + INIT_PREFETCH() #define OpRW(Label, Type) _##Label : { @@ -1000,17 +1001,17 @@ INLINE_ONLY inline EXTERN void restore_absmi_regs(REGSTORE *old_regs) { #define Op(Label, Type) \ case _##Label: { \ - START_PREFETCH(Type) + START_PREFETCH(Type) #define OpW(Label, Type) \ case _##Label: { \ - START_PREFETCH_W(Type) + START_PREFETCH_W(Type) #define BOp(Label, Type) case _##Label: { #define PBOp(Label, Type) \ case _##Label: { \ - INIT_PREFETCH() + INIT_PREFETCH() #define OpRW(Label, Type) case _##Label: { @@ -2075,7 +2076,8 @@ cufail: #endif -#if /* defined(IN_ABSMI_C) ||*/ defined(IN_INLINES_C) /*|| defined(IN_TRACED_ABSMI_C) */ +#if /* defined(IN_ABSMI_C) ||*/ defined( \ + IN_INLINES_C) /*|| defined(IN_TRACED_ABSMI_C) */ static int iequ_complex(register CELL *pt0, register CELL *pt0_end, register CELL *pt1) { @@ -2450,4 +2452,11 @@ extern yamop *headoftrace; ENDD(d0); #endif +#define Yap_AsmError(e, d) \ + { \ + saveregs(); \ + Yap_ThrowError(e, d, "while exwcuting inlined built-in"); \ + setregs(); \ + } + #endif // ABSMI_H diff --git a/H/arith2.h b/H/arith2.h index 201d27155..fe815f14a 100755 --- a/H/arith2.h +++ b/H/arith2.h @@ -301,12 +301,12 @@ static Term p_div(Term t1, Term t2 USES_REGS) { Int i1 = IntegerOfTerm(t1), i2 = IntegerOfTerm(t2); if (i2 == 0) { - return Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "// /2"); + Yap_ArithError(EVALUATION_ERROR_ZERO_DIVISOR, t2, "// /2"); } else if (i1 == Int_MIN && i2 == -1) { #ifdef USE_GMP return Yap_gmp_add_ints(Int_MAX, 1); #else - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, t1, + Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, t1, "rem/2 with %d and %d", i1, i2); #endif } else { @@ -314,7 +314,7 @@ static Term p_div(Term t1, Term t2 USES_REGS) { } } case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "// /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "// /2"); case big_int_e: #ifdef USE_GMP /* dividing a bignum by an integer */ @@ -325,7 +325,7 @@ static Term p_div(Term t1, Term t2 USES_REGS) { } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "// /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "// /2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -336,7 +336,7 @@ static Term p_div(Term t1, Term t2 USES_REGS) { /* two bignums */ return Yap_gmp_div_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "// /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "// /2"); default: RERROR(); } @@ -355,7 +355,7 @@ static Term p_and(Term t1, Term t2 USES_REGS) { /* two integers */ RINT(IntegerOfTerm(t1) & IntegerOfTerm(t2)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "/\\ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "/\\ /2"); case big_int_e: #ifdef USE_GMP return Yap_gmp_and_int_big(IntegerOfTerm(t1), t2); @@ -365,7 +365,7 @@ static Term p_and(Term t1, Term t2 USES_REGS) { } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "/\\ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "/\\ /2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -376,7 +376,7 @@ static Term p_and(Term t1, Term t2 USES_REGS) { /* two bignums */ return Yap_gmp_and_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "/\\ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "/\\ /2"); default: RERROR(); } @@ -395,7 +395,7 @@ static Term p_or(Term t1, Term t2 USES_REGS) { /* two integers */ RINT(IntegerOfTerm(t1) | IntegerOfTerm(t2)); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "\\/ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "\\/ /2"); case big_int_e: #ifdef USE_GMP return Yap_gmp_ior_int_big(IntegerOfTerm(t1), t2); @@ -405,7 +405,7 @@ static Term p_or(Term t1, Term t2 USES_REGS) { } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, "\\/ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, "\\/ /2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { @@ -416,7 +416,7 @@ static Term p_or(Term t1, Term t2 USES_REGS) { /* two bignums */ return Yap_gmp_ior_big_big(t1, t2); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "\\/ /2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, "\\/ /2"); default: RERROR(); } @@ -438,33 +438,33 @@ static Term p_sll(Term t1, Term t2 USES_REGS) { if (i2 <= 0) { if (i2 == Int_MIN) { - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); } RINT(SLR(IntegerOfTerm(t1), -i2)); } return do_sll(IntegerOfTerm(t1), i2 PASS_REGS); } case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "<>/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "<>/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); } return do_sll(IntegerOfTerm(t1), -i2 PASS_REGS); } RINT(SLR(IntegerOfTerm(t1), i2)); } case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, ">>/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, ">>/2"); case big_int_e: #ifdef USE_GMP - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); #endif default: RERROR(); } break; case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t1, ">>/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t1, ">>/2"); case big_int_e: #ifdef USE_GMP switch (ETypeOfTerm(t2)) { case long_int_e: return Yap_gmp_sll_big_int(t1, -IntegerOfTerm(t2)); case big_int_e: - return Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); + Yap_ArithError(RESOURCE_ERROR_HUGE_INT, t2, ">>/2"); case double_e: - return Yap_ArithError(TYPE_ERROR_INTEGER, t2, ">>/2"); + Yap_ArithError(TYPE_ERROR_INTEGER, t2, ">>/2"); default: RERROR(); } diff --git a/H/eval.h b/H/eval.h index 81be993d7..5b1117a59 100644 --- a/H/eval.h +++ b/H/eval.h @@ -375,6 +375,7 @@ Functor EvalArg(Term); eval_flt = (F); \ return (FFloat); \ } + #define REvalError() \ { return (FError); } @@ -406,9 +407,13 @@ yamop *Yap_EvalError__(const char *, const char *, int, yap_error_number, Term, ...); #define Yap_ArithError(id, t, ...) \ - Yap_ArithError__(__FILE__, __FUNCTION__, __LINE__, id, t, __VA_ARGS__) -Int Yap_ArithError__(const char *, const char *, int, yap_error_number, Term, - ...); + Yap_ThrowError__(__FILE__, __FUNCTION__, __LINE__, id, t, __VA_ARGS__) +#define Yap_BinError(id) \ + Yap_Error__(__FILE__, __FUNCTION__, __LINE__, id, 0L, "") +#define Yap_AbsmiError(id) \ + Yap_Error__(__FILE__, __FUNCTION__, __LINE__, id, 0L, "") +extern Int Yap_ArithError__(const char *, const char *, int, yap_error_number, + Term, ...); #include "inline-only.h" @@ -429,7 +434,7 @@ INLINE_ONLY inline EXTERN Term Yap_Eval__(Term t USES_REGS) { #if HAVE_FECLEAREXCEPT inline static void Yap_ClearExs(void) { feclearexcept(FE_ALL_EXCEPT); } #else -inline static void Yap_ClearExs(void) { } +inline static void Yap_ClearExs(void) {} #endif inline static yap_error_number Yap_FoundArithError__(USES_REGS1) { @@ -463,7 +468,11 @@ Atom Yap_NameOfBinaryOp(int i); #define RINT(v) return (MkIntegerTerm(v)) #define RFLOAT(v) return (MkFloatTerm(v)) #define RBIG(v) return (Yap_MkBigIntTerm(v)) -#define RERROR() return (0L) +#define RERROR() \ + { \ + Yap_BinError(LOCAL_Error_TYPE); \ + return (0L); \ + } static inline blob_type ETypeOfTerm(Term t) { if (IsIntTerm(t)) diff --git a/H/generated/dlocals.h b/H/generated/dlocals.h index 50ec4e7a1..2034b0403 100644 --- a/H/generated/dlocals.h +++ b/H/generated/dlocals.h @@ -121,8 +121,6 @@ #define REMOTE_ArenaOverflows(wid) REMOTE(wid)->ArenaOverflows_ #define LOCAL_DepthArenas LOCAL->DepthArenas_ #define REMOTE_DepthArenas(wid) REMOTE(wid)->DepthArenas_ -#define LOCAL_ArithError LOCAL->ArithError_ -#define REMOTE_ArithError(wid) REMOTE(wid)->ArithError_ #define LOCAL_LastAssertedPred LOCAL->LastAssertedPred_ #define REMOTE_LastAssertedPred(wid) REMOTE(wid)->LastAssertedPred_ #define LOCAL_TmpPred LOCAL->TmpPred_ @@ -288,16 +286,10 @@ #define REMOTE_TrailBase(wid) REMOTE(wid)->TrailBase_ #define LOCAL_TrailTop LOCAL->TrailTop_ #define REMOTE_TrailTop(wid) REMOTE(wid)->TrailTop_ -#define LOCAL_ErrorMessage LOCAL->ErrorMessage_ -#define REMOTE_ErrorMessage(wid) REMOTE(wid)->ErrorMessage_ -#define LOCAL_Error_Term LOCAL->Error_Term_ -#define REMOTE_Error_Term(wid) REMOTE(wid)->Error_Term_ #define LOCAL_ActiveError LOCAL->ActiveError_ #define REMOTE_ActiveError(wid) REMOTE(wid)->ActiveError_ -#define LOCAL_BallTerm LOCAL->BallTerm_ -#define REMOTE_BallTerm(wid) REMOTE(wid)->BallTerm_ #define LOCAL_IOBotch LOCAL->IOBotch_ #define REMOTE_IOBotch(wid) REMOTE(wid)->IOBotch_ #define LOCAL_tokptr LOCAL->tokptr_ @@ -352,14 +344,10 @@ #define LOCAL_s_dbg LOCAL->s_dbg_ #define REMOTE_s_dbg(wid) REMOTE(wid)->s_dbg_ -#define LOCAL_matherror LOCAL->matherror_ -#define REMOTE_matherror(wid) REMOTE(wid)->matherror_ #define LOCAL_mathtt LOCAL->mathtt_ #define REMOTE_mathtt(wid) REMOTE(wid)->mathtt_ #define LOCAL_mathstring LOCAL->mathstring_ #define REMOTE_mathstring(wid) REMOTE(wid)->mathstring_ -#define LOCAL_CurrentError LOCAL->CurrentError_ -#define REMOTE_CurrentError(wid) REMOTE(wid)->CurrentError_ #define LOCAL_heap_overflows LOCAL->heap_overflows_ #define REMOTE_heap_overflows(wid) REMOTE(wid)->heap_overflows_ diff --git a/H/generated/hlocals.h b/H/generated/hlocals.h index 0dbbdc4e0..46a00dad4 100644 --- a/H/generated/hlocals.h +++ b/H/generated/hlocals.h @@ -69,7 +69,6 @@ typedef struct worker_local { UInt GlobalArenaOverflows_; Int ArenaOverflows_; Int DepthArenas_; - int ArithError_; struct pred_entry* LastAssertedPred_; struct pred_entry* TmpPred_; char* ScannerStack_; @@ -164,12 +163,9 @@ typedef struct worker_local { ADDR GlobalBase_; ADDR TrailBase_; ADDR TrailTop_; - char* ErrorMessage_; - Term Error_Term_; -/** error handling info, designed to be easy to pass to the foreign world */ - struct yap_error_descriptor ActiveError_; +/* error handling info, designed to be easy to pass to the foreign world */ + yap_error_descriptor_t* ActiveError_; /// pointer to an exception term, from throw - struct DB_TERM* BallTerm_; jmp_buf IOBotch_; TokEntry* tokptr_; TokEntry* toktide_; @@ -201,10 +197,8 @@ typedef struct worker_local { //dbase.c struct db_globs* s_dbg_; //eval.c - yap_error_number matherror_; Term mathtt_; char* mathstring_; - yap_error_number CurrentError_; //grow.c int heap_overflows_; Int total_heap_overflow_time_; diff --git a/H/generated/iatoms.h b/H/generated/iatoms.h index e92b86e85..9e01498dd 100644 --- a/H/generated/iatoms.h +++ b/H/generated/iatoms.h @@ -24,9 +24,14 @@ AtomAttributedModule = Yap_LookupAtom("attributes_module"); TermAttributedModule = MkAtomTerm(AtomAttributedModule); AtomDoubleArrow = Yap_LookupAtom("-->"); TermDoubleArrow = MkAtomTerm(AtomDoubleArrow); AtomAssert = Yap_LookupAtom(":-"); TermAssert = MkAtomTerm(AtomAssert); + AtomBeginBracket = Yap_LookupAtom("("); TermBeginBracket = MkAtomTerm(AtomBeginBracket); + AtomEndBracket = Yap_LookupAtom(")"); TermEndBracket = MkAtomTerm(AtomEndBracket); + AtomBeginSquareBracket = Yap_LookupAtom("["); TermBeginSquareBracket = MkAtomTerm(AtomBeginSquareBracket); + AtomEndSquareBracket = Yap_LookupAtom("]"); TermEndSquareBracket = MkAtomTerm(AtomEndSquareBracket); + AtomBeginCurlyBracket = Yap_LookupAtom("{"); TermBeginCurlyBracket = MkAtomTerm(AtomBeginCurlyBracket); + AtomEndCurlyBracket = Yap_LookupAtom("}"); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket); AtomEmptyBrackets = Yap_LookupAtom("()"); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets); AtomEmptySquareBrackets = Yap_LookupAtom("[]"); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets); - AtomEmptyCurlyBrackets = Yap_LookupAtom("{}"); TermEmptyCurlyBrackets = MkAtomTerm(AtomEmptyCurlyBrackets); AtomAsserta = Yap_LookupAtom("asserta"); TermAsserta = MkAtomTerm(AtomAsserta); AtomAssertaStatic = Yap_LookupAtom("asserta_static"); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic); AtomAssertz = Yap_LookupAtom("assertz"); TermAssertz = MkAtomTerm(AtomAssertz); @@ -63,6 +68,7 @@ AtomCharset = Yap_LookupAtom("charset"); TermCharset = MkAtomTerm(AtomCharset); AtomChType = Yap_FullLookupAtom("$char_type"); TermChType = MkAtomTerm(AtomChType); AtomCleanCall = Yap_FullLookupAtom("$clean_call"); TermCleanCall = MkAtomTerm(AtomCleanCall); + AtomClose = Yap_LookupAtom("close"); TermClose = MkAtomTerm(AtomClose); AtomColon = Yap_LookupAtom(":"); TermColon = MkAtomTerm(AtomColon); AtomCodeSpace = Yap_LookupAtom("code_space"); TermCodeSpace = MkAtomTerm(AtomCodeSpace); AtomCodes = Yap_LookupAtom("codes"); TermCodes = MkAtomTerm(AtomCodes); @@ -84,7 +90,7 @@ AtomCurrentModule = Yap_FullLookupAtom("$current_module"); TermCurrentModule = MkAtomTerm(AtomCurrentModule); AtomCut = Yap_LookupAtom("!"); TermCut = MkAtomTerm(AtomCut); AtomCutBy = Yap_FullLookupAtom("$cut_by"); TermCutBy = MkAtomTerm(AtomCutBy); - AtomDAbort = Yap_FullLookupAtom("$abort"); TermDAbort = MkAtomTerm(AtomDAbort); + AtomDAbort = Yap_LookupAtom("abort"); TermDAbort = MkAtomTerm(AtomDAbort); AtomDBLoad = Yap_FullLookupAtom("$db_load"); TermDBLoad = MkAtomTerm(AtomDBLoad); AtomDBREF = Yap_LookupAtom("DBRef"); TermDBREF = MkAtomTerm(AtomDBREF); AtomDBReference = Yap_LookupAtom("db_reference"); TermDBReference = MkAtomTerm(AtomDBReference); @@ -185,6 +191,7 @@ AtomIgnore = Yap_LookupAtom("ignore"); TermIgnore = MkAtomTerm(AtomIgnore); AtomInf = Yap_LookupAtom("inf"); TermInf = MkAtomTerm(AtomInf); AtomInfinity = Yap_LookupAtom("infinity"); TermInfinity = MkAtomTerm(AtomInfinity); + AtomInfo = Yap_LookupAtom("info"); TermInfo = MkAtomTerm(AtomInfo); AtomInitGoal = Yap_FullLookupAtom("$init_goal"); TermInitGoal = MkAtomTerm(AtomInitGoal); AtomInitProlog = Yap_FullLookupAtom("$init_prolog"); TermInitProlog = MkAtomTerm(AtomInitProlog); AtomInStackExpansion = Yap_LookupAtom("in stack expansion"); TermInStackExpansion = MkAtomTerm(AtomInStackExpansion); @@ -196,6 +203,7 @@ AtomInternalCompilerError = Yap_LookupAtom("internal_compiler_error"); TermInternalCompilerError = MkAtomTerm(AtomInternalCompilerError); AtomIs = Yap_LookupAtom("is"); TermIs = MkAtomTerm(AtomIs); AtomJ = Yap_LookupAtom("j"); TermJ = MkAtomTerm(AtomJ); + Atoml = Yap_LookupAtom("l"); Terml = MkAtomTerm(Atoml); AtomKey = Yap_LookupAtom("key"); TermKey = MkAtomTerm(AtomKey); AtomLDLibraryPath = Yap_LookupAtom("LD_LIBRARY_PATH"); TermLDLibraryPath = MkAtomTerm(AtomLDLibraryPath); AtomLONGINT = Yap_LookupAtom("LongInt"); TermLONGINT = MkAtomTerm(AtomLONGINT); @@ -281,6 +289,7 @@ AtomPermissionError = Yap_LookupAtom("permission_error"); TermPermissionError = MkAtomTerm(AtomPermissionError); AtomPi = Yap_LookupAtom("pi"); TermPi = MkAtomTerm(AtomPi); AtomPipe = Yap_LookupAtom("pipe"); TermPipe = MkAtomTerm(AtomPipe); + AtomPriority = Yap_LookupAtom("priority"); TermPriority = MkAtomTerm(AtomPriority); AtomPlus = Yap_LookupAtom("+"); TermPlus = MkAtomTerm(AtomPlus); AtomPointer = Yap_LookupAtom("pointer"); TermPointer = MkAtomTerm(AtomPointer); AtomPortray = Yap_FullLookupAtom("portray"); TermPortray = MkAtomTerm(AtomPortray); @@ -483,9 +492,9 @@ FunctorDot7 = Yap_MkFunctor(AtomDot,7); FunctorDot8 = Yap_MkFunctor(AtomDot,8); FunctorDot9 = Yap_MkFunctor(AtomDot,9); + FunctorDoubleArrow = Yap_MkFunctor(AtomDoubleArrow,2); FunctorDoubleSlash = Yap_MkFunctor(AtomDoubleSlash,2); FunctorEmptySquareBrackets = Yap_MkFunctor(AtomEmptySquareBrackets,2); - FunctorEmptyCurlyBrackets = Yap_MkFunctor(AtomEmptyCurlyBrackets,2); FunctorEq = Yap_MkFunctor(AtomEq,2); FunctorError = Yap_MkFunctor(AtomError,2); FunctorEvaluationError = Yap_MkFunctor(AtomEvaluationError,1); @@ -512,6 +521,10 @@ FunctorHat = Yap_MkFunctor(AtomHat,2); FunctorI = Yap_MkFunctor(AtomI,2); FunctorId = Yap_MkFunctor(AtomId,1); + FunctorInfo1 = Yap_MkFunctor(AtomInfo,1); + FunctorInfo2 = Yap_MkFunctor(AtomInfo,2); + FunctorInfo3 = Yap_MkFunctor(AtomInfo,3); + FunctorInfo4 = Yap_MkFunctor(AtomInfo,4); FunctorIs = Yap_MkFunctor(AtomIs,2); FunctorJ = Yap_MkFunctor(AtomJ,2); FunctorLastExecuteWithin = Yap_MkFunctor(AtomLastExecuteWithin,1); @@ -529,11 +542,13 @@ FunctorNot = Yap_MkFunctor(AtomNot,1); FunctorObj = Yap_MkFunctor(AtomObj,1); FunctorOr = Yap_MkFunctor(AtomSemic,2); + FunctorOutput = Yap_MkFunctor(AtomOutput,1); FunctorPermissionError = Yap_MkFunctor(AtomPermissionError,3); FunctorPlus = Yap_MkFunctor(AtomPlus,2); FunctorPortray = Yap_MkFunctor(AtomPortray,1); FunctorPrintMessage = Yap_MkFunctor(AtomPrintMessage,2); FunctorProcedure = Yap_MkFunctor(AtomProcedure,5); + FunctorPriority = Yap_MkFunctor(AtomPriority,1); FunctorPrologConstraint = Yap_MkFunctor(AtomProlog,2); FunctorProtectStack = Yap_MkFunctor(AtomProtectStack,4); FunctorQuery = Yap_MkFunctor(AtomQuery,1); diff --git a/H/generated/ilocals.h b/H/generated/ilocals.h index b290c118d..2ada8ba04 100755 --- a/H/generated/ilocals.h +++ b/H/generated/ilocals.h @@ -69,7 +69,6 @@ static void InitWorker(int wid) { REMOTE_GlobalArenaOverflows(wid) = 0L; REMOTE_ArenaOverflows(wid) = 0L; REMOTE_DepthArenas(wid) = 0; - REMOTE_ArithError(wid) = FALSE; REMOTE_LastAssertedPred(wid) = NULL; REMOTE_TmpPred(wid) = NULL; REMOTE_ScannerStack(wid) = NULL; @@ -165,14 +164,11 @@ static void InitWorker(int wid) { + REMOTE_ActiveError(wid) = calloc(sizeof(yap_error_descriptor_t),1); - REMOTE_BallTerm(wid) = NULL; - - - @@ -201,10 +197,8 @@ static void InitWorker(int wid) { - REMOTE_matherror(wid) = YAP_NO_ERROR; REMOTE_mathstring(wid) = NULL; - REMOTE_CurrentError(wid) = YAP_NO_ERROR; REMOTE_heap_overflows(wid) = 0; REMOTE_total_heap_overflow_time(wid) = 0; diff --git a/H/generated/ratoms.h b/H/generated/ratoms.h index 563df5b3f..1f485c034 100644 --- a/H/generated/ratoms.h +++ b/H/generated/ratoms.h @@ -24,9 +24,14 @@ AtomAttributedModule = AtomAdjust(AtomAttributedModule); TermAttributedModule = MkAtomTerm(AtomAttributedModule); AtomDoubleArrow = AtomAdjust(AtomDoubleArrow); TermDoubleArrow = MkAtomTerm(AtomDoubleArrow); AtomAssert = AtomAdjust(AtomAssert); TermAssert = MkAtomTerm(AtomAssert); + AtomBeginBracket = AtomAdjust(AtomBeginBracket); TermBeginBracket = MkAtomTerm(AtomBeginBracket); + AtomEndBracket = AtomAdjust(AtomEndBracket); TermEndBracket = MkAtomTerm(AtomEndBracket); + AtomBeginSquareBracket = AtomAdjust(AtomBeginSquareBracket); TermBeginSquareBracket = MkAtomTerm(AtomBeginSquareBracket); + AtomEndSquareBracket = AtomAdjust(AtomEndSquareBracket); TermEndSquareBracket = MkAtomTerm(AtomEndSquareBracket); + AtomBeginCurlyBracket = AtomAdjust(AtomBeginCurlyBracket); TermBeginCurlyBracket = MkAtomTerm(AtomBeginCurlyBracket); + AtomEndCurlyBracket = AtomAdjust(AtomEndCurlyBracket); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket); AtomEmptyBrackets = AtomAdjust(AtomEmptyBrackets); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets); AtomEmptySquareBrackets = AtomAdjust(AtomEmptySquareBrackets); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets); - AtomEmptyCurlyBrackets = AtomAdjust(AtomEmptyCurlyBrackets); TermEmptyCurlyBrackets = MkAtomTerm(AtomEmptyCurlyBrackets); AtomAsserta = AtomAdjust(AtomAsserta); TermAsserta = MkAtomTerm(AtomAsserta); AtomAssertaStatic = AtomAdjust(AtomAssertaStatic); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic); AtomAssertz = AtomAdjust(AtomAssertz); TermAssertz = MkAtomTerm(AtomAssertz); @@ -63,6 +68,7 @@ AtomCharset = AtomAdjust(AtomCharset); TermCharset = MkAtomTerm(AtomCharset); AtomChType = AtomAdjust(AtomChType); TermChType = MkAtomTerm(AtomChType); AtomCleanCall = AtomAdjust(AtomCleanCall); TermCleanCall = MkAtomTerm(AtomCleanCall); + AtomClose = AtomAdjust(AtomClose); TermClose = MkAtomTerm(AtomClose); AtomColon = AtomAdjust(AtomColon); TermColon = MkAtomTerm(AtomColon); AtomCodeSpace = AtomAdjust(AtomCodeSpace); TermCodeSpace = MkAtomTerm(AtomCodeSpace); AtomCodes = AtomAdjust(AtomCodes); TermCodes = MkAtomTerm(AtomCodes); @@ -185,6 +191,7 @@ AtomIgnore = AtomAdjust(AtomIgnore); TermIgnore = MkAtomTerm(AtomIgnore); AtomInf = AtomAdjust(AtomInf); TermInf = MkAtomTerm(AtomInf); AtomInfinity = AtomAdjust(AtomInfinity); TermInfinity = MkAtomTerm(AtomInfinity); + AtomInfo = AtomAdjust(AtomInfo); TermInfo = MkAtomTerm(AtomInfo); AtomInitGoal = AtomAdjust(AtomInitGoal); TermInitGoal = MkAtomTerm(AtomInitGoal); AtomInitProlog = AtomAdjust(AtomInitProlog); TermInitProlog = MkAtomTerm(AtomInitProlog); AtomInStackExpansion = AtomAdjust(AtomInStackExpansion); TermInStackExpansion = MkAtomTerm(AtomInStackExpansion); @@ -196,6 +203,7 @@ AtomInternalCompilerError = AtomAdjust(AtomInternalCompilerError); TermInternalCompilerError = MkAtomTerm(AtomInternalCompilerError); AtomIs = AtomAdjust(AtomIs); TermIs = MkAtomTerm(AtomIs); AtomJ = AtomAdjust(AtomJ); TermJ = MkAtomTerm(AtomJ); + Atoml = AtomAdjust(Atoml); Terml = MkAtomTerm(Atoml); AtomKey = AtomAdjust(AtomKey); TermKey = MkAtomTerm(AtomKey); AtomLDLibraryPath = AtomAdjust(AtomLDLibraryPath); TermLDLibraryPath = MkAtomTerm(AtomLDLibraryPath); AtomLONGINT = AtomAdjust(AtomLONGINT); TermLONGINT = MkAtomTerm(AtomLONGINT); @@ -281,6 +289,7 @@ AtomPermissionError = AtomAdjust(AtomPermissionError); TermPermissionError = MkAtomTerm(AtomPermissionError); AtomPi = AtomAdjust(AtomPi); TermPi = MkAtomTerm(AtomPi); AtomPipe = AtomAdjust(AtomPipe); TermPipe = MkAtomTerm(AtomPipe); + AtomPriority = AtomAdjust(AtomPriority); TermPriority = MkAtomTerm(AtomPriority); AtomPlus = AtomAdjust(AtomPlus); TermPlus = MkAtomTerm(AtomPlus); AtomPointer = AtomAdjust(AtomPointer); TermPointer = MkAtomTerm(AtomPointer); AtomPortray = AtomAdjust(AtomPortray); TermPortray = MkAtomTerm(AtomPortray); @@ -483,9 +492,9 @@ FunctorDot7 = FuncAdjust(FunctorDot7); FunctorDot8 = FuncAdjust(FunctorDot8); FunctorDot9 = FuncAdjust(FunctorDot9); + FunctorDoubleArrow = FuncAdjust(FunctorDoubleArrow); FunctorDoubleSlash = FuncAdjust(FunctorDoubleSlash); FunctorEmptySquareBrackets = FuncAdjust(FunctorEmptySquareBrackets); - FunctorEmptyCurlyBrackets = FuncAdjust(FunctorEmptyCurlyBrackets); FunctorEq = FuncAdjust(FunctorEq); FunctorError = FuncAdjust(FunctorError); FunctorEvaluationError = FuncAdjust(FunctorEvaluationError); @@ -512,6 +521,10 @@ FunctorHat = FuncAdjust(FunctorHat); FunctorI = FuncAdjust(FunctorI); FunctorId = FuncAdjust(FunctorId); + FunctorInfo1 = FuncAdjust(FunctorInfo1); + FunctorInfo2 = FuncAdjust(FunctorInfo2); + FunctorInfo3 = FuncAdjust(FunctorInfo3); + FunctorInfo4 = FuncAdjust(FunctorInfo4); FunctorIs = FuncAdjust(FunctorIs); FunctorJ = FuncAdjust(FunctorJ); FunctorLastExecuteWithin = FuncAdjust(FunctorLastExecuteWithin); @@ -529,11 +542,13 @@ FunctorNot = FuncAdjust(FunctorNot); FunctorObj = FuncAdjust(FunctorObj); FunctorOr = FuncAdjust(FunctorOr); + FunctorOutput = FuncAdjust(FunctorOutput); FunctorPermissionError = FuncAdjust(FunctorPermissionError); FunctorPlus = FuncAdjust(FunctorPlus); FunctorPortray = FuncAdjust(FunctorPortray); FunctorPrintMessage = FuncAdjust(FunctorPrintMessage); FunctorProcedure = FuncAdjust(FunctorProcedure); + FunctorPriority = FuncAdjust(FunctorPriority); FunctorPrologConstraint = FuncAdjust(FunctorPrologConstraint); FunctorProtectStack = FuncAdjust(FunctorProtectStack); FunctorQuery = FuncAdjust(FunctorQuery); diff --git a/H/generated/rlocals.h b/H/generated/rlocals.h index d376d9bde..77f95bc68 100644 --- a/H/generated/rlocals.h +++ b/H/generated/rlocals.h @@ -86,7 +86,6 @@ static void RestoreWorker(int wid USES_REGS) { - #ifdef COROUTINING @@ -187,9 +186,6 @@ static void RestoreWorker(int wid USES_REGS) { - - - @@ -215,8 +211,6 @@ static void RestoreWorker(int wid USES_REGS) { - - #ifdef LOAD_DYLD #endif diff --git a/H/generated/tatoms.h b/H/generated/tatoms.h index eb4cc27bc..561d48c72 100644 --- a/H/generated/tatoms.h +++ b/H/generated/tatoms.h @@ -24,9 +24,14 @@ EXTERNAL Atom AtomArrow; EXTERNAL Term TermArrow; EXTERNAL Atom AtomAttributedModule; EXTERNAL Term TermAttributedModule; EXTERNAL Atom AtomDoubleArrow; EXTERNAL Term TermDoubleArrow; EXTERNAL Atom AtomAssert; EXTERNAL Term TermAssert; +EXTERNAL Atom AtomBeginBracket; EXTERNAL Term TermBeginBracket; +EXTERNAL Atom AtomEndBracket; EXTERNAL Term TermEndBracket; +EXTERNAL Atom AtomBeginSquareBracket; EXTERNAL Term TermBeginSquareBracket; +EXTERNAL Atom AtomEndSquareBracket; EXTERNAL Term TermEndSquareBracket; +EXTERNAL Atom AtomBeginCurlyBracket; EXTERNAL Term TermBeginCurlyBracket; +EXTERNAL Atom AtomEndCurlyBracket; EXTERNAL Term TermEndCurlyBracket; EXTERNAL Atom AtomEmptyBrackets; EXTERNAL Term TermEmptyBrackets; EXTERNAL Atom AtomEmptySquareBrackets; EXTERNAL Term TermEmptySquareBrackets; -EXTERNAL Atom AtomEmptyCurlyBrackets; EXTERNAL Term TermEmptyCurlyBrackets; EXTERNAL Atom AtomAsserta; EXTERNAL Term TermAsserta; EXTERNAL Atom AtomAssertaStatic; EXTERNAL Term TermAssertaStatic; EXTERNAL Atom AtomAssertz; EXTERNAL Term TermAssertz; @@ -63,6 +68,7 @@ EXTERNAL Atom AtomChars; EXTERNAL Term TermChars; EXTERNAL Atom AtomCharset; EXTERNAL Term TermCharset; EXTERNAL Atom AtomChType; EXTERNAL Term TermChType; EXTERNAL Atom AtomCleanCall; EXTERNAL Term TermCleanCall; +EXTERNAL Atom AtomClose; EXTERNAL Term TermClose; EXTERNAL Atom AtomColon; EXTERNAL Term TermColon; EXTERNAL Atom AtomCodeSpace; EXTERNAL Term TermCodeSpace; EXTERNAL Atom AtomCodes; EXTERNAL Term TermCodes; @@ -185,6 +191,7 @@ EXTERNAL Atom AtomId; EXTERNAL Term TermId; EXTERNAL Atom AtomIgnore; EXTERNAL Term TermIgnore; EXTERNAL Atom AtomInf; EXTERNAL Term TermInf; EXTERNAL Atom AtomInfinity; EXTERNAL Term TermInfinity; +EXTERNAL Atom AtomInfo; EXTERNAL Term TermInfo; EXTERNAL Atom AtomInitGoal; EXTERNAL Term TermInitGoal; EXTERNAL Atom AtomInitProlog; EXTERNAL Term TermInitProlog; EXTERNAL Atom AtomInStackExpansion; EXTERNAL Term TermInStackExpansion; @@ -196,6 +203,7 @@ EXTERNAL Atom AtomInteger; EXTERNAL Term TermInteger; EXTERNAL Atom AtomInternalCompilerError; EXTERNAL Term TermInternalCompilerError; EXTERNAL Atom AtomIs; EXTERNAL Term TermIs; EXTERNAL Atom AtomJ; EXTERNAL Term TermJ; +EXTERNAL Atom Atoml; EXTERNAL Term Terml; EXTERNAL Atom AtomKey; EXTERNAL Term TermKey; EXTERNAL Atom AtomLDLibraryPath; EXTERNAL Term TermLDLibraryPath; EXTERNAL Atom AtomLONGINT; EXTERNAL Term TermLONGINT; @@ -281,6 +289,7 @@ EXTERNAL Atom AtomPastEndOfStream; EXTERNAL Term TermPastEndOfStream; EXTERNAL Atom AtomPermissionError; EXTERNAL Term TermPermissionError; EXTERNAL Atom AtomPi; EXTERNAL Term TermPi; EXTERNAL Atom AtomPipe; EXTERNAL Term TermPipe; +EXTERNAL Atom AtomPriority; EXTERNAL Term TermPriority; EXTERNAL Atom AtomPlus; EXTERNAL Term TermPlus; EXTERNAL Atom AtomPointer; EXTERNAL Term TermPointer; EXTERNAL Atom AtomPortray; EXTERNAL Term TermPortray; @@ -537,12 +546,12 @@ EXTERNAL Functor FunctorDot8; EXTERNAL Functor FunctorDot9; +EXTERNAL Functor FunctorDoubleArrow; + EXTERNAL Functor FunctorDoubleSlash; EXTERNAL Functor FunctorEmptySquareBrackets; -EXTERNAL Functor FunctorEmptyCurlyBrackets; - EXTERNAL Functor FunctorEq; EXTERNAL Functor FunctorError; @@ -595,6 +604,14 @@ EXTERNAL Functor FunctorI; EXTERNAL Functor FunctorId; +EXTERNAL Functor FunctorInfo1; + +EXTERNAL Functor FunctorInfo2; + +EXTERNAL Functor FunctorInfo3; + +EXTERNAL Functor FunctorInfo4; + EXTERNAL Functor FunctorIs; EXTERNAL Functor FunctorJ; @@ -629,6 +646,8 @@ EXTERNAL Functor FunctorObj; EXTERNAL Functor FunctorOr; +EXTERNAL Functor FunctorOutput; + EXTERNAL Functor FunctorPermissionError; EXTERNAL Functor FunctorPlus; @@ -639,6 +658,8 @@ EXTERNAL Functor FunctorPrintMessage; EXTERNAL Functor FunctorProcedure; +EXTERNAL Functor FunctorPriority; + EXTERNAL Functor FunctorPrologConstraint; EXTERNAL Functor FunctorProtectStack; diff --git a/H/qly.h b/H/qly.h index 8c545f33a..e0d0c8b32 100644 --- a/H/qly.h +++ b/H/qly.h @@ -96,10 +96,9 @@ typedef enum { QLY_END_OPS = 11, QLY_START_PREDICATE = 12, QLY_END_PREDICATES = 13, - QLY_ATOM_WIDE = 14, QLY_FAILCODE = 15, QLY_ATOM = 16, - QLY_ATOM_BLOB = 17 + QLY_ATOM_BLOB = 14 } qlf_tag_t; #define STATIC_PRED_FLAGS \ diff --git a/H/rheap.h b/H/rheap.h index 7b282fd45..d6bf5f0f4 100644 --- a/H/rheap.h +++ b/H/rheap.h @@ -1460,9 +1460,6 @@ static void RestoreEntries(PropEntry *pp, int int_key USES_REGS) { case ExpProperty: pp->NextOfPE = PropAdjust(pp->NextOfPE); break; - case WideAtomProperty: - pp->NextOfPE = PropAdjust(pp->NextOfPE); - break; case BlobProperty: pp->NextOfPE = PropAdjust(pp->NextOfPE); { diff --git a/H/walkclause.h b/H/walkclause.h index 20a25fc2c..0252df004 100644 --- a/H/walkclause.h +++ b/H/walkclause.h @@ -1,748 +1,746 @@ - - /* This file was generated automatically by "yap -L misc/buildops" +/* This file was generated automatically by "yap -L misc/buildops" please do not update */ +while (TRUE) { + op_numbers op; - while (TRUE) { - op_numbers op; - - op = Yap_op_from_opcode(pc->opc); - /* C-code, maybe indexing */ - switch (op) { - /* instructions type D */ - case _write_dbterm: - pc = NEXTOP(pc,D); - break; - /* instructions type Illss */ - case _enter_lu_pred: - return walk_got_lu_block(pc->y_u.Illss.I, startp, endp); - /* instructions type J */ + op = Yap_op_from_opcode(pc->opc); + /* C-code, maybe indexing */ + switch (op) { + /* instructions type D */ + case _write_dbterm: + pc = NEXTOP(pc, D); + break; + /* instructions type Illss */ + case _enter_lu_pred: + return walk_got_lu_block(pc->y_u.Illss.I, startp, endp); +/* instructions type J */ #ifdef YAP_JIT - case _jit_handler: + case _jit_handler: #endif - pc = NEXTOP(pc,J); - break; - /* instructions type L */ - case _alloc_for_logical_pred: - return walk_got_lu_clause(pc->y_u.L.ClBase, startp, endp); - /* instructions type N */ - case _write_bigint: - pc = NEXTOP(pc,N); - break; - /* instructions type Osblp */ - case _either: - case _or_else: - clause_code = TRUE; - pp = pc->y_u.Osblp.p0; - pc = NEXTOP(pc,Osblp); - break; - /* instructions type Osbmp */ - case _p_execute: - case _p_execute_tail: - pc = NEXTOP(pc,Osbmp); - break; - /* instructions type Osbpa */ - case _ensure_space: - pc = NEXTOP(pc,Osbpa); - break; - /* instructions type Osbpp */ - case _call_cpred: - pp = pc->y_u.Osbpp.p; - return walk_found_c_pred(pp, startp, endp); - case _call_usercpred: - pp = pc->y_u.Osbpp.p; - return walk_found_c_pred(pp, startp, endp); - case _p_execute2: - return found_meta_call(startp, endp); - case _call: - case _fcall: - clause_code = TRUE; - pp = pc->y_u.Osbpp.p0; - pc = NEXTOP(pc,Osbpp); - break; - /* instructions type OtILl */ - case _count_trust_logical: - case _profiled_trust_logical: - case _trust_logical: - return walk_got_lu_block(pc->y_u.OtILl.block, startp, endp); - /* instructions type OtaLl */ - case _count_retry_logical: - case _profiled_retry_logical: - case _retry_logical: - case _try_logical: - pc = pc->y_u.OtaLl.n; - break; - /* instructions type OtapFs */ - case _cut_c: - case _cut_userc: - case _retry_c: - case _retry_userc: - case _try_c: - case _try_userc: - clause_code = TRUE; - pp = pc->y_u.OtapFs.p; - pc = NEXTOP(pc,OtapFs); - break; - /* instructions type Otapl */ - case _count_retry_and_mark: - case _count_retry_me: - case _count_trust_me: - case _profiled_retry_and_mark: - case _profiled_retry_me: - case _profiled_trust_me: - case _retry: - case _retry_and_mark: - case _retry_me: - case _spy_or_trymark: - case _trust: - case _trust_me: - case _try_and_mark: - case _try_clause: - case _try_me: - clause_code = FALSE; - pp = pc->y_u.Otapl.p; - pc = NEXTOP(pc,Otapl); - break; - /* instructions type c */ - case _write_atom: - pc = NEXTOP(pc,c); - break; - /* instructions type cc */ - case _get_2atoms: - pc = NEXTOP(pc,cc); - break; - /* instructions type ccc */ - case _get_3atoms: - pc = NEXTOP(pc,ccc); - break; - /* instructions type cccc */ - case _get_4atoms: - pc = NEXTOP(pc,cccc); - break; - /* instructions type ccccc */ - case _get_5atoms: - pc = NEXTOP(pc,ccccc); - break; - /* instructions type cccccc */ - case _get_6atoms: - pc = NEXTOP(pc,cccccc); - break; - /* instructions type clll */ - case _if_not_then: - pc = NEXTOP(pc,clll); - break; - /* instructions type d */ - case _write_float: - pc = NEXTOP(pc,d); - break; - /* instructions type e */ - case _Nstop: - return NULL; - case _copy_idb_term: - return found_idb_clause(pc, startp, endp); - case _expand_index: - return found_expand(pc, startp, endp PASS_REGS); - case _index_pred: - return found_owner_op(pc, startp, endp PASS_REGS); - case _lock_pred: - return found_owner_op(pc, startp, endp PASS_REGS); - case _op_fail: - if (codeptr == FAILCODE) - return found_fail(pc, startp, endp PASS_REGS); - pc = NEXTOP(pc,e); - break; - case _spy_pred: - return found_owner_op(pc, startp, endp PASS_REGS); - case _trust_fail: - if (codeptr == TRUSTFAILCODE) - return found_fail(pc, startp, endp PASS_REGS); - pc = NEXTOP(pc,e); - break; - case _undef_p: - return found_owner_op(pc, startp, endp PASS_REGS); - case _unify_idb_term: - return found_idb_clause(pc, startp, endp); - case _allocate: - case _enter_exo: - case _index_blob: - case _index_dbref: - case _index_long: - case _p_equal: - case _p_functor: - case _pop: + pc = NEXTOP(pc, J); + break; + /* instructions type L */ + case _alloc_for_logical_pred: + return walk_got_lu_clause(pc->y_u.L.ClBase, startp, endp); + /* instructions type N */ + case _write_bigint: + pc = NEXTOP(pc, N); + break; + /* instructions type Osblp */ + case _either: + case _or_else: + clause_code = TRUE; + pp = pc->y_u.Osblp.p0; + pc = NEXTOP(pc, Osblp); + break; + /* instructions type Osbmp */ + case _p_execute: + case _p_execute_tail: + pc = NEXTOP(pc, Osbmp); + break; + /* instructions type Osbpa */ + case _ensure_space: + pc = NEXTOP(pc, Osbpa); + break; + /* instructions type Osbpp */ + case _call_cpred: + pp = pc->y_u.Osbpp.p; + return walk_found_c_pred(pp, startp, endp); + case _call_usercpred: + pp = pc->y_u.Osbpp.p; + return walk_found_c_pred(pp, startp, endp); + case _p_execute2: + return found_meta_call(startp, endp); + case _call: + case _fcall: + clause_code = TRUE; + pp = pc->y_u.Osbpp.p0; + pc = NEXTOP(pc, Osbpp); + break; + /* instructions type OtILl */ + case _count_trust_logical: + case _profiled_trust_logical: + case _trust_logical: + return walk_got_lu_block(pc->y_u.OtILl.block, startp, endp); + /* instructions type OtaLl */ + case _count_retry_logical: + case _profiled_retry_logical: + case _retry_logical: + case _try_logical: + pc = pc->y_u.OtaLl.n; + break; + /* instructions type OtapFs */ + case _cut_c: + case _cut_userc: + case _retry_c: + case _retry_userc: + case _try_c: + case _try_userc: + clause_code = TRUE; + pp = pc->y_u.OtapFs.p; + pc = NEXTOP(pc, OtapFs); + break; + /* instructions type Otapl */ + case _count_retry_and_mark: + case _count_retry_me: + case _count_trust_me: + case _profiled_retry_and_mark: + case _profiled_retry_me: + case _profiled_trust_me: + case _retry: + case _retry_and_mark: + case _retry_me: + case _spy_or_trymark: + case _trust: + case _trust_me: + case _try_and_mark: + case _try_clause: + case _try_me: + clause_code = FALSE; + pp = pc->y_u.Otapl.p; + pc = NEXTOP(pc, Otapl); + break; + /* instructions type c */ + case _write_atom: + pc = NEXTOP(pc, c); + break; + /* instructions type cc */ + case _get_2atoms: + pc = NEXTOP(pc, cc); + break; + /* instructions type ccc */ + case _get_3atoms: + pc = NEXTOP(pc, ccc); + break; + /* instructions type cccc */ + case _get_4atoms: + pc = NEXTOP(pc, cccc); + break; + /* instructions type ccccc */ + case _get_5atoms: + pc = NEXTOP(pc, ccccc); + break; + /* instructions type cccccc */ + case _get_6atoms: + pc = NEXTOP(pc, cccccc); + break; + /* instructions type clll */ + case _if_not_then: + pc = NEXTOP(pc, clll); + break; + /* instructions type d */ + case _write_float: + pc = NEXTOP(pc, d); + break; + /* instructions type e */ + case _Nstop: + return NULL; + case _copy_idb_term: + return found_idb_clause(pc, startp, endp); + case _expand_index: + return found_expand(pc, startp, endp PASS_REGS); + case _index_pred: + return found_owner_op(pc, startp, endp PASS_REGS); + case _lock_pred: + return found_owner_op(pc, startp, endp PASS_REGS); + case _op_fail: + if (codeptr == FAILCODE) + return found_fail(pc, startp, endp PASS_REGS); + pc = NEXTOP(pc, e); + break; + case _spy_pred: + return found_owner_op(pc, startp, endp PASS_REGS); + case _trust_fail: + if (codeptr == TRUSTFAILCODE) + return found_fail(pc, startp, endp PASS_REGS); + pc = NEXTOP(pc, e); + break; + case _undef_p: + return found_owner_op(pc, startp, endp PASS_REGS); + case _unify_idb_term: + return found_idb_clause(pc, startp, endp); + case _allocate: + case _enter_exo: + case _index_blob: + case _index_dbref: + case _index_long: + case _p_equal: + case _p_functor: + case _pop: #ifdef BEAM - case _retry_eam: + case _retry_eam: #endif #ifdef THREADS - case _thread_local: + case _thread_local: #endif - case _unlock_lu: - case _write_l_list: - case _write_list: - case _write_void: - pc = NEXTOP(pc,e); - break; - /* instructions type fa */ - case _write_l_struc: - case _write_struct: - pc = NEXTOP(pc,fa); - break; - /* instructions type i */ - case _write_longint: - pc = NEXTOP(pc,i); - break; - /* instructions type l */ - case _Ystop: - return found_ystop(pc, clause_code, startp, endp, pp PASS_REGS); - case _jump: - case _jump_if_var: - case _move_back: + case _unlock_lu: + case _write_l_list: + case _write_list: + case _write_void: + pc = NEXTOP(pc, e); + break; + /* instructions type fa */ + case _write_l_struc: + case _write_struct: + pc = NEXTOP(pc, fa); + break; + /* instructions type i */ + case _write_longint: + pc = NEXTOP(pc, i); + break; + /* instructions type l */ + case _Ystop: + return found_ystop(pc, clause_code, startp, endp, pp PASS_REGS); + case _jump: + case _jump_if_var: + case _move_back: #if INLINE_BIG_COMPARISONS - case _p_dif: - case _p_eq: + case _p_dif: + case _p_eq: #endif - case _retry2: - case _retry3: - case _retry4: - case _skip: - case _try_clause2: - case _try_clause3: - case _try_clause4: - case _try_in: - pc = NEXTOP(pc,l); - break; - /* instructions type llll */ - case _switch_on_type: - pc = NEXTOP(pc,llll); - break; - /* instructions type lp */ - case _retry_all_exo: - case _retry_exo: - case _retry_exo_udi: - case _try_all_exo: - case _try_exo: - case _try_exo_udi: - case _user_switch: - pc = NEXTOP(pc,lp); - break; - /* instructions type o */ - case _unify_l_list: - case _unify_l_list_write: - case _unify_l_void: - case _unify_l_void_write: - case _unify_list: - case _unify_list_write: - case _unify_void: - case _unify_void_write: - pc = NEXTOP(pc,o); - break; - /* instructions type oD */ - case _unify_dbterm: - case _unify_l_dbterm: - pc = NEXTOP(pc,oD); - break; - /* instructions type oN */ - case _unify_bigint: - case _unify_l_bigint: - pc = NEXTOP(pc,oN); - break; - /* instructions type oc */ - case _unify_atom: - case _unify_atom_write: - case _unify_l_atom: - case _unify_l_atom_write: - pc = NEXTOP(pc,oc); - break; - /* instructions type od */ - case _unify_float: - case _unify_float_write: - case _unify_l_float: - case _unify_l_float_write: - pc = NEXTOP(pc,od); - break; - /* instructions type ofa */ - case _unify_l_struc: - case _unify_l_struc_write: - case _unify_struct: - case _unify_struct_write: - pc = NEXTOP(pc,ofa); - break; - /* instructions type oi */ - case _unify_l_longint: - case _unify_l_longint_write: - case _unify_longint: - case _unify_longint_write: - pc = NEXTOP(pc,oi); - break; - /* instructions type ollll */ - case _switch_list_nl: - pc = NEXTOP(pc,ollll); - break; - /* instructions type os */ + case _retry2: + case _retry3: + case _retry4: + case _skip: + case _try_clause2: + case _try_clause3: + case _try_clause4: + case _try_in: + pc = NEXTOP(pc, l); + break; + /* instructions type llll */ + case _switch_on_type: + pc = NEXTOP(pc, llll); + break; + /* instructions type lp */ + case _retry_all_exo: + case _retry_exo: + case _retry_exo_udi: + case _try_all_exo: + case _try_exo: + case _try_exo_udi: + case _user_switch: + pc = NEXTOP(pc, lp); + break; + /* instructions type o */ + case _unify_l_list: + case _unify_l_list_write: + case _unify_l_void: + case _unify_l_void_write: + case _unify_list: + case _unify_list_write: + case _unify_void: + case _unify_void_write: + pc = NEXTOP(pc, o); + break; + /* instructions type oD */ + case _unify_dbterm: + case _unify_l_dbterm: + pc = NEXTOP(pc, oD); + break; + /* instructions type oN */ + case _unify_bigint: + case _unify_l_bigint: + pc = NEXTOP(pc, oN); + break; + /* instructions type oc */ + case _unify_atom: + case _unify_atom_write: + case _unify_l_atom: + case _unify_l_atom_write: + pc = NEXTOP(pc, oc); + break; + /* instructions type od */ + case _unify_float: + case _unify_float_write: + case _unify_l_float: + case _unify_l_float_write: + pc = NEXTOP(pc, od); + break; + /* instructions type ofa */ + case _unify_l_struc: + case _unify_l_struc_write: + case _unify_struct: + case _unify_struct_write: + pc = NEXTOP(pc, ofa); + break; + /* instructions type oi */ + case _unify_l_longint: + case _unify_l_longint_write: + case _unify_longint: + case _unify_longint_write: + pc = NEXTOP(pc, oi); + break; + /* instructions type ollll */ + case _switch_list_nl: + pc = NEXTOP(pc, ollll); + break; +/* instructions type os */ #ifdef BEAM - case _run_eam: + case _run_eam: #endif - case _unify_l_n_voids: - case _unify_l_n_voids_write: - case _unify_n_voids: - case _unify_n_voids_write: - pc = NEXTOP(pc,os); - break; - /* instructions type osc */ - case _unify_n_atoms: - case _unify_n_atoms_write: - pc = NEXTOP(pc,osc); - break; - /* instructions type ou */ - case _unify_l_string: - case _unify_string: - pc = NEXTOP(pc,ou); - break; - /* instructions type ox */ - case _save_appl_x: - case _save_appl_x_write: - case _save_pair_x: - case _save_pair_x_write: - case _unify_l_x_loc: - case _unify_l_x_loc_write: - case _unify_l_x_val: - case _unify_l_x_val_write: - case _unify_l_x_var: - case _unify_l_x_var_write: - case _unify_x_loc: - case _unify_x_loc_write: - case _unify_x_val: - case _unify_x_val_write: - case _unify_x_var: - case _unify_x_var_write: - pc = NEXTOP(pc,ox); - break; - /* instructions type oxx */ - case _unify_l_x_var2: - case _unify_l_x_var2_write: - case _unify_x_var2: - case _unify_x_var2_write: - pc = NEXTOP(pc,oxx); - break; - /* instructions type oy */ - case _save_appl_y: - case _save_appl_y_write: - case _save_pair_y: - case _save_pair_y_write: - case _unify_l_y_loc: - case _unify_l_y_loc_write: - case _unify_l_y_val: - case _unify_l_y_val_write: - case _unify_l_y_var: - case _unify_l_y_var_write: - case _unify_y_loc: - case _unify_y_loc_write: - case _unify_y_val: - case _unify_y_val_write: - case _unify_y_var: - case _unify_y_var_write: - pc = NEXTOP(pc,oy); - break; - /* instructions type p */ - case _lock_lu: - case _procceed: - pp = pc->y_u.p.p; - if (pp->PredFlags & MegaClausePredFlag) - return found_mega_clause(pp, startp, endp); - clause_code = TRUE; - pc = NEXTOP(pc,p); - break; - case _count_call: - case _count_retry: - case _deallocate: - case _enter_profiling: - case _retry_profiled: - case _retry_udi: - case _try_udi: - pc = NEXTOP(pc,p); - break; - /* instructions type plxxs */ - case _call_bfunc_xx: - pc = NEXTOP(pc,plxxs); - break; - /* instructions type plxys */ - case _call_bfunc_xy: - case _call_bfunc_yx: - pc = NEXTOP(pc,plxys); - break; - /* instructions type plyys */ - case _call_bfunc_yy: - pc = NEXTOP(pc,plyys); - break; - /* instructions type pp */ - case _execute_cpred: - pp = pc->y_u.pp.p; - return walk_found_c_pred(pp, startp, endp); - case _dexecute: - case _execute: - clause_code = TRUE; - pp = pc->y_u.pp.p0; - pc = NEXTOP(pc,pp); - break; - /* instructions type s */ - case _cut: - case _cut_e: - case _cut_t: - case _pop_n: - case _write_n_voids: - pc = NEXTOP(pc,s); - break; - /* instructions type sc */ - case _write_n_atoms: - pc = NEXTOP(pc,sc); - break; - /* instructions type sllll */ - case _switch_on_sub_arg_type: - pc = NEXTOP(pc,sllll); - break; - /* instructions type slpp */ - case _call_c_wfail: - pp = pc->y_u.slpp.p; - return walk_found_c_pred(pp, startp, endp); - /* instructions type sssl */ - case _go_on_cons: - case _go_on_func: - case _if_cons: - case _if_func: - case _switch_on_cons: - case _switch_on_func: - pc = NEXTOP(pc,sssl); - break; - /* instructions type sssllp */ - case _expand_clauses: - return found_expand_index(pc, startp, endp, codeptr PASS_REGS); - pc = NEXTOP(pc,sssllp); - break; - /* instructions type x */ - case _get_atom_exo: - case _get_list: - case _put_list: - case _save_b_x: - case _write_x_loc: - case _write_x_val: - case _write_x_var: - pc = NEXTOP(pc,x); - break; - /* instructions type xD */ - case _get_dbterm: - case _put_dbterm: - pc = NEXTOP(pc,xD); - break; - /* instructions type xN */ - case _get_bigint: - case _put_bigint: - pc = NEXTOP(pc,xN); - break; - /* instructions type xc */ - case _get_atom: - case _put_atom: - pc = NEXTOP(pc,xc); - break; - /* instructions type xd */ - case _get_float: - case _put_float: - pc = NEXTOP(pc,xd); - break; - /* instructions type xfa */ - case _get_struct: - case _put_struct: - pc = NEXTOP(pc,xfa); - break; - /* instructions type xi */ - case _get_longint: - case _put_longint: - pc = NEXTOP(pc,xi); - break; - /* instructions type xl */ - case _p_atom_x: - case _p_atomic_x: - case _p_compound_x: - case _p_db_ref_x: - case _p_float_x: - case _p_integer_x: - case _p_nonvar_x: - case _p_number_x: - case _p_primitive_x: - case _p_var_x: - pc = NEXTOP(pc,xl); - break; - /* instructions type xll */ - case _jump_if_nonvar: - pc = NEXTOP(pc,xll); - break; - /* instructions type xllll */ - case _switch_on_arg_type: - pc = NEXTOP(pc,xllll); - break; - /* instructions type xps */ - case _commit_b_x: - pc = NEXTOP(pc,xps); - break; - /* instructions type xu */ - case _get_string: - pc = NEXTOP(pc,xu); - break; - /* instructions type xx */ - case _get_x_val: - case _get_x_var: - case _gl_void_valx: - case _gl_void_varx: - case _glist_valx: - case _put_x_val: - case _put_x_var: - pc = NEXTOP(pc,xx); - break; - /* instructions type xxc */ - case _p_func2s_cv: - pc = NEXTOP(pc,xxc); - break; - /* instructions type xxn */ - case _p_and_vc: - case _p_arg_cv: - case _p_div_cv: - case _p_div_vc: - case _p_func2s_vc: - case _p_minus_cv: - case _p_or_vc: - case _p_plus_vc: - case _p_sll_cv: - case _p_sll_vc: - case _p_slr_cv: - case _p_slr_vc: - case _p_times_vc: - pc = NEXTOP(pc,xxn); - break; - /* instructions type xxx */ - case _p_and_vv: - case _p_arg_vv: - case _p_div_vv: - case _p_func2f_xx: - case _p_func2s_vv: - case _p_minus_vv: - case _p_or_vv: - case _p_plus_vv: - case _p_sll_vv: - case _p_slr_vv: - case _p_times_vv: - pc = NEXTOP(pc,xxx); - break; - /* instructions type xxxx */ - case _put_xx_val: - pc = NEXTOP(pc,xxxx); - break; - /* instructions type xxy */ - case _p_func2f_xy: - pc = NEXTOP(pc,xxy); - break; - /* instructions type y */ - case _save_b_y: - case _write_y_loc: - case _write_y_val: - case _write_y_var: - pc = NEXTOP(pc,y); - break; - /* instructions type yl */ - case _p_atom_y: - case _p_atomic_y: - case _p_compound_y: - case _p_db_ref_y: - case _p_float_y: - case _p_integer_y: - case _p_nonvar_y: - case _p_number_y: - case _p_primitive_y: - case _p_var_y: - pc = NEXTOP(pc,yl); - break; - /* instructions type yps */ - case _commit_b_y: - pc = NEXTOP(pc,yps); - break; - /* instructions type yx */ - case _get_y_val: - case _get_y_var: - case _gl_void_valy: - case _gl_void_vary: - case _glist_valy: - case _put_unsafe: - case _put_y_val: - case _put_y_var: - pc = NEXTOP(pc,yx); - break; - /* instructions type yxc */ - case _p_func2s_y_cv: - pc = NEXTOP(pc,yxc); - break; - /* instructions type yxn */ - case _p_and_y_vc: - case _p_arg_y_cv: - case _p_div_y_cv: - case _p_div_y_vc: - case _p_func2s_y_vc: - case _p_minus_y_cv: - case _p_or_y_vc: - case _p_plus_y_vc: - case _p_sll_y_cv: - case _p_sll_y_vc: - case _p_slr_y_cv: - case _p_slr_y_vc: - case _p_times_y_vc: - pc = NEXTOP(pc,yxn); - break; - /* instructions type yxx */ - case _p_and_y_vv: - case _p_arg_y_vv: - case _p_div_y_vv: - case _p_func2f_yx: - case _p_func2s_y_vv: - case _p_minus_y_vv: - case _p_or_y_vv: - case _p_plus_y_vv: - case _p_sll_y_vv: - case _p_slr_y_vv: - case _p_times_y_vv: - pc = NEXTOP(pc,yxx); - break; - /* instructions type yyx */ - case _p_func2f_yy: - pc = NEXTOP(pc,yyx); - break; - /* instructions type yyxx */ - case _get_yy_var: - case _put_y_vals: - pc = NEXTOP(pc,yyxx); - break; + case _unify_l_n_voids: + case _unify_l_n_voids_write: + case _unify_n_voids: + case _unify_n_voids_write: + pc = NEXTOP(pc, os); + break; + /* instructions type osc */ + case _unify_n_atoms: + case _unify_n_atoms_write: + pc = NEXTOP(pc, osc); + break; + /* instructions type ou */ + case _unify_l_string: + case _unify_string: + pc = NEXTOP(pc, ou); + break; + /* instructions type ox */ + case _save_appl_x: + case _save_appl_x_write: + case _save_pair_x: + case _save_pair_x_write: + case _unify_l_x_loc: + case _unify_l_x_loc_write: + case _unify_l_x_val: + case _unify_l_x_val_write: + case _unify_l_x_var: + case _unify_l_x_var_write: + case _unify_x_loc: + case _unify_x_loc_write: + case _unify_x_val: + case _unify_x_val_write: + case _unify_x_var: + case _unify_x_var_write: + pc = NEXTOP(pc, ox); + break; + /* instructions type oxx */ + case _unify_l_x_var2: + case _unify_l_x_var2_write: + case _unify_x_var2: + case _unify_x_var2_write: + pc = NEXTOP(pc, oxx); + break; + /* instructions type oy */ + case _save_appl_y: + case _save_appl_y_write: + case _save_pair_y: + case _save_pair_y_write: + case _unify_l_y_loc: + case _unify_l_y_loc_write: + case _unify_l_y_val: + case _unify_l_y_val_write: + case _unify_l_y_var: + case _unify_l_y_var_write: + case _unify_y_loc: + case _unify_y_loc_write: + case _unify_y_val: + case _unify_y_val_write: + case _unify_y_var: + case _unify_y_var_write: + pc = NEXTOP(pc, oy); + break; + /* instructions type p */ + case _lock_lu: + case _procceed: + pp = pc->y_u.p.p; + if (pp->PredFlags & MegaClausePredFlag) + return found_mega_clause(pp, startp, endp); + clause_code = TRUE; + pc = NEXTOP(pc, p); + break; + case _count_call: + case _count_retry: + case _deallocate: + case _enter_profiling: + case _retry_profiled: + case _retry_udi: + case _try_udi: + pc = NEXTOP(pc, p); + break; + /* instructions type plxxs */ + case _call_bfunc_xx: + pc = NEXTOP(pc, plxxs); + break; + /* instructions type plxys */ + case _call_bfunc_xy: + case _call_bfunc_yx: + pc = NEXTOP(pc, plxys); + break; + /* instructions type plyys */ + case _call_bfunc_yy: + pc = NEXTOP(pc, plyys); + break; + /* instructions type pp */ + case _execute_cpred: + pp = pc->y_u.pp.p; + return walk_found_c_pred(pp, startp, endp); + case _dexecute: + case _execute: + clause_code = TRUE; + pp = pc->y_u.pp.p0; + pc = NEXTOP(pc, pp); + break; + /* instructions type s */ + case _cut: + case _cut_e: + case _cut_t: + case _pop_n: + case _write_n_voids: + pc = NEXTOP(pc, s); + break; + /* instructions type sc */ + case _write_n_atoms: + pc = NEXTOP(pc, sc); + break; + /* instructions type sllll */ + case _switch_on_sub_arg_type: + pc = NEXTOP(pc, sllll); + break; + /* instructions type slpp */ + case _call_c_wfail: + pp = pc->y_u.slpp.p; + return walk_found_c_pred(pp, startp, endp); + /* instructions type sssl */ + case _go_on_cons: + case _go_on_func: + case _if_cons: + case _if_func: + case _switch_on_cons: + case _switch_on_func: + pc = NEXTOP(pc, sssl); + break; + /* instructions type sssllp */ + case _expand_clauses: + return found_expand_index(pc, startp, endp, codeptr PASS_REGS); + pc = NEXTOP(pc, sssllp); + break; + /* instructions type x */ + case _get_atom_exo: + case _get_list: + case _put_list: + case _save_b_x: + case _write_x_loc: + case _write_x_val: + case _write_x_var: + pc = NEXTOP(pc, x); + break; + /* instructions type xD */ + case _get_dbterm: + case _put_dbterm: + pc = NEXTOP(pc, xD); + break; + /* instructions type xN */ + case _get_bigint: + case _put_bigint: + pc = NEXTOP(pc, xN); + break; + /* instructions type xc */ + case _get_atom: + case _put_atom: + pc = NEXTOP(pc, xc); + break; + /* instructions type xd */ + case _get_float: + case _put_float: + pc = NEXTOP(pc, xd); + break; + /* instructions type xfa */ + case _get_struct: + case _put_struct: + pc = NEXTOP(pc, xfa); + break; + /* instructions type xi */ + case _get_longint: + case _put_longint: + pc = NEXTOP(pc, xi); + break; + /* instructions type xl */ + case _p_atom_x: + case _p_atomic_x: + case _p_compound_x: + case _p_db_ref_x: + case _p_float_x: + case _p_integer_x: + case _p_nonvar_x: + case _p_number_x: + case _p_primitive_x: + case _p_var_x: + pc = NEXTOP(pc, xl); + break; + /* instructions type xll */ + case _jump_if_nonvar: + pc = NEXTOP(pc, xll); + break; + /* instructions type xllll */ + case _switch_on_arg_type: + pc = NEXTOP(pc, xllll); + break; + /* instructions type xps */ + case _commit_b_x: + pc = NEXTOP(pc, xps); + break; + /* instructions type xu */ + case _get_string: + pc = NEXTOP(pc, xu); + break; + /* instructions type xx */ + case _get_x_val: + case _get_x_var: + case _gl_void_valx: + case _gl_void_varx: + case _glist_valx: + case _put_x_val: + case _put_x_var: + pc = NEXTOP(pc, xx); + break; + /* instructions type xxc */ + case _p_func2s_cv: + pc = NEXTOP(pc, xxc); + break; + /* instructions type xxn */ + case _p_and_vc: + case _p_arg_cv: + case _p_div_cv: + case _p_div_vc: + case _p_func2s_vc: + case _p_minus_cv: + case _p_or_vc: + case _p_plus_vc: + case _p_sll_cv: + case _p_sll_vc: + case _p_slr_cv: + case _p_slr_vc: + case _p_times_vc: + pc = NEXTOP(pc, xxn); + break; + /* instructions type xxx */ + case _p_and_vv: + case _p_arg_vv: + case _p_div_vv: + case _p_func2f_xx: + case _p_func2s_vv: + case _p_minus_vv: + case _p_or_vv: + case _p_plus_vv: + case _p_sll_vv: + case _p_slr_vv: + case _p_times_vv: + pc = NEXTOP(pc, xxx); + break; + /* instructions type xxxx */ + case _put_xx_val: + pc = NEXTOP(pc, xxxx); + break; + /* instructions type xxy */ + case _p_func2f_xy: + pc = NEXTOP(pc, xxy); + break; + /* instructions type y */ + case _save_b_y: + case _write_y_loc: + case _write_y_val: + case _write_y_var: + pc = NEXTOP(pc, y); + break; + /* instructions type yl */ + case _p_atom_y: + case _p_atomic_y: + case _p_compound_y: + case _p_db_ref_y: + case _p_float_y: + case _p_integer_y: + case _p_nonvar_y: + case _p_number_y: + case _p_primitive_y: + case _p_var_y: + pc = NEXTOP(pc, yl); + break; + /* instructions type yps */ + case _commit_b_y: + pc = NEXTOP(pc, yps); + break; + /* instructions type yx */ + case _get_y_val: + case _get_y_var: + case _gl_void_valy: + case _gl_void_vary: + case _glist_valy: + case _put_unsafe: + case _put_y_val: + case _put_y_var: + pc = NEXTOP(pc, yx); + break; + /* instructions type yxc */ + case _p_func2s_y_cv: + pc = NEXTOP(pc, yxc); + break; + /* instructions type yxn */ + case _p_and_y_vc: + case _p_arg_y_cv: + case _p_div_y_cv: + case _p_div_y_vc: + case _p_func2s_y_vc: + case _p_minus_y_cv: + case _p_or_y_vc: + case _p_plus_y_vc: + case _p_sll_y_cv: + case _p_sll_y_vc: + case _p_slr_y_cv: + case _p_slr_y_vc: + case _p_times_y_vc: + pc = NEXTOP(pc, yxn); + break; + /* instructions type yxx */ + case _p_and_y_vv: + case _p_arg_y_vv: + case _p_div_y_vv: + case _p_func2f_yx: + case _p_func2s_y_vv: + case _p_minus_y_vv: + case _p_or_y_vv: + case _p_plus_y_vv: + case _p_sll_y_vv: + case _p_slr_y_vv: + case _p_times_y_vv: + pc = NEXTOP(pc, yxx); + break; + /* instructions type yyx */ + case _p_func2f_yy: + pc = NEXTOP(pc, yyx); + break; + /* instructions type yyxx */ + case _get_yy_var: + case _put_y_vals: + pc = NEXTOP(pc, yyxx); + break; #ifdef YAPOR - /* instructions type Otapl */ - case _getwork: - case _getwork_seq: - case _sync: - clause_code = FALSE; - pp = pc->y_u.Otapl.p; - pc = NEXTOP(pc,Otapl); - break; - /* instructions type e */ - case _getwork_first_time: - pc = NEXTOP(pc,e); - break; + /* instructions type Otapl */ + case _getwork: + case _getwork_seq: + case _sync: + clause_code = FALSE; + pp = pc->y_u.Otapl.p; + pc = NEXTOP(pc, Otapl); + break; + /* instructions type e */ + case _getwork_first_time: + pc = NEXTOP(pc, e); + break; #endif #ifdef TABLING - /* instructions type Otapl */ - case _table_answer_resolution: + /* instructions type Otapl */ + case _table_answer_resolution: #ifdef THREADS_CONSUMER_SHARING - case _table_answer_resolution_completion: + case _table_answer_resolution_completion: #endif - case _table_completion: - case _table_load_answer: - case _table_retry: - case _table_retry_me: - case _table_trust: - case _table_trust_me: - case _table_try: - case _table_try_answer: - case _table_try_me: - case _table_try_single: - clause_code = FALSE; - pp = pc->y_u.Otapl.p; - pc = NEXTOP(pc,Otapl); - break; - /* instructions type e */ + case _table_completion: + case _table_load_answer: + case _table_retry: + case _table_retry_me: + case _table_trust: + case _table_trust_me: + case _table_try: + case _table_try_answer: + case _table_try_me: + case _table_try_single: + clause_code = FALSE; + pp = pc->y_u.Otapl.p; + pc = NEXTOP(pc, Otapl); + break; +/* instructions type e */ #ifdef TABLING_INNER_CUTS - case _clause_with_cut: + case _clause_with_cut: #endif - pc = NEXTOP(pc,e); - break; - /* instructions type s */ - case _table_new_answer: - pc = NEXTOP(pc,s); - break; - /* instructions type e */ - case _trie_do_appl: - case _trie_do_appl_in_pair: - case _trie_do_atom: - case _trie_do_atom_in_pair: - case _trie_do_bigint: - case _trie_do_double: - case _trie_do_extension: - case _trie_do_gterm: - case _trie_do_longint: - case _trie_do_null: - case _trie_do_null_in_pair: - case _trie_do_pair: - case _trie_do_val: - case _trie_do_val_in_pair: - case _trie_do_var: - case _trie_do_var_in_pair: - case _trie_retry_appl: - case _trie_retry_appl_in_pair: - case _trie_retry_atom: - case _trie_retry_atom_in_pair: - case _trie_retry_bigint: - case _trie_retry_double: - case _trie_retry_extension: - case _trie_retry_gterm: - case _trie_retry_longint: - case _trie_retry_null: - case _trie_retry_null_in_pair: - case _trie_retry_pair: - case _trie_retry_val: - case _trie_retry_val_in_pair: - case _trie_retry_var: - case _trie_retry_var_in_pair: - case _trie_trust_appl: - case _trie_trust_appl_in_pair: - case _trie_trust_atom: - case _trie_trust_atom_in_pair: - case _trie_trust_bigint: - case _trie_trust_double: - case _trie_trust_extension: - case _trie_trust_gterm: - case _trie_trust_longint: - case _trie_trust_null: - case _trie_trust_null_in_pair: - case _trie_trust_pair: - case _trie_trust_val: - case _trie_trust_val_in_pair: - case _trie_trust_var: - case _trie_trust_var_in_pair: - case _trie_try_appl: - case _trie_try_appl_in_pair: - case _trie_try_atom: - case _trie_try_atom_in_pair: - case _trie_try_bigint: - case _trie_try_double: - case _trie_try_extension: - case _trie_try_gterm: - case _trie_try_longint: - case _trie_try_null: - case _trie_try_null_in_pair: - case _trie_try_pair: - case _trie_try_val: - case _trie_try_val_in_pair: - case _trie_try_var: - case _trie_try_var_in_pair: - pc = NEXTOP(pc,e); - break; + pc = NEXTOP(pc, e); + break; + /* instructions type s */ + case _table_new_answer: + pc = NEXTOP(pc, s); + break; + /* instructions type e */ + case _trie_do_appl: + case _trie_do_appl_in_pair: + case _trie_do_atom: + case _trie_do_atom_in_pair: + case _trie_do_bigint: + case _trie_do_double: + case _trie_do_extension: + case _trie_do_gterm: + case _trie_do_longint: + case _trie_do_null: + case _trie_do_null_in_pair: + case _trie_do_pair: + case _trie_do_val: + case _trie_do_val_in_pair: + case _trie_do_var: + case _trie_do_var_in_pair: + case _trie_retry_appl: + case _trie_retry_appl_in_pair: + case _trie_retry_atom: + case _trie_retry_atom_in_pair: + case _trie_retry_bigint: + case _trie_retry_double: + case _trie_retry_extension: + case _trie_retry_gterm: + case _trie_retry_longint: + case _trie_retry_null: + case _trie_retry_null_in_pair: + case _trie_retry_pair: + case _trie_retry_val: + case _trie_retry_val_in_pair: + case _trie_retry_var: + case _trie_retry_var_in_pair: + case _trie_trust_appl: + case _trie_trust_appl_in_pair: + case _trie_trust_atom: + case _trie_trust_atom_in_pair: + case _trie_trust_bigint: + case _trie_trust_double: + case _trie_trust_extension: + case _trie_trust_gterm: + case _trie_trust_longint: + case _trie_trust_null: + case _trie_trust_null_in_pair: + case _trie_trust_pair: + case _trie_trust_val: + case _trie_trust_val_in_pair: + case _trie_trust_var: + case _trie_trust_var_in_pair: + case _trie_try_appl: + case _trie_try_appl_in_pair: + case _trie_try_atom: + case _trie_try_atom_in_pair: + case _trie_try_bigint: + case _trie_try_double: + case _trie_try_extension: + case _trie_try_gterm: + case _trie_try_longint: + case _trie_try_null: + case _trie_try_null_in_pair: + case _trie_try_pair: + case _trie_try_val: + case _trie_try_val_in_pair: + case _trie_try_var: + case _trie_try_var_in_pair: + pc = NEXTOP(pc, e); + break; #endif - /* this instruction is hardwired */ - case _or_last: + /* this instruction is hardwired */ + case _or_last: #ifdef YAPOR - pp = pc->y_u.Osblp.p0; - if (pp->PredFlags & MegaClausePredFlag) - return found_mega_clause(pp, startp, endp); - clause_code = TRUE; - pc = NEXTOP(pc,Osblp); + pp = pc->y_u.Osblp.p0; + if (pp->PredFlags & MegaClausePredFlag) + return found_mega_clause(pp, startp, endp); + clause_code = TRUE; + pc = NEXTOP(pc, Osblp); #else - pp = pc->y_u.p.p; - if (pp->PredFlags & MegaClausePredFlag) - return found_mega_clause(pp, startp, endp); - clause_code = TRUE; - pc = NEXTOP(pc,p); + pp = pc->y_u.p.p; + if (pp->PredFlags & MegaClausePredFlag) + return found_mega_clause(pp, startp, endp); + clause_code = TRUE; + pc = NEXTOP(pc, p); #endif - } } +} diff --git a/OPTYap/opt.preds.c b/OPTYap/opt.preds.c index c21652ec4..77d4182e8 100644 --- a/OPTYap/opt.preds.c +++ b/OPTYap/opt.preds.c @@ -120,7 +120,7 @@ struct page_statistics { #ifdef USE_PAGES_MALLOC long pages_in_use; /* same as struct pages (opt.structs.h) */ #endif /* USE_PAGES_MALLOC */ - long structs_in_use; /* same as struct pages (opt.structs.h) */ + size_t structs_in_use; /* same as struct pages (opt.structs.h) */ long bytes_in_use; }; diff --git a/OPTYap/opt.structs.h b/OPTYap/opt.structs.h index 566aa4907..e5b8684fd 100644 --- a/OPTYap/opt.structs.h +++ b/OPTYap/opt.structs.h @@ -95,7 +95,7 @@ struct threads_dependency_frame { #ifdef USE_PAGES_MALLOC typedef struct page_header { - volatile int structs_in_use; + volatile size_t structs_in_use; void *allocated_area; void *first_free_struct; struct page_header *previous; @@ -125,7 +125,7 @@ struct global_page_entry { int structs_per_page; volatile long pages_in_use; #endif /* USE_PAGES_MALLOC */ - volatile long structs_in_use; + volatile size_t structs_in_use; }; struct local_page_entry { @@ -133,9 +133,10 @@ struct local_page_entry { struct page_header *first_page; struct page_header *last_page; int structs_per_page; - long pages_in_use; + + size_t pages_in_use; #endif /* USE_PAGES_MALLOC */ - long structs_in_use; + size_t structs_in_use; }; #define PgEnt_lock(X) ((X).lock) diff --git a/Packages.cmake b/Packages.cmake index 97b5c7ce8..92f84b166 100644 --- a/Packages.cmake +++ b/Packages.cmake @@ -38,7 +38,10 @@ ENDIF(WITH_CPLINT) #must be last +OPTION (WITH_SWIG " Enable SWIG interfaces to foreign languages" ON) +IF (WITH_SWIG) add_subDIRECTORY (packages/swig) +ENDIF (WITH_SWIG) # please install doxygen for prolog first @@ -50,11 +53,17 @@ add_subDIRECTORY (packages/swig) option (WITH_DOCS "generate YAP docs" OFF) - # add_subDIRECTORY (docs) + IF (WITH_DOCS) + add_subDIRECTORY (docs) + ENDIF (WITH_DOCS) # add_subDIRECTORY (packages/cuda) +option (WITH_GECODE +"interface gecode constraint solver" ON) +if (WITH_GECODE) add_subDIRECTORY (packages/gecode) +endif() add_subDIRECTORY (packages/real) @@ -68,6 +77,8 @@ add_subDIRECTORY (packages/ProbLog) add_subDIRECTORY (packages/swi-minisat2) +add_subDIRECTORY (packages/clpqr) + #todo: use cmake target builds # option (USE_MAXPERFORMANCE diff --git a/Prelims.cmake b/Prelims.cmake index f7c9de1db..ccc7ca5ad 100644 --- a/Prelims.cmake +++ b/Prelims.cmake @@ -105,20 +105,6 @@ else() endif() -#cross-compilation support -# Search packages for host system instead of packages for target system -# in case of cross compilation these macro should be defined by toolchain file -if(NOT COMMAND find_host_package) - macro(find_host_package) - find_package(${ARGN}) - endmacro() -endif() -if(NOT COMMAND find_host_program) - macro(find_host_program) - find_program(${ARGN}) - endmacro() -endif() - # where we have most scripts # set path to additional CMake modules @@ -141,22 +127,22 @@ if(POLICY CMP0043) endif(POLICY CMP0043) +if (ANDROID) + set ( prefix ${YAP_APP_DIR}/build ) + set ( datarootdir ${prefix}/assets ) +else() set ( prefix "${CMAKE_INSTALL_PREFIX}") + set ( datarootdir ${prefix}/share ) +endif() + set ( libpl ${datarootdir}/Yap) +set ( includedir "${prefix}/include") set ( exec_prefix "${prefix}") set ( libdir "${exec_prefix}/lib") set ( dlls "${exec_prefix}/lib/Yap") -set ( includedir "${prefix}/include") -set ( datarootdir "${prefix}/share") -if (ANDROID) - set ( libpl "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/../../../../../build/generated/assets/Yap") -else() - set ( libpl "${datarootdir}/Yap") - -endif() set ( datadir "${datarootdir}") set ( mandir "${datarootdir}/man") set ( bindir "${exec_prefix}/bin") -set ( docdir "${exec_prefix}/doc/Yap") +set ( docdir "${datarootdir}/doc/Yap") set(YAP_ROOTDIR ${prefix}) diff --git a/PrologCommons/PROLOGCOMMONS.md b/PrologCommons/PROLOGCOMMONS.md index a2d50cd9d..ecb96a348 100644 --- a/PrologCommons/PROLOGCOMMONS.md +++ b/PrologCommons/PROLOGCOMMONS.md @@ -1,4 +1,5 @@ - +Prolog Commons {#prolog_commons} +============= This directory should hold files from the Prolog Commons project. Please see diff --git a/README.md b/README.md index 610b8d187..756627999 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ ![The YAP Logo](docs/icons/yap_128x128x32.png) -README for YAP6 +User Manual for YAP6 (#main) ==================== -NOTE: this version of YAP is stil experimental, documentation may be out of date. +NOTE: this version of YAP is still experimental, documentation may be out of date. -## Introduction +## Introduction This document provides User information on version 6.3.4 of YAP (Yet Another Prolog). The YAP Prolog System is a @@ -94,22 +94,3 @@ DTAI group of KULeuven. + The [R](http://stoics.org.uk/~nicos/sware/packs/real/) interface package developed by Nicos Angelopoulos, Vítor Santos Costa, João Azevedo, Jan Wielemaker, and Rui Camacho. - - -Downloading YAP {#download} -============== - -The latest development version of Yap-6 is yap-6.3.4 and can be -obtained from the repositories - - - -and - - - -YAP-6.3.4 does not use modules. Please just use `git clone` to obtain the distribution. - -Most of these repositories are basically copies of the original -repositories at the SWI-Prolog site. YAP-6 will work either with or -without these packages. diff --git a/Untitled b/Untitled deleted file mode 100644 index 1b2556d6c..000000000 --- a/Untitled +++ /dev/null @@ -1,337 +0,0 @@ -Process: Python [88916] -Path: /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python -Identifier: Python -Version: 2.7.10 (2.7.10) -Code Type: X86-64 (Native) -Parent Process: Atom Helper [88821] -Responsible: Atom [88817] -User ID: 501 - -Date/Time: 2016-06-12 12:40:34.078 +0100 -OS Version: Mac OS X 10.11.5 (15F34) -Report Version: 11 -Anonymous UUID: B8085CAA-5C3C-7B89-D7A4-E30E7D5EAC9C - -Sleep/Wake UUID: ABD12798-599D-4E2A-8BAF-24F5ACC919E7 - -Time Awake Since Boot: 220000 seconds -Time Since Wake: 4000 seconds - -System Integrity Protection: enabled - -Crashed Thread: 0 Dispatch queue: com.apple.main-thread - -Exception Type: EXC_BAD_ACCESS (SIGSEGV) -Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000008 - -VM Regions Near 0x8: ---> - __TEXT 0000000105287000-0000000105288000 [ 4K] r-x/rwx SM=COW /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python - -Thread 0 Crashed:: Dispatch queue: com.apple.main-thread -0 org.python.python 0x000000010532ffce 0x10528f000 + 659406 -1 org.python.python 0x0000000105330481 PyGILState_Ensure + 55 -2 com.apple.LLDB.framework 0x0000000108b1e37a lldb_private::ScriptInterpreterPython::Locker::DoAcquireLock() + 28 -3 com.apple.LLDB.framework 0x0000000108b23a6b lldb_private::ScriptInterpreterPython::Clear() + 37 -4 com.apple.LLDB.framework 0x000000010885e510 lldb_private::Debugger::Clear() + 266 -5 com.apple.LLDB.framework 0x000000010885f8ec lldb_private::Debugger::~Debugger() + 28 -6 com.apple.LLDB.framework 0x000000010885fc0e lldb_private::Debugger::~Debugger() + 14 -7 libc++.1.dylib 0x00007fff91f31cb8 std::__1::__shared_weak_count::__release_shared() + 44 -8 com.apple.LLDB.framework 0x00000001068a06cf std::__1::__vector_base, std::__1::allocator > >::~__vector_base() + 49 -9 libsystem_c.dylib 0x00007fff9321246b __cxa_finalize_ranges + 345 -10 libsystem_c.dylib 0x00007fff9321276f exit + 55 -11 org.python.python 0x000000010533200c 0x10528f000 + 667660 -12 org.python.python 0x0000000105331c45 PyErr_PrintEx + 41 -13 org.python.python 0x0000000105331668 PyRun_SimpleFileExFlags + 750 -14 org.python.python 0x0000000105343011 Py_Main + 3137 -15 libdyld.dylib 0x00007fff8d16d5ad start + 1 - -Thread 1: -0 libsystem_kernel.dylib 0x00007fff9af6bf72 mach_msg_trap + 10 -1 libsystem_kernel.dylib 0x00007fff9af6b3b3 mach_msg + 55 -2 com.apple.CoreFoundation 0x00007fff95f861c4 __CFRunLoopServiceMachPort + 212 -3 com.apple.CoreFoundation 0x00007fff95f8568c __CFRunLoopRun + 1356 -4 com.apple.CoreFoundation 0x00007fff95f84ed8 CFRunLoopRunSpecific + 296 -5 com.apple.CoreFoundation 0x00007fff95fc69b1 CFRunLoopRun + 97 -6 com.apple.DebugSymbols 0x00007fff87a2c69a SpotlightQueryThread(void*) + 346 -7 libsystem_pthread.dylib 0x00007fff9490e99d _pthread_body + 131 -8 libsystem_pthread.dylib 0x00007fff9490e91a _pthread_start + 168 -9 libsystem_pthread.dylib 0x00007fff9490c351 thread_start + 13 - -Thread 2: -0 libsystem_kernel.dylib 0x00007fff9af725e2 __workq_kernreturn + 10 -1 libsystem_pthread.dylib 0x00007fff9490e578 _pthread_wqthread + 1283 -2 libsystem_pthread.dylib 0x00007fff9490c341 start_wqthread + 13 - -Thread 3: -0 libsystem_kernel.dylib 0x00007fff9af725e2 __workq_kernreturn + 10 -1 libsystem_pthread.dylib 0x00007fff9490e578 _pthread_wqthread + 1283 -2 libsystem_pthread.dylib 0x00007fff9490c341 start_wqthread + 13 - -Thread 4:: Dispatch queue: com.apple.libdispatch-manager -0 libsystem_kernel.dylib 0x00007fff9af72efa kevent_qos + 10 -1 libdispatch.dylib 0x00007fff87927165 _dispatch_mgr_invoke + 216 -2 libdispatch.dylib 0x00007fff87926dcd _dispatch_mgr_thread + 52 - -Thread 5: -0 libsystem_kernel.dylib 0x00007fff9af725e2 __workq_kernreturn + 10 -1 libsystem_pthread.dylib 0x00007fff9490e578 _pthread_wqthread + 1283 -2 libsystem_pthread.dylib 0x00007fff9490c341 start_wqthread + 13 - -Thread 6: -0 libsystem_kernel.dylib 0x00007fff9af725e2 __workq_kernreturn + 10 -1 libsystem_pthread.dylib 0x00007fff9490e578 _pthread_wqthread + 1283 -2 libsystem_pthread.dylib 0x00007fff9490c341 start_wqthread + 13 - -Thread 7: -0 libsystem_kernel.dylib 0x00007fff9af725e2 __workq_kernreturn + 10 -1 libsystem_pthread.dylib 0x00007fff9490e578 _pthread_wqthread + 1283 -2 libsystem_pthread.dylib 0x00007fff9490c341 start_wqthread + 13 - -Thread 0 crashed with X86 Thread State (64-bit): - rax: 0x0000000000000001 rbx: 0x00007fb1e266bdb0 rcx: 0x00000b0000000000 rdx: 0x00007fb1e2403388 - rdi: 0x00007fb1e2403368 rsi: 0x00000b0000000b00 rbp: 0x00007fff5a9785a0 rsp: 0x00007fff5a978580 - r8: 0x00000000fffffffc r9: 0x00007fb1e2403380 r10: 0x00000000ffffffff r11: 0xffffffff00000000 - r12: 0x0000000000000001 r13: 0x0000000000000000 r14: 0x0000000000000000 r15: 0x0000000000000001 - rip: 0x000000010532ffce rfl: 0x0000000000010206 cr2: 0x0000000000000008 - -Logical CPU: 6 -Error Code: 0x00000004 -Trap Number: 14 - - -Binary Images: - 0x105287000 - 0x105287fff org.python.python (2.7.10 - 2.7.10) <307E6E15-ECF7-3BB2-AF06-3E8D23DFDECA> /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python - 0x10528f000 - 0x105380ff7 org.python.python (2.7.10 - 2.7.10) <83AFAAA7-BDFA-354D-8A7A-8F40A30ACB91> /System/Library/Frameworks/Python.framework/Versions/2.7/Python - 0x105746000 - 0x105747fff _locale.so (94) <4394AC91-22AE-3D7D-85C4-792A4F35F3F2> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_locale.so - 0x10580c000 - 0x10580dff7 time.so (94) <94E8BF2A-7841-32AD-8722-6B2526999CA1> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/time.so - 0x105814000 - 0x105816fff select.so (94) <22170D1C-40EF-303A-8BB7-A48E783F9350> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/select.so - 0x10581d000 - 0x10581efff fcntl.so (94) <419069D5-A61F-3925-B320-EA7B9E38F44B> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/fcntl.so - 0x105823000 - 0x105826fff _struct.so (94) <0DCC6B47-A763-3AA6-82C5-B6A58073286B> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_struct.so - 0x10582d000 - 0x10582ffff binascii.so (94) <9044E1C3-221F-3B79-847A-C9C3D8FEA9FD> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/binascii.so - 0x105834000 - 0x105835fff cStringIO.so (94) /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/cStringIO.so - 0x10596c000 - 0x10596dfff libpanel.5.4.dylib (46) /usr/lib/libpanel.5.4.dylib - 0x1059a2000 - 0x1059b0fff _ctypes.so (94) <57C51BC5-542B-3E78-94AC-0AC3DDEAFE8F> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ctypes.so - 0x1059bd000 - 0x1059c1fff itertools.so (94) <889782F7-5414-3881-BAAB-83CACDFDF0C5> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/itertools.so - 0x1059cb000 - 0x1059cefff operator.so (94) /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/operator.so - 0x1059d5000 - 0x1059d6ff7 readline.so (94) <9761BEFB-EF61-3542-B6D7-D4EE20F4FCF2> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/readline.so - 0x1059dd000 - 0x1059dffff _collections.so (94) <5FEB3871-0B8F-3233-876C-0E81CF581963> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_collections.so - 0x1059e6000 - 0x1059e7fff _heapq.so (94) <9200023E-75BA-3F20-843C-398C3709CA88> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_heapq.so - 0x1059ed000 - 0x1059f4ff7 _socket.so (94) <0995C171-1F75-3087-89BE-EC0F68FB1231> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_socket.so - 0x1059ff000 - 0x105a00fff _functools.so (94) <49B479ED-A07D-322D-9A29-AFF4CA084219> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_functools.so - 0x105a05000 - 0x105a0efff _ssl.so (94) <027A0AA6-E941-32D2-A091-47C3A43DD846> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_ssl.so - 0x105a1a000 - 0x105a25fff cPickle.so (94) /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/cPickle.so - 0x105a2c000 - 0x105a3bfff _io.so (94) <39FEF2EC-8D20-33A6-B91F-EF7B2FAE9009> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so - 0x105a4c000 - 0x105a4fff7 math.so (94) <216DBA90-4498-361D-8321-B41F9A3B121C> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/math.so - 0x105a56000 - 0x105a57fff _hashlib.so (94) /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_hashlib.so - 0x105a5d000 - 0x105a5eff7 _random.so (94) <5A3C615E-01F8-37C2-A3F2-B1EDEB31C954> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_random.so - 0x105a63000 - 0x105a66ff7 strop.so (94) <44D8B4D6-D536-31EE-94EA-4F3C0FC773FA> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/strop.so - 0x105a6c000 - 0x105a6cfff _scproxy.so (94) <07D4037C-CB1A-3850-9C0A-A29446A772CE> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_scproxy.so - 0x105ab1000 - 0x105ab5fff _json.so (94) <8DF51919-72DB-335D-B4F5-D8B3B7A96A89> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_json.so - 0x105ac0000 - 0x105ac9ff7 datetime.so (94) <94EF278A-0BE1-3990-A13B-2A5F36F64263> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/datetime.so - 0x10687c000 - 0x10941cff7 com.apple.LLDB.framework (1.350.0.21.9 - 350.0.21.9) <7862FFB0-5204-36DE-A5FA-9BE017CC7E45> /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/A/LLDB - 0x7fff6497b000 - 0x7fff649b225f dyld (360.22) /usr/lib/dyld - 0x7fff87008000 - 0x7fff872a2ff3 com.apple.security (7.0 - 57337.50.23) <8B6CF71D-A63E-34C9-9227-0AACAB643584> /System/Library/Frameworks/Security.framework/Versions/A/Security - 0x7fff875a4000 - 0x7fff875a6ff7 com.apple.xpc.ServiceManagement (1.0 - 1) /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement - 0x7fff875d7000 - 0x7fff875dbfff libGIF.dylib (1450) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib - 0x7fff8767e000 - 0x7fff87686fff com.apple.CoreServices.FSEvents (1223.10.1 - 1223.10.1) <7F5B7A23-BC1D-3FA9-A9B8-D534F1E1979A> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents - 0x7fff87765000 - 0x7fff877a7ff7 com.apple.Metal (56.6 - 56.6) <2B2C0F78-20B8-3878-B9B1-DE18BB92919D> /System/Library/Frameworks/Metal.framework/Versions/A/Metal - 0x7fff877a8000 - 0x7fff8780eff7 libsystem_network.dylib (583.50.1) /usr/lib/system/libsystem_network.dylib - 0x7fff8780f000 - 0x7fff8791efe7 libvDSP.dylib (563.5) <9AB6CA3C-4F0E-35E6-9184-9DF86E7C3DAD> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib - 0x7fff8791f000 - 0x7fff8794cfff libdispatch.dylib (501.40.12) /usr/lib/system/libdispatch.dylib - 0x7fff87961000 - 0x7fff87964fff libCoreVMClient.dylib (119.5) <560D70FB-709F-3030-96C9-F249FCB7DA6D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib - 0x7fff87a2b000 - 0x7fff87a65ff7 com.apple.DebugSymbols (132 - 132) <23A42C53-B941-3871-9EE2-4C87A46005B5> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols - 0x7fff87a66000 - 0x7fff87a6fff7 com.apple.CommonAuth (4.0 - 2.0) <4B8673E1-3697-3FE2-8D30-AC7AC5D4F8BF> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth - 0x7fff87a9f000 - 0x7fff87abbff3 libresolv.9.dylib (60) /usr/lib/libresolv.9.dylib - 0x7fff87b6d000 - 0x7fff87c5fff7 libiconv.2.dylib (44) /usr/lib/libiconv.2.dylib - 0x7fff87c60000 - 0x7fff87c60fff com.apple.Accelerate.vecLib (3.10 - vecLib 3.10) <054DFE32-737D-3211-9A14-0FC5E1A880E3> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib - 0x7fff87dcf000 - 0x7fff87e76fff com.apple.LanguageModeling (1.0 - 1) <58C18A47-BDE7-3CBE-81C0-797029D170A1> /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling - 0x7fff87e77000 - 0x7fff87f27fe7 libvMisc.dylib (563.5) <6D73C20D-D1C4-3BA5-809B-4B597C15AA86> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib - 0x7fff87f5a000 - 0x7fff882aefff com.apple.Foundation (6.9 - 1259) <71A9D3A0-0B1F-3E3A-86F3-1486365A6EF2> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation - 0x7fff88488000 - 0x7fff88488fff com.apple.CoreServices (728.12 - 728.12) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices - 0x7fff884b9000 - 0x7fff8850afff com.apple.audio.CoreAudio (4.3.0 - 4.3.0) /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio - 0x7fff8874d000 - 0x7fff88755ffb libsystem_dnssd.dylib (625.50.5) <4D10E12B-59B5-386F-82DA-326F18028F0A> /usr/lib/system/libsystem_dnssd.dylib - 0x7fff88756000 - 0x7fff8876cff7 libLinearAlgebra.dylib (1162.2) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib - 0x7fff8876d000 - 0x7fff8879efff com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS - 0x7fff88c4f000 - 0x7fff88d3efff libxml2.2.dylib (29.7) <32BBF51E-B084-3FC2-AE9C-C008BE84102B> /usr/lib/libxml2.2.dylib - 0x7fff88ef9000 - 0x7fff88f01fff libcopyfile.dylib (127) /usr/lib/system/libcopyfile.dylib - 0x7fff88f71000 - 0x7fff88fa7fff libssl.0.9.8.dylib (59.40.2) <523FEBFA-4BF7-3A69-83B7-164265BE7F4D> /usr/lib/libssl.0.9.8.dylib - 0x7fff88fa8000 - 0x7fff88faaff7 libRadiance.dylib (1450) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib - 0x7fff893ee000 - 0x7fff89417ff7 libxslt.1.dylib (14.2) <6E8D0F06-9086-32D3-9D87-3870A1CE9E99> /usr/lib/libxslt.1.dylib - 0x7fff8949d000 - 0x7fff894b7ff3 liblzma.5.dylib (10) /usr/lib/liblzma.5.dylib - 0x7fff894b8000 - 0x7fff894dcfff libJPEG.dylib (1450) <1775E59E-D82C-3F7A-8E4F-B0C13F88F691> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib - 0x7fff894dd000 - 0x7fff894e0fff com.apple.IOSurface (108.2.1 - 108.2.1) /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface - 0x7fff89742000 - 0x7fff89747fff com.apple.TCC (1.0 - 1) /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC - 0x7fff89b44000 - 0x7fff89b46fff libsystem_coreservices.dylib (19.2) <1B3F5AFC-FFCD-3ECB-8B9A-5538366FB20D> /usr/lib/system/libsystem_coreservices.dylib - 0x7fff89bdd000 - 0x7fff89bddff7 libunc.dylib (29) /usr/lib/system/libunc.dylib - 0x7fff89bde000 - 0x7fff89c09ffb libarchive.2.dylib (33.20.2) <6C370A21-63FD-3A68-B4B3-5333F24B770B> /usr/lib/libarchive.2.dylib - 0x7fff8a0fc000 - 0x7fff8a16bfff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit - 0x7fff8a170000 - 0x7fff8a174fff libcache.dylib (75) <9548AAE9-2AB7-3525-9ECE-A2A7C4688447> /usr/lib/system/libcache.dylib - 0x7fff8a1e1000 - 0x7fff8a1fdff7 libsystem_malloc.dylib (67.40.1) <5748E8B2-F81C-34C6-8B13-456213127678> /usr/lib/system/libsystem_malloc.dylib - 0x7fff8a245000 - 0x7fff8a245fff libmetal_timestamp.dylib (600.0.44.1) <6576F284-BACA-332A-A6E7-FA1C347636E3> /System/Library/PrivateFrameworks/GPUCompiler.framework/libmetal_timestamp.dylib - 0x7fff8a2d9000 - 0x7fff8a2dafff liblangid.dylib (122) <9CC4F0D1-5C51-3B69-BC8F-EE3A51FD0822> /usr/lib/liblangid.dylib - 0x7fff8a2db000 - 0x7fff8a2e9fff com.apple.opengl (12.1.0 - 12.1.0) /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL - 0x7fff8ae82000 - 0x7fff8aeabff7 libxpc.dylib (765.50.8) <54D1328E-054E-3DAA-89E2-375722F9D18F> /usr/lib/system/libxpc.dylib - 0x7fff8aeac000 - 0x7fff8b2a8fff libLAPACK.dylib (1162.2) <987E42B0-5108-3065-87F0-9DF7616A8A06> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib - 0x7fff8b3a2000 - 0x7fff8b648ff7 com.apple.CoreData (120 - 641.3) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData - 0x7fff8b649000 - 0x7fff8b678ffb libsystem_m.dylib (3105) <08E1A4B2-6448-3DFE-A58C-ACC7335BE7E4> /usr/lib/system/libsystem_m.dylib - 0x7fff8be57000 - 0x7fff8be6efff libmarisa.dylib (4) /usr/lib/libmarisa.dylib - 0x7fff8c64b000 - 0x7fff8c778ff3 com.apple.CoreText (352.0 - 494.11) <08E8640E-6602-3A00-BC28-94235FD311B4> /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText - 0x7fff8c794000 - 0x7fff8c7e9fff com.apple.AE (701 - 701) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE - 0x7fff8c83b000 - 0x7fff8c83dfff com.apple.loginsupport (1.0 - 1) <9B2F5F9B-ED38-313F-B798-D2B667BCD6B5> /System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport - 0x7fff8cb98000 - 0x7fff8cb9bfff libsystem_sandbox.dylib (460.50.4) <150A9D3D-F69E-32F7-8C7B-8E72CAAFF7E4> /usr/lib/system/libsystem_sandbox.dylib - 0x7fff8cb9c000 - 0x7fff8cb9cff7 libkeymgr.dylib (28) <8371CE54-5FDD-3CE9-B3DF-E98C761B6FE0> /usr/lib/system/libkeymgr.dylib - 0x7fff8cbff000 - 0x7fff8cc00fff com.apple.TrustEvaluationAgent (2.0 - 25) <0239494E-FEFE-39BC-9FC7-E251BA5128F1> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent - 0x7fff8cc01000 - 0x7fff8cc01fff libOpenScriptingUtil.dylib (169.1) /usr/lib/libOpenScriptingUtil.dylib - 0x7fff8d16a000 - 0x7fff8d16dffb libdyld.dylib (360.22) /usr/lib/system/libdyld.dylib - 0x7fff8d245000 - 0x7fff8d246fff libffi.dylib (18.1) <5BA9612C-747E-33CE-9DB1-3C01ECF3041D> /usr/lib/libffi.dylib - 0x7fff8d2e2000 - 0x7fff8d378fff com.apple.ColorSync (4.9.0 - 4.9.0) <8FC37E20-6579-3CB2-9D49-BC39FC38DF87> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync - 0x7fff8d6fd000 - 0x7fff8d771ff7 com.apple.Heimdal (4.0 - 2.0) <5D365381-8B5E-3259-8867-FC4A7D307BDE> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal - 0x7fff8d772000 - 0x7fff8d773fff libDiagnosticMessagesClient.dylib (100) <4243B6B4-21E9-355B-9C5A-95A216233B96> /usr/lib/libDiagnosticMessagesClient.dylib - 0x7fff8d7e3000 - 0x7fff8d808ff7 libPng.dylib (1450) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib - 0x7fff8ebb0000 - 0x7fff8ed56ff7 com.apple.audio.toolbox.AudioToolbox (1.13 - 1.13) <082319FC-59F2-3D36-AC9B-94759724E302> /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox - 0x7fff8f074000 - 0x7fff8f090ff7 libextension.dylib (78) /usr/lib/libextension.dylib - 0x7fff8f127000 - 0x7fff8f137fff libbsm.0.dylib (34) <7E14504C-A8B0-3574-B6EB-5D5FABC72926> /usr/lib/libbsm.0.dylib - 0x7fff8f177000 - 0x7fff903c5fe7 com.apple.CoreGraphics (1.600.0 - 957) /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics - 0x7fff903c6000 - 0x7fff904eafff libsqlite3.dylib (216.4) <280D67B8-F93D-3587-A146-19F36C817548> /usr/lib/libsqlite3.dylib - 0x7fff90521000 - 0x7fff9055fff7 libGLImage.dylib (12.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib - 0x7fff90622000 - 0x7fff90667ff7 com.apple.coreservices.SharedFileList (24.4 - 24.5) <1D2AD77B-778F-3253-A295-3D0A32A8121C> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList - 0x7fff90709000 - 0x7fff90717fff libxar.1.dylib (302) <03207F66-2C4A-3DBD-8D81-70F4C85903C4> /usr/lib/libxar.1.dylib - 0x7fff90e64000 - 0x7fff90e73ffb com.apple.LangAnalysis (1.7.0 - 1.7.0) <18D21123-A3E7-3851-974A-08E5D4540475> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis - 0x7fff90f0b000 - 0x7fff90f57fff com.apple.print.framework.PrintCore (11.2 - 472.2) <5AE8AA6B-CE09-397D-B0D4-0F9CCBF1F77D> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore - 0x7fff90f96000 - 0x7fff90fbafff com.apple.MultitouchSupport.framework (304.12 - 304.12) <65CB7653-EACD-3ADB-ABB6-2E0671708301> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport - 0x7fff91154000 - 0x7fff91165ff7 libsystem_trace.dylib (201.10.3) /usr/lib/system/libsystem_trace.dylib - 0x7fff911f6000 - 0x7fff91254fff com.apple.SystemConfiguration (1.14 - 1.14) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration - 0x7fff919db000 - 0x7fff919f2ff7 libsystem_coretls.dylib (83.40.5) /usr/lib/system/libsystem_coretls.dylib - 0x7fff919f3000 - 0x7fff919f3fff com.apple.ApplicationServices (48 - 48) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices - 0x7fff91b86000 - 0x7fff91bd2ffb com.apple.HIServices (1.22 - 550) <6B76B41C-CF5A-34C4-89F4-EFD7CA3D1C9D> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices - 0x7fff91c23000 - 0x7fff91c64ff7 libGLU.dylib (12.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib - 0x7fff91c65000 - 0x7fff91c96ff7 libncurses.5.4.dylib (46) /usr/lib/libncurses.5.4.dylib - 0x7fff91ef6000 - 0x7fff91f49ff7 libc++.1.dylib (120.1) <8FC3D139-8055-3498-9AC5-6467CB7F4D14> /usr/lib/libc++.1.dylib - 0x7fff91f8c000 - 0x7fff91f8eff7 libquarantine.dylib (80) <0F4169F0-0C84-3A25-B3AE-E47B3586D908> /usr/lib/system/libquarantine.dylib - 0x7fff91fc3000 - 0x7fff91fddfff com.apple.Kerberos (3.0 - 1) <1B4744BF-E5AE-38E2-AA56-E22D3270F2E8> /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos - 0x7fff9233c000 - 0x7fff9269ef3f libobjc.A.dylib (680) <7489D2D6-1EFD-3414-B18D-2AECCCC90286> /usr/lib/libobjc.A.dylib - 0x7fff926df000 - 0x7fff926f0fff libcmph.dylib (6) /usr/lib/libcmph.dylib - 0x7fff92756000 - 0x7fff9279bff3 libFontRegistry.dylib (155.2) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib - 0x7fff927b9000 - 0x7fff927c4ff7 libcommonCrypto.dylib (60075.50.1) <93732261-34B4-3914-B7A2-90A81A182DBA> /usr/lib/system/libcommonCrypto.dylib - 0x7fff927c5000 - 0x7fff927c6ffb libremovefile.dylib (41) <552EF39E-14D7-363E-9059-4565AC2F894E> /usr/lib/system/libremovefile.dylib - 0x7fff93126000 - 0x7fff93131ff7 libChineseTokenizer.dylib (16) <79B8C67A-3061-3C78-92CD-4650719E68D4> /usr/lib/libChineseTokenizer.dylib - 0x7fff93132000 - 0x7fff9313cfff com.apple.NetAuth (6.0 - 6.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth - 0x7fff931b3000 - 0x7fff93240fff libsystem_c.dylib (1082.50.1) /usr/lib/system/libsystem_c.dylib - 0x7fff93250000 - 0x7fff935e5fdb com.apple.vImage (8.0 - 8.0) <4BAC9B6F-7482-3580-8787-AB0A5B4D331B> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage - 0x7fff9394a000 - 0x7fff939bffff com.apple.framework.IOKit (2.0.2 - 1179.50.2) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit - 0x7fff939e9000 - 0x7fff93a02fff com.apple.CFOpenDirectory (10.11 - 194) <11F95672-55E0-3F9D-9171-5E8C56AEE948> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory - 0x7fff93ad9000 - 0x7fff93ae1fff libGFXShared.dylib (12.1) <5A0C2493-200C-30BE-97D5-8E8C0B8E604D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib - 0x7fff93ae2000 - 0x7fff93aeafff libsystem_networkextension.dylib (385.40.36) <66095DC7-6539-38F2-95EE-458F15F6D014> /usr/lib/system/libsystem_networkextension.dylib - 0x7fff93d66000 - 0x7fff93d83ff7 com.apple.AppleVPAFramework (2.1.2 - 2.1.2) <41378C0B-B56A-3A73-9BD0-E06FA1F87B8C> /System/Library/PrivateFrameworks/AppleVPA.framework/Versions/A/AppleVPA - 0x7fff94496000 - 0x7fff9449efff com.apple.NetFS (6.0 - 4.0) <842A5346-24C3-3F22-9ECF-E586A10EA1F2> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS - 0x7fff9449f000 - 0x7fff944a4ff7 libmacho.dylib (875.1) <318264FA-58F1-39D8-8285-1F6254EE410E> /usr/lib/system/libmacho.dylib - 0x7fff944a5000 - 0x7fff944cefff libsystem_info.dylib (477.50.4) /usr/lib/system/libsystem_info.dylib - 0x7fff945f8000 - 0x7fff9466ffeb libcorecrypto.dylib (335.50.1) /usr/lib/system/libcorecrypto.dylib - 0x7fff94672000 - 0x7fff9467afef libsystem_platform.dylib (74.40.2) <29A905EF-6777-3C33-82B0-6C3A88C4BA15> /usr/lib/system/libsystem_platform.dylib - 0x7fff947a8000 - 0x7fff94835dd7 com.apple.AppleJPEG (1.0 - 1) <558ACADA-C41F-3EEF-82A0-C2D7B13C5428> /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG - 0x7fff9490b000 - 0x7fff94914ff7 libsystem_pthread.dylib (138.10.4) <3DD1EF4C-1D1B-3ABF-8CC6-B3B1CEEE9559> /usr/lib/system/libsystem_pthread.dylib - 0x7fff94915000 - 0x7fff94923ff7 libbz2.1.0.dylib (38) <28E54258-C0FE-38D4-AB76-1734CACCB344> /usr/lib/libbz2.1.0.dylib - 0x7fff949d8000 - 0x7fff949e4fff com.apple.speech.synthesis.framework (5.4.12 - 5.4.12) <71DA00B8-5EA2-326B-8814-59DB25512F65> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis - 0x7fff949e5000 - 0x7fff94a43fff com.apple.CoreServices.OSServices (728.12 - 728.12) <776EBD4F-7052-377F-A70D-E2FDBD465A5E> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices - 0x7fff94c55000 - 0x7fff94c6dfef libcompression.dylib (28) /usr/lib/libcompression.dylib - 0x7fff94d75000 - 0x7fff94d81ff7 com.apple.OpenDirectory (10.11 - 194) <31A67AD5-5CC2-350A-96D7-821DF4BC4196> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory - 0x7fff94dd2000 - 0x7fff94de9ff7 libsystem_asl.dylib (323.50.1) <41F8E11F-1BD0-3F1D-BA3A-AA1577ED98A9> /usr/lib/system/libsystem_asl.dylib - 0x7fff95efc000 - 0x7fff96372fff com.apple.CoreFoundation (6.9 - 1258.1) <943A1383-DA6A-3DC0-ABCD-D9AEB3D0D34D> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation - 0x7fff96a8b000 - 0x7fff96a8cffb libSystem.B.dylib (1226.10.1) /usr/lib/libSystem.B.dylib - 0x7fff96b0b000 - 0x7fff96b67fff libTIFF.dylib (1450) <14EB7C03-7DDA-3276-BAC5-D597913AC9C4> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib - 0x7fff9788c000 - 0x7fff97900ff3 com.apple.securityfoundation (6.0 - 55126) <130656AE-2711-3914-8736-D8B021C93FE0> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation - 0x7fff97901000 - 0x7fff9796fff7 com.apple.ApplicationServices.ATS (377 - 394.4) <9779E916-0788-3CAC-B1EC-F68BCB12A2B6> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS - 0x7fff97970000 - 0x7fff979c1ff7 libcups.2.dylib (435.2) <91584A40-214D-33E8-A613-CE22289037C8> /usr/lib/libcups.2.dylib - 0x7fff97acb000 - 0x7fff97ad4ff3 libsystem_notify.dylib (150.40.1) /usr/lib/system/libsystem_notify.dylib - 0x7fff97c56000 - 0x7fff97c58fff libCVMSPluginSupport.dylib (12.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib - 0x7fff97c59000 - 0x7fff97c5cff7 libCoreFSCache.dylib (119.5) <2389D7DA-B8EF-3EB4-AAAF-FBEDE01CDECA> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib - 0x7fff97d7b000 - 0x7fff97d80ff7 libheimdal-asn1.dylib (453.40.10) <981DE40B-FA16-36F7-BE92-8C8A115D6CD9> /usr/lib/libheimdal-asn1.dylib - 0x7fff97d81000 - 0x7fff97d9fffb libedit.3.dylib (43) <1D3E3152-4001-3C19-B56A-7543F1BBA47C> /usr/lib/libedit.3.dylib - 0x7fff987b2000 - 0x7fff989bffff libicucore.A.dylib (551.51.3) <5BC80F94-C90D-3175-BD96-FF1DC222EC9C> /usr/lib/libicucore.A.dylib - 0x7fff989c0000 - 0x7fff989c0ff7 liblaunch.dylib (765.50.8) <834ED605-5114-3641-AA4D-ECF31B801C50> /usr/lib/system/liblaunch.dylib - 0x7fff98b55000 - 0x7fff98b8ffff com.apple.QD (3.12 - 302) <0FE53180-2895-3D14-A1E7-F82DE1D106E1> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD - 0x7fff98be1000 - 0x7fff98be1fff libenergytrace.dylib (10.40.1) <0A491CA7-3451-3FD5-999A-58AB4362682B> /usr/lib/libenergytrace.dylib - 0x7fff98c36000 - 0x7fff98c41fff libGL.dylib (12.1) <70D51643-04AC-3400-8F11-A6FC25985289> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib - 0x7fff98c77000 - 0x7fff98ca0fff libc++abi.dylib (125) /usr/lib/libc++abi.dylib - 0x7fff98cb0000 - 0x7fff98cdfff7 com.apple.DictionaryServices (1.2 - 250.3) <30250542-CBAA-39C1-91AA-B57A5DE17594> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices - 0x7fff98ce0000 - 0x7fff98ce7ff7 libcompiler_rt.dylib (62) /usr/lib/system/libcompiler_rt.dylib - 0x7fff98d10000 - 0x7fff98fa6fff libmecabra.dylib (696.5) /usr/lib/libmecabra.dylib - 0x7fff99bdb000 - 0x7fff99bdbfff com.apple.Accelerate (1.10 - Accelerate 1.10) <185EC96A-5AF0-3620-A4ED-4D3654D25B39> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate - 0x7fff99bdc000 - 0x7fff99bddfff libsystem_blocks.dylib (65) <1244D9D5-F6AA-35BB-B307-86851C24B8E5> /usr/lib/system/libsystem_blocks.dylib - 0x7fff99d2d000 - 0x7fff99e94fff libBLAS.dylib (1162.2) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib - 0x7fff99f74000 - 0x7fff9a259ffb com.apple.CoreServices.CarbonCore (1136.2 - 1136.2) <2DBAFC9A-6CD6-351D-B1F4-87D81AA6D640> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore - 0x7fff9a2cc000 - 0x7fff9a312ff7 libauto.dylib (186) <999E610F-41FC-32A3-ADCA-5EC049B65DFB> /usr/lib/libauto.dylib - 0x7fff9a359000 - 0x7fff9a35ffff com.apple.IOAccelerator (205.10 - 205.10) /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator - 0x7fff9a40b000 - 0x7fff9a410ff3 libunwind.dylib (35.3) /usr/lib/system/libunwind.dylib - 0x7fff9a833000 - 0x7fff9a923fff libJP2.dylib (1450) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib - 0x7fff9ab94000 - 0x7fff9aba5fff libSparseBLAS.dylib (1162.2) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib - 0x7fff9abea000 - 0x7fff9ac8afff com.apple.Metadata (10.7.0 - 972.34) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata - 0x7fff9af5b000 - 0x7fff9af79ff7 libsystem_kernel.dylib (3248.50.21) <78E54D59-D2B0-3F54-9A4A-0A68D671F253> /usr/lib/system/libsystem_kernel.dylib - 0x7fff9b073000 - 0x7fff9b159ff7 libcrypto.0.9.8.dylib (59.40.2) <2486D801-C756-3488-B519-1AA6807E8948> /usr/lib/libcrypto.0.9.8.dylib - 0x7fff9b3c1000 - 0x7fff9b4bdff7 libFontParser.dylib (158.6) <267A9AE4-4138-3112-8D73-BDFDC96568FF> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib - 0x7fff9b4c2000 - 0x7fff9b4ddff7 libCRFSuite.dylib (34) <078B4CD8-6A8C-3067-B2BA-0C2A0BAB8AC3> /usr/lib/libCRFSuite.dylib - 0x7fff9b625000 - 0x7fff9b8acff3 com.apple.CFNetwork (760.5.1 - 760.5.1) /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork - 0x7fff9b928000 - 0x7fff9baeefe7 com.apple.ImageIO.framework (3.3.0 - 1450) <18ABA1F4-43EC-3990-9777-C91FD3D6AF71> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO - 0x7fff9bdf0000 - 0x7fff9be24ff7 com.apple.CoreVideo (1.8 - 191.3) <1AA24A1B-CB84-3F6B-B6DE-11494542649C> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo - 0x7fff9bf5b000 - 0x7fff9bf60fff com.apple.DiskArbitration (2.7 - 2.7) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration - 0x7fff9bf61000 - 0x7fff9c086fff com.apple.LaunchServices (728.12 - 728.12) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices - 0x7fff9c0e4000 - 0x7fff9c0effff libkxld.dylib (3248.50.21) <99195052-038E-3490-ACF8-76F9AC43897E> /usr/lib/system/libkxld.dylib - 0x7fff9d382000 - 0x7fff9d386fff libpam.2.dylib (20) /usr/lib/libpam.2.dylib - 0x7fff9d4b7000 - 0x7fff9d4c8ff7 libz.1.dylib (61.20.1) /usr/lib/libz.1.dylib - 0x7fff9d4ca000 - 0x7fff9d4f8ff7 com.apple.CoreServicesInternal (248.2 - 248.2) <6E111F0A-D7F1-3738-ADE7-CF983BD4EC8B> /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal - 0x7fff9d4f9000 - 0x7fff9d4fbff7 libsystem_configuration.dylib (802.40.13) <3DEB7DF9-6804-37E1-BC83-0166882FF0FF> /usr/lib/system/libsystem_configuration.dylib - 0x7fff9d5ab000 - 0x7fff9d5acfff libsystem_secinit.dylib (20) <32B1A8C6-DC84-3F4F-B8CE-9A52B47C3E6B> /usr/lib/system/libsystem_secinit.dylib - -External Modification Summary: - Calls made by other processes targeting this process: - task_for_pid: 11 - thread_create: 0 - thread_set_state: 0 - Calls made by this process: - task_for_pid: 0 - thread_create: 0 - thread_set_state: 0 - Calls made by all processes on this machine: - task_for_pid: 199747 - thread_create: 0 - thread_set_state: 9181 - -VM Region Summary: -ReadOnly portion of Libraries: Total=231.3M resident=0K(0%) swapped_out_or_unallocated=231.3M(100%) -Writable regions: Total=112.3M written=0K(0%) resident=0K(0%) swapped_out=0K(0%) unallocated=112.3M(100%) - - VIRTUAL REGION -REGION TYPE SIZE COUNT (non-coalesced) -=========== ======= ======= -Activity Tracing 2048K 2 -Dispatch continuations 16.0M 2 -Kernel Alloc Once 4K 2 -MALLOC 75.5M 22 -MALLOC guard page 32K 7 -STACK GUARD 56.0M 9 -Stack 11.1M 16 -VM_ALLOCATE 7448K 21 -__DATA 11.8M 183 -__LINKEDIT 101.5M 32 -__TEXT 129.8M 182 -__UNICODE 552K 2 -mapped file 47.0M 49 -shared memory 324K 9 -=========== ======= ======= -TOTAL 458.9M 524 - -Model: MacBookPro11,5, BootROM MBP114.0172.B09, 4 processors, Intel Core i7, 2,5 GHz, 16 GB, SMC 2.30f2 -Graphics: AMD Radeon R9 M370X, AMD Radeon R9 M370X, PCIe, 2048 MB -Graphics: Intel Iris Pro, Intel Iris Pro, Built-In -Memory Module: BANK 0/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D54343147533642465238412D50422020 -Memory Module: BANK 1/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D54343147533642465238412D50422020 -AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0x152), Broadcom BCM43xx 1.0 (7.21.95.175.1a6) -Bluetooth: Version 4.4.5f3 17904, 3 services, 27 devices, 1 incoming serial ports -Network Service: Wi-Fi, AirPort, en0 -Serial ATA Device: APPLE SSD SM0512G, 500,28 GB -USB Device: USB 3.0 Bus -USB Device: Card Reader -USB Device: Apple Internal Keyboard / Trackpad -USB Device: Bluetooth USB Host Controller -Thunderbolt Bus: MacBook Pro, Apple Inc., 27.1 diff --git a/cmake/Config.cmake b/cmake/Config.cmake index 9c0abcae4..4b5c288fb 100644 --- a/cmake/Config.cmake +++ b/cmake/Config.cmake @@ -15,13 +15,15 @@ include(TestBigEndian) include(GetGitRevisionDescription) # modern systems do this. + set(MALLOC_T "void *") OPTION(WITH_SYSTEM_MALLOC "use malloc to allocate memory" ON) OPTION(WITH_DL_MALLOC "use malloc to allocate memory" OFF) OPTION(WITH_YAP_MALLOC - "use malloc to allocate memory" OFF) + "use malloc to allocate mem + ory" OFF) if (WITH_SYSTEM_MALLOC) set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS USE_SYSTEM_MALLOC=1) @@ -144,6 +146,7 @@ endif (HAVE_LIBDL) if (WIN32) check_library_exists(comdlg32 FindText "" HAVE_LIBCOMDLG32) if (HAVE_LIBCOMDLG32) + set(EXTRALIBS ${EXTRALIBS} comdlg32) endif (HAVE_LIBCOMDLG32) check_library_exists(msvcrt strtok "" HAVE_LIBMSCRT) @@ -215,6 +218,7 @@ if (HAVE_LIBPTHREAD) endif (HAVE_LIBPTHREAD) + check_library_exists(unicode main "" HAVE_LIBUNICODE) if (HAVE_LIBUNICODE) set(EXTRALIBS ${EXTRALIBS} unicode) @@ -255,6 +259,7 @@ check_function_exists(__builtin_ffsll HAVE___BUILTIN_FFSLL) check_function_exists(fgetpos HAVE_FGETPOS) check_function_exists(finite HAVE_FINITE) check_function_exists(iswblank HAVE_ISWBLANK) +check_function_exists(iswspace HAVE_ISWSPACE) check_symbol_exists(flsl HAVE_FLSL) check_symbol_exists(flsll HAVE_FLSLL) check_function_exists(fmemopen HAVE_FMEMOPEN) @@ -262,7 +267,7 @@ check_function_exists(fpclass HAVE_FPCLASS) check_function_exists(ftime HAVE_FTIME) check_function_exists(ftruncate HAVE_FTRUNCATE) check_function_exists(funopen HAVE_FUNOPEN) -check_function_exists(gcc HAVE_GCC) +#check_function_exists(gcc HAVE_GCC) check_function_exists(getcwd HAVE_GETCWD) check_function_exists(getenv HAVE_GETENV) check_function_exists(getexecname HAVE_GETEXECNAME) @@ -336,10 +341,14 @@ check_function_exists(socklen_t HAVE_SOCKLEN_T) check_function_exists(sqllen HAVE_SQLLEN) check_function_exists(sqlulen HAVE_SQLULEN) check_function_exists(srand HAVE_SRAND) -check_function_exists(srand HAVE_SRAND48) +check_function_exists(srand48 HAVE_SRAND48) check_function_exists(srandom HAVE_SRANDOM) +check_function_exists(stpcpy HAVE_STPCPY) +check_function_exists(stpncpy HAVE_STPNCPY) check_function_exists(ssize_t HAVE_SSIZE_T) check_function_exists(stat HAVE_STAT) +check_function_exists(strcat HAVE_STRCAT) +check_function_exists(strncat HAVE_STRNCAT) check_function_exists(strcasecmp HAVE_STRCASECMP) check_function_exists(strcasestr HAVE_STRCASESTR) check_function_exists(strchr HAVE_STRCHR) @@ -395,5 +404,13 @@ configure_file(${CMAKE_CURRENT_LIST_DIR}/../YapTermConfig.h.cmake configure_file(${CMAKE_CURRENT_LIST_DIR}/../config.h.cmake ${CMAKE_BINARY_DIR}/config.h) configure_file(${CMAKE_CURRENT_LIST_DIR}/../GitSHA1.c.in GitSHA1.c @ONLY) - configure_file(${CMAKE_CURRENT_LIST_DIR}/../os/YapIOConfig.h.cmake ${CMAKE_BINARY_DIR}/os/YapIOConfig.h) + +check_include_files( "stdio.h;cudd.h" HAVE_CTYPE_HUDD_H ) + +check_include_files( "stdio.h;cuddI.h" HAVE_CUDD_H ) +check_include_files( "cudd.h;cuddInt.h" HAVE_CUDDINT_H ) +check_include_files( "stdio.h;cudd/cudd.h" HAVE_CUDD_CUDD_H ) +check_include_files( "stdio.h;cudd/cuddInt.h" HAVE_CUDD_CUDDINT_H ) +configure_file (cmake/cudd_config.h.cmake + "${CMAKE_CURRENT_BINARY_DIR}/cudd_config.h" ) diff --git a/cmake/FindCUDD.cmake b/cmake/FindCUDD.cmake index c8821176a..3ebf72b40 100644 --- a/cmake/FindCUDD.cmake +++ b/cmake/FindCUDD.cmake @@ -13,6 +13,7 @@ SET( CUDD_FOUND "NO" ) set (CUDD_INCLUDE_SEARCH_PATH + ${CUDD_ROOT_DIR}/include ${CMAKE_INSTALL_PREFIX}/include /usr/local/yap/include /usr/local/Yap/include @@ -32,6 +33,7 @@ set (CUDD_INCLUDE_SEARCH_PATH set (CUDD_LIB_SEARCH_PATH + ${CUDD_ROOT_DIR}/lib ${CMAKE_INSTALL_PREFIX}/lib /usr/lib /usr/local/lib/cudd diff --git a/cmake/FindGecode.cmake b/cmake/FindGecode.cmake index 5055b0de5..402767dee 100644 --- a/cmake/FindGecode.cmake +++ b/cmake/FindGecode.cmake @@ -1,12 +1,12 @@ #source from http://code.google.com/p/cpfloat-gecode/source/browse/trunk/cmake-support/FindGecode.cmake?r=9 - +# #Works under the assumption than when gecode is installed at least the kernel component exists # Look for the header file -find_path(GECODE_INCLUDE_DIR NAMES gecode/kernel.hh PATHS ${CMAKE_INSTALL_PREFIX}/include) -find_file(GECODE_CONFIG gecode/support/config.hpp PATHS ${CMAKE_INSTALL_PREFIX}/include) +find_path(GECODE_INCLUDE_DIR NAMES gecode/kernel.hh PATHS ${GECODE_ROOT_DIR}/include ${CMAKE_INSTALL_PREFIX}/include /usr/local/include /opt/local/include /usr}/include) +find_file(GECODE_CONFIG gecode/support/config.hpp PATHS ${GECODE_ROOT_DIR}/include ${CMAKE_INSTALL_PREFIX}/include /usr/local/include /opt/local/include /usr}/include) # Look for the library -find_library(GECODE_LIBRARY NAMES gecodekernel PATHS ${CMAKE_INSTALL_PREFIX}/lib) -find_library(GECODE_SUPPORT_LIBRARY NAMES gecodesupportl PATHS ${CMAKE_INSTALL_PREFIX}/lib) +find_library(GECODE_LIBRARY NAMES gecodekernel PATHS ${GECODE_ROOT_DIR}/lib ${CMAKE_INSTALL_PREFIX}/lib /usr/local/lib /opt/local/lib /usr}/lib) +find_library(GECODE_SUPPORT_LIBRARY NAMES gecodesupport PATHS ${GECODE_ROOT_DIR}/lib ${CMAKE_INSTALL_PREFIX}/lib /usr/local/lib /opt/local/lib /usr}/include) if(GECODE_CONFIG) file(STRINGS ${GECODE_CONFIG} GECODE_LINE_VERSION REGEX "^#define GECODE_VERSION .*") @@ -20,39 +20,39 @@ endif() if(GECODE_FOUND) set(GECODE_LIBRARIES ${GECODE_LIBRARY} ${GECODE_SUPPORT_LIBRARY}) set(GECODE_INCLUDE_DIRS ${GECODE_INCLUDE_DIR}) - find_library(GECODE_DRIVER_LIBRARY gecodedriverl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_DRIVER_LIBRARY gecodedriver PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_FZ_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_FZ_LIBRARY}) endif() - find_library(GECODE_GIST_LIBRARY gecodegistl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_GIST_LIBRARY gecodegist PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_GIST_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_GIST_LIBRARY}) endif() - find_library(GECODE_GRAPH_LIBRARY gecodegraphl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_GRAPH_LIBRARY gecodegraph PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_GRAPH_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_GRAPH_LIBRARY}) endif() - find_library(GECODE_INT_LIBRARY gecodeintl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_INT_LIBRARY gecodeint PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_INT_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_INT_LIBRARY}) endif() - find_library(GECODE_FLOAT_LIBRARY gecodefloatl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_FLOAT_LIBRARY gecodefloat PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_FLOAT_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_FLOAT_LIBRARY}) endif() - find_library(GECODE_MM_LIBRARY gecodeminimodell PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_MM_LIBRARY gecodeminimodel PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_MM_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_MM_LIBRARY}) endif() - find_library(GECODE_SCHEDULING_LIBRARY gecodeschedulingl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_SCHEDULING_LIBRARY gecodescheduling PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_SCHEDULING_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_SCHEDULING_LIBRARY}) endif() - find_library(GECODE_SEARCH_LIBRARY gecodesearchl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_SEARCH_LIBRARY gecodesearch PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_SEARCH_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_SEARCH_LIBRARY}) endif() - find_library(GECODE_SET_LIBRARY gecodesetl PATHS ${CMAKE_INSTALL_PREFIX}/lib) + find_library(GECODE_SET_LIBRARY gecodeset PATHS ${CMAKE_INSTALL_PREFIX}/lib) if(GECODE_SET_LIBRARY) list(APPEND GECODE_LIBRARIES ${GECODE_SET_LIBRARY}) endif() diff --git a/cmake/FindMySQL.cmake b/cmake/FindMySQL.cmake index 0249c7f5a..eed370cfe 100644 --- a/cmake/FindMySQL.cmake +++ b/cmake/FindMySQL.cmake @@ -11,6 +11,7 @@ IF (MYSQL_INCLUDE_DIR) ENDIF (MYSQL_INCLUDE_DIR) FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + ${MYSQL_ROOT_DIR}/include /usr/local/include/mysql /usr/include/mysql /usr/include/mariadb @@ -18,7 +19,8 @@ FIND_PATH(MYSQL_INCLUDE_DIR mysql.h SET(MYSQL_NAMES mysqlclient mysqlclient_r mariadb ) FIND_LIBRARY(MYSQL_LIBRARY - NAMES ${MYSQL_NAMES} + NAMES ${MYSQL_ROOT_DIR}/lib + ${MYSQL_NAMES} PATHS /usr/lib /usr/local/lib PATH_SUFFIXES mysql mariadb ) @@ -45,4 +47,4 @@ ENDIF (MYSQL_FOUND) MARK_AS_ADVANCED( MYSQL_LIBRARY MYSQL_INCLUDE_DIR - ) \ No newline at end of file + ) diff --git a/cmake/FindODBC.cmake b/cmake/FindODBC.cmake index 9348a7163..667e44cd7 100644 --- a/cmake/FindODBC.cmake +++ b/cmake/FindODBC.cmake @@ -19,6 +19,7 @@ set(ODBC_FOUND FALSE) find_path(ODBC_INCLUDE_DIRECTORIES sql.h + ${ODBC_ROOT_DIR}/include /usr/include /usr/include/odbc /usr/local/include @@ -34,6 +35,7 @@ find_path(ODBC_INCLUDE_DIRECTORIES sql.h find_library(ODBC_LIBRARY NAMES iodbc odbc odbcinst odbc32 PATHS + ${ODBC_ROOT_DIR}/lib /usr/lib /usr/lib/odbc /usr/local/lib diff --git a/cmake/Model.cmake b/cmake/Model.cmake index 9533386e5..1ec8215ec 100644 --- a/cmake/Model.cmake +++ b/cmake/Model.cmake @@ -2,7 +2,7 @@ set(YAP_FOUND ON) set(YAP_MAJOR_VERSION 6) set(YAP_MINOR_VERSION 3) -set(YAP_PATCH_VERSION 4) +set(YAP_PATCH_VERSION 5) set(YAP_FULL_VERSION ${YAP_MAJOR_VERSION}.${YAP_MINOR_VERSION}.${YAP_PATCH_VERSION}) diff --git a/cmake/cudd.cmake b/cmake/cudd.cmake index de2d30096..7345e360d 100644 --- a/cmake/cudd.cmake +++ b/cmake/cudd.cmake @@ -1,5 +1,5 @@ - + option (WITH_CUDD "BDD CUDD package" ON) if (WITH_CUDD) @@ -18,10 +18,7 @@ if (CUDD_FOUND) set( CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${CUDD_INCLUDE_DIR} ) -check_include_files( "stdio.h;cudd.h" HAVE_CUDD_H ) -check_include_files( "stdio.h;cudd/cudd.h" HAVE_CUDD_CUDD_H ) -check_include_files( "cuddInt.h" HAVE_CUDDINT_H ) -check_include_files( "cudd/cuddInt.h" HAVE_CUDD_CUDDINT_H ) endif (CUDD_FOUND) + endif(WITH_CUDD) diff --git a/packages/bdd/cudd_config.h.cmake b/cmake/cudd_config.h.cmake similarity index 100% rename from packages/bdd/cudd_config.h.cmake rename to cmake/cudd_config.h.cmake diff --git a/cmake/python.cmake b/cmake/python.cmake index 3898249b1..288e2ca1e 100644 --- a/cmake/python.cmake +++ b/cmake/python.cmake @@ -1,4 +1,8 @@ +option (WITH_PYTHON + "Allow Python->YAP and YAP->Python" ON) + +IF (WITH_PYTHON) #BREW install for Python3 @@ -31,3 +35,6 @@ find_package(PythonLibs) set( CMAKE_REQUIRED_INCLUDES ${PYTHON_INCLUDE_DIRS} ${CMAKE_REQUIRED_INCLUDES} ) check_include_file(Python.h HAVE_PYTHON_H) + +endif(WITH_PYTHON) + diff --git a/config.h.cmake b/config.h.cmake index 9f34be495..02fab125e 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -586,6 +586,11 @@ function. */ #cmakedefine HAVE_ISWBLANK ${HAVE_ISWBLANK} #endif +/* Define to 1 if you have the `iswspace' function. */ +#ifndef HAVE_ISWSPACE +#cmakedefine HAVE_ISWSPACE ${HAVE_ISWSPACE} +#endif + /* Define to 1 if you have the header file. */ #ifndef HAVE_JUDY_H #cmakedefine HAVE_JUDY_H ${HAVE_JUDY_H} diff --git a/configure b/configure index 4c425b161..d93ba3d4d 100755 --- a/configure +++ b/configure @@ -22,7 +22,7 @@ # details, see TOP_SRCDIR="$(dirname $0)" -CMAKE_CMD="cmake ${TOP_SRCDIR}" +CMAKE=cmake BUILD_TYPE="Debug" PREFIX=/usr/local @@ -39,15 +39,19 @@ quote() { extract_var_string() { VAR_NAME=$1 - VAR_NAME=$(echo $1 | sed -e 's/[ \t]*$//') - if [ "x$2" != "x" ]; then - VAR_VALUE=$2 - else - VAR_VALUE=yes + VAR_NAME=$(echo $1 | sed -e 's/[\\b]*$//') + + if [ "x$VAR_VALUE" = "x" ]; then + if [ "x$2" != "x" ]; then + VAR_VALUE=$2 + else + VAR_VALUE=yes + fi fi if [ "x$3" != "x" ]; then VAR_UC_NAME=$3 + VAR_UC=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g') else VAR_UC_NAME=$(echo "$1" | tr '[:lower:]' '[:upper:]' | tr -c '[:alnum:]' '_' | sed 's/_$//g') fi @@ -55,35 +59,73 @@ extract_var_string() { set_config_var() { is_with=n + found=y + arg=$(echo "${2}" | tr '[:upper:]' '[:lower:]' ) case "$1" in "--enable-"*) name="${1#--enable-}" cfg="${ENABLE_VARS}" + case "x$arg" in + "xy"|"xyes"|"xtrue") + VAR_VALUE=yes + ;; + "xn"|"xno"|"xfalse") + found=y + VAR_VALUE=no + ;; + **) + VAR_VALUE="" + ;; + esac ;; "--disable-"*) name="${1#--disable-}"; - cfg="${DISABLE_VARS}"; + cfg="${ENABLE_VARS}" + case "x$arg" in + "xy"|"xyes"|"xtrue") + VAR_VALUE=no + ;; + "xn"|"xno"|"xfalse") + VAR_VALUE=yes + ;; + **) + VAR_VALUE="" + ;; + esac ;; "--with-"*) # IFS="=" read -ra WITHARGS <<< "${1}" name="${1#--with-}" cfg="${WITH_VARS}" - is_with=y + case "x$arg" in + "x"|"xy"|"xyes"|"xtrue") + is_with=n + VAR_VALUE=yes + ``;; + "xn"|"xno"|"xfalse") + is_with=n + VAR_VALUE=no + ;; + **) + is_with=y + VAR_VALUE="" + ;; + esac + ;; esac - found=n - for varstring in $cfg; do - extract_var_string $(echo "${varstring}" | tr '|' ' ') - if [ "x$VAR_NAME" = "x$name" ]; then - found=y - break; - fi - done + for varstring in $cfg; do + extract_var_string $(echo "${varstring}" | tr '|' ' ') + if [ "x$VAR_NAME" = "x$name" ]; then + found=y + break; + fi + done if [ "$found" = "y" ]; then if [ "x$is_with" = "xy" ]; then - CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$2")" + CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "$VAR_VALUE") -D${VAR_UC}_ROOT_DIR=$(quote "$2")" else CMAKE_ARGS="$CMAKE_ARGS -D${VAR_UC_NAME}=$(quote "${VAR_VALUE}")" fi @@ -100,6 +142,7 @@ prefix_to_offset() { print_help() { cat <&2 -h, --help display this help and exit + --cmake=CMAKE use a specific cmake, not the default --disable-debug disable debugging mode --pass-thru pass remaining arguments through to CMake @@ -154,7 +197,6 @@ EOF fi done - first=y for varstring in ${WITH_VARS}; do if [ $first = 'y' ]; then echo "" @@ -164,6 +206,7 @@ EOF var_doc_name="WITH_${VAR_UC_NAME}_DOC" eval "docstring=\$$var_doc_name" paraminfo="${VAR_NAME}=${VAR_VALUE}" + if [ "x${docstring}" = "x" ]; then printf " --with-%-16s enable %s support\n" "$paraminfo" "$(echo -n "${VAR_NAME}" | tr '-' ' ')" else @@ -176,6 +219,10 @@ EOF while [ $# != 0 ]; do case "$1" in + "--cmake="*) + CMAKE="${1#*=}";; + "--cmake") + CMAKE="${2}"; shift;; "--prefix="*) PREFIX="${1#*=}";; "--prefix") @@ -274,11 +321,13 @@ while [ $# != 0 ]; do done;; "--enable-"*) - set_config_var "$1" + name=$(echo "${1#--enable-}" | awk '{split($1,v,"="); print v[1]}') + set_config_var "--with-${name}" "${1#--enable-${name}=}" ;; "--disable-"*) - set_config_var "$1" + name=$(echo "${1#--disable-}" | awk '{split($1,v,"="); print v[1]}') + set_config_var "--with-${name}" "${1#--disable-${name}=}" ;; "--with-"*) @@ -312,4 +361,5 @@ if [ "x${LDFLAGS}" != "x" ]; then done fi -eval "cmake ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS}" +CMAKE_CMD="${CMAKE} ${TOP_SRCDIR}" +${CMAKE_CMD} ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS} diff --git a/console/yap.c b/console/yap.c index 9baf4d45b..a07ed8571 100755 --- a/console/yap.c +++ b/console/yap.c @@ -78,8 +78,7 @@ static int init_standard_system(int argc, char *argv[], YAP_init_args *iap) { BootMode = YAP_parse_yap_arguments(argc, argv, iap); iap->Embedded = false; /* init memory */ - iap->boot_file_type = - BootMode = YAP_Init(iap); + iap->boot_file_type = BootMode = YAP_Init(iap); if (iap->ErrorNo) { /* boot failed */ YAP_Error(iap->ErrorNo, 0L, iap->ErrorCause); diff --git a/docs/Doxyfile b/docs/Doxyfile index b56d7949a..b7bd6c4c3 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -785,9 +785,8 @@ INPUT = /Users/vsc/git/yap-6.3/pl \ /Users/vsc/git/yap-6.3/library \ /Users/vsc/git/yap-6.3/packages \ /Users/vsc/git/yap-6.3/swi/library \ - /Users/vsc/git/yap-6.3/docs/yap.md \ - /Users/vsc/git/yap-6.3/docs/chr.md \ - /Users/vsc/git/yap-6.3/docs/clpqr.md \ + /Users/vsc/git/yap-6.3/docs/md \ + /Users/vsc/git/yap-6.3/INSTALL.md \ # This tag can be used to specify the character encoding of the source files @@ -937,7 +936,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in index f18062fa2..c4338c1e1 100644 --- a/docs/Doxyfile.in +++ b/docs/Doxyfile.in @@ -384,7 +384,7 @@ INLINE_GROUPED_CLASSES = NO # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set -v# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. @@ -785,9 +785,8 @@ INPUT = @PROJECT_SOURCE_DIR@/pl \ @PROJECT_SOURCE_DIR@/library \ @PROJECT_SOURCE_DIR@/packages \ @PROJECT_SOURCE_DIR@/swi/library \ - @PROJECT_SOURCE_DIR@/docs/yap.md \ - @PROJECT_SOURCE_DIR@/docs/chr.md \ - @PROJECT_SOURCE_DIR@/docs/clpqr.md \ + @PROJECT_SOURCE_DIR@/docs/md \ + @PROJECT_SOURCE_DIR@/INSTALL.md # This tag can be used to specify the character encoding of the source files @@ -828,7 +827,11 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = *pltotex.pl +EXCLUDE = *pltotex.pl \ +@PROJECT_SOURCE_DIR@/packages/myddas/sqlite3/src \ +@PROJECT_SOURCE_DIR@/packages/gecode/4.0.* \ +@PROJECT_SOURCE_DIR@/packages/gecode/3,* \ +@PROJECT_SOURCE_DIR@/C/traced_absmi_insts.h # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1134,7 +1137,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = @CMAKE_SOURCE_DIR@/docs/solarized-light.css # @CMAKE_SOURCE_DIR@/docs/solarized-light.css diff --git a/docs/install.md b/docs/install.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/jquery-2.0.3.min.js b/docs/jquery-2.0.3.min.js deleted file mode 100644 index 2be209dd2..000000000 --- a/docs/jquery-2.0.3.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery-2.0.3.min.map -*/ -(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="

",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t) -};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*\s*$/g,ct={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("