aboutsummaryrefslogtreecommitdiff
path: root/src/lstrlib.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/lstrlib.js')
-rw-r--r--src/lstrlib.js860
1 files changed, 479 insertions, 381 deletions
diff --git a/src/lstrlib.js b/src/lstrlib.js
index ddb2161..67c4537 100644
--- a/src/lstrlib.js
+++ b/src/lstrlib.js
@@ -1,11 +1,84 @@
"use strict";
-const assert = require('assert');
-const sprintf = require('sprintf-js').sprintf;
-
-const lauxlib = require('./lauxlib.js');
-const lua = require('./lua.js');
-const luaconf = require('./luaconf.js');
+const { sprintf } = require('sprintf-js');
+
+const {
+ LUA_INTEGER_FMT,
+ LUA_INTEGER_FRMLEN,
+ LUA_MININTEGER,
+ LUA_NUMBER_FMT,
+ LUA_NUMBER_FRMLEN,
+ frexp,
+ lua_getlocaledecpoint
+} = require('./luaconf.js');
+const {
+ LUA_TBOOLEAN,
+ LUA_TFUNCTION,
+ LUA_TNIL,
+ LUA_TNUMBER,
+ LUA_TSTRING,
+ LUA_TTABLE,
+ lua_call,
+ lua_createtable,
+ lua_dump,
+ lua_gettable,
+ lua_gettop,
+ lua_isinteger,
+ lua_isstring,
+ lua_pop,
+ lua_pushcclosure,
+ lua_pushinteger,
+ lua_pushlightuserdata,
+ lua_pushliteral,
+ lua_pushlstring,
+ lua_pushnil,
+ lua_pushnumber,
+ lua_pushstring,
+ lua_pushvalue,
+ lua_remove,
+ lua_setfield,
+ lua_setmetatable,
+ lua_settop,
+ lua_toboolean,
+ lua_tointeger,
+ lua_tonumber,
+ lua_tostring,
+ lua_touserdata,
+ lua_type,
+ lua_upvalueindex
+} = require('./lua.js');
+const {
+ luaL_Buffer,
+ luaL_addchar,
+ luaL_addlstring,
+ luaL_addsize,
+ luaL_addstring,
+ luaL_addvalue,
+ luaL_argcheck,
+ luaL_argerror,
+ luaL_buffinit,
+ luaL_buffinitsize,
+ luaL_checkinteger,
+ luaL_checknumber,
+ luaL_checkstack,
+ luaL_checkstring,
+ luaL_checktype,
+ luaL_error,
+ luaL_newlib,
+ luaL_optinteger,
+ luaL_optstring,
+ luaL_prepbuffsize,
+ luaL_pushresult,
+ luaL_pushresultsize,
+ luaL_tolstring,
+ luaL_typename
+} = require('./lauxlib.js');
+const lualib = require('./lualib.js');
+const {
+ luastring_indexOf,
+ to_jsstring,
+ to_luastring
+} = require("./fengaricore.js");
const sL_ESC = '%';
const L_ESC = sL_ESC.charCodeAt(0);
@@ -22,7 +95,7 @@ const MAXSIZE = 2147483647;
/* Give natural (i.e. strings end at the first \0) length of a string represented by an array of bytes */
const strlen = function(s) {
- let len = s.indexOf(0);
+ let len = luastring_indexOf(s, 0);
return len > -1 ? len : s.length;
};
@@ -34,74 +107,74 @@ const posrelat = function(pos, len) {
};
const str_sub = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
+ let s = luaL_checkstring(L, 1);
let l = s.length;
- let start = posrelat(lauxlib.luaL_checkinteger(L, 2), l);
- let end = posrelat(lauxlib.luaL_optinteger(L, 3, -1), l);
+ let start = posrelat(luaL_checkinteger(L, 2), l);
+ let end = posrelat(luaL_optinteger(L, 3, -1), l);
if (start < 1) start = 1;
if (end > l) end = l;
if (start <= end)
- lua.lua_pushstring(L, s.slice(start - 1, (start - 1) + (end - start + 1)));
- else lua.lua_pushliteral(L, "");
+ lua_pushstring(L, s.subarray(start - 1, (start - 1) + (end - start + 1)));
+ else lua_pushliteral(L, "");
return 1;
};
const str_len = function(L) {
- lua.lua_pushinteger(L, lauxlib.luaL_checkstring(L, 1).length);
+ lua_pushinteger(L, luaL_checkstring(L, 1).length);
return 1;
};
const str_char = function(L) {
- let n = lua.lua_gettop(L); /* number of arguments */
- let b = new lauxlib.luaL_Buffer();
- let p = lauxlib.luaL_buffinitsize(L, b, n);
+ let n = lua_gettop(L); /* number of arguments */
+ let b = new luaL_Buffer();
+ let p = luaL_buffinitsize(L, b, n);
for (let i = 1; i <= n; i++) {
- let c = lauxlib.luaL_checkinteger(L, i);
- lauxlib.luaL_argcheck(L, c >= 0 && c <= 255, "value out of range"); // Strings are 8-bit clean
+ let c = luaL_checkinteger(L, i);
+ luaL_argcheck(L, c >= 0 && c <= 255, "value out of range"); // Strings are 8-bit clean
p[i-1] = c;
}
- lauxlib.luaL_pushresultsize(b, n);
+ luaL_pushresultsize(b, n);
return 1;
};
const writer = function(L, b, size, B) {
- lauxlib.luaL_addlstring(B, b, size);
+ luaL_addlstring(B, b, size);
return 0;
};
const str_dump = function(L) {
- let b = new lauxlib.luaL_Buffer();
- let strip = lua.lua_toboolean(L, 2);
- lauxlib.luaL_checktype(L, 1, lua.LUA_TFUNCTION);
- lua.lua_settop(L, 1);
- lauxlib.luaL_buffinit(L, b);
- if (lua.lua_dump(L, writer, b, strip) !== 0)
- return lauxlib.luaL_error(L, lua.to_luastring("unable to dump given function"));
- lauxlib.luaL_pushresult(b);
+ let b = new luaL_Buffer();
+ let strip = lua_toboolean(L, 2);
+ luaL_checktype(L, 1, LUA_TFUNCTION);
+ lua_settop(L, 1);
+ luaL_buffinit(L, b);
+ if (lua_dump(L, writer, b, strip) !== 0)
+ return luaL_error(L, to_luastring("unable to dump given function"));
+ luaL_pushresult(b);
return 1;
};
-const SIZELENMOD = luaconf.LUA_NUMBER_FRMLEN.length + 1;
+const SIZELENMOD = LUA_NUMBER_FRMLEN.length + 1;
const L_NBFD = 1;
const num2straux = function(x) {
/* if 'inf' or 'NaN', format it like '%g' */
if (Object.is(x, Infinity))
- return lua.to_luastring('inf', true).slice(0);
+ return to_luastring('inf');
else if (Object.is(x, -Infinity))
- return lua.to_luastring('-inf', true).slice(0);
+ return to_luastring('-inf');
else if (Number.isNaN(x))
- return lua.to_luastring('nan', true).slice(0);
+ return to_luastring('nan');
else if (x === 0) { /* can be -0... */
/* create "0" or "-0" followed by exponent */
- let zero = sprintf(luaconf.LUA_NUMBER_FMT + "x0p+0", x);
+ let zero = sprintf(LUA_NUMBER_FMT + "x0p+0", x);
if (Object.is(x, -0))
zero = "-" + zero;
- return lua.to_luastring(zero);
+ return to_luastring(zero);
} else {
let buff = "";
- let fe = luaconf.frexp(x); /* 'x' fraction and exponent */
+ let fe = frexp(x); /* 'x' fraction and exponent */
let m = fe[0];
let e = fe[1];
if (m < 0) { /* is number negative? */
@@ -112,17 +185,20 @@ const num2straux = function(x) {
buff += (m * (1<<L_NBFD)).toString(16);
e -= L_NBFD; /* this digit goes before the radix point */
buff += sprintf("p%+d", e); /* add exponent */
- return lua.to_luastring(buff);
+ return to_luastring(buff);
}
};
const lua_number2strx = function(L, fmt, x) {
let buff = num2straux(x);
- if (fmt[SIZELENMOD] === 'A'.charCodeAt(0)) {
- for (let i = 0; i < buff.length; i++)
- buff[i] = String.fromCharCode(buff[i]).toUpperCase().charCodeAt(0);
- } else if (fmt[SIZELENMOD] !== 'a'.charCodeAt(0))
- lauxlib.luaL_error(L, lua.to_luastring("modifiers for format '%%a'/'%%A' not implemented"));
+ if (fmt[SIZELENMOD] === 65 /* 'A'.charCodeAt(0) */) {
+ for (let i = 0; i < buff.length; i++) {
+ let c = buff[i];
+ if (c >= 97) /* toupper */
+ buff[i] = c & 0xdf;
+ }
+ } else if (fmt[SIZELENMOD] !== 97 /* 'a'.charCodeAt(0) */)
+ luaL_error(L, to_luastring("modifiers for format '%%a'/'%%A' not implemented"));
return buff;
};
@@ -137,106 +213,105 @@ const lua_number2strx = function(L, fmt, x) {
/* valid flags in a format specification */
-const FLAGS = ["-".charCodeAt(0), "+".charCodeAt(0), " ".charCodeAt(0), "#".charCodeAt(0), "0".charCodeAt(0)];
+const FLAGS = to_luastring("-+ #0");
/*
** maximum size of each format specification (such as "%-099.99d")
*/
// const MAX_FORMAT = 32;
-// TODO: locale ? and do it better
-const isalpha = e => ('a'.charCodeAt(0) <= e && e <= 'z'.charCodeAt(0)) || (e >= 'A'.charCodeAt(0) && e <= 'Z'.charCodeAt(0));
-const isdigit = e => '0'.charCodeAt(0) <= e && e <= '9'.charCodeAt(0);
+const isalpha = e => (97 <= e && e <= 122) || (65 <= e && e <= 90);
+const isdigit = e => 48 <= e && e <= 57;
const iscntrl = e => (0x00 <= e && e <= 0x1f) || e === 0x7f;
-const isgraph = e => e > 32 && e < 127; // TODO: Will only work for ASCII
-const islower = e => /^[a-z]$/.test(String.fromCharCode(e));
-const isupper = e => /^[A-Z]$/.test(String.fromCharCode(e));
-const isalnum = e => /^[a-zA-Z0-9]$/.test(String.fromCharCode(e));
+const isgraph = e => 33 <= e && e <= 126;
+const islower = e => 97 <= e && e <= 122;
+const isupper = e => 65 <= e && e <= 90;
+const isalnum = e => (97 <= e && e <= 122) || (65 <= e && e <= 90) || (48 <= e && e <= 57);
const ispunct = e => isgraph(e) && !isalnum(e);
-const isspace = e => /^\s$/.test(String.fromCharCode(e));
-const isxdigit = e => /^[0-9A-Fa-f]$/.test(String.fromCharCode(e));
+const isspace = e => e === 32 || (e >= 9 && e <= 13);
+const isxdigit = e => (48 <= e && e <= 57) || (65 <= e && e <= 70) || (97 <= e && e <= 102);
const addquoted = function(b, s, len) {
- lauxlib.luaL_addchar(b, '"'.charCodeAt(0));
+ luaL_addchar(b, 34 /* '"'.charCodeAt(0) */);
let i = 0;
while (len--) {
- if (s[i] === '"'.charCodeAt(0) || s[i] === '\\'.charCodeAt(0) || s[i] === '\n'.charCodeAt(0)) {
- lauxlib.luaL_addchar(b, '\\'.charCodeAt(0));
- lauxlib.luaL_addchar(b, s[i]);
+ if (s[i] === 34 /* '"'.charCodeAt(0) */ ||
+ s[i] === 92 /* '\\'.charCodeAt(0) */ ||
+ s[i] === 10 /* '\n'.charCodeAt(0) */) {
+ luaL_addchar(b, 92 /* '\\'.charCodeAt(0) */);
+ luaL_addchar(b, s[i]);
} else if (iscntrl(s[i])) {
- let buff;
- if (!isdigit(s[i+1]))
- buff = lua.to_luastring(sprintf("\\%d", s[i]));
- else
- buff = lua.to_luastring(sprintf("\\%03d", s[i]));
- lauxlib.luaL_addstring(b, buff);
+ let buff = ''+s[i];
+ if (isdigit(s[i+1]))
+ buff = '0'.repeat(3-buff.length) + buff; /* pad to 3 '0's */
+ luaL_addstring(b, to_luastring("\\" + buff));
} else
- lauxlib.luaL_addchar(b, s[i]);
+ luaL_addchar(b, s[i]);
i++;
}
- lauxlib.luaL_addchar(b, '"'.charCodeAt(0));
+ luaL_addchar(b, 34 /* '"'.charCodeAt(0) */);
};
/*
** Ensures the 'buff' string uses a dot as the radix character.
*/
const checkdp = function(buff) {
- if (buff.indexOf('.'.charCodeAt(0)) < 0) { /* no dot? */
- let point = luaconf.lua_getlocaledecpoint().charCodeAt(0); /* try locale point */
- let ppoint = buff.indexOf(point);
- if (ppoint) buff[ppoint] = '.'; /* change it to a dot */
+ if (luastring_indexOf(buff, 46 /* ('.').charCodeAt(0) */) < 0) { /* no dot? */
+ let point = lua_getlocaledecpoint(); /* try locale point */
+ let ppoint = luastring_indexOf(buff, point);
+ if (ppoint) buff[ppoint] = 46 /* ('.').charCodeAt(0) */; /* change it to a dot */
}
};
const addliteral = function(L, b, arg) {
- switch(lua.lua_type(L, arg)) {
- case lua.LUA_TSTRING: {
- let s = lua.lua_tostring(L, arg);
+ switch(lua_type(L, arg)) {
+ case LUA_TSTRING: {
+ let s = lua_tostring(L, arg);
addquoted(b, s, s.length);
break;
}
- case lua.LUA_TNUMBER: {
+ case LUA_TNUMBER: {
let buff;
- if (!lua.lua_isinteger(L, arg)) { /* float? */
- let n = lua.lua_tonumber(L, arg); /* write as hexa ('%a') */
- buff = lua_number2strx(L, lua.to_luastring(`%${luaconf.LUA_INTEGER_FRMLEN}a`), n);
+ if (!lua_isinteger(L, arg)) { /* float? */
+ let n = lua_tonumber(L, arg); /* write as hexa ('%a') */
+ buff = lua_number2strx(L, to_luastring(`%${LUA_INTEGER_FRMLEN}a`), n);
checkdp(buff); /* ensure it uses a dot */
} else { /* integers */
- let n = lua.lua_tointeger(L, arg);
- let format = (n === luaconf.LUA_MININTEGER) /* corner case? */
- ? "0x%" + luaconf.LUA_INTEGER_FRMLEN + "x" /* use hexa */
- : luaconf.LUA_INTEGER_FMT; /* else use default format */
- buff = lua.to_luastring(sprintf(format, n));
+ let n = lua_tointeger(L, arg);
+ let format = (n === LUA_MININTEGER) /* corner case? */
+ ? "0x%" + LUA_INTEGER_FRMLEN + "x" /* use hexa */
+ : LUA_INTEGER_FMT; /* else use default format */
+ buff = to_luastring(sprintf(format, n));
}
- lauxlib.luaL_addstring(b, buff);
+ luaL_addstring(b, buff);
break;
}
- case lua.LUA_TNIL: case lua.LUA_TBOOLEAN: {
- lauxlib.luaL_tolstring(L, arg);
- lauxlib.luaL_addvalue(b);
+ case LUA_TNIL: case LUA_TBOOLEAN: {
+ luaL_tolstring(L, arg);
+ luaL_addvalue(b);
break;
}
default: {
- lauxlib.luaL_argerror(L, arg, lua.to_luastring("value has no literal form", true));
+ luaL_argerror(L, arg, to_luastring("value has no literal form", true));
}
}
};
const scanformat = function(L, strfrmt, i, form) {
let p = i;
- while (strfrmt[p] !== 0 && FLAGS.indexOf(strfrmt[p]) >= 0) p++; /* skip flags */
+ while (strfrmt[p] !== 0 && luastring_indexOf(FLAGS, strfrmt[p]) >= 0) p++; /* skip flags */
if (p - i >= FLAGS.length)
- lauxlib.luaL_error(L, lua.to_luastring("invalid format (repeated flags)", true));
+ luaL_error(L, to_luastring("invalid format (repeated flags)", true));
if (isdigit(strfrmt[p])) p++; /* skip width */
if (isdigit(strfrmt[p])) p++; /* (2 digits at most) */
- if (strfrmt[p] === '.'.charCodeAt(0)) {
+ if (strfrmt[p] === 46 /* '.'.charCodeAt(0) */) {
p++;
if (isdigit(strfrmt[p])) p++; /* skip precision */
if (isdigit(strfrmt[p])) p++; /* (2 digits at most) */
}
if (isdigit(strfrmt[p]))
- lauxlib.luaL_error(L, lua.to_luastring("invalid format (width or precision too long)", true));
- form[0] = "%".charCodeAt(0);
+ luaL_error(L, to_luastring("invalid format (width or precision too long)", true));
+ form[0] = 37 /* "%".charCodeAt(0) */;
for (let j = 0; j < p - i + 1; j++)
form[j+1] = strfrmt[i+j];
return p;
@@ -249,52 +324,52 @@ const addlenmod = function(form, lenmod) {
let l = form.length;
let lm = lenmod.length;
let spec = form[l - 1];
- for (let i = 0; i < lenmod.length; i++)
+ for (let i = 0; i < lm; i++)
form[i + l - 1] = lenmod[i];
form[l + lm - 1] = spec;
// form[l + lm] = 0;
};
const str_format = function(L) {
- let top = lua.lua_gettop(L);
+ let top = lua_gettop(L);
let arg = 1;
- let strfrmt = lauxlib.luaL_checkstring(L, arg);
+ let strfrmt = luaL_checkstring(L, arg);
let i = 0;
- let b = new lauxlib.luaL_Buffer();
- lauxlib.luaL_buffinit(L, b);
+ let b = new luaL_Buffer();
+ luaL_buffinit(L, b);
while (i < strfrmt.length) {
if (strfrmt[i] !== L_ESC) {
- lauxlib.luaL_addchar(b, strfrmt[i++]);
+ luaL_addchar(b, strfrmt[i++]);
} else if (strfrmt[++i] === L_ESC) {
- lauxlib.luaL_addchar(b, strfrmt[i++]); /* %% */
+ luaL_addchar(b, strfrmt[i++]); /* %% */
} else { /* format item */
let form = []; /* to store the format ('%...') */
if (++arg > top)
- lauxlib.luaL_argerror(L, arg, lua.to_luastring("no value", true));
+ luaL_argerror(L, arg, to_luastring("no value", true));
i = scanformat(L, strfrmt, i, form);
switch (String.fromCharCode(strfrmt[i++])) {
case 'c': {
- // sprintf(String.fromCharCode(...form), lauxlib.luaL_checkinteger(L, arg));
- lauxlib.luaL_addchar(b, lauxlib.luaL_checkinteger(L, arg));
+ // sprintf(String.fromCharCode(...form), luaL_checkinteger(L, arg));
+ luaL_addchar(b, luaL_checkinteger(L, arg));
break;
}
case 'd': case 'i':
case 'o': case 'u': case 'x': case 'X': {
- let n = lauxlib.luaL_checkinteger(L, arg);
- addlenmod(form, luaconf.LUA_INTEGER_FRMLEN.split('').map(e => e.charCodeAt(0)));
- lauxlib.luaL_addstring(b, lua.to_luastring(sprintf(String.fromCharCode(...form), n)));
+ let n = luaL_checkinteger(L, arg);
+ addlenmod(form, to_luastring(LUA_INTEGER_FRMLEN, true));
+ luaL_addstring(b, to_luastring(sprintf(String.fromCharCode(...form), n)));
break;
}
case 'a': case 'A': {
- addlenmod(form, luaconf.LUA_INTEGER_FRMLEN.split('').map(e => e.charCodeAt(0)));
- lauxlib.luaL_addstring(b, lua_number2strx(L, form, lauxlib.luaL_checknumber(L, arg)));
+ addlenmod(form, to_luastring(LUA_INTEGER_FRMLEN, true));
+ luaL_addstring(b, lua_number2strx(L, form, luaL_checknumber(L, arg)));
break;
}
case 'e': case 'E': case 'f':
case 'g': case 'G': {
- let n = lauxlib.luaL_checknumber(L, arg);
- addlenmod(form, luaconf.LUA_INTEGER_FRMLEN.split('').map(e => e.charCodeAt(0)));
- lauxlib.luaL_addstring(b, lua.to_luastring(sprintf(String.fromCharCode(...form), n)));
+ let n = luaL_checknumber(L, arg);
+ addlenmod(form, to_luastring(LUA_INTEGER_FRMLEN, true));
+ luaL_addstring(b, to_luastring(sprintf(String.fromCharCode(...form), n)));
break;
}
case 'q': {
@@ -302,29 +377,29 @@ const str_format = function(L) {
break;
}
case 's': {
- let s = lauxlib.luaL_tolstring(L, arg);
+ let s = luaL_tolstring(L, arg);
if (form.length <= 2 || form[2] === 0) { /* no modifiers? */
- lauxlib.luaL_addvalue(b); /* keep entire string */
+ luaL_addvalue(b); /* keep entire string */
} else {
- lauxlib.luaL_argcheck(L, s.length === strlen(s), arg, "string contains zeros");
- if (form.indexOf('.'.charCodeAt(0)) < 0 && s.length >= 100) {
+ luaL_argcheck(L, s.length === strlen(s), arg, "string contains zeros");
+ if (luastring_indexOf(form, 46 /* '.'.charCodeAt(0) */) < 0 && s.length >= 100) {
/* no precision and string is too long to be formatted */
- lauxlib.luaL_addvalue(b); /* keep entire string */
+ luaL_addvalue(b); /* keep entire string */
} else { /* format the string into 'buff' */
// TODO: will fail if s is not valid UTF-8
- lauxlib.luaL_addstring(b, lua.to_luastring(sprintf(String.fromCharCode(...form), lua.to_jsstring(s))));
- lua.lua_pop(L, 1); /* remove result from 'luaL_tolstring' */
+ luaL_addstring(b, to_luastring(sprintf(String.fromCharCode(...form), to_jsstring(s))));
+ lua_pop(L, 1); /* remove result from 'luaL_tolstring' */
}
}
break;
}
default: { /* also treat cases 'pnLlh' */
- return lauxlib.luaL_error(L, lua.to_luastring("invalid option '%%%c' to 'format'"), strfrmt[i-1]);
+ return luaL_error(L, to_luastring("invalid option '%%%c' to 'format'"), strfrmt[i-1]);
}
}
}
}
- lauxlib.luaL_pushresult(b);
+ luaL_pushresult(b);
return 1;
};
@@ -358,21 +433,17 @@ class Header {
/*
** options for pack/unpack
*/
-const KOption = {
- Kint: 0, /* signed integers */
- Kuint: 1, /* unsigned integers */
- Kfloat: 2, /* floating-point numbers */
- Kchar: 3, /* fixed-length strings */
- Kstring: 4, /* strings with prefixed length */
- Kzstr: 5, /* zero-terminated strings */
- Kpadding: 6, /* padding */
- Kpaddalign: 7, /* padding for alignment */
- Knop: 8 /* no-op (configuration or spaces) */
-};
-
-const digit = function(c) {
- return '0'.charCodeAt(0) <= c && c <= '9'.charCodeAt(0);
-};
+const Kint = 0; /* signed integers */
+const Kuint = 1; /* unsigned integers */
+const Kfloat = 2; /* floating-point numbers */
+const Kchar = 3; /* fixed-length strings */
+const Kstring = 4; /* strings with prefixed length */
+const Kzstr = 5; /* zero-terminated strings */
+const Kpadding = 6; /* padding */
+const Kpaddalign = 7; /* padding for alignment */
+const Knop = 8; /* no-op (configuration or spaces) */
+
+const digit = isdigit;
const getnum = function(fmt, df) {
if (fmt.off >= fmt.s.length || !digit(fmt.s[fmt.off])) /* no number? */
@@ -380,7 +451,7 @@ const getnum = function(fmt, df) {
else {
let a = 0;
do {
- a = a * 10 + (fmt.s[fmt.off++] - '0'.charCodeAt(0));
+ a = a * 10 + (fmt.s[fmt.off++] - 48 /* '0'.charCodeAt(0) */);
} while (fmt.off < fmt.s.length && digit(fmt.s[fmt.off]) && a <= (MAXSIZE - 9)/10);
return a;
}
@@ -393,7 +464,7 @@ const getnum = function(fmt, df) {
const getnumlimit = function(h, fmt, df) {
let sz = getnum(fmt, df);
if (sz > MAXINTSIZE || sz <= 0)
- lauxlib.luaL_error(h.L, lua.to_luastring("integral size (%d) out of limits [1,%d]"), sz, MAXINTSIZE);
+ luaL_error(h.L, to_luastring("integral size (%d) out of limits [1,%d]"), sz, MAXINTSIZE);
return sz;
};
@@ -402,47 +473,43 @@ const getnumlimit = function(h, fmt, df) {
*/
const getoption = function(h, fmt) {
let r = {
- opt: NaN,
- size: NaN
+ opt: fmt.s[fmt.off++],
+ size: 0 /* default */
};
-
- r.opt = fmt.s[fmt.off++];
- r.size = 0; /* default */
switch (r.opt) {
- case 'b'.charCodeAt(0): r.size = 1; r.opt = KOption.Kint; return r; // sizeof(char): 1
- case 'B'.charCodeAt(0): r.size = 1; r.opt = KOption.Kuint; return r;
- case 'h'.charCodeAt(0): r.size = 2; r.opt = KOption.Kint; return r; // sizeof(short): 2
- case 'H'.charCodeAt(0): r.size = 2; r.opt = KOption.Kuint; return r;
- case 'l'.charCodeAt(0): r.size = 4; r.opt = KOption.Kint; return r; // sizeof(long): 4
- case 'L'.charCodeAt(0): r.size = 4; r.opt = KOption.Kuint; return r;
- case 'j'.charCodeAt(0): r.size = 4; r.opt = KOption.Kint; return r; // sizeof(lua_Integer): 4
- case 'J'.charCodeAt(0): r.size = 4; r.opt = KOption.Kuint; return r;
- case 'T'.charCodeAt(0): r.size = 4; r.opt = KOption.Kuint; return r; // sizeof(size_t): 4
- case 'f'.charCodeAt(0): r.size = 4; r.opt = KOption.Kfloat; return r; // sizeof(float): 4
- case 'd'.charCodeAt(0): r.size = 8; r.opt = KOption.Kfloat; return r; // sizeof(double): 8
- case 'n'.charCodeAt(0): r.size = 8; r.opt = KOption.Kfloat; return r; // sizeof(lua_Number): 8
- case 'i'.charCodeAt(0): r.size = getnumlimit(h, fmt, 4); r.opt = KOption.Kint; return r; // sizeof(int): 4
- case 'I'.charCodeAt(0): r.size = getnumlimit(h, fmt, 4); r.opt = KOption.Kuint; return r;
- case 's'.charCodeAt(0): r.size = getnumlimit(h, fmt, 4); r.opt = KOption.Kstring; return r;
- case 'c'.charCodeAt(0): {
+ case 98 /*'b'*/: r.size = 1; r.opt = Kint; return r; // sizeof(char): 1
+ case 66 /*'B'*/: r.size = 1; r.opt = Kuint; return r;
+ case 104 /*'h'*/: r.size = 2; r.opt = Kint; return r; // sizeof(short): 2
+ case 72 /*'H'*/: r.size = 2; r.opt = Kuint; return r;
+ case 108 /*'l'*/: r.size = 4; r.opt = Kint; return r; // sizeof(long): 4
+ case 76 /*'L'*/: r.size = 4; r.opt = Kuint; return r;
+ case 106 /*'j'*/: r.size = 4; r.opt = Kint; return r; // sizeof(lua_Integer): 4
+ case 74 /*'J'*/: r.size = 4; r.opt = Kuint; return r;
+ case 84 /*'T'*/: r.size = 4; r.opt = Kuint; return r; // sizeof(size_t): 4
+ case 102 /*'f'*/: r.size = 4; r.opt = Kfloat; return r; // sizeof(float): 4
+ case 100 /*'d'*/: r.size = 8; r.opt = Kfloat; return r; // sizeof(double): 8
+ case 110 /*'n'*/: r.size = 8; r.opt = Kfloat; return r; // sizeof(lua_Number): 8
+ case 105 /*'i'*/: r.size = getnumlimit(h, fmt, 4); r.opt = Kint; return r; // sizeof(int): 4
+ case 73 /*'I'*/: r.size = getnumlimit(h, fmt, 4); r.opt = Kuint; return r;
+ case 115 /*'s'*/: r.size = getnumlimit(h, fmt, 4); r.opt = Kstring; return r;
+ case 99 /*'c'*/: {
r.size = getnum(fmt, -1);
if (r.size === -1)
- lauxlib.luaL_error(h.L, lua.to_luastring("missing size for format option 'c'"));
- r.opt = KOption.Kchar;
+ luaL_error(h.L, to_luastring("missing size for format option 'c'"));
+ r.opt = Kchar;
return r;
}
- case 'z'.charCodeAt(0): r.opt = KOption.Kzstr; return r;
- case 'x'.charCodeAt(0): r.size = 1; r.opt = KOption.Kpadding; return r;
- case 'X'.charCodeAt(0): r.opt = KOption.Kpaddalign; return r;
- case ' '.charCodeAt(0): break;
- case '<'.charCodeAt(0): h.islittle = true; break;
- case '>'.charCodeAt(0): h.islittle = false; break;
- case '='.charCodeAt(0): h.islittle = true; break;
- case '!'.charCodeAt(0): h.maxalign = getnumlimit(h, fmt, MAXALIGN); break;
- default: lauxlib.luaL_error(h.L, lua.to_luastring("invalid format option '%c'"), r.opt);
+ case 122 /*'z'*/: r.opt = Kzstr; return r;
+ case 120 /*'x'*/: r.size = 1; r.opt = Kpadding; return r;
+ case 88 /*'X'*/: r.opt = Kpaddalign; return r;
+ case 32 /*' '*/: break;
+ case 60 /*'<'*/: h.islittle = true; break;
+ case 62 /*'>'*/: h.islittle = false; break;
+ case 61 /*'='*/: h.islittle = true; break;
+ case 33 /*'!'*/: h.maxalign = getnumlimit(h, fmt, MAXALIGN); break;
+ default: luaL_error(h.L, to_luastring("invalid format option '%c'"), r.opt);
}
-
- r.opt = KOption.Knop;
+ r.opt = Knop;
return r;
};
@@ -466,24 +533,24 @@ const getdetails = function(h, totalsize, fmt) {
r.size = opt.size;
r.opt = opt.opt;
let align = r.size; /* usually, alignment follows size */
- if (r.opt === KOption.Kpaddalign) { /* 'X' gets alignment from following option */
+ if (r.opt === Kpaddalign) { /* 'X' gets alignment from following option */
if (fmt.off >= fmt.s.length || fmt.s[fmt.off] === 0)
- lauxlib.luaL_argerror(h.L, 1, lua.to_luastring("invalid next option for option 'X'", true));
+ luaL_argerror(h.L, 1, to_luastring("invalid next option for option 'X'", true));
else {
let o = getoption(h, fmt);
align = o.size;
o = o.opt;
- if (o === KOption.Kchar || align === 0)
- lauxlib.luaL_argerror(h.L, 1, lua.to_luastring("invalid next option for option 'X'", true));
+ if (o === Kchar || align === 0)
+ luaL_argerror(h.L, 1, to_luastring("invalid next option for option 'X'", true));
}
}
- if (align <= 1 || r.opt === KOption.Kchar) /* need no alignment? */
+ if (align <= 1 || r.opt === Kchar) /* need no alignment? */
r.ntoalign = 0;
else {
if (align > h.maxalign) /* enforce maximum alignment */
align = h.maxalign;
if ((align & (align -1)) !== 0) /* is 'align' not a power of 2? */
- lauxlib.luaL_argerror(h.L, 1, lua.to_luastring("format asks for alignment not power of 2", true));
+ luaL_argerror(h.L, 1, to_luastring("format asks for alignment not power of 2", true));
r.ntoalign = (align - (totalsize & (align - 1))) & (align - 1);
}
return r;
@@ -496,7 +563,7 @@ const getdetails = function(h, totalsize, fmt) {
** bytes if necessary (by default they would be zeros).
*/
const packint = function(b, n, islittle, size, neg) {
- let buff = lauxlib.luaL_prepbuffsize(b, size);
+ let buff = luaL_prepbuffsize(b, size);
buff[islittle ? 0 : size - 1] = n & MC; /* first byte */
for (let i = 1; i < size; i++) {
n >>= NB;
@@ -506,20 +573,20 @@ const packint = function(b, n, islittle, size, neg) {
for (let i = SZINT; i < size; i++) /* correct extra bytes */
buff[islittle ? i : size - 1 - i] = MC;
}
- lauxlib.luaL_addsize(b, size); /* add result to buffer */
+ luaL_addsize(b, size); /* add result to buffer */
};
const str_pack = function(L) {
- let b = new lauxlib.luaL_Buffer();
+ let b = new luaL_Buffer();
let h = new Header(L);
let fmt = {
- s: lauxlib.luaL_checkstring(L, 1), /* format string */
+ s: luaL_checkstring(L, 1), /* format string */
off: 0
};
let arg = 1; /* current argument to pack */
let totalsize = 0; /* accumulate total size of result */
- lua.lua_pushnil(L); /* mark to separate arguments from string buffer */
- lauxlib.luaL_buffinit(L, b);
+ lua_pushnil(L); /* mark to separate arguments from string buffer */
+ luaL_buffinit(L, b);
while (fmt.off < fmt.s.length) {
let details = getdetails(h, totalsize, fmt);
let opt = details.opt;
@@ -527,105 +594,124 @@ const str_pack = function(L) {
let ntoalign = details.ntoalign;
totalsize += ntoalign + size;
while (ntoalign-- > 0)
- lauxlib.luaL_addchar(b, LUAL_PACKPADBYTE); /* fill alignment */
+ luaL_addchar(b, LUAL_PACKPADBYTE); /* fill alignment */
arg++;
switch (opt) {
- case KOption.Kint: { /* signed integers */
- let n = lauxlib.luaL_checkinteger(L, arg);
+ case Kint: { /* signed integers */
+ let n = luaL_checkinteger(L, arg);
if (size < SZINT) { /* need overflow check? */
let lim = 1 << (size * 8) - 1;
- lauxlib.luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow");
+ luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow");
}
packint(b, n, h.islittle, size, n < 0);
break;
}
- case KOption.Kuint: { /* unsigned integers */
- let n = lauxlib.luaL_checkinteger(L, arg);
+ case Kuint: { /* unsigned integers */
+ let n = luaL_checkinteger(L, arg);
if (size < SZINT)
- lauxlib.luaL_argcheck(L, (n>>>0) < (1 << (size * NB)), arg, "unsigned overflow");
+ luaL_argcheck(L, (n>>>0) < (1 << (size * NB)), arg, "unsigned overflow");
packint(b, n>>>0, h.islittle, size, false);
break;
}
- case KOption.Kfloat: { /* floating-point options */
- let buff = lauxlib.luaL_prepbuffsize(b, size);
- let n = lauxlib.luaL_checknumber(L, arg); /* get argument */
- let dv = new DataView(buff.buffer);
+ case Kfloat: { /* floating-point options */
+ let buff = luaL_prepbuffsize(b, size);
+ let n = luaL_checknumber(L, arg); /* get argument */
+ let dv = new DataView(buff.buffer, buff.byteOffset, buff.byteLength);
if (size === 4) dv.setFloat32(0, n, h.islittle);
else dv.setFloat64(0, n, h.islittle);
- lauxlib.luaL_addsize(b, size);
+ luaL_addsize(b, size);
break;
}
- case KOption.Kchar: { /* fixed-size string */
- let s = lauxlib.luaL_checkstring(L, arg);
+ case Kchar: { /* fixed-size string */
+ let s = luaL_checkstring(L, arg);
let len = s.length;
- lauxlib.luaL_argcheck(L, len <= size, arg, "string longer than given size");
- lauxlib.luaL_addlstring(b, s, len); /* add string */
+ luaL_argcheck(L, len <= size, arg, "string longer than given size");
+ luaL_addlstring(b, s, len); /* add string */
while (len++ < size) /* pad extra space */
- lauxlib.luaL_addchar(b, LUAL_PACKPADBYTE);
+ luaL_addchar(b, LUAL_PACKPADBYTE);
break;
}
- case KOption.Kstring: { /* strings with length count */
- let s = lauxlib.luaL_checkstring(L, arg);
+ case Kstring: { /* strings with length count */
+ let s = luaL_checkstring(L, arg);
let len = s.length;
- lauxlib.luaL_argcheck(L,
+ luaL_argcheck(L,
size >= 4 /* sizeof(size_t) */ || len < (1 << (size * NB)),
arg, "string length does not fit in given size");
packint(b, len, h.islittle, size, 0); /* pack length */
- lauxlib.luaL_addlstring(b, s, len);
+ luaL_addlstring(b, s, len);
totalsize += len;
break;
}
- case KOption.Kzstr: { /* zero-terminated string */
- let s = lauxlib.luaL_checkstring(L, arg);
+ case Kzstr: { /* zero-terminated string */
+ let s = luaL_checkstring(L, arg);
let len = s.length;
- lauxlib.luaL_argcheck(L, s.indexOf(0) < 0, arg, "strings contains zeros");
- lauxlib.luaL_addlstring(b, s, len);
- lauxlib.luaL_addchar(b, 0); /* add zero at the end */
+ luaL_argcheck(L, luastring_indexOf(s, 0) < 0, arg, "strings contains zeros");
+ luaL_addlstring(b, s, len);
+ luaL_addchar(b, 0); /* add zero at the end */
totalsize += len + 1;
break;
}
- case KOption.Kpadding: lauxlib.luaL_addchar(b, LUAL_PACKPADBYTE); /* fall through */
- case KOption.Kpaddalign: case KOption.Knop:
+ case Kpadding: luaL_addchar(b, LUAL_PACKPADBYTE); /* fall through */
+ case Kpaddalign: case Knop:
arg--; /* undo increment */
break;
}
}
- lauxlib.luaL_pushresult(b);
+ luaL_pushresult(b);
return 1;
};
const str_reverse = function(L) {
- lua.lua_pushstring(L, lauxlib.luaL_checkstring(L, 1).slice(0).reverse());
+ let s = luaL_checkstring(L, 1);
+ let l = s.length;
+ let r = new Uint8Array(l);
+ for (let i=0; i<l; i++)
+ r[i] = s[l-1-i];
+ lua_pushstring(L, r);
return 1;
};
const str_lower = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
- // TODO: will fail on invalid UTF-8
- lua.lua_pushstring(L, lua.to_luastring(lua.to_jsstring(s).toLowerCase()));
+ let s = luaL_checkstring(L, 1);
+ let l = s.length;
+ let r = new Uint8Array(l);
+ for (let i=0; i<l; i++) {
+ let c = s[i];
+ if (isupper(c))
+ c = c | 0x20;
+ r[i] = c;
+ }
+ lua_pushstring(L, r);
return 1;
};
const str_upper = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
- // TODO: will fail on invalid UTF-8
- lua.lua_pushstring(L, lua.to_luastring(lua.to_jsstring(s).toUpperCase()));
+ let s = luaL_checkstring(L, 1);
+ let l = s.length;
+ let r = new Uint8Array(l);
+ for (let i=0; i<l; i++) {
+ let c = s[i];
+ if (islower(c))
+ c = c & 0xdf;
+ r[i] = c;
+ }
+ lua_pushstring(L, r);
return 1;
};
const str_rep = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
+ let s = luaL_checkstring(L, 1);
let l = s.length;
- let n = lauxlib.luaL_checkinteger(L, 2);
- let sep = lauxlib.luaL_optstring(L, 3, "");
+ let n = luaL_checkinteger(L, 2);
+ let sep = luaL_optstring(L, 3, "");
let lsep = sep.length;
- if (n <= 0) lua.lua_pushliteral(L, "");
+ if (n <= 0) lua_pushliteral(L, "");
else if (l + lsep < l || l + lsep > MAXSIZE / n) /* may overflow? */
- return lauxlib.luaL_error(L, lua.to_luastring("resulting string too large"));
+ return luaL_error(L, to_luastring("resulting string too large"));
else {
let totallen = n * l + (n - 1) * lsep;
- let b = new lauxlib.luaL_Buffer();
- let p = lauxlib.luaL_buffinitsize(L, b, totallen);
+ let b = new luaL_Buffer();
+ let p = luaL_buffinitsize(L, b, totallen);
let pi = 0;
while (n-- > 1) { /* first n-1 copies (followed by separator) */
p.set(s, pi);
@@ -636,34 +722,34 @@ const str_rep = function(L) {
}
}
p.set(s, pi); /* last copy (not followed by separator) */
- lauxlib.luaL_pushresultsize(b, totallen);
+ luaL_pushresultsize(b, totallen);
}
return 1;
};
const str_byte = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
+ let s = luaL_checkstring(L, 1);
let l = s.length;
- let posi = posrelat(lauxlib.luaL_optinteger(L, 2, 1), l);
- let pose = posrelat(lauxlib.luaL_optinteger(L, 3, posi), l);
+ let posi = posrelat(luaL_optinteger(L, 2, 1), l);
+ let pose = posrelat(luaL_optinteger(L, 3, posi), l);
if (posi < 1) posi = 1;
if (pose > l) pose = l;
if (posi > pose) return 0; /* empty interval; return no values */
if (pose - posi >= Number.MAX_SAFE_INTEGER) /* arithmetic overflow? */
- return lauxlib.luaL_error(L, "string slice too long");
+ return luaL_error(L, "string slice too long");
let n = (pose - posi) + 1;
- lauxlib.luaL_checkstack(L, n, "string slice too long");
+ luaL_checkstack(L, n, "string slice too long");
for (let i = 0; i < n; i++)
- lua.lua_pushinteger(L, s[posi + i - 1]);
+ lua_pushinteger(L, s[posi + i - 1]);
return n;
};
const str_packsize = function(L) {
let h = new Header(L);
let fmt = {
- s: lauxlib.luaL_checkstring(L, 1),
+ s: luaL_checkstring(L, 1),
off: 0
};
let totalsize = 0; /* accumulate total size of result */
@@ -673,17 +759,17 @@ const str_packsize = function(L) {
let size = details.size;
let ntoalign = details.ntoalign;
size += ntoalign; /* total space used by option */
- lauxlib.luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, "format result too large");
+ luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, "format result too large");
totalsize += size;
switch (opt) {
- case KOption.Kstring: /* strings with length count */
- case KOption.Kzstr: /* zero-terminated string */
- lauxlib.luaL_argerror(L, 1, "variable-length format");
+ case Kstring: /* strings with length count */
+ case Kzstr: /* zero-terminated string */
+ luaL_argerror(L, 1, "variable-length format");
/* call never return, but to avoid warnings: *//* fall through */
default: break;
}
}
- lua.lua_pushinteger(L, totalsize);
+ lua_pushinteger(L, totalsize);
return 1;
};
@@ -711,14 +797,14 @@ const unpackint = function(L, str, islittle, size, issigned) {
let mask = !issigned || res >= 0 ? 0 : MC;
for (let i = limit; i < size; i++) {
if (str[islittle ? i : size - 1 - i] !== mask)
- lauxlib.luaL_error(L, lua.to_luastring("%d-byte integer does not fit into Lua Integer"), size);
+ luaL_error(L, to_luastring("%d-byte integer does not fit into Lua Integer"), size);
}
}
return res;
};
const unpacknum = function(L, b, islittle, size) {
- assert(b.length >= size);
+ lualib.lua_assert(b.length >= size);
let dv = new DataView(new ArrayBuffer(size));
for (let i = 0; i < size; i++)
@@ -731,68 +817,69 @@ const unpacknum = function(L, b, islittle, size) {
const str_unpack = function(L) {
let h = new Header(L);
let fmt = {
- s: lauxlib.luaL_checkstring(L, 1),
+ s: luaL_checkstring(L, 1),
off: 0
};
- let data = lauxlib.luaL_checkstring(L, 2);
+ let data = luaL_checkstring(L, 2);
let ld = data.length;
- let pos = posrelat(lauxlib.luaL_optinteger(L, 3, 1), ld) - 1;
+ let pos = posrelat(luaL_optinteger(L, 3, 1), ld) - 1;
let n = 0; /* number of results */
- lauxlib.luaL_argcheck(L, pos <= ld && pos >= 0, 3, "initial position out of string");
+ luaL_argcheck(L, pos <= ld && pos >= 0, 3, "initial position out of string");
while (fmt.off < fmt.s.length) {
let details = getdetails(h, pos, fmt);
let opt = details.opt;
let size = details.size;
let ntoalign = details.ntoalign;
if (/*ntoalign + size > ~pos ||*/ pos + ntoalign + size > ld)
- lauxlib.luaL_argerror(L, 2, lua.to_luastring("data string too short", true));
+ luaL_argerror(L, 2, to_luastring("data string too short", true));
pos += ntoalign; /* skip alignment */
/* stack space for item + next position */
- lauxlib.luaL_checkstack(L, 2, lua.to_luastring("too many results", true));
+ luaL_checkstack(L, 2, to_luastring("too many results", true));
n++;
switch (opt) {
- case KOption.Kint:
- case KOption.Kuint: {
- let res = unpackint(L, data.slice(pos), h.islittle, size, opt === KOption.Kint);
- lua.lua_pushinteger(L, res);
+ case Kint:
+ case Kuint: {
+ let res = unpackint(L, data.subarray(pos), h.islittle, size, opt === Kint);
+ lua_pushinteger(L, res);
break;
}
- case KOption.Kfloat: {
- let res = unpacknum(L, data.slice(pos), h.islittle, size);
- lua.lua_pushnumber(L, res);
+ case Kfloat: {
+ let res = unpacknum(L, data.subarray(pos), h.islittle, size);
+ lua_pushnumber(L, res);
break;
}
- case KOption.Kchar: {
- lua.lua_pushstring(L, data.slice(pos, pos + size));
+ case Kchar: {
+ lua_pushstring(L, data.subarray(pos, pos + size));
break;
}
- case KOption.Kstring: {
- let len = unpackint(L, data.slice(pos), h.islittle, size, 0);
- lauxlib.luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short");
- lua.lua_pushstring(L, data.slice(pos + size, pos + size + len));
+ case Kstring: {
+ let len = unpackint(L, data.subarray(pos), h.islittle, size, 0);
+ luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short");
+ lua_pushstring(L, data.subarray(pos + size, pos + size + len));
pos += len; /* skip string */
break;
}
- case KOption.Kzstr: {
- let len = data.slice(pos).indexOf(0);
- lua.lua_pushstring(L, data.slice(pos, pos + len));
- pos += len + 1; /* skip string plus final '\0' */
+ case Kzstr: {
+ let e = luastring_indexOf(data, 0, pos);
+ if (e === -1) e = data.length - pos;
+ lua_pushstring(L, data.subarray(pos, e));
+ pos = e + 1; /* skip string plus final '\0' */
break;
}
- case KOption.Kpaddalign: case KOption.Kpadding: case KOption.Knop:
+ case Kpaddalign: case Kpadding: case Knop:
n--; /* undo increment */
break;
}
pos += size;
}
- lua.lua_pushinteger(L, pos + 1); /* next position */
+ lua_pushinteger(L, pos + 1); /* next position */
return n + 1;
};
const CAP_UNFINISHED = -1;
const CAP_POSITION = -2;
const MAXCCALLS = 200;
-const SPECIALS = ["^".charCodeAt(0), "$".charCodeAt(0), "*".charCodeAt(0), "+".charCodeAt(0), "?".charCodeAt(0), ".".charCodeAt(0), "(".charCodeAt(0), "[".charCodeAt(0), "%".charCodeAt(0), "-".charCodeAt(0)];
+const SPECIALS = to_luastring("^$*+?.([%-");
class MatchState {
constructor(L) {
@@ -809,9 +896,9 @@ class MatchState {
}
const check_capture = function(ms, l) {
- l = l - '1'.charCodeAt(0);
+ l = l - 49 /* '1'.charCodeAt(0) */;
if (l < 0 || l >= ms.level || ms.capture[l].len === CAP_UNFINISHED)
- return lauxlib.luaL_error(ms.L, lua.to_luastring("invalid capture index %%%d"), l + 1);
+ return luaL_error(ms.L, to_luastring("invalid capture index %%%d"), l + 1);
return l;
};
@@ -819,24 +906,24 @@ const capture_to_close = function(ms) {
let level = ms.level;
for (level--; level >= 0; level--)
if (ms.capture[level].len === CAP_UNFINISHED) return level;
- return lauxlib.luaL_error(ms.L, lua.to_luastring("invalid pattern capture"));
+ return luaL_error(ms.L, to_luastring("invalid pattern capture"));
};
const classend = function(ms, p) {
switch(ms.p[p++]) {
case L_ESC: {
if (p === ms.p_end)
- lauxlib.luaL_error(ms.L, lua.to_luastring("malformed pattern (ends with '%%')"));
+ luaL_error(ms.L, to_luastring("malformed pattern (ends with '%%')"));
return p + 1;
}
- case '['.charCodeAt(0): {
- if (ms.p[p] === '^'.charCodeAt(0)) p++;
+ case 91 /* '['.charCodeAt(0) */: {
+ if (ms.p[p] === 94 /* '^'.charCodeAt(0) */) p++;
do { /* look for a ']' */
if (p === ms.p_end)
- lauxlib.luaL_error(ms.L, lua.to_luastring("malformed pattern (missing ']')"));
+ luaL_error(ms.L, to_luastring("malformed pattern (missing ']')"));
if (ms.p[p++] === L_ESC && p < ms.p_end)
p++; /* skip escapes (e.g. '%]') */
- } while (ms.p[p] !== ']'.charCodeAt(0));
+ } while (ms.p[p] !== 93 /* ']'.charCodeAt(0) */);
return p + 1;
}
default: {
@@ -846,27 +933,36 @@ const classend = function(ms, p) {
};
const match_class = function(c, cl) {
- let res;
- switch (String.fromCharCode(cl).toLowerCase().charCodeAt(0)) {
- case 'a'.charCodeAt(0) : res = isalpha(c); break;
- case 'c'.charCodeAt(0) : res = iscntrl(c); break;
- case 'd'.charCodeAt(0) : res = isdigit(c); break;
- case 'g'.charCodeAt(0) : res = isgraph(c); break;
- case 'l'.charCodeAt(0) : res = islower(c); break;
- case 'p'.charCodeAt(0) : res = ispunct(c); break;
- case 's'.charCodeAt(0) : res = isspace(c); break;
- case 'u'.charCodeAt(0) : res = isupper(c); break;
- case 'w'.charCodeAt(0) : res = isalnum(c); break;
- case 'x'.charCodeAt(0) : res = isxdigit(c); break;
- case 'z'.charCodeAt(0) : res = (c === 0); break; /* deprecated option */
+ switch (cl) {
+ case 97 /* 'a'.charCodeAt(0) */: return isalpha(c);
+ case 65 /* 'A'.charCodeAt(0) */: return !isalpha(c);
+ case 99 /* 'c'.charCodeAt(0) */: return iscntrl(c);
+ case 67 /* 'C'.charCodeAt(0) */: return !iscntrl(c);
+ case 100 /* 'd'.charCodeAt(0) */: return isdigit(c);
+ case 68 /* 'D'.charCodeAt(0) */: return !isdigit(c);
+ case 103 /* 'g'.charCodeAt(0) */: return isgraph(c);
+ case 71 /* 'G'.charCodeAt(0) */: return !isgraph(c);
+ case 108 /* 'l'.charCodeAt(0) */: return islower(c);
+ case 76 /* 'L'.charCodeAt(0) */: return !islower(c);
+ case 112 /* 'p'.charCodeAt(0) */: return ispunct(c);
+ case 80 /* 'P'.charCodeAt(0) */: return !ispunct(c);
+ case 115 /* 's'.charCodeAt(0) */: return isspace(c);
+ case 83 /* 'S'.charCodeAt(0) */: return !isspace(c);
+ case 117 /* 'u'.charCodeAt(0) */: return isupper(c);
+ case 85 /* 'U'.charCodeAt(0) */: return !isupper(c);
+ case 119 /* 'w'.charCodeAt(0) */: return isalnum(c);
+ case 87 /* 'W'.charCodeAt(0) */: return !isalnum(c);
+ case 120 /* 'x'.charCodeAt(0) */: return isxdigit(c);
+ case 88 /* 'X'.charCodeAt(0) */: return !isxdigit(c);
+ case 122 /* 'z'.charCodeAt(0) */: return (c === 0); /* deprecated option */
+ case 90 /* 'z'.charCodeAt(0) */: return (c !== 0); /* deprecated option */
default: return (cl === c);
}
- return (islower(cl) ? res : !res);
};
const matchbracketclass = function(ms, c, p, ec) {
let sig = true;
- if (ms.p[p + 1] === '^'.charCodeAt(0)) {
+ if (ms.p[p + 1] === 94 /* '^'.charCodeAt(0) */) {
sig = false;
p++; /* skip the '^' */
}
@@ -875,7 +971,7 @@ const matchbracketclass = function(ms, c, p, ec) {
p++;
if (match_class(c, ms.p[p]))
return sig;
- } else if (ms.p[p + 1] === '-'.charCodeAt(0) && p + 2 < ec) {
+ } else if (ms.p[p + 1] === 45 /* '-'.charCodeAt(0) */ && p + 2 < ec) {
p += 2;
if (ms.p[p - 2] <= c && c <= ms.p[p])
return sig;
@@ -890,9 +986,9 @@ const singlematch = function(ms, s, p, ep) {
else {
let c = ms.src[s];
switch (ms.p[p]) {
- case '.'.charCodeAt(0): return true; /* matches any char */
+ case 46 /* '.'.charCodeAt(0) */: return true; /* matches any char */
case L_ESC: return match_class(c, ms.p[p + 1]);
- case '['.charCodeAt(0): return matchbracketclass(ms, c, p, ep - 1);
+ case 91 /* '['.charCodeAt(0) */: return matchbracketclass(ms, c, p, ep - 1);
default: return ms.p[p] === c;
}
}
@@ -900,7 +996,7 @@ const singlematch = function(ms, s, p, ep) {
const matchbalance = function(ms, s, p) {
if (p >= ms.p_end - 1)
- lauxlib.luaL_error(ms.L, lua.to_luastring("malformed pattern (missing arguments to '%%b'"));
+ luaL_error(ms.L, to_luastring("malformed pattern (missing arguments to '%%b'"));
if (ms.src[s] !== ms.p[p])
return null;
else {
@@ -943,7 +1039,7 @@ const min_expand = function(ms, s, p, ep) {
const start_capture = function(ms, s, p, what) {
let level = ms.level;
- if (level >= LUA_MAXCAPTURES) lauxlib.luaL_error(ms.L, lua.to_luastring("too many captures", true));
+ if (level >= LUA_MAXCAPTURES) luaL_error(ms.L, to_luastring("too many captures", true));
ms.capture[level] = ms.capture[level] ? ms.capture[level] : {};
ms.capture[level].init = s;
ms.capture[level].len = what;
@@ -969,7 +1065,7 @@ const array_cmp = function(a, ai, b, bi, len) {
return true;
let aj = ai+len;
loop: for (;;) {
- ai = a.indexOf(b[bi], ai);
+ ai = luastring_indexOf(a, b[bi], ai);
if (ai === -1 || ai >= aj)
return false;
for (let j = 1; j < len; j++) {
@@ -995,24 +1091,24 @@ const match = function(ms, s, p) {
let gotoinit = true;
if (ms.matchdepth-- === 0)
- lauxlib.luaL_error(ms.L, lua.to_luastring("pattern too complex", true));
+ luaL_error(ms.L, to_luastring("pattern too complex", true));
while (gotoinit || gotodefault) {
gotoinit = false;
if (p !== ms.p_end) { /* end of pattern? */
- switch (gotodefault ? 'x'.charCodeAt(0) : ms.p[p]) {
- case '('.charCodeAt(0): { /* start capture */
- if (ms.p[p + 1] === ')'.charCodeAt(0)) /* position capture? */
+ switch (gotodefault ? void 0 : ms.p[p]) {
+ case 40 /* '('.charCodeAt(0) */: { /* start capture */
+ if (ms.p[p + 1] === 41 /* ')'.charCodeAt(0) */) /* position capture? */
s = start_capture(ms, s, p + 2, CAP_POSITION);
else
s = start_capture(ms, s, p + 1, CAP_UNFINISHED);
break;
}
- case ')'.charCodeAt(0): { /* end capture */
+ case 41 /* ')'.charCodeAt(0) */: { /* end capture */
s = end_capture(ms, s, p + 1);
break;
}
- case '$'.charCodeAt(0): {
+ case 36 /* '$'.charCodeAt(0) */: {
if (p + 1 !== ms.p_end) { /* is the '$' the last char in pattern? */
gotodefault = true; /* no; go to default */
break;
@@ -1022,7 +1118,7 @@ const match = function(ms, s, p) {
}
case L_ESC: { /* escaped sequences not in the format class[*+?-]? */
switch (ms.p[p + 1]) {
- case 'b'.charCodeAt(0): { /* balanced string? */
+ case 98 /* 'b'.charCodeAt(0) */: { /* balanced string? */
s = matchbalance(ms, s, p + 2);
if (s !== null) {
p += 4;
@@ -1030,10 +1126,10 @@ const match = function(ms, s, p) {
}
break;
}
- case 'f'.charCodeAt(0): { /* frontier? */
+ case 102 /* 'f'.charCodeAt(0) */: { /* frontier? */
p += 2;
- if (ms.p[p] !== '['.charCodeAt(0))
- lauxlib.luaL_error(ms.L, lua.to_luastring("missing '[' after '%%f' in pattern"));
+ if (ms.p[p] !== 91 /* '['.charCodeAt(0) */)
+ luaL_error(ms.L, to_luastring("missing '[' after '%%f' in pattern"));
let ep = classend(ms, p); /* points to what is next */
let previous = s === ms.src_init ? 0 : ms.src[s-1];
if (!matchbracketclass(ms, previous, p, ep - 1) && matchbracketclass(ms, (s===ms.src_end)?0:ms.src[s], p, ep - 1)) {
@@ -1042,9 +1138,8 @@ const match = function(ms, s, p) {
s = null; /* match failed */
break;
}
- case '0'.charCodeAt(0): case '1'.charCodeAt(0): case '2'.charCodeAt(0): case '3'.charCodeAt(0):
- case '4'.charCodeAt(0): case '5'.charCodeAt(0): case '6'.charCodeAt(0): case '7'.charCodeAt(0):
- case '8'.charCodeAt(0): case '9'.charCodeAt(0): { /* capture results (%0-%9)? */
+ case 48: case 49: case 50: case 51: case 52:
+ case 53: case 54: case 55: case 56: case 57: { /* capture results (%0-%9)? */
s = match_capture(ms, s, ms.p[p + 1]);
if (s !== null) {
p += 2; gotoinit = true;
@@ -1060,13 +1155,16 @@ const match = function(ms, s, p) {
let ep = classend(ms, p); /* points to optional suffix */
/* does not match at least once? */
if (!singlematch(ms, s, p, ep)) {
- if (ms.p[ep] === '*'.charCodeAt(0) || ms.p[ep] === '?'.charCodeAt(0) || ms.p[ep] === '-'.charCodeAt(0)) { /* accept empty? */
+ if (ms.p[ep] === 42 /* '*'.charCodeAt(0) */ ||
+ ms.p[ep] === 63 /* '?'.charCodeAt(0) */ ||
+ ms.p[ep] === 45 /* '-'.charCodeAt(0) */
+ ) { /* accept empty? */
p = ep + 1; gotoinit = true; break;
} else /* '+' or no suffix */
s = null; /* fail */
} else { /* matched once */
switch (ms.p[ep]) { /* handle optional suffix */
- case '?'.charCodeAt(0): { /* optional */
+ case 63 /* '?'.charCodeAt(0) */: { /* optional */
let res;
if ((res = match(ms, s + 1, ep + 1)) !== null)
s = res;
@@ -1075,13 +1173,13 @@ const match = function(ms, s, p) {
}
break;
}
- case '+'.charCodeAt(0): /* 1 or more repetitions */
+ case 43 /* '+'.charCodeAt(0) */: /* 1 or more repetitions */
s++; /* 1 match already done */
/* fall through */
- case '*'.charCodeAt(0): /* 0 or more repetitions */
+ case 42 /* '*'.charCodeAt(0) */: /* 0 or more repetitions */
s = max_expand(ms, s, p, ep);
break;
- case '-'.charCodeAt(0): /* 0 or more repetitions (minimum) */
+ case 45 /* '-'.charCodeAt(0) */: /* 0 or more repetitions (minimum) */
s = min_expand(ms, s, p, ep);
break;
default: /* no suffix */
@@ -1100,22 +1198,22 @@ const match = function(ms, s, p) {
const push_onecapture = function(ms, i, s, e) {
if (i >= ms.level) {
if (i === 0)
- lua.lua_pushlstring(ms.L, ms.src.slice(s, e), e - s); /* add whole match */
+ lua_pushlstring(ms.L, ms.src.subarray(s, e), e - s); /* add whole match */
else
- lauxlib.luaL_error(ms.L, lua.to_luastring("invalid capture index %%%d"), i + 1);
+ luaL_error(ms.L, to_luastring("invalid capture index %%%d"), i + 1);
} else {
let l = ms.capture[i].len;
- if (l === CAP_UNFINISHED) lauxlib.luaL_error(ms.L, lua.to_luastring("unfinished capture", true));
+ if (l === CAP_UNFINISHED) luaL_error(ms.L, to_luastring("unfinished capture", true));
if (l === CAP_POSITION)
- lua.lua_pushinteger(ms.L, ms.capture[i].init - ms.src_init + 1);
+ lua_pushinteger(ms.L, ms.capture[i].init - ms.src_init + 1);
else
- lua.lua_pushlstring(ms.L, ms.src.slice(ms.capture[i].init), l);
+ lua_pushlstring(ms.L, ms.src.subarray(ms.capture[i].init), l);
}
};
const push_captures = function(ms, s, e) {
- let nlevels = ms.level === 0 && ms.src.slice(s) ? 1 : ms.level;
- lauxlib.luaL_checkstack(ms.L, nlevels, lua.to_luastring("too many catpures", true));
+ let nlevels = ms.level === 0 && ms.src.subarray(s) ? 1 : ms.level;
+ luaL_checkstack(ms.L, nlevels, to_luastring("too many catpures", true));
for (let i = 0; i < nlevels; i++)
push_onecapture(ms, i, s, e);
return nlevels; /* number of strings pushed */
@@ -1123,7 +1221,7 @@ const push_captures = function(ms, s, e) {
const nospecials = function(p, l) {
for (let i=0; i<l; i++) {
- if (SPECIALS.indexOf(p[i]) !== -1)
+ if (luastring_indexOf(SPECIALS, p[i]) !== -1)
return false;
}
return true;
@@ -1141,7 +1239,7 @@ const prepstate = function(ms, L, s, ls, p, lp) {
const reprepstate = function(ms) {
ms.level = 0;
- assert(ms.matchdepth === MAXCCALLS);
+ lualib.lua_assert(ms.matchdepth === MAXCCALLS);
};
const find_subarray = function(arr, subarr, from_index) {
@@ -1166,31 +1264,31 @@ const find_subarray = function(arr, subarr, from_index) {
};
const str_find_aux = function(L, find) {
- let s = lauxlib.luaL_checkstring(L, 1);
- let p = lauxlib.luaL_checkstring(L, 2);
+ let s = luaL_checkstring(L, 1);
+ let p = luaL_checkstring(L, 2);
let ls = s.length;
let lp = p.length;
- let init = posrelat(lauxlib.luaL_optinteger(L, 3, 1), ls);
+ let init = posrelat(luaL_optinteger(L, 3, 1), ls);
if (init < 1) init = 1;
else if (init > ls + 1) { /* start after string's end? */
- lua.lua_pushnil(L); /* cannot find anything */
+ lua_pushnil(L); /* cannot find anything */
return 1;
}
/* explicit request or no special characters? */
- if (find && (lua.lua_toboolean(L, 4) || nospecials(p, lp))) {
+ if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {
/* do a plain search */
- let f = find_subarray(s.slice(init - 1), p, 0);
+ let f = find_subarray(s.subarray(init - 1), p, 0);
if (f > -1) {
- lua.lua_pushinteger(L, init + f);
- lua.lua_pushinteger(L, init + f + lp - 1);
+ lua_pushinteger(L, init + f);
+ lua_pushinteger(L, init + f + lp - 1);
return 2;
}
} else {
let ms = new MatchState(L);
let s1 = init - 1;
- let anchor = p[0] === '^'.charCodeAt(0);
+ let anchor = p[0] === 94 /* '^'.charCodeAt(0) */;
if (anchor) {
- p = p.slice(1); lp--; /* skip anchor character */
+ p = p.subarray(1); lp--; /* skip anchor character */
}
prepstate(ms, L, s, ls, p, lp);
do {
@@ -1198,15 +1296,15 @@ const str_find_aux = function(L, find) {
reprepstate(ms);
if ((res = match(ms, s1, 0)) !== null) {
if (find) {
- lua.lua_pushinteger(L, s1 + 1); /* start */
- lua.lua_pushinteger(L, res); /* end */
+ lua_pushinteger(L, s1 + 1); /* start */
+ lua_pushinteger(L, res); /* end */
return push_captures(ms, null, 0) + 2;
} else
return push_captures(ms, s1, res);
}
} while (s1++ < ms.src_end && !anchor);
}
- lua.lua_pushnil(L); /* not found */
+ lua_pushnil(L); /* not found */
return 1;
};
@@ -1229,7 +1327,7 @@ class GMatchState {
}
const gmatch_aux = function(L) {
- let gm = lua.lua_touserdata(L, lua.lua_upvalueindex(3));
+ let gm = lua_touserdata(L, lua_upvalueindex(3));
gm.ms.L = L;
for (let src = gm.src; src <= gm.ms.src_end; src++) {
reprepstate(gm.ms);
@@ -1243,41 +1341,41 @@ const gmatch_aux = function(L) {
};
const str_gmatch = function(L) {
- let s = lauxlib.luaL_checkstring(L, 1);
- let p = lauxlib.luaL_checkstring(L, 2);
+ let s = luaL_checkstring(L, 1);
+ let p = luaL_checkstring(L, 2);
let ls = s.length;
let lp = p.length;
- lua.lua_settop(L, 2); /* keep them on closure to avoid being collected */
+ lua_settop(L, 2); /* keep them on closure to avoid being collected */
let gm = new GMatchState();
- lua.lua_pushlightuserdata(L, gm);
+ lua_pushlightuserdata(L, gm);
prepstate(gm.ms, L, s, ls, p, lp);
gm.src = 0;
gm.p = 0;
gm.lastmatch = null;
- lua.lua_pushcclosure(L, gmatch_aux, 3);
+ lua_pushcclosure(L, gmatch_aux, 3);
return 1;
};
const add_s = function(ms, b, s, e) {
let L = ms.L;
- let news = lua.lua_tostring(L, 3);
+ let news = lua_tostring(L, 3);
let l = news.length;
for (let i = 0; i < l; i++) {
if (news[i] !== L_ESC)
- lauxlib.luaL_addchar(b, news[i]);
+ luaL_addchar(b, news[i]);
else {
i++; /* skip ESC */
if (!isdigit(news[i])) {
if (news[i] !== L_ESC)
- lauxlib.luaL_error(L, lua.to_luastring("invalid use of '%c' in replacement string"), L_ESC);
- lauxlib.luaL_addchar(b, news[i]);
- } else if (news[i] === '0'.charCodeAt(0))
- lauxlib.luaL_addlstring(b, ms.src.slice(s), e - s);
+ luaL_error(L, to_luastring("invalid use of '%c' in replacement string"), L_ESC);
+ luaL_addchar(b, news[i]);
+ } else if (news[i] === 48 /* '0'.charCodeAt(0) */)
+ luaL_addlstring(b, ms.src.subarray(s, e), e - s);
else {
- push_onecapture(ms, news[i] - '1'.charCodeAt(0), s, e);
- lauxlib.luaL_tolstring(L, -1);
- lua.lua_remove(L, -2); /* remove original value */
- lauxlib.luaL_addvalue(b); /* add capture to accumulated result */
+ push_onecapture(ms, news[i] - 49 /* '1'.charCodeAt(0) */, s, e);
+ luaL_tolstring(L, -1);
+ lua_remove(L, -2); /* remove original value */
+ luaL_addvalue(b); /* add capture to accumulated result */
}
}
}
@@ -1286,15 +1384,15 @@ const add_s = function(ms, b, s, e) {
const add_value = function(ms, b, s, e, tr) {
let L = ms.L;
switch (tr) {
- case lua.LUA_TFUNCTION: {
- lua.lua_pushvalue(L, 3);
+ case LUA_TFUNCTION: {
+ lua_pushvalue(L, 3);
let n = push_captures(ms, s, e);
- lua.lua_call(L, n, 1);
+ lua_call(L, n, 1);
break;
}
- case lua.LUA_TTABLE: {
+ case LUA_TTABLE: {
push_onecapture(ms, 0, s, e);
- lua.lua_gettable(L, 3);
+ lua_gettable(L, 3);
break;
}
default: { /* LUA_TNUMBER or LUA_TSTRING */
@@ -1302,31 +1400,31 @@ const add_value = function(ms, b, s, e, tr) {
return;
}
}
- if (!lua.lua_toboolean(L, -1)) { /* nil or false? */
- lua.lua_pop(L, 1);
- lua.lua_pushlstring(L, ms.src.slice(s, e), e - s); /* keep original text */
- } else if (!lua.lua_isstring(L, -1))
- lauxlib.luaL_error(L, lua.to_luastring("invalid replacement value (a %s)"), lauxlib.luaL_typename(L, -1));
- lauxlib.luaL_addvalue(b); /* add result to accumulator */
+ if (!lua_toboolean(L, -1)) { /* nil or false? */
+ lua_pop(L, 1);
+ lua_pushlstring(L, ms.src.subarray(s, e), e - s); /* keep original text */
+ } else if (!lua_isstring(L, -1))
+ luaL_error(L, to_luastring("invalid replacement value (a %s)"), luaL_typename(L, -1));
+ luaL_addvalue(b); /* add result to accumulator */
};
const str_gsub = function(L) {
- let src = lauxlib.luaL_checkstring(L, 1); /* subject */
+ let src = luaL_checkstring(L, 1); /* subject */
let srcl = src.length;
- let p = lauxlib.luaL_checkstring(L, 2); /* pattern */
+ let p = luaL_checkstring(L, 2); /* pattern */
let lp = p.length;
let lastmatch = null; /* end of last match */
- let tr = lua.lua_type(L, 3); /* replacement type */
- let max_s = lauxlib.luaL_optinteger(L, 4, srcl + 1); /* max replacements */
- let anchor = p[0] === '^'.charCodeAt(0);
+ let tr = lua_type(L, 3); /* replacement type */
+ let max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */
+ let anchor = p[0] === 94 /* '^'.charCodeAt(0) */;
let n = 0; /* replacement count */
let ms = new MatchState(L);
- let b = new lauxlib.luaL_Buffer();
- lauxlib.luaL_argcheck(L, tr === lua.LUA_TNUMBER || tr === lua.LUA_TSTRING || tr === lua.LUA_TFUNCTION || tr === lua.LUA_TTABLE, 3,
+ let b = new luaL_Buffer();
+ luaL_argcheck(L, tr === LUA_TNUMBER || tr === LUA_TSTRING || tr === LUA_TFUNCTION || tr === LUA_TTABLE, 3,
"string/function/table expected");
- lauxlib.luaL_buffinit(L, b);
+ luaL_buffinit(L, b);
if (anchor) {
- p = p.slice(1); lp--; /* skip anchor character */
+ p = p.subarray(1); lp--; /* skip anchor character */
}
prepstate(ms, L, src, srcl, p, lp);
src = 0; p = 0;
@@ -1338,13 +1436,13 @@ const str_gsub = function(L) {
add_value(ms, b, src, e, tr); /* add replacement to buffer */
src = lastmatch = e;
} else if (src < ms.src_end) /* otherwise, skip one character */
- lauxlib.luaL_addchar(b, ms.src[src++]);
+ luaL_addchar(b, ms.src[src++]);
else break; /* end of subject */
if (anchor) break;
}
- lauxlib.luaL_addlstring(b, ms.src.slice(src), ms.src_end - src);
- lauxlib.luaL_pushresult(b);
- lua.lua_pushinteger(L, n); /* number of substitutions */
+ luaL_addlstring(b, ms.src.subarray(src, ms.src_end), ms.src_end - src);
+ luaL_pushresult(b);
+ lua_pushinteger(L, n); /* number of substitutions */
return 2;
};
@@ -1369,18 +1467,18 @@ const strlib = {
};
const createmetatable = function(L) {
- lua.lua_createtable(L, 0, 1); /* table to be metatable for strings */
- lua.lua_pushliteral(L, ""); /* dummy string */
- lua.lua_pushvalue(L, -2); /* copy table */
- lua.lua_setmetatable(L, -2); /* set table as metatable for strings */
- lua.lua_pop(L, 1); /* pop dummy string */
- lua.lua_pushvalue(L, -2); /* get string library */
- lua.lua_setfield(L, -2, lua.to_luastring("__index", true)); /* metatable.__index = string */
- lua.lua_pop(L, 1); /* pop metatable */
+ lua_createtable(L, 0, 1); /* table to be metatable for strings */
+ lua_pushliteral(L, ""); /* dummy string */
+ lua_pushvalue(L, -2); /* copy table */
+ lua_setmetatable(L, -2); /* set table as metatable for strings */
+ lua_pop(L, 1); /* pop dummy string */
+ lua_pushvalue(L, -2); /* get string library */
+ lua_setfield(L, -2, to_luastring("__index", true)); /* metatable.__index = string */
+ lua_pop(L, 1); /* pop metatable */
};
const luaopen_string = function(L) {
- lauxlib.luaL_newlib(L, strlib);
+ luaL_newlib(L, strlib);
createmetatable(L);
return 1;
};