jump_t *find_in_jumptable(jumptable_t *jt, size_t id) { register jump_t *i, *loop; /* start at id */ i = loop = &jt->hash[id % jt->maxnum]; while( FILLEDP(i) ) { if( EQUALP(i->id,id) ) { return i; /* found id */ } else { i++; /* not found */ /* wrap around */ i = (i >= &jt->hash[jt->maxnum]) ? jt->hash : i; if( i == loop ) { return NULL; /* when hash table is full */ } } } /* empty slot, so not found */ return i; }
SCM_EXPORT ScmObj scm_p_equalp(ScmObj obj1, ScmObj obj2) { enum ScmObjType type; ScmObj elm1, elm2; #if SCM_USE_VECTOR ScmObj *v1, *v2; scm_int_t i, len; #endif DECLARE_FUNCTION("equal?", procedure_fixed_2); if (EQ(obj1, obj2)) return SCM_TRUE; type = SCM_TYPE(obj1); /* different type */ if (type != SCM_TYPE(obj2)) return SCM_FALSE; /* same type */ switch (type) { #if (SCM_USE_INT && !SCM_HAS_IMMEDIATE_INT_ONLY) case ScmInt: return MAKE_BOOL(SCM_INT_VALUE(obj1) == SCM_INT_VALUE(obj2)); #endif #if (SCM_USE_CHAR && !SCM_HAS_IMMEDIATE_CHAR_ONLY) case ScmChar: return MAKE_BOOL(SCM_CHAR_VALUE(obj1) == SCM_CHAR_VALUE(obj2)); #endif #if SCM_USE_STRING case ScmString: return MAKE_BOOL(STRING_EQUALP(obj1, obj2)); #endif case ScmCons: for (; CONSP(obj1) && CONSP(obj2); obj1 = CDR(obj1), obj2 = CDR(obj2)) { elm1 = CAR(obj1); elm2 = CAR(obj2); if (!EQ(elm1, elm2) && (SCM_TYPE(elm1) != SCM_TYPE(elm2) || !EQUALP(elm1, elm2))) return SCM_FALSE; } /* compare last cdr */ return (EQ(obj1, obj2)) ? SCM_TRUE : scm_p_equalp(obj1, obj2); #if SCM_USE_VECTOR case ScmVector: len = SCM_VECTOR_LEN(obj1); if (len != SCM_VECTOR_LEN(obj2)) return SCM_FALSE; v1 = SCM_VECTOR_VEC(obj1); v2 = SCM_VECTOR_VEC(obj2); for (i = 0; i < len; i++) { elm1 = v1[i]; elm2 = v2[i]; if (!EQ(elm1, elm2) && (SCM_TYPE(elm1) != SCM_TYPE(elm2) || !EQUALP(elm1, elm2))) return SCM_FALSE; } return SCM_TRUE; #endif #if SCM_USE_SSCM_EXTENSIONS case ScmCPointer: return MAKE_BOOL(SCM_C_POINTER_VALUE(obj1) == SCM_C_POINTER_VALUE(obj2)); case ScmCFuncPointer: return MAKE_BOOL(SCM_C_FUNCPOINTER_VALUE(obj1) == SCM_C_FUNCPOINTER_VALUE(obj2)); #endif default: break; } return SCM_FALSE; }