static void _Increment_ExpAtoms(LPEXP lpExp, WORD wExpLength) { WORD wCount; for (wCount = 0; wCount < wExpLength; wCount++) switch (EXPFLAGS(lpExp + wCount) & EXPTYPEFLAGS) { case EXPATOM: KppIncrementAtom(CAR(lpExp + wCount)); break; case EXPVAR: { VARID idVar = CAR(lpExp + wCount); LPVAR lpVar = (LPVAR) KppGetItem(VAR, idVar); if (lpVar) { switch (VARFLAGS(lpVar) & EXPTYPEFLAGS) { case EXPATOM: KppIncrementAtom(VARVALUE(lpVar)); break; case EXPLIST: KppIncrementListAtoms(VARVALUE(lpVar)); break; } KppReleaseItem(VAR, idVar); } } } }
static ATOMID get_atom(char *name) { ATOMID idName = KppAddAtom(name); LPEXP lpBinding = KlwGetBinding(idName); if (lpBinding) { switch (EXPFLAGS(lpBinding) & EXPTYPEFLAGS) { case EXPATOM: return CAR(lpBinding); case EXPVAR: { LPVAR lpVar = (LPVAR) KppGetItem(VAR, CAR(lpBinding)); ATOMID idBinding = NULLID; if (lpVar) { if (VARFLAGS(lpVar) & EXPATOM) idBinding = VARVALUE(lpVar); KppReleaseItem(VAR, CAR(lpBinding)); } return idBinding; } default: return NULLID; } } return idName; }
inline int varfalsep(satinstance sati,int i) { return (VARVALUE(i) == 0); }
inline int vartruep(satinstance sati,int i) { return (VARVALUE(i) == 1); }
inline int varvalue(satinstance sati,int v) { return VARVALUE(v); }
inline int litfalsep(satinstance sati,int l) { return (VARVALUE(VAR(l)) == 1-VALUE(l)); }
inline int littruep(satinstance sati,int l) { return (VARVALUE(VAR(l)) == VALUE(l)); }
inline void litunset(satinstance sati,int l) { VARVALUE(VAR(l)) = UNASS; }
inline void litsettrue(satinstance sati,int l) { VARVALUE(VAR(l)) = VALUE(l); }
inline int varunsetp(satinstance sati,int i) { return (VARVALUE(i) == UNASS); }
LPEXP KlwGetBinding(ATOMID idVarName) { varctx ctx = varstack ? (varctx) GLOBALLOCK(varstack->hCtx) : NULL; while (ctx) { GLOBALHANDLE hPrev = ctx->hPrev; LPEXP lpBinding = NULL; if (ctx->idCode && ctx->idCode != srclns.idCode || ctx->wType && ctx->wType != srclns.wType) { GLOBALUNLOCK(ctx->hCtx); return NULL; } if (ctx->idVarList) { VARID idVar; LIST_LOOP loop; kpc_init_loop(ctx->idVarList, &loop); while (idVar = next(&loop)) { LPVAR lpVar = (LPVAR) KppGetItem(VAR, idVar); if (lpVar) { LISTID idBindings = BINDINGS(lpVar); ITEMID idValue = VARVALUE(lpVar); ATOMID idName = VARNAME(lpVar); WORD wFlags = VARFLAGS(lpVar); KppReleaseItem(VAR, idVar); if (idName == idVarName) { if (wFlags & EXPBOUND) { EXPFLAGS(&resexp) = wFlags; CAR(&resexp) = idValue; lpBinding = &resexp; } else if (idBindings) { WORD wIndex = KppGetElem(idBindings, 1); if (!wIndex) break; lpBinding = ctx->lpBody + wIndex - 1; } break; } } } } GLOBALUNLOCK(ctx->hCtx); if (lpBinding) return lpBinding; if (hPrev) ctx = (varctx) GLOBALLOCK(hPrev); else return NULL; } return NULL; }