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); } }
// 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); }
// isfunc void buildin_isfunc(fake * fk, interpreter * inter) { const char * str = fkpspopcstrptr(fk); bool ret = fkisfunc(fk, str); fkpspush<bool>(fk, ret); }
// dostring void buildin_dostring(fake * fk, interpreter * inter) { const char * str = fkpspopcstrptr(fk); bool ret = fkparsestr(fk, str); fkpspush<bool>(fk, ret); }
// dofile void buildin_dofile(fake * fk, interpreter * inter) { const char * file = fkpspopcstrptr(fk); bool ret = fkparse(fk, file); fkpspush<bool>(fk, ret); }
// 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); }