| /* |
| ** strlib.c |
| ** String library to LUA |
| */ |
| |
| char *rcs_strlib="$Id: strlib.c,v 1.11 1995/02/02 20:05:37 roberto Exp roberto $"; |
| |
| #include <string.h> |
| #include <stdlib.h> |
| #include <ctype.h> |
| |
| #include "lua.h" |
| #include "lualib.h" |
| |
| |
| static char *newstring (lua_Object o) |
| { |
| char *s = lua_getstring(o); |
| char *ns = (char *)malloc(strlen(s)+1); |
| if (ns == 0) |
| lua_error("not enough memory for new string"); |
| strcpy(ns, s); |
| return ns; |
| } |
| |
| |
| /* |
| ** 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 = newstring(o1); |
| start = lua_getnumber (o2); |
| end = o3 == LUA_NOOBJECT ? strlen(s) : lua_getnumber (o3); |
| if (end < start || start < 1 || end > strlen(s)) |
| lua_pushliteral(""); |
| else |
| { |
| s[end] = 0; |
| lua_pushstring (&s[start-1]); |
| } |
| 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 = newstring(o); |
| while (*c != 0) |
| { |
| *c = tolower(*c); |
| c++; |
| } |
| lua_pushstring(s); |
| 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 = newstring(o); |
| while (*c != 0) |
| { |
| *c = toupper(*c); |
| c++; |
| } |
| lua_pushstring(s); |
| 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); |
| } |