SCM scm_from_ip_addr_number(struct ip_addr const *ip) { if (ip->family == AF_INET) { return scm_from_uint32(ntohl(ip->u.v4.s_addr)); } else { uint32_t w4, w3, w2, w1; memcpy(&w4, ((char *)ip->u.v6.s6_addr)+0*sizeof(w4), sizeof(w4)); memcpy(&w3, ((char *)ip->u.v6.s6_addr)+1*sizeof(w4), sizeof(w3)); memcpy(&w2, ((char *)ip->u.v6.s6_addr)+2*sizeof(w4), sizeof(w2)); memcpy(&w1, ((char *)ip->u.v6.s6_addr)+3*sizeof(w4), sizeof(w1)); uint64_t hi = ((uint64_t)ntohl(w4) << 32ULL) | ntohl(w3); uint64_t lo = ((uint64_t)ntohl(w2) << 32ULL) | ntohl(w1); return scm_logior(scm_ash(scm_from_uint64(hi), scm_from_uint(64)), scm_from_uint64(lo)); } }
// While we are at it, convert from eth addr to SCM (as a uint64!) SCM scm_from_eth_addr(unsigned char const addr[ETH_ADDR_LEN]) { # define A(idx, loc) (((uint64_t)addr[idx])<<((loc)*8)) uint64_t const v = A(0,5) | A(1,4) | A(2,3) | A(3,2) | A(4,1) | A(5,0); return scm_from_uint64(v); # undef A }
SCM script_ogre_create_child_scene_node(SCM s_parent, SCM s_name) { void *parent = (void*)scm_to_uint64(s_parent); const char *name = scm_to_locale_string(s_name); uint64_t ret = ogre_create_child_scene_node(parent, name); return scm_from_uint64(ret); }
SCM script_ogre_create_entity(SCM s_name, SCM s_mesh_path) { const char *name = scm_to_locale_string(s_name), *mesh_path = scm_to_locale_string(s_mesh_path); uint64_t ret = ogre_create_entity(name, mesh_path); return scm_from_uint64(ret); }
static SCM guileAddPropertyListener(SCM element, SCM keySymbol, SCM callback) { char* key = scm_to_utf8_string(scm_symbol_to_string(keySymbol)); guihckElementId listenerId = guihckStackGetElement(threadLocalContext.ctx); guihckPropertyListenerId id = guihckElementAddListener(threadLocalContext.ctx, listenerId, scm_to_uint64(element), key, guilePropertyListenerCallback, callback, guilePropertyListenerFreeCallback); scm_gc_protect_object(callback); free(key); return scm_from_uint64(id); }
SCM guileGetElement() { guihckElementId id = guihckStackGetElement(threadLocalContext.ctx); return scm_from_uint64(id); }
SCM script_ogre_create_light(SCM s_name) { const char *name = scm_to_locale_string(s_name); uint64_t ret = ogre_create_light(name); return scm_from_uint64(ret); }
SCM script_ogre_get_root_scene_node() { uint64_t ret = ogre_get_root_scene_node(); return scm_from_uint64(ret); }
SCM script_ogre_get_scene_mgr() { uint64_t ret = ogre_get_scene_mgr(); return scm_from_uint64(ret); }