/* ** strlib.c ** String library to LUA */ char *rcs_strlib="$Id: strlib.c,v 1.8 1995/01/06 20:31:10 roberto Exp roberto $"; #include #include #include "mem.h" #include "lua.h" #include "lualib.h" /* ** Return the position of the first caracter of a substring into a string ** LUA interface: ** n = strfind (string, substring, init, end) */ 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); if (f != NULL) { int pos = f-s1+1; if (o4 == 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) lua_pushnumber (pos); else lua_pushnil(); } else lua_pushnil(); } /* ** Return the string length ** LUA interface: ** n = strlen (string) */ 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))); } /* ** Return the substring of a string, from start to end ** LUA interface: ** substring = strsub (string, start, end) */ 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 = lua_copystring(o1); start = lua_getnumber (o2); end = o3 == NULL ? strlen(s) : lua_getnumber (o3); if (end < start || start < 1 || end > strlen(s)) lua_pushliteral(""); else { s[end] = 0; lua_pushstring (&s[start-1]); } luaI_free(s); } /* ** Convert a string to lower case. ** LUA interface: ** lowercase = strlower (string) */ static void str_lower (void) { char *s, *c; lua_Object o = lua_getparam (1); if (!lua_isstring(o)) lua_error ("incorrect arguments to function `strlower'"); c = s = luaI_strdup(lua_getstring(o)); while (*c != 0) { *c = tolower(*c); c++; } lua_pushstring(s); luaI_free(s); } /* ** Convert a string to upper case. ** LUA interface: ** uppercase = strupper (string) */ 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 = luaI_strdup(lua_getstring(o)); while (*c != 0) { *c = toupper(*c); c++; } lua_pushstring(s); luaI_free(s); } /* ** Open string library */ void strlib_open (void) { lua_register ("strfind", str_find); lua_register ("strlen", str_len); lua_register ("strsub", str_sub); lua_register ("strlower", str_lower); lua_register ("strupper", str_upper); }