35int luaO_ceillog2 (
unsigned int x) {
36 static const lu_byte log_2[256] = {
37 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
38 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
39 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
40 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
41 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
42 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
43 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
44 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
48 while (x >= 256) { l += 8; x >>= 8; }
53static lua_Integer intarith (
lua_State *L,
int op, lua_Integer v1,
56 case LUA_OPADD:
return intop(+, v1, v2);
57 case LUA_OPSUB:
return intop(-, v1, v2);
58 case LUA_OPMUL:
return intop(*, v1, v2);
59 case LUA_OPMOD:
return luaV_mod(L, v1, v2);
60 case LUA_OPIDIV:
return luaV_idiv(L, v1, v2);
61 case LUA_OPBAND:
return intop(&, v1, v2);
62 case LUA_OPBOR:
return intop(|, v1, v2);
63 case LUA_OPBXOR:
return intop(^, v1, v2);
64 case LUA_OPSHL:
return luaV_shiftl(v1, v2);
65 case LUA_OPSHR:
return luaV_shiftr(v1, v2);
66 case LUA_OPUNM:
return intop(-, 0, v1);
67 case LUA_OPBNOT:
return intop(^, ~l_castS2U(0), v1);
68 default: lua_assert(0);
return 0;
73static lua_Number numarith (
lua_State *L,
int op, lua_Number v1,
76 case LUA_OPADD:
return luai_numadd(L, v1, v2);
77 case LUA_OPSUB:
return luai_numsub(L, v1, v2);
78 case LUA_OPMUL:
return luai_nummul(L, v1, v2);
79 case LUA_OPDIV:
return luai_numdiv(L, v1, v2);
80 case LUA_OPPOW:
return luai_numpow(L, v1, v2);
81 case LUA_OPIDIV:
return luai_numidiv(L, v1, v2);
82 case LUA_OPUNM:
return luai_numunm(L, v1);
83 case LUA_OPMOD:
return luaV_modf(L, v1, v2);
84 default: lua_assert(0);
return 0;
92 case LUA_OPBAND:
case LUA_OPBOR:
case LUA_OPBXOR:
93 case LUA_OPSHL:
case LUA_OPSHR:
95 lua_Integer i1; lua_Integer i2;
96 if (tointegerns(p1, &i1) && tointegerns(p2, &i2)) {
97 setivalue(res, intarith(L, op, i1, i2));
102 case LUA_OPDIV:
case LUA_OPPOW: {
103 lua_Number n1; lua_Number n2;
104 if (tonumberns(p1, n1) && tonumberns(p2, n2)) {
105 setfltvalue(res, numarith(L, op, n1, n2));
111 lua_Number n1; lua_Number n2;
112 if (ttisinteger(p1) && ttisinteger(p2)) {
113 setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2)));
116 else if (tonumberns(p1, n1) && tonumberns(p2, n2)) {
117 setfltvalue(res, numarith(L, op, n1, n2));
128 if (!luaO_rawarith(L, op, p1, p2, s2v(res))) {
130 luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD));
135int luaO_hexavalue (
int c) {
136 if (lisdigit(c))
return c -
'0';
137 else return (ltolower(c) -
'a') + 10;
141static int isneg (
const char **s) {
142 if (**s ==
'-') { (*s)++;
return 1; }
143 else if (**s ==
'+') (*s)++;
155#if !defined(lua_strx2number)
165static lua_Number lua_strx2number (
const char *s,
char **endptr) {
166 int dot = lua_getlocaledecpoint();
167 lua_Number r = l_mathop(0.0);
173 *endptr = cast_charp(s);
174 while (lisspace(cast_uchar(*s))) s++;
176 if (!(*s ==
'0' && (*(s + 1) ==
'x' || *(s + 1) ==
'X')))
177 return l_mathop(0.0);
178 for (s += 2; ; s++) {
183 else if (lisxdigit(cast_uchar(*s))) {
184 if (sigdig == 0 && *s ==
'0')
186 else if (++sigdig <= MAXSIGDIG)
187 r = (r * l_mathop(16.0)) + luaO_hexavalue(*s);
193 if (nosigdig + sigdig == 0)
194 return l_mathop(0.0);
195 *endptr = cast_charp(s);
197 if (*s ==
'p' || *s ==
'P') {
202 if (!lisdigit(cast_uchar(*s)))
203 return l_mathop(0.0);
204 while (lisdigit(cast_uchar(*s)))
205 exp1 = exp1 * 10 + *(s++) -
'0';
206 if (neg1) exp1 = -exp1;
208 *endptr = cast_charp(s);
211 return l_mathop(ldexp)(r, e);
219#if !defined (L_MAXLENNUM)
220#define L_MAXLENNUM 200
228static const char *l_str2dloc (
const char *s, lua_Number *result,
int mode) {
230 *result = (mode ==
'x') ? lua_strx2number(s, &endptr)
231 : lua_str2number(s, &endptr);
232 if (endptr == s)
return NULL;
233 while (lisspace(cast_uchar(*endptr))) endptr++;
234 return (*endptr ==
'\0') ? endptr : NULL;
251static const char *l_str2d (
const char *s, lua_Number *result) {
253 const char *pmode = strpbrk(s,
".xXnN");
254 int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0;
257 endptr = l_str2dloc(s, result, mode);
258 if (endptr == NULL) {
259 char buff[L_MAXLENNUM + 1];
260 const char *pdot = strchr(s,
'.');
261 if (pdot == NULL || strlen(s) > L_MAXLENNUM)
264 buff[pdot - s] = lua_getlocaledecpoint();
265 endptr = l_str2dloc(buff, result, mode);
267 endptr = s + (endptr - buff);
273#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10)
274#define MAXLASTD cast_int(LUA_MAXINTEGER % 10)
276static const char *l_str2int (
const char *s, lua_Integer *result) {
280 while (lisspace(cast_uchar(*s))) s++;
283 (s[1] ==
'x' || s[1] ==
'X')) {
285 for (; lisxdigit(cast_uchar(*s)); s++) {
286 a = a * 16 + luaO_hexavalue(*s);
291 for (; lisdigit(cast_uchar(*s)); s++) {
293 if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg))
299 while (lisspace(cast_uchar(*s))) s++;
300 if (empty || *s !=
'\0')
return NULL;
302 *result = l_castU2S((neg) ? 0u - a : a);
308size_t luaO_str2num (
const char *s,
TValue *o) {
309 lua_Integer i; lua_Number n;
311 if ((e = l_str2int(s, &i)) != NULL) {
314 else if ((e = l_str2d(s, &n)) != NULL) {
323int luaO_utf8esc (
char *buff,
unsigned long x) {
325 lua_assert(x <= 0x7FFFFFFFu);
327 buff[UTF8BUFFSZ - 1] = cast_char(x);
329 unsigned int mfb = 0x3f;
331 buff[UTF8BUFFSZ - (n++)] = cast_char(0x80 | (x & 0x3f));
335 buff[UTF8BUFFSZ - n] = cast_char((~mfb << 1) | x);
349#define MAXNUMBER2STR 44
355static int tostringbuff (
TValue *obj,
char *buff) {
357 lua_assert(ttisnumber(obj));
358 if (ttisinteger(obj))
359 len = lua_integer2str(buff, MAXNUMBER2STR, ivalue(obj));
361 len = lua_number2str(buff, MAXNUMBER2STR, fltvalue(obj));
362 if (buff[strspn(buff,
"-0123456789")] ==
'\0') {
363 buff[len++] = lua_getlocaledecpoint();
375 char buff[MAXNUMBER2STR];
376 int len = tostringbuff(obj, buff);
377 setsvalue(L, obj, luaS_newlstr(L, buff, len));
394#define BUFVFS (LUA_IDSIZE + MAXNUMBER2STR + 95)
414static void pushstr (
BuffFS *buff,
const char *str,
size_t lstr) {
416 setsvalue2s(L, L->top.p, luaS_newlstr(L, str, lstr));
428static void clearbuff (
BuffFS *buff) {
429 pushstr(buff, buff->space, buff->blen);
438static char *getbuff (
BuffFS *buff,
int sz) {
439 lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS);
440 if (sz > BUFVFS - buff->blen)
442 return buff->space + buff->blen;
446#define addsize(b,sz) ((b)->blen += (sz))
453static void addstr2buff (
BuffFS *buff,
const char *str,
size_t slen) {
454 if (slen <= BUFVFS) {
455 char *bf = getbuff(buff, cast_int(slen));
456 memcpy(bf, str, slen);
457 addsize(buff, cast_int(slen));
461 pushstr(buff, str, slen);
470 char *numbuff = getbuff(buff, MAXNUMBER2STR);
471 int len = tostringbuff(num, numbuff);
480const char *luaO_pushvfstring (
lua_State *L,
const char *fmt, va_list argp) {
483 buff.pushed = buff.blen = 0;
485 while ((e = strchr(fmt,
'%')) != NULL) {
486 addstr2buff(&buff, fmt, e - fmt);
489 const char *s = va_arg(argp,
char *);
490 if (s == NULL) s =
"(null)";
491 addstr2buff(&buff, s, strlen(s));
495 char c = cast_uchar(va_arg(argp,
int));
496 addstr2buff(&buff, &c,
sizeof(
char));
501 setivalue(&num, va_arg(argp,
int));
502 addnum2buff(&buff, &num);
507 setivalue(&num, cast(lua_Integer, va_arg(argp, l_uacInt)));
508 addnum2buff(&buff, &num);
513 setfltvalue(&num, cast_num(va_arg(argp, l_uacNumber)));
514 addnum2buff(&buff, &num);
518 const int sz = 3 *
sizeof(
void*) + 8;
519 char *bf = getbuff(&buff, sz);
520 void *p = va_arg(argp,
void *);
521 int len = lua_pointer2str(bf, sz, p);
527 int len = luaO_utf8esc(bf, va_arg(argp,
long));
528 addstr2buff(&buff, bf + UTF8BUFFSZ - len, len);
532 addstr2buff(&buff,
"%", 1);
536 luaG_runerror(L,
"invalid option '%%%c' to 'lua_pushfstring'",
542 addstr2buff(&buff, fmt, strlen(fmt));
544 lua_assert(buff.pushed == 1);
545 return svalue(s2v(L->top.p - 1));
549const char *luaO_pushfstring (
lua_State *L,
const char *fmt, ...) {
553 msg = luaO_pushvfstring(L, fmt, argp);
562#define PRE "[string \""
565#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) )
567void luaO_chunkid (
char *out,
const char *source,
size_t srclen) {
568 size_t bufflen = LUA_IDSIZE;
569 if (*source ==
'=') {
570 if (srclen <= bufflen)
571 memcpy(out, source + 1, srclen *
sizeof(
char));
573 addstr(out, source + 1, bufflen - 1);
577 else if (*source ==
'@') {
578 if (srclen <= bufflen)
579 memcpy(out, source + 1, srclen *
sizeof(
char));
581 addstr(out, RETS, LL(RETS));
583 memcpy(out, source + 1 + srclen - bufflen, bufflen *
sizeof(
char));
587 const char *nl = strchr(source,
'\n');
588 addstr(out, PRE, LL(PRE));
589 bufflen -= LL(PRE RETS POS) + 1;
590 if (srclen < bufflen && nl == NULL) {
591 addstr(out, source, srclen);
594 if (nl != NULL) srclen = nl - source;
595 if (srclen > bufflen) srclen = bufflen;
596 addstr(out, source, srclen);
597 addstr(out, RETS, LL(RETS));
599 memcpy(out, POS, (LL(POS) + 1) *
sizeof(
char));