new arguments for gsub

This commit is contained in:
Roberto Ierusalimschy 1997-06-18 17:15:47 -03:00
parent 6b78040840
commit ea98620d98
1 changed files with 9 additions and 28 deletions

View File

@ -3,7 +3,7 @@
** String library to LUA
*/
char *rcs_strlib="$Id: strlib.c,v 1.41 1997/04/06 14:17:06 roberto Exp roberto $";
char *rcs_strlib="$Id: strlib.c,v 1.42 1997/06/16 20:29:59 roberto Exp roberto $";
#include <string.h>
#include <stdio.h>
@ -69,28 +69,6 @@ static void addstr (char *s)
addnchar(s, strlen(s));
}
/*
** Interface to strtok
*/
static void str_tok (void)
{
char *s1 = luaL_check_string(1);
char *del = luaL_check_string(2);
lua_Object t = lua_createtable();
int i = 1;
/* As strtok changes s1, and s1 is "constant", make a copy of it */
s1 = strcpy(strbuffer(strlen(s1+1)), s1);
while ((s1 = strtok(s1, del)) != NULL) {
lua_pushobject(t);
lua_pushnumber(i++);
lua_pushstring(s1);
lua_settable();
s1 = NULL; /* prepare for next strtok */
}
lua_pushobject(t);
lua_pushnumber(i-1); /* total number of tokens */
}
/*
** Return the string length
@ -306,7 +284,7 @@ static char *match (char *s, char *p, int level)
return res;
}
case ESC:
if (isdigit((unsigned char)*(p+1))) { /* capture */
if (isdigit((unsigned char)(*(p+1)))) { /* capture */
int l = check_cap(*(p+1), level);
if (strncmp(capture[l].init, s, capture[l].len) == 0) {
/* return match(p+2, s+capture[l].len, level); */
@ -394,7 +372,7 @@ static void str_find (void)
}
}
static void add_s (lua_Object newp)
static void add_s (lua_Object newp, lua_Object table, int n)
{
if (lua_isstring(newp)) {
char *news = lua_getstring(newp);
@ -411,7 +389,10 @@ static void add_s (lua_Object newp)
lua_Object res;
struct lbuff oldbuff;
lua_beginblock();
if (lua_istable(table))
lua_pushobject(table);
push_captures();
lua_pushnumber(n);
/* function may use lbuffer, so save it and create a new one */
oldbuff = lbuffer;
lbuffer.b = NULL; lbuffer.max = lbuffer.size = 0;
@ -431,15 +412,16 @@ static void str_gsub (void)
char *src = luaL_check_string(1);
char *p = luaL_check_string(2);
lua_Object newp = lua_getparam(3);
int max_s = (int)luaL_opt_number(4, strlen(src)+1);
lua_Object table = lua_getparam(4);
int max_s = (int)luaL_opt_number(lua_istable(table)?5:4, strlen(src)+1);
int anchor = (*p == '^') ? (p++, 1) : 0;
int n = 0;
luaI_emptybuff();
while (n < max_s) {
char *e = match(src, p, 0);
if (e) {
add_s(newp);
n++;
add_s(newp, table, n);
}
if (e && e>src) /* non empty match? */
src = e; /* skip it */
@ -527,7 +509,6 @@ static void str_format (void)
static struct luaL_reg strlib[] = {
{"strtok", str_tok},
{"strlen", str_len},
{"strsub", str_sub},
{"strset", str_set},