summaryrefslogtreecommitdiff
path: root/strlib.c
blob: 12f9dcbfe4e5fe566eb2aa74b1a9b30b47242770 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
** strlib.c
** String library to LUA
*/

char *rcs_strlib="$Id: strlib.c,v 1.13 1995/10/09 12:49:21 roberto Exp roberto $";

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include "lua.h"
#include "lualib.h"


void lua_arg_error(char *funcname)
{
  char buff[100];
  sprintf(buff, "incorrect arguments to function `%s'", funcname);
  lua_error(buff);
}

char *lua_check_string (int numArg, char *funcname)
{
  lua_Object o = lua_getparam(numArg);
  if (!(lua_isstring(o) || lua_isnumber(o)))
    lua_arg_error(funcname);
  return lua_getstring(o);
}

float lua_check_number (int numArg, char *funcname)
{
  lua_Object o = lua_getparam(numArg);
  if (!lua_isnumber(o))
    lua_arg_error(funcname);
  return lua_getnumber(o);
}

static char *newstring (char *s)
{
  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 = lua_check_string(1, "strfind");
 char *s2 = lua_check_string(2, "strfind");
 int init = (lua_getparam(3) == LUA_NOOBJECT) ? 0 :
                                 (int)lua_check_number(3, "strfind")-1;
 char *f = strstr(s1+init,s2);
 if (f != NULL)
 {
  int pos = f-s1+1;
  if (lua_getparam (4) == LUA_NOOBJECT)
   lua_pushnumber (pos);
  else if ((int)lua_check_number(4, "strfind") >= 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)
{
 char *s = lua_check_string(1, "strlen");
 lua_pushnumber(strlen(s));
}


/*
** Return the substring of a string, from start to end
** LUA interface:
**			substring = strsub (string, start, end)
*/
static void str_sub (void)
{
 char *s = lua_check_string(1, "strsub");
 int start = (int)lua_check_number(2, "strsub");
 int end = (lua_getparam(3) == LUA_NOOBJECT) ? strlen(s) :
                                    (int)lua_check_number(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;
 }
}

/*
** Convert a string according to given function.
*/
typedef int (*strfunc)(int s);
static void str_apply (strfunc f, char *funcname)
{
 char *s, *c;
 c = s = newstring(lua_check_string(1, funcname));
 while (*c != 0)
 {
  *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");
}


/*
** Convert a string to upper case.
** LUA interface:
**			uppercase = strupper (string)
*/
static void str_upper (void)
{
  str_apply(toupper, "strupper");
}

/*
** get ascii value of a character in a string
*/
static void str_ascii (void)
{
  char *s = lua_check_string(1, "ascii");
  lua_Object o2 = lua_getparam(2);
  int pos;
  pos = (o2 == LUA_NOOBJECT) ? 0 : (int)lua_check_number(2, "ascii")-1;
  if (pos<0 || pos>=strlen(s))
    lua_arg_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] = (int)lua_check_number(i, "int2str");
  }
  s[i-1] = 0;
  lua_pushstring(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);
 lua_register ("ascii", str_ascii);
 lua_register ("int2str", str_int2str);
}