From ae808860ae57ac5287e6950895cf45378cc90235 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 9 Oct 1995 09:49:21 -0300 Subject: new functions: "ascii" and "int2str", small "re-engineering" on parameter checking. --- strlib.c | 159 ++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 92 insertions(+), 67 deletions(-) diff --git a/strlib.c b/strlib.c index 329a7937..12e696a2 100644 --- a/strlib.c +++ b/strlib.c @@ -3,9 +3,10 @@ ** String library to LUA */ -char *rcs_strlib="$Id: strlib.c,v 1.11 1995/02/02 20:05:37 roberto Exp roberto $"; +char *rcs_strlib="$Id: strlib.c,v 1.12 1995/02/06 19:37:51 roberto Exp $"; #include +#include #include #include @@ -13,9 +14,31 @@ char *rcs_strlib="$Id: strlib.c,v 1.11 1995/02/02 20:05:37 roberto Exp roberto $ #include "lualib.h" -static char *newstring (lua_Object o) +static void str_error(char *funcname) +{ + char buff[250]; + sprintf(buff, "incorrect arguments to function `%s'", funcname); + lua_error(buff); +} + +static char *check_and_get_string (int numArg, char *funcname) +{ + lua_Object o = lua_getparam(numArg); + if (!(lua_isstring(o) || lua_isnumber(o))) + str_error(funcname); + return lua_getstring(o); +} + +static int check_and_get_int (int numArg, char *funcname) +{ + lua_Object o = lua_getparam(numArg); + if (!lua_isnumber(o)) + str_error(funcname); + return (int)lua_getnumber(o); +} + +static char *newstring (char *s) { - char *s = lua_getstring(o); char *ns = (char *)malloc(strlen(s)+1); if (ns == 0) lua_error("not enough memory for new string"); @@ -31,34 +54,17 @@ static char *newstring (lua_Object o) */ static void str_find (void) { - char *s1, *s2, *f; - int init; - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - lua_Object o3 = lua_getparam (3); - lua_Object o4 = lua_getparam (4); - if (!lua_isstring(o1) || !lua_isstring(o2)) - lua_error ("incorrect arguments to function `strfind'"); - if (o3 == LUA_NOOBJECT) - init = 0; - else if (lua_isnumber(o3)) - init = lua_getnumber(o3)-1; - else - { - lua_error ("incorrect arguments to function `strfind'"); - return; /* to avoid warnings */ - } - s1 = lua_getstring(o1); - s2 = lua_getstring(o2); - f = strstr(s1+init,s2); + char *s1 = check_and_get_string(1, "strfind"); + char *s2 = check_and_get_string(2, "strfind"); + int init = (lua_getparam(3) == LUA_NOOBJECT) ? 0 : + check_and_get_int(3, "strfind")-1; + char *f = strstr(s1+init,s2); if (f != NULL) { int pos = f-s1+1; - if (o4 == LUA_NOOBJECT) + if (lua_getparam (4) == LUA_NOOBJECT) lua_pushnumber (pos); - else if (!lua_isnumber(o4)) - lua_error ("incorrect arguments to function `strfind'"); - else if ((int)lua_getnumber(o4) >= pos+strlen(s2)-1) + else if (check_and_get_int(4, "strfind") >= pos+strlen(s2)-1) lua_pushnumber (pos); else lua_pushnil(); @@ -74,10 +80,8 @@ static void str_find (void) */ static void str_len (void) { - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlen'"); - lua_pushnumber(strlen(lua_getstring(o))); + char *s = check_and_get_string(1, "strlen"); + lua_pushnumber(strlen(s)); } @@ -88,48 +92,47 @@ static void str_len (void) */ static void str_sub (void) { - int start, end; - char *s; - lua_Object o1 = lua_getparam (1); - lua_Object o2 = lua_getparam (2); - lua_Object o3 = lua_getparam (3); - if (!lua_isstring(o1) || !lua_isnumber(o2)) - lua_error ("incorrect arguments to function `strsub'"); - if (o3 != LUA_NOOBJECT && !lua_isnumber(o3)) - lua_error ("incorrect third argument to function `strsub'"); - s = newstring(o1); - start = lua_getnumber (o2); - end = o3 == LUA_NOOBJECT ? strlen(s) : lua_getnumber (o3); + char *s = check_and_get_string(1, "strsub"); + int start = check_and_get_int(2, "strsub"); + int end = (lua_getparam(3) == LUA_NOOBJECT) ? strlen(s) : + check_and_get_int(3, "strsub"); if (end < start || start < 1 || end > strlen(s)) lua_pushliteral(""); else { + char temp = s[end]; s[end] = 0; lua_pushstring (&s[start-1]); + s[end] = temp; } - free(s); } /* -** Convert a string to lower case. -** LUA interface: -** lowercase = strlower (string) +** Convert a string according to given function. */ -static void str_lower (void) +typedef int (*strfunc)(int s); +static void str_apply (strfunc f, char *funcname) { char *s, *c; - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlower'"); - c = s = newstring(o); + c = s = newstring(check_and_get_string(1, funcname)); while (*c != 0) { - *c = tolower(*c); + *c = f(*c); c++; } lua_pushstring(s); free(s); -} +} + +/* +** Convert a string to lower case. +** LUA interface: +** lowercase = strlower (string) +*/ +static void str_lower (void) +{ + str_apply(tolower, "strlower"); +} /* @@ -139,20 +142,40 @@ static void str_lower (void) */ static void str_upper (void) { - char *s, *c; - lua_Object o = lua_getparam (1); - if (!lua_isstring(o)) - lua_error ("incorrect arguments to function `strlower'"); - c = s = newstring(o); - while (*c != 0) - { - *c = toupper(*c); - c++; - } - lua_pushstring(s); - free(s); -} + str_apply(toupper, "strupper"); +} +/* +** get ascii value of a character in a string +*/ +static void str_ascii (void) +{ + char *s = check_and_get_string(1, "ascii"); + lua_Object o2 = lua_getparam(2); + int pos; + pos = (o2 == LUA_NOOBJECT) ? 0 : check_and_get_int(2, "ascii")-1; + if (pos<0 || pos>=strlen(s)) + str_error("ascii"); + lua_pushnumber(s[pos]); +} + +/* +** converts one or more integers to chars in a string +*/ +#define maxparams 50 +static void str_int2str (void) +{ + char s[maxparams+1]; + int i = 0; + while (lua_getparam(++i) != LUA_NOOBJECT) + { + if (i > maxparams) + lua_error("too many parameters to function `int2str'"); + s[i-1] = check_and_get_int(i, "int2str"); + } + s[i-1] = 0; + lua_pushstring(s); +} /* ** Open string library @@ -164,4 +187,6 @@ void strlib_open (void) lua_register ("strsub", str_sub); lua_register ("strlower", str_lower); lua_register ("strupper", str_upper); + lua_register ("ascii", str_ascii); + lua_register ("int2str", str_int2str); } -- cgit v1.2.3-55-g6feb