示例#1
0
void buildin_tcp_bind(fake * fk, interpreter * inter)
{
    int port = fkpspop<int>(fk);
    const char * ip = fkpspopcstrptr(fk);
    int s = fkpspop<int>(fk);
    
	sockaddr_in _sockaddr;
	memset(&_sockaddr, 0, sizeof(_sockaddr));
	_sockaddr.sin_family = AF_INET;
	_sockaddr.sin_port = htons(port);
	_sockaddr.sin_addr.s_addr = inet_addr(ip);
	int ret = ::bind(s, (const sockaddr *)&_sockaddr, sizeof(_sockaddr));
	if (ret != 0)
    {
        fkpspush<bool>(fk, false);
    }
    else
    {
        fkpspush<bool>(fk, true);
    }
}
示例#2
0
// replace
void buildin_string_replace(fake * fk, interpreter * inter)
{
	BIF_CHECK_ARG_NUM(3);

	const char * tostr = fkpspopcstrptr(fk);
	const char * fromstr = fkpspopcstrptr(fk);
	const char * str = fkpspopcstrptr(fk);

	if (!tostr || !fromstr || !str)
	{
		fkpspush<const char *>(fk, "");
		return;
	}
	
	int str_size = strlen(str);
	int from_size = strlen(fromstr);
	int to_size = strlen(tostr);

	if (from_size == 0)
	{
		fkpspush<const char *>(fk, str);
		return;
	}

	char * tmpbuff = 0;

	int delta = to_size - from_size;
	if (delta == 0)
	{
		tmpbuff = (char *)safe_fkmalloc(fk, str_size + 1, emt_tmp);
		memcpy(tmpbuff, str, str_size);
		tmpbuff[str_size] = 0;
			
		int pos = 0;
		const char * find = strstr(tmpbuff + pos, fromstr);
		while (find)
		{
	        memcpy((void*)find, tostr, to_size);
			pos = find - tmpbuff + to_size;
			find = strstr(tmpbuff + pos, fromstr);
		}
	}
	else
	{
		int num = 0;
		
		int pos = 0;
		const char * find = strstr(str + pos, fromstr);
		while (find)
		{
			num++;
			pos = find - str + from_size;
			find = strstr(str + pos, fromstr);
		}

		if (num >= 0)
		{
			int new_str_size = str_size + num * delta + 1;
			tmpbuff = (char *)safe_fkmalloc(fk, new_str_size, emt_tmp);
			tmpbuff[str_size + num * delta] = 0;
		
			char * pbuff = tmpbuff;
			
			int pos = 0;
			const char * find = strstr(str + pos, fromstr);
			while (find)
			{
				int skip_size = find - str - pos;
				if (skip_size > 0)
				{
					memcpy(pbuff, str + pos, skip_size);
					pbuff += skip_size;
				}

				memcpy(pbuff, tostr, to_size);
				pbuff += to_size;
			
				pos = find - str + from_size;
				find = strstr(str + pos, fromstr);
			}

			if (pos < str_size)
			{
				memcpy(pbuff, str + pos, str_size - pos);
			}			
		}
		else
		{
			fkpspush<const char *>(fk, str);
			return;
		}
	}
	
	fkpspush<const char *>(fk, tmpbuff);
	safe_fkfree(fk, tmpbuff);
}
示例#3
0
// isfunc
void buildin_isfunc(fake * fk, interpreter * inter)
{
	const char * str = fkpspopcstrptr(fk);
	bool ret = fkisfunc(fk, str);
	fkpspush<bool>(fk, ret);
}
示例#4
0
// dostring
void buildin_dostring(fake * fk, interpreter * inter)
{
	const char * str = fkpspopcstrptr(fk);
	bool ret = fkparsestr(fk, str);
	fkpspush<bool>(fk, ret);
}
示例#5
0
// dofile
void buildin_dofile(fake * fk, interpreter * inter)
{
	const char * file = fkpspopcstrptr(fk);
	bool ret = fkparse(fk, file);
	fkpspush<bool>(fk, ret);
}
示例#6
0
// dumpfunc
void buildin_dumpfunc(fake * fk, interpreter * inter)
{
	const char * func = fkpspopcstrptr(fk);
	const char * str = fk->bin.dump(func).c_str();
	fkpspush<const char *>(fk, str);
}