Fix string.format("%c", 0).

This commit is contained in:
Mike Pall 2018-01-14 14:11:59 +01:00
parent 7dbf0b05f1
commit 430d9f8f7e

View File

@ -850,20 +850,21 @@ LJLIB_CF(string_format)
} else { /* format item */ } else { /* format item */
char form[MAX_FMTSPEC]; /* to store the format (`%...') */ char form[MAX_FMTSPEC]; /* to store the format (`%...') */
char buff[MAX_FMTITEM]; /* to store the formatted item */ char buff[MAX_FMTITEM]; /* to store the formatted item */
int n = 0;
if (++arg > top) if (++arg > top)
luaL_argerror(L, arg, lj_obj_typename[0]); luaL_argerror(L, arg, lj_obj_typename[0]);
strfrmt = scanformat(L, strfrmt, form); strfrmt = scanformat(L, strfrmt, form);
switch (*strfrmt++) { switch (*strfrmt++) {
case 'c': case 'c':
sprintf(buff, form, lj_lib_checkint(L, arg)); n = sprintf(buff, form, lj_lib_checkint(L, arg));
break; break;
case 'd': case 'i': case 'd': case 'i':
addintlen(form); addintlen(form);
sprintf(buff, form, num2intfrm(L, arg)); n = sprintf(buff, form, num2intfrm(L, arg));
break; break;
case 'o': case 'u': case 'x': case 'X': case 'o': case 'u': case 'x': case 'X':
addintlen(form); addintlen(form);
sprintf(buff, form, num2uintfrm(L, arg)); n = sprintf(buff, form, num2uintfrm(L, arg));
break; break;
case 'e': case 'E': case 'f': case 'g': case 'G': case 'a': case 'A': { case 'e': case 'E': case 'f': case 'g': case 'G': case 'a': case 'A': {
TValue tv; TValue tv;
@ -880,10 +881,10 @@ LJLIB_CF(string_format)
nbuf[len] = '\0'; nbuf[len] = '\0';
for (p = form; *p < 'A' && *p != '.'; p++) ; for (p = form; *p < 'A' && *p != '.'; p++) ;
*p++ = 's'; *p = '\0'; *p++ = 's'; *p = '\0';
sprintf(buff, form, nbuf); n = sprintf(buff, form, nbuf);
break; break;
} }
sprintf(buff, form, (double)tv.n); n = sprintf(buff, form, (double)tv.n);
break; break;
} }
case 'q': case 'q':
@ -902,14 +903,14 @@ LJLIB_CF(string_format)
luaL_addvalue(&b); luaL_addvalue(&b);
continue; continue;
} }
sprintf(buff, form, strdata(str)); n = sprintf(buff, form, strdata(str));
break; break;
} }
default: default:
lj_err_callerv(L, LJ_ERR_STRFMTO, *(strfrmt -1)); lj_err_callerv(L, LJ_ERR_STRFMTO, *(strfrmt -1));
break; break;
} }
luaL_addlstring(&b, buff, strlen(buff)); luaL_addlstring(&b, buff, n);
} }
} }
luaL_pushresult(&b); luaL_pushresult(&b);