Skip to content

Commit d1919cc

Browse files
committed
Merge remote-tracking branch 'jtothebell/pico8' into pico8
2 parents 6ec64c2 + c21af95 commit d1919cc

File tree

3 files changed

+64
-8
lines changed

3 files changed

+64
-8
lines changed

lbaselib.c

+9
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,17 @@ static int luaB_type (lua_State *L) {
195195
}
196196

197197

198+
static int _empty(lua_State *L) { return 0; }
199+
200+
198201
static int pairsmeta (lua_State *L, const char *method, int iszero,
199202
lua_CFunction iter) {
203+
// PICO-8 0.2.0 changelog: pairs(nil) returns an empty function
204+
if (lua_isnil(L, 1)) {
205+
lua_pushcfunction(L, _empty);
206+
return 1;
207+
}
208+
200209
if (!luaL_getmetafield(L, 1, method)) { /* no metamethod? */
201210
luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
202211
lua_pushcfunction(L, iter); /* will return generator, */

lpico8lib.c

+52-7
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,15 @@ static int pico8_rotr(lua_State *l) {
140140
static int pico8_tostr(lua_State *l) {
141141
char buffer[20];
142142
char const *s = buffer;
143-
auto hex = lua_toboolean(l, 2);
143+
144+
uint16_t flags = 0;
145+
if (lua_isboolean(l, 2)) {
146+
flags = lua_toboolean(l, 2) ? 1 : 0;
147+
}
148+
else if (lua_isnumber(l, 2)) {
149+
flags = lua_tointeger(l, 2);
150+
}
151+
144152
switch (lua_type(l, 1))
145153
{
146154
case LUA_TNONE:
@@ -149,9 +157,17 @@ static int pico8_tostr(lua_State *l) {
149157
break;
150158
case LUA_TNUMBER: {
151159
lua_Number x = lua_tonumber(l, 1);
152-
if (hex) {
160+
if (flags) {
153161
uint32_t b = (uint32_t)x.bits();
154-
sprintf(buffer, "0x%04x.%04x", (b >> 16) & 0xffff, b & 0xffff);
162+
if ((flags & 0x3) == 0x3) {
163+
sprintf(buffer, "0x%04x%04x", (b >> 16) & 0xffff, b & 0xffff);
164+
}
165+
else if ((flags & 0x2) == 0x2) {
166+
sprintf(buffer, "%d", b);
167+
}
168+
else {
169+
sprintf(buffer, "0x%04x.%04x", (b >> 16) & 0xffff, b & 0xffff);
170+
}
155171
} else {
156172
lua_number2str(buffer, x);
157173
}
@@ -172,7 +188,7 @@ static int pico8_tostr(lua_State *l) {
172188
case LUA_TFUNCTION:
173189
// PICO-8 0.1.12d changelog: “tostr(x,true) can also be used to view
174190
// the hex value of functions and tables (uses Lua's tostring)”
175-
if (hex) {
191+
if (flags) {
176192
luaL_tolstring(l, 1, NULL);
177193
return 1;
178194
}
@@ -189,6 +205,25 @@ static int pico8_tonum(lua_State *l) {
189205
{
190206
case LUA_TSTRING: {
191207
char const *s = lua_tostring(l, 1);
208+
uint16_t flags = lua_gettop(l) >= 2 ? lua_tointeger(l, 2) : 0;
209+
if (flags & 0x1) {
210+
char buffer[9];
211+
size_t i = 0;
212+
while (s[i] != '\0') {
213+
buffer[i] = isxdigit(s[i]) ? s[i] : '0';
214+
i++;
215+
}
216+
uint32_t bits = strtol(buffer, NULL, 16);
217+
if (flags & 0x2) bits >>= 16;
218+
lua_pushnumber(l, (lua_Number)bits);
219+
return 1;
220+
}
221+
else if (flags & 0x2) {
222+
uint32_t bits = strtol(s, NULL, 10);
223+
bits >>= 16;
224+
lua_pushnumber(l, (lua_Number)bits);
225+
return 1;
226+
}
192227
// If parsing failed, PICO-8 returns nothing
193228
if (!luaO_str2d(s, strlen(s), &ret)) return 0;
194229
break;
@@ -203,14 +238,20 @@ static int pico8_tonum(lua_State *l) {
203238
}
204239

205240
static int pico8_chr(lua_State *l) {
206-
char s[2] = { (char)(uint8_t)lua_tonumber(l, 1), '\0' };
207-
lua_pushlstring(l, s, 1);
241+
// PICO-8 seems to top out at allowing 248 arguments
242+
char s[248];
243+
size_t numargs = lua_gettop(l) < sizeof(s) ? lua_gettop(l) : sizeof(s);
244+
for (size_t i = 0; i < numargs; i++) {
245+
s[i] = (char)(uint8_t)lua_tonumber(l, i + 1);
246+
}
247+
lua_pushlstring(l, s, numargs);
208248
return 1;
209249
}
210250

211251
static int pico8_ord(lua_State *l) {
212252
size_t len;
213-
int n = 0, count = 1;
253+
int n = 0;
254+
int count = 1;
214255
char const *s = luaL_checklstring(l, 1, &len);
215256
if (!lua_isnone(l, 3)) {
216257
if (!lua_isnumber(l, 3)) return 0;
@@ -230,6 +271,10 @@ static int pico8_ord(lua_State *l) {
230271
}
231272

232273
static int pico8_split(lua_State *l) {
274+
if (lua_isnil(l, 1)) {
275+
return 0;
276+
}
277+
233278
size_t count = 0, hlen;
234279
char const *haystack = luaL_checklstring(l, 1, &hlen);
235280
if (!haystack)

lstrlib.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ static int str_sub (lua_State *L) {
5454
size_t l;
5555
const char *s = luaL_checklstring(L, 1, &l);
5656
size_t start = posrelat(luaL_checkinteger(L, 2), l);
57-
size_t end = posrelat(luaL_optinteger(L, 3, -1), l);
57+
size_t end = lua_gettop(L) > 2 ? start : l;
58+
if (lua_isnumber(L, 3))
59+
end = posrelat(lua_tonumber(L, 3), l);
5860
if (start < 1) start = 1;
5961
if (end > l) end = l;
6062
if (start <= end)

0 commit comments

Comments
 (0)