Esempio n. 1
0
static EEL_xno n2_tcp_read(EEL_vm *vm)
{
	EEL_value *args = vm->heap + vm->argv;
	EB_socket *ebs;
	EEL_object *so;
	int count;
	char buf[258];
	if(EEL_TYPE(args) != md.net2_socket_cid)
		return EEL_XWRONGTYPE;
	ebs = o2EB_socket(args->objref.v);
	if(!ebs->rs)
		return EEL_XDEVICECLOSED;
	count = NET2_TCPRead(ebs->rs->n2socket, buf, sizeof(buf) - 1);
	if(!count)
	{
		eel_nil2v(vm->heap + vm->resv);
		return 0;
	}
	buf[count] = 0;
	so = eel_ds_nnew(vm, buf, count);
	if(!so)
		return EEL_XMEMORY;
	eel_o2v(vm->heap + vm->resv, so);
	return 0;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
static EEL_xno eb_version(EEL_vm *vm)
{
	EEL_object *a;
	EEL_value v;
	EEL_xno x = eel_o_construct(vm, EEL_CARRAY, NULL, 0, &v);
	if(x)
		return x;
	a = v.objref.v;
	eel_l2v(&v, EEL_MAJOR_VERSION);
	x = eel_setlindex(a, 0, &v);
	if(!x)
	{
		eel_l2v(&v, EEL_MINOR_VERSION);
		x = eel_setlindex(a, 1, &v);
		if(!x)
		{
			eel_l2v(&v, EEL_MICRO_VERSION);
			x = eel_setlindex(a, 2, &v);
		}
	}
	if(x)
	{
		eel_disown(a);
		return x;
	}
	eel_o2v(vm->heap + vm->resv, a);
	return 0;
}
Esempio n. 4
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;
}
Esempio n. 5
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;
}
Esempio n. 6
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;
}