diff options
| -rw-r--r-- | iolib.c | 47 | ||||
| -rw-r--r-- | lualib.h | 7 | ||||
| -rw-r--r-- | strlib.c | 44 |
3 files changed, 72 insertions, 26 deletions
| @@ -116,7 +116,7 @@ static void io_read (void) | |||
| 116 | char *p = luaL_opt_string(1, "[^\n]*{\n}", "read"); | 116 | char *p = luaL_opt_string(1, "[^\n]*{\n}", "read"); |
| 117 | int inskip = 0; /* to control {skips} */ | 117 | int inskip = 0; /* to control {skips} */ |
| 118 | int c = NEED_OTHER; | 118 | int c = NEED_OTHER; |
| 119 | luaI_addchar(0); | 119 | luaI_emptybuff(); |
| 120 | while (*p) { | 120 | while (*p) { |
| 121 | if (*p == '{') { | 121 | if (*p == '{') { |
| 122 | inskip++; | 122 | inskip++; |
| @@ -129,10 +129,10 @@ static void io_read (void) | |||
| 129 | p++; | 129 | p++; |
| 130 | } | 130 | } |
| 131 | else { | 131 | else { |
| 132 | char *ep = item_end(p); /* get what is next */ | 132 | char *ep = luaL_item_end(p); /* get what is next */ |
| 133 | int m; /* match result */ | 133 | int m; /* match result */ |
| 134 | if (c == NEED_OTHER) c = getc(lua_infile); | 134 | if (c == NEED_OTHER) c = getc(lua_infile); |
| 135 | m = (c == EOF) ? 0 : singlematch((char)c, p); | 135 | m = (c == EOF) ? 0 : luaL_singlematch((char)c, p); |
| 136 | if (m) { | 136 | if (m) { |
| 137 | if (inskip == 0) luaI_addchar(c); | 137 | if (inskip == 0) luaI_addchar(c); |
| 138 | c = NEED_OTHER; | 138 | c = NEED_OTHER; |
| @@ -277,6 +277,45 @@ static void errorfb (void) | |||
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | 279 | ||
| 280 | /* -------------------------------------------- | ||
| 281 | * functions to manipulate userdata | ||
| 282 | */ | ||
| 283 | static void getbyte (void) | ||
| 284 | { | ||
| 285 | lua_Object ud = lua_getparam(1); | ||
| 286 | int i = luaL_check_number(2, "getbyte")-1; | ||
| 287 | luaL_arg_check(lua_isuserdata(ud), "getbyte", 1, "userdata expected"); | ||
| 288 | luaL_arg_check(0 <= i && i < lua_getbindatasize(ud), "getbyte", 2, | ||
| 289 | "out of range"); | ||
| 290 | lua_pushnumber(*(((char *)lua_getbinarydata(ud))+i)); | ||
| 291 | } | ||
| 292 | |||
| 293 | static void createuserdata (void) | ||
| 294 | { | ||
| 295 | lua_Object t = lua_getparam(1); | ||
| 296 | int tag = luaL_opt_number(2, 0, "createud"); | ||
| 297 | int i; | ||
| 298 | luaI_emptybuff(); | ||
| 299 | luaL_arg_check(lua_istable(t), "createud", 1, "table expected"); | ||
| 300 | for (i=0; ; i++) { | ||
| 301 | lua_Object o; | ||
| 302 | lua_beginblock(); | ||
| 303 | lua_pushobject(t); | ||
| 304 | lua_pushnumber(i+1); | ||
| 305 | o = lua_basicindex(); | ||
| 306 | if (lua_isnil(o)) { | ||
| 307 | lua_endblock(); | ||
| 308 | break; | ||
| 309 | } | ||
| 310 | luaL_arg_check(lua_isnumber(o), "createud", 1, | ||
| 311 | "table values must be numbers"); | ||
| 312 | luaI_addchar(lua_getnumber(o)); | ||
| 313 | lua_endblock(); | ||
| 314 | } | ||
| 315 | lua_pushbinarydata(luaI_addchar(0), i, tag); | ||
| 316 | } | ||
| 317 | |||
| 318 | |||
| 280 | static struct luaL_reg iolib[] = { | 319 | static struct luaL_reg iolib[] = { |
| 281 | {"readfrom", io_readfrom}, | 320 | {"readfrom", io_readfrom}, |
| 282 | {"writeto", io_writeto}, | 321 | {"writeto", io_writeto}, |
| @@ -291,6 +330,8 @@ static struct luaL_reg iolib[] = { | |||
| 291 | {"date", io_date}, | 330 | {"date", io_date}, |
| 292 | {"exit", io_exit}, | 331 | {"exit", io_exit}, |
| 293 | {"debug", io_debug}, | 332 | {"debug", io_debug}, |
| 333 | {"getbyte", getbyte}, | ||
| 334 | {"createud", createuserdata}, | ||
| 294 | {"print_stack", errorfb} | 335 | {"print_stack", errorfb} |
| 295 | }; | 336 | }; |
| 296 | 337 | ||
| @@ -2,7 +2,7 @@ | |||
| 2 | ** Libraries to be used in LUA programs | 2 | ** Libraries to be used in LUA programs |
| 3 | ** Grupo de Tecnologia em Computacao Grafica | 3 | ** Grupo de Tecnologia em Computacao Grafica |
| 4 | ** TeCGraf - PUC-Rio | 4 | ** TeCGraf - PUC-Rio |
| 5 | ** $Id: lualib.h,v 1.11 1997/03/17 17:01:10 roberto Exp roberto $ | 5 | ** $Id: lualib.h,v 1.12 1997/03/18 15:30:50 roberto Exp roberto $ |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #ifndef lualib_h | 8 | #ifndef lualib_h |
| @@ -19,10 +19,11 @@ void mathlib_open (void); | |||
| 19 | /* auxiliar functions (private) */ | 19 | /* auxiliar functions (private) */ |
| 20 | 20 | ||
| 21 | char *luaI_addchar (int c); | 21 | char *luaI_addchar (int c); |
| 22 | void luaI_emptybuff (void); | ||
| 22 | void luaI_addquoted (char *s); | 23 | void luaI_addquoted (char *s); |
| 23 | 24 | ||
| 24 | char *item_end (char *p); | 25 | char *luaL_item_end (char *p); |
| 25 | int singlematch (int c, char *p); | 26 | int luaL_singlematch (int c, char *p); |
| 26 | 27 | ||
| 27 | #endif | 28 | #endif |
| 28 | 29 | ||
| @@ -3,7 +3,7 @@ | |||
| 3 | ** String library to LUA | 3 | ** String library to LUA |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_strlib="$Id: strlib.c,v 1.36 1997/03/17 17:01:10 roberto Exp roberto $"; | 6 | char *rcs_strlib="$Id: strlib.c,v 1.37 1997/03/18 15:30:50 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <string.h> | 8 | #include <string.h> |
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| @@ -24,7 +24,7 @@ struct lbuff { | |||
| 24 | static struct lbuff lbuffer = {NULL, 0, 0}; | 24 | static struct lbuff lbuffer = {NULL, 0, 0}; |
| 25 | 25 | ||
| 26 | 26 | ||
| 27 | static char *lua_strbuffer (unsigned long size) | 27 | static char *luaL_strbuffer (unsigned long size) |
| 28 | { | 28 | { |
| 29 | if (size > lbuffer.max) { | 29 | if (size > lbuffer.max) { |
| 30 | /* ANSI "realloc" doesn't need this test, but some machines (Sun!) | 30 | /* ANSI "realloc" doesn't need this test, but some machines (Sun!) |
| @@ -39,20 +39,24 @@ static char *lua_strbuffer (unsigned long size) | |||
| 39 | 39 | ||
| 40 | static char *openspace (unsigned long size) | 40 | static char *openspace (unsigned long size) |
| 41 | { | 41 | { |
| 42 | char *buff = lua_strbuffer(lbuffer.size+size); | 42 | char *buff = luaL_strbuffer(lbuffer.size+size); |
| 43 | return buff+lbuffer.size; | 43 | return buff+lbuffer.size; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | char *luaI_addchar (int c) | 46 | char *luaI_addchar (int c) |
| 47 | { | 47 | { |
| 48 | if (lbuffer.size >= lbuffer.max) | 48 | if (lbuffer.size >= lbuffer.max) |
| 49 | lua_strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2); | 49 | luaL_strbuffer(lbuffer.max == 0 ? 100 : lbuffer.max*2); |
| 50 | lbuffer.b[lbuffer.size++] = c; | 50 | lbuffer.b[lbuffer.size++] = c; |
| 51 | if (c == 0) | ||
| 52 | lbuffer.size = 0; /* prepare for next string */ | ||
| 53 | return lbuffer.b; | 51 | return lbuffer.b; |
| 54 | } | 52 | } |
| 55 | 53 | ||
| 54 | void luaI_emptybuff (void) | ||
| 55 | { | ||
| 56 | lbuffer.size = 0; /* prepare for next string */ | ||
| 57 | } | ||
| 58 | |||
| 59 | |||
| 56 | static void addnchar (char *s, int n) | 60 | static void addnchar (char *s, int n) |
| 57 | { | 61 | { |
| 58 | char *b = openspace(n); | 62 | char *b = openspace(n); |
| @@ -75,7 +79,7 @@ static void str_tok (void) | |||
| 75 | lua_Object t = lua_createtable(); | 79 | lua_Object t = lua_createtable(); |
| 76 | int i = 1; | 80 | int i = 1; |
| 77 | /* As strtok changes s1, and s1 is "constant", make a copy of it */ | 81 | /* As strtok changes s1, and s1 is "constant", make a copy of it */ |
| 78 | s1 = strcpy(lua_strbuffer(strlen(s1+1)), s1); | 82 | s1 = strcpy(luaL_strbuffer(strlen(s1+1)), s1); |
| 79 | while ((s1 = strtok(s1, del)) != NULL) { | 83 | while ((s1 = strtok(s1, del)) != NULL) { |
| 80 | lua_pushobject(t); | 84 | lua_pushobject(t); |
| 81 | lua_pushnumber(i++); | 85 | lua_pushnumber(i++); |
| @@ -105,7 +109,7 @@ static void str_sub (void) | |||
| 105 | long start = (long)luaL_check_number(2, "strsub"); | 109 | long start = (long)luaL_check_number(2, "strsub"); |
| 106 | long end = (long)luaL_opt_number(3, strlen(s), "strsub"); | 110 | long end = (long)luaL_opt_number(3, strlen(s), "strsub"); |
| 107 | if (1 <= start && start <= end && end <= strlen(s)) { | 111 | if (1 <= start && start <= end && end <= strlen(s)) { |
| 108 | luaI_addchar(0); | 112 | luaI_emptybuff(); |
| 109 | addnchar(s+start-1, end-start+1); | 113 | addnchar(s+start-1, end-start+1); |
| 110 | lua_pushstring(luaI_addchar(0)); | 114 | lua_pushstring(luaI_addchar(0)); |
| 111 | } | 115 | } |
| @@ -118,7 +122,7 @@ static void str_sub (void) | |||
| 118 | static void str_lower (void) | 122 | static void str_lower (void) |
| 119 | { | 123 | { |
| 120 | char *s = luaL_check_string(1, "strlower"); | 124 | char *s = luaL_check_string(1, "strlower"); |
| 121 | luaI_addchar(0); | 125 | luaI_emptybuff(); |
| 122 | while (*s) | 126 | while (*s) |
| 123 | luaI_addchar(tolower((unsigned char)*s++)); | 127 | luaI_addchar(tolower((unsigned char)*s++)); |
| 124 | lua_pushstring(luaI_addchar(0)); | 128 | lua_pushstring(luaI_addchar(0)); |
| @@ -130,7 +134,7 @@ static void str_lower (void) | |||
| 130 | static void str_upper (void) | 134 | static void str_upper (void) |
| 131 | { | 135 | { |
| 132 | char *s = luaL_check_string(1, "strupper"); | 136 | char *s = luaL_check_string(1, "strupper"); |
| 133 | luaI_addchar(0); | 137 | luaI_emptybuff(); |
| 134 | while (*s) | 138 | while (*s) |
| 135 | luaI_addchar(toupper((unsigned char)*s++)); | 139 | luaI_addchar(toupper((unsigned char)*s++)); |
| 136 | lua_pushstring(luaI_addchar(0)); | 140 | lua_pushstring(luaI_addchar(0)); |
| @@ -140,7 +144,7 @@ static void str_rep (void) | |||
| 140 | { | 144 | { |
| 141 | char *s = luaL_check_string(1, "strrep"); | 145 | char *s = luaL_check_string(1, "strrep"); |
| 142 | int n = (int)luaL_check_number(2, "strrep"); | 146 | int n = (int)luaL_check_number(2, "strrep"); |
| 143 | luaI_addchar(0); | 147 | luaI_emptybuff(); |
| 144 | while (n-- > 0) | 148 | while (n-- > 0) |
| 145 | addstr(s); | 149 | addstr(s); |
| 146 | lua_pushstring(luaI_addchar(0)); | 150 | lua_pushstring(luaI_addchar(0)); |
| @@ -168,7 +172,7 @@ static char *bracket_end (char *p) | |||
| 168 | return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']'); | 172 | return (*p == 0) ? NULL : strchr((*p=='^') ? p+2 : p+1, ']'); |
| 169 | } | 173 | } |
| 170 | 174 | ||
| 171 | char *item_end (char *p) | 175 | char *luaL_item_end (char *p) |
| 172 | { | 176 | { |
| 173 | switch (*p++) { | 177 | switch (*p++) { |
| 174 | case '\0': return p-1; | 178 | case '\0': return p-1; |
| @@ -202,7 +206,7 @@ static int matchclass (int c, int cl) | |||
| 202 | return (islower((unsigned char)cl) ? res : !res); | 206 | return (islower((unsigned char)cl) ? res : !res); |
| 203 | } | 207 | } |
| 204 | 208 | ||
| 205 | int singlematch (int c, char *p) | 209 | int luaL_singlematch (int c, char *p) |
| 206 | { | 210 | { |
| 207 | if (c == 0) return 0; | 211 | if (c == 0) return 0; |
| 208 | switch (*p) { | 212 | switch (*p) { |
| @@ -324,8 +328,8 @@ static char *match (char *s, char *p, int level) | |||
| 324 | } | 328 | } |
| 325 | else goto dflt; | 329 | else goto dflt; |
| 326 | default: dflt: { /* it is a pattern item */ | 330 | default: dflt: { /* it is a pattern item */ |
| 327 | int m = singlematch(*s, p); | 331 | int m = luaL_singlematch(*s, p); |
| 328 | char *ep = item_end(p); /* get what is next */ | 332 | char *ep = luaL_item_end(p); /* get what is next */ |
| 329 | switch (*ep) { | 333 | switch (*ep) { |
| 330 | case '*': { /* repetition */ | 334 | case '*': { /* repetition */ |
| 331 | char *res; | 335 | char *res; |
| @@ -427,7 +431,7 @@ static void str_gsub (void) | |||
| 427 | int max_s = (int)luaL_opt_number(4, strlen(src)+1, "gsub"); | 431 | int max_s = (int)luaL_opt_number(4, strlen(src)+1, "gsub"); |
| 428 | int anchor = (*p == '^') ? (p++, 1) : 0; | 432 | int anchor = (*p == '^') ? (p++, 1) : 0; |
| 429 | int n = 0; | 433 | int n = 0; |
| 430 | luaI_addchar(0); | 434 | luaI_emptybuff(); |
| 431 | while (n < max_s) { | 435 | while (n < max_s) { |
| 432 | char *e = match(src, p, 0); | 436 | char *e = match(src, p, 0); |
| 433 | if (e) { | 437 | if (e) { |
| @@ -450,10 +454,10 @@ static void str_set (void) | |||
| 450 | { | 454 | { |
| 451 | char *item = luaL_check_string(1, "strset"); | 455 | char *item = luaL_check_string(1, "strset"); |
| 452 | int i; | 456 | int i; |
| 453 | luaL_arg_check(*item_end(item) == 0, "strset", 1, "wrong format"); | 457 | luaL_arg_check(*luaL_item_end(item) == 0, "strset", 1, "wrong format"); |
| 454 | luaI_addchar(0); | 458 | luaI_emptybuff(); |
| 455 | for (i=1; i<256; i++) /* 0 cannot be part of a set */ | 459 | for (i=1; i<256; i++) /* 0 cannot be part of a set */ |
| 456 | if (singlematch(i, item)) | 460 | if (luaL_singlematch(i, item)) |
| 457 | luaI_addchar(i); | 461 | luaI_addchar(i); |
| 458 | lua_pushstring(luaI_addchar(0)); | 462 | lua_pushstring(luaI_addchar(0)); |
| 459 | } | 463 | } |
| @@ -476,7 +480,7 @@ static void str_format (void) | |||
| 476 | { | 480 | { |
| 477 | int arg = 1; | 481 | int arg = 1; |
| 478 | char *strfrmt = luaL_check_string(arg++, "format"); | 482 | char *strfrmt = luaL_check_string(arg++, "format"); |
| 479 | luaI_addchar(0); /* initialize */ | 483 | luaI_emptybuff(); /* initialize */ |
| 480 | while (*strfrmt) { | 484 | while (*strfrmt) { |
| 481 | if (*strfrmt != '%') | 485 | if (*strfrmt != '%') |
| 482 | luaI_addchar(*strfrmt++); | 486 | luaI_addchar(*strfrmt++); |
