mirror of https://github.com/rusefi/lua.git
new (internal?) functions to manipulate userdata
This commit is contained in:
parent
9e9e2ea287
commit
264f8c5e7b
47
iolib.c
47
iolib.c
|
@ -116,7 +116,7 @@ static void io_read (void)
|
||||||
char *p = luaL_opt_string(1, "[^\n]*{\n}", "read");
|
char *p = luaL_opt_string(1, "[^\n]*{\n}", "read");
|
||||||
int inskip = 0; /* to control {skips} */
|
int inskip = 0; /* to control {skips} */
|
||||||
int c = NEED_OTHER;
|
int c = NEED_OTHER;
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (*p == '{') {
|
if (*p == '{') {
|
||||||
inskip++;
|
inskip++;
|
||||||
|
@ -129,10 +129,10 @@ static void io_read (void)
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char *ep = item_end(p); /* get what is next */
|
char *ep = luaL_item_end(p); /* get what is next */
|
||||||
int m; /* match result */
|
int m; /* match result */
|
||||||
if (c == NEED_OTHER) c = getc(lua_infile);
|
if (c == NEED_OTHER) c = getc(lua_infile);
|
||||||
m = (c == EOF) ? 0 : singlematch((char)c, p);
|
m = (c == EOF) ? 0 : luaL_singlematch((char)c, p);
|
||||||
if (m) {
|
if (m) {
|
||||||
if (inskip == 0) luaI_addchar(c);
|
if (inskip == 0) luaI_addchar(c);
|
||||||
c = NEED_OTHER;
|
c = NEED_OTHER;
|
||||||
|
@ -277,6 +277,45 @@ static void errorfb (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* --------------------------------------------
|
||||||
|
* functions to manipulate userdata
|
||||||
|
*/
|
||||||
|
static void getbyte (void)
|
||||||
|
{
|
||||||
|
lua_Object ud = lua_getparam(1);
|
||||||
|
int i = luaL_check_number(2, "getbyte")-1;
|
||||||
|
luaL_arg_check(lua_isuserdata(ud), "getbyte", 1, "userdata expected");
|
||||||
|
luaL_arg_check(0 <= i && i < lua_getbindatasize(ud), "getbyte", 2,
|
||||||
|
"out of range");
|
||||||
|
lua_pushnumber(*(((char *)lua_getbinarydata(ud))+i));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void createuserdata (void)
|
||||||
|
{
|
||||||
|
lua_Object t = lua_getparam(1);
|
||||||
|
int tag = luaL_opt_number(2, 0, "createud");
|
||||||
|
int i;
|
||||||
|
luaI_emptybuff();
|
||||||
|
luaL_arg_check(lua_istable(t), "createud", 1, "table expected");
|
||||||
|
for (i=0; ; i++) {
|
||||||
|
lua_Object o;
|
||||||
|
lua_beginblock();
|
||||||
|
lua_pushobject(t);
|
||||||
|
lua_pushnumber(i+1);
|
||||||
|
o = lua_basicindex();
|
||||||
|
if (lua_isnil(o)) {
|
||||||
|
lua_endblock();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
luaL_arg_check(lua_isnumber(o), "createud", 1,
|
||||||
|
"table values must be numbers");
|
||||||
|
luaI_addchar(lua_getnumber(o));
|
||||||
|
lua_endblock();
|
||||||
|
}
|
||||||
|
lua_pushbinarydata(luaI_addchar(0), i, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct luaL_reg iolib[] = {
|
static struct luaL_reg iolib[] = {
|
||||||
{"readfrom", io_readfrom},
|
{"readfrom", io_readfrom},
|
||||||
{"writeto", io_writeto},
|
{"writeto", io_writeto},
|
||||||
|
@ -291,6 +330,8 @@ static struct luaL_reg iolib[] = {
|
||||||
{"date", io_date},
|
{"date", io_date},
|
||||||
{"exit", io_exit},
|
{"exit", io_exit},
|
||||||
{"debug", io_debug},
|
{"debug", io_debug},
|
||||||
|
{"getbyte", getbyte},
|
||||||
|
{"createud", createuserdata},
|
||||||
{"print_stack", errorfb}
|
{"print_stack", errorfb}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
7
lualib.h
7
lualib.h
|
@ -2,7 +2,7 @@
|
||||||
** Libraries to be used in LUA programs
|
** Libraries to be used in LUA programs
|
||||||
** Grupo de Tecnologia em Computacao Grafica
|
** Grupo de Tecnologia em Computacao Grafica
|
||||||
** TeCGraf - PUC-Rio
|
** TeCGraf - PUC-Rio
|
||||||
** $Id: lualib.h,v 1.11 1997/03/17 17:01:10 roberto Exp roberto $
|
** $Id: lualib.h,v 1.12 1997/03/18 15:30:50 roberto Exp roberto $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef lualib_h
|
#ifndef lualib_h
|
||||||
|
@ -19,10 +19,11 @@ void mathlib_open (void);
|
||||||
/* auxiliar functions (private) */
|
/* auxiliar functions (private) */
|
||||||
|
|
||||||
char *luaI_addchar (int c);
|
char *luaI_addchar (int c);
|
||||||
|
void luaI_emptybuff (void);
|
||||||
void luaI_addquoted (char *s);
|
void luaI_addquoted (char *s);
|
||||||
|
|
||||||
char *item_end (char *p);
|
char *luaL_item_end (char *p);
|
||||||
int singlematch (int c, char *p);
|
int luaL_singlematch (int c, char *p);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
44
strlib.c
44
strlib.c
|
@ -3,7 +3,7 @@
|
||||||
** String library to LUA
|
** String library to LUA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *rcs_strlib="$Id: strlib.c,v 1.36 1997/03/17 17:01:10 roberto Exp roberto $";
|
char *rcs_strlib="$Id: strlib.c,v 1.37 1997/03/18 15:30:50 roberto Exp roberto $";
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -24,7 +24,7 @@ struct lbuff {
|
||||||
static struct lbuff lbuffer = {NULL, 0, 0};
|
static struct lbuff lbuffer = {NULL, 0, 0};
|
||||||
|
|
||||||
|
|
||||||
static char *lua_strbuffer (unsigned long size)
|
static char *luaL_strbuffer (unsigned long size)
|
||||||
{
|
{
|
||||||
if (size > lbuffer.max) {
|
if (size > lbuffer.max) {
|
||||||
/* ANSI "realloc" doesn't need this test, but some machines (Sun!)
|
/* ANSI "realloc" doesn't need this test, but some machines (Sun!)
|
||||||
|
@ -39,20 +39,24 @@ static char *lua_strbuffer (unsigned long size)
|
||||||
|
|
||||||
static char *openspace (unsigned long size)
|
static char *openspace (unsigned long size)
|
||||||
{
|
{
|
||||||
char *buff = lua_strbuffer(lbuffer.size+size);
|
char *buff = luaL_strbuffer(lbuffer.size+size);
|
||||||
return buff+lbuffer.size;
|
return buff+lbuffer.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *luaI_addchar (int c)
|
char *luaI_addchar (int c)
|
||||||
{
|
{
|
||||||
if (lbuffer.size >= lbuffer.max)
|
if (lbuffer.size >= lbuffer.max)
|
||||||
lua_strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2);
|
luaL_strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2);
|
||||||
lbuffer.b[lbuffer.size++] = c;
|
lbuffer.b[lbuffer.size++] = c;
|
||||||
if (c == 0)
|
|
||||||
lbuffer.size = 0; /* prepare for next string */
|
|
||||||
return lbuffer.b;
|
return lbuffer.b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void luaI_emptybuff (void)
|
||||||
|
{
|
||||||
|
lbuffer.size = 0; /* prepare for next string */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void addnchar (char *s, int n)
|
static void addnchar (char *s, int n)
|
||||||
{
|
{
|
||||||
char *b = openspace(n);
|
char *b = openspace(n);
|
||||||
|
@ -75,7 +79,7 @@ static void str_tok (void)
|
||||||
lua_Object t = lua_createtable();
|
lua_Object t = lua_createtable();
|
||||||
int i = 1;
|
int i = 1;
|
||||||
/* As strtok changes s1, and s1 is "constant", make a copy of it */
|
/* As strtok changes s1, and s1 is "constant", make a copy of it */
|
||||||
s1 = strcpy(lua_strbuffer(strlen(s1+1)), s1);
|
s1 = strcpy(luaL_strbuffer(strlen(s1+1)), s1);
|
||||||
while ((s1 = strtok(s1, del)) != NULL) {
|
while ((s1 = strtok(s1, del)) != NULL) {
|
||||||
lua_pushobject(t);
|
lua_pushobject(t);
|
||||||
lua_pushnumber(i++);
|
lua_pushnumber(i++);
|
||||||
|
@ -105,7 +109,7 @@ static void str_sub (void)
|
||||||
long start = (long)luaL_check_number(2, "strsub");
|
long start = (long)luaL_check_number(2, "strsub");
|
||||||
long end = (long)luaL_opt_number(3, strlen(s), "strsub");
|
long end = (long)luaL_opt_number(3, strlen(s), "strsub");
|
||||||
if (1 <= start && start <= end && end <= strlen(s)) {
|
if (1 <= start && start <= end && end <= strlen(s)) {
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
addnchar(s+start-1, end-start+1);
|
addnchar(s+start-1, end-start+1);
|
||||||
lua_pushstring(luaI_addchar(0));
|
lua_pushstring(luaI_addchar(0));
|
||||||
}
|
}
|
||||||
|
@ -118,7 +122,7 @@ static void str_sub (void)
|
||||||
static void str_lower (void)
|
static void str_lower (void)
|
||||||
{
|
{
|
||||||
char *s = luaL_check_string(1, "strlower");
|
char *s = luaL_check_string(1, "strlower");
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
while (*s)
|
while (*s)
|
||||||
luaI_addchar(tolower((unsigned char)*s++));
|
luaI_addchar(tolower((unsigned char)*s++));
|
||||||
lua_pushstring(luaI_addchar(0));
|
lua_pushstring(luaI_addchar(0));
|
||||||
|
@ -130,7 +134,7 @@ static void str_lower (void)
|
||||||
static void str_upper (void)
|
static void str_upper (void)
|
||||||
{
|
{
|
||||||
char *s = luaL_check_string(1, "strupper");
|
char *s = luaL_check_string(1, "strupper");
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
while (*s)
|
while (*s)
|
||||||
luaI_addchar(toupper((unsigned char)*s++));
|
luaI_addchar(toupper((unsigned char)*s++));
|
||||||
lua_pushstring(luaI_addchar(0));
|
lua_pushstring(luaI_addchar(0));
|
||||||
|
@ -140,7 +144,7 @@ static void str_rep (void)
|
||||||
{
|
{
|
||||||
char *s = luaL_check_string(1, "strrep");
|
char *s = luaL_check_string(1, "strrep");
|
||||||
int n = (int)luaL_check_number(2, "strrep");
|
int n = (int)luaL_check_number(2, "strrep");
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
while (n-- > 0)
|
while (n-- > 0)
|
||||||
addstr(s);
|
addstr(s);
|
||||||
lua_pushstring(luaI_addchar(0));
|
lua_pushstring(luaI_addchar(0));
|
||||||
|
@ -168,7 +172,7 @@ static char *bracket_end (char *p)
|
||||||
return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']');
|
return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']');
|
||||||
}
|
}
|
||||||
|
|
||||||
char *item_end (char *p)
|
char *luaL_item_end (char *p)
|
||||||
{
|
{
|
||||||
switch (*p++) {
|
switch (*p++) {
|
||||||
case '\0': return p-1;
|
case '\0': return p-1;
|
||||||
|
@ -202,7 +206,7 @@ static int matchclass (int c, int cl)
|
||||||
return (islower((unsigned char)cl) ? res : !res);
|
return (islower((unsigned char)cl) ? res : !res);
|
||||||
}
|
}
|
||||||
|
|
||||||
int singlematch (int c, char *p)
|
int luaL_singlematch (int c, char *p)
|
||||||
{
|
{
|
||||||
if (c == 0) return 0;
|
if (c == 0) return 0;
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
|
@ -324,8 +328,8 @@ static char *match (char *s, char *p, int level)
|
||||||
}
|
}
|
||||||
else goto dflt;
|
else goto dflt;
|
||||||
default: dflt: { /* it is a pattern item */
|
default: dflt: { /* it is a pattern item */
|
||||||
int m = singlematch(*s, p);
|
int m = luaL_singlematch(*s, p);
|
||||||
char *ep = item_end(p); /* get what is next */
|
char *ep = luaL_item_end(p); /* get what is next */
|
||||||
switch (*ep) {
|
switch (*ep) {
|
||||||
case '*': { /* repetition */
|
case '*': { /* repetition */
|
||||||
char *res;
|
char *res;
|
||||||
|
@ -427,7 +431,7 @@ static void str_gsub (void)
|
||||||
int max_s = (int)luaL_opt_number(4, strlen(src)+1, "gsub");
|
int max_s = (int)luaL_opt_number(4, strlen(src)+1, "gsub");
|
||||||
int anchor = (*p == '^') ? (p++, 1) : 0;
|
int anchor = (*p == '^') ? (p++, 1) : 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
while (n < max_s) {
|
while (n < max_s) {
|
||||||
char *e = match(src, p, 0);
|
char *e = match(src, p, 0);
|
||||||
if (e) {
|
if (e) {
|
||||||
|
@ -450,10 +454,10 @@ static void str_set (void)
|
||||||
{
|
{
|
||||||
char *item = luaL_check_string(1, "strset");
|
char *item = luaL_check_string(1, "strset");
|
||||||
int i;
|
int i;
|
||||||
luaL_arg_check(*item_end(item) == 0, "strset", 1, "wrong format");
|
luaL_arg_check(*luaL_item_end(item) == 0, "strset", 1, "wrong format");
|
||||||
luaI_addchar(0);
|
luaI_emptybuff();
|
||||||
for (i=1; i<256; i++) /* 0 cannot be part of a set */
|
for (i=1; i<256; i++) /* 0 cannot be part of a set */
|
||||||
if (singlematch(i, item))
|
if (luaL_singlematch(i, item))
|
||||||
luaI_addchar(i);
|
luaI_addchar(i);
|
||||||
lua_pushstring(luaI_addchar(0));
|
lua_pushstring(luaI_addchar(0));
|
||||||
}
|
}
|
||||||
|
@ -476,7 +480,7 @@ static void str_format (void)
|
||||||
{
|
{
|
||||||
int arg = 1;
|
int arg = 1;
|
||||||
char *strfrmt = luaL_check_string(arg++, "format");
|
char *strfrmt = luaL_check_string(arg++, "format");
|
||||||
luaI_addchar(0); /* initialize */
|
luaI_emptybuff(); /* initialize */
|
||||||
while (*strfrmt) {
|
while (*strfrmt) {
|
||||||
if (*strfrmt != '%')
|
if (*strfrmt != '%')
|
||||||
luaI_addchar(*strfrmt++);
|
luaI_addchar(*strfrmt++);
|
||||||
|
|
Loading…
Reference in New Issue