static EEL_xno m_construct(EEL_vm *vm, EEL_classes cid, EEL_value *initv, int initc, EEL_value *result) { EEL_xno x; EEL_value v; EEL_module *m; EEL_object *eo; eel_clean_modules(vm); eo = eel_o_alloc(vm, sizeof(EEL_module), cid); if(!eo) return EEL_XMEMORY; m = o2EEL_module(eo); memset(m, 0, sizeof(EEL_module)); m->id = VMP->state->module_id_counter++; x = eel_o_construct(vm, EEL_CTABLE, NULL, 0, &v); if(x) { eel_o_free(eo); return x; } m->exports = v.objref.v; eel_o2v(result, eo); return 0; }
/*---------------------------------------------------------- IPaddress class ----------------------------------------------------------*/ static EEL_xno ipa_construct(EEL_vm *vm, EEL_types type, EEL_value *initv, int initc, EEL_value *result) { IPaddress *ipa; EEL_object *eo = eel_o_alloc(vm, sizeof(IPaddress), type); if(!eo) return EEL_XMEMORY; ipa = o2IPaddress(eo); switch(initc) { case 0: ipa->host = INADDR_NONE; ipa->port = 9999; break; case 1: if(EEL_TYPE(initv) == md.ipaddress_cid) { IPaddress *src = o2IPaddress(initv->objref.v); memcpy(ipa, src, sizeof(IPaddress)); } else { /* Create server socket */ if(SDLNet_ResolveHost(ipa, NULL, eel_v2l(initv)) != 0) { eel_o_free(eo); return EEL_XDEVICEOPEN; } } break; case 2: { const char *s; switch((EEL_classes)EEL_TYPE(initv)) { case EEL_CSTRING: case EEL_CDSTRING: s = eel_v2s(initv); default: s = NULL; } /* Connect as client */ if(SDLNet_ResolveHost(ipa, s, eel_v2l(initv + 1)) != 0) { eel_o_free(eo); return EEL_XDEVICEOPEN; } break; } default: eel_o_free(eo); return EEL_XARGUMENTS; } eel_o2v(result, eo); return 0; }
static EEL_xno ipa_clone(EEL_vm *vm, const EEL_value *src, EEL_value *dst, EEL_types t) { EEL_object *co = eel_o_alloc(vm, sizeof(IPaddress), t); if(!co) return EEL_XMEMORY; memcpy(o2IPaddress(co), o2IPaddress(src->objref.v), sizeof(IPaddress)); eel_o2v(dst, co); return 0; }
static EEL_xno n2s_construct(EEL_vm *vm, EEL_types type, EEL_value *initv, int initc, EEL_value *result) { REAL_EB_socket *rs; EB_socket *ebs; EEL_object *eo; rs = malloc(sizeof(REAL_EB_socket)); if(!rs) return EEL_XMEMORY; eo = eel_o_alloc(vm, sizeof(EB_socket), type); if(!eo) { free(rs); return EEL_XMEMORY; } ebs = o2EB_socket(eo); ebs->rs = rs; rs->pollperiod = 50; rs->sender = NULL; rs->fifo.buffer = NULL; rs->closed = 0; rs->status = EEL_XOK; switch(initc) { case 1: if(initv->type == EEL_TINTEGER) { rs->n2socket = eel_v2l(initv); if(rs->n2socket > NET2_MAX_SOCKETS) { eel_o_free(eo); return EEL_XHIGHINDEX; } } else { IPaddress *ipa; if(EEL_TYPE(initv) != md.ipaddress_cid) { eel_o_free(eo); return EEL_XWRONGTYPE; } ipa = o2IPaddress(initv->objref.v); rs->n2socket = NET2_TCPConnectToIP(ipa); if(rs->n2socket < 0) { eel_o_free(eo); return EEL_XDEVICEOPEN; } } break; case 2: rs->n2socket = NET2_TCPConnectTo(eel_v2s(initv), eel_v2l(initv + 1)); if(rs->n2socket < 0) { eel_o_free(eo); return EEL_XDEVICEOPEN; } break; default: eel_o_free(eo); return EEL_XARGUMENTS; } if(eb_sockets && (rs->n2socket >= 0)) eb_sockets[rs->n2socket] = eo; eel_o2v(result, eo); return 0; }