static int str_replace(lua_State *L) { size_t l1, l2, l3; const char *src = luaL_checklstring(L, 1, &l1); const char *p = luaL_checklstring(L, 2, &l2); const char *p2 = luaL_checklstring(L, 3, &l3); int init = luaL_optinteger(L, 4, 1) - 1; const char *s2; int n = 0; TBuffer b; buffer_init (&b, l1, L); if (init > 0) { buffer_addlstring(&b, src, init); } while (1) { s2 = lmemfind(src+init, l1-init, p, l2); if (s2) { buffer_addlstring(&b, src+init, s2-(src+init)); buffer_addlstring(&b, p2, l3); init = init + (s2-(src+init)) + l2; n++; } else { buffer_addlstring(&b, src+init, l1-init); break; } } buffer_pushresult(&b); buffer_free (&b); lua_pushnumber(L, (lua_Number)n); /* number of substitutions */ return 2; }
void bufferZ_addlstring (TBuffer *buf, const void *src, size_t len) { int n; size_t header[2] = { ID_STRING }; header[1] = len; buffer_addlstring (buf, header, sizeof (header)); buffer_addlstring (buf, src, len); n = len % N_ALIGN; if (n) buffer_addlstring (buf, NULL, N_ALIGN - n); }
void bufferZ_addnum (TBuffer *buf, size_t num) { size_t header[2] = { ID_NUMBER }; header[1] = num; buffer_addlstring (buf, header, sizeof (header)); }
void buffer_addvalue (TBuffer *buf, int stackpos) { size_t len; const char *p = lua_tolstring (buf->L, stackpos, &len); buffer_addlstring (buf, p, len); }
void buffer_addbuffer (TBuffer *trg, TBuffer *src) { buffer_addlstring (trg, src->arr, src->top); }