diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-07-27 13:32:59 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-07-27 13:32:59 -0300 |
| commit | 0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b (patch) | |
| tree | 0ac634fed90877130b1f102bf4075af999de2158 /lstrlib.c | |
| parent | 15231d4fb2f6984b25e0353ff46eda1a180b686d (diff) | |
| download | lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.tar.gz lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.tar.bz2 lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.zip | |
Added gcc option '-Wconversion'
No warnings for standard numerical types. Still pending alternative
numerical types.
Diffstat (limited to 'lstrlib.c')
| -rw-r--r-- | lstrlib.c | 132 |
1 files changed, 69 insertions, 63 deletions
| @@ -113,7 +113,7 @@ static int str_lower (lua_State *L) { | |||
| 113 | const char *s = luaL_checklstring(L, 1, &l); | 113 | const char *s = luaL_checklstring(L, 1, &l); |
| 114 | char *p = luaL_buffinitsize(L, &b, l); | 114 | char *p = luaL_buffinitsize(L, &b, l); |
| 115 | for (i=0; i<l; i++) | 115 | for (i=0; i<l; i++) |
| 116 | p[i] = tolower(cast_uchar(s[i])); | 116 | p[i] = cast_char(tolower(cast_uchar(s[i]))); |
| 117 | luaL_pushresultsize(&b, l); | 117 | luaL_pushresultsize(&b, l); |
| 118 | return 1; | 118 | return 1; |
| 119 | } | 119 | } |
| @@ -126,7 +126,7 @@ static int str_upper (lua_State *L) { | |||
| 126 | const char *s = luaL_checklstring(L, 1, &l); | 126 | const char *s = luaL_checklstring(L, 1, &l); |
| 127 | char *p = luaL_buffinitsize(L, &b, l); | 127 | char *p = luaL_buffinitsize(L, &b, l); |
| 128 | for (i=0; i<l; i++) | 128 | for (i=0; i<l; i++) |
| 129 | p[i] = toupper(cast_uchar(s[i])); | 129 | p[i] = cast_char(toupper(cast_uchar(s[i]))); |
| 130 | luaL_pushresultsize(&b, l); | 130 | luaL_pushresultsize(&b, l); |
| 131 | return 1; | 131 | return 1; |
| 132 | } | 132 | } |
| @@ -139,7 +139,7 @@ static int str_rep (lua_State *L) { | |||
| 139 | const char *sep = luaL_optlstring(L, 3, "", &lsep); | 139 | const char *sep = luaL_optlstring(L, 3, "", &lsep); |
| 140 | if (n <= 0) | 140 | if (n <= 0) |
| 141 | lua_pushliteral(L, ""); | 141 | lua_pushliteral(L, ""); |
| 142 | else if (l_unlikely(l + lsep < l || l + lsep > MAX_SIZE / n)) | 142 | else if (l_unlikely(l + lsep < l || l + lsep > MAX_SIZE / cast_sizet(n))) |
| 143 | return luaL_error(L, "resulting string too large"); | 143 | return luaL_error(L, "resulting string too large"); |
| 144 | else { | 144 | else { |
| 145 | size_t totallen = ((size_t)n * (l + lsep)) - lsep; | 145 | size_t totallen = ((size_t)n * (l + lsep)) - lsep; |
| @@ -172,7 +172,7 @@ static int str_byte (lua_State *L) { | |||
| 172 | n = (int)(pose - posi) + 1; | 172 | n = (int)(pose - posi) + 1; |
| 173 | luaL_checkstack(L, n, "string slice too long"); | 173 | luaL_checkstack(L, n, "string slice too long"); |
| 174 | for (i=0; i<n; i++) | 174 | for (i=0; i<n; i++) |
| 175 | lua_pushinteger(L, cast_uchar(s[posi+i-1])); | 175 | lua_pushinteger(L, cast_uchar(s[posi + cast_uint(i) - 1])); |
| 176 | return n; | 176 | return n; |
| 177 | } | 177 | } |
| 178 | 178 | ||
| @@ -181,13 +181,13 @@ static int str_char (lua_State *L) { | |||
| 181 | int n = lua_gettop(L); /* number of arguments */ | 181 | int n = lua_gettop(L); /* number of arguments */ |
| 182 | int i; | 182 | int i; |
| 183 | luaL_Buffer b; | 183 | luaL_Buffer b; |
| 184 | char *p = luaL_buffinitsize(L, &b, n); | 184 | char *p = luaL_buffinitsize(L, &b, cast_uint(n)); |
| 185 | for (i=1; i<=n; i++) { | 185 | for (i=1; i<=n; i++) { |
| 186 | lua_Unsigned c = (lua_Unsigned)luaL_checkinteger(L, i); | 186 | lua_Unsigned c = (lua_Unsigned)luaL_checkinteger(L, i); |
| 187 | luaL_argcheck(L, c <= (lua_Unsigned)UCHAR_MAX, i, "value out of range"); | 187 | luaL_argcheck(L, c <= (lua_Unsigned)UCHAR_MAX, i, "value out of range"); |
| 188 | p[i - 1] = cast_uchar(c); | 188 | p[i - 1] = cast_char(cast_uchar(c)); |
| 189 | } | 189 | } |
| 190 | luaL_pushresultsize(&b, n); | 190 | luaL_pushresultsize(&b, cast_uint(n)); |
| 191 | return 1; | 191 | return 1; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| @@ -352,10 +352,10 @@ typedef struct MatchState { | |||
| 352 | const char *p_end; /* end ('\0') of pattern */ | 352 | const char *p_end; /* end ('\0') of pattern */ |
| 353 | lua_State *L; | 353 | lua_State *L; |
| 354 | int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ | 354 | int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ |
| 355 | unsigned char level; /* total number of captures (finished or unfinished) */ | 355 | int level; /* total number of captures (finished or unfinished) */ |
| 356 | struct { | 356 | struct { |
| 357 | const char *init; | 357 | const char *init; |
| 358 | ptrdiff_t len; | 358 | ptrdiff_t len; /* length or special value (CAP_*) */ |
| 359 | } capture[LUA_MAXCAPTURES]; | 359 | } capture[LUA_MAXCAPTURES]; |
| 360 | } MatchState; | 360 | } MatchState; |
| 361 | 361 | ||
| @@ -550,7 +550,7 @@ static const char *end_capture (MatchState *ms, const char *s, | |||
| 550 | static const char *match_capture (MatchState *ms, const char *s, int l) { | 550 | static const char *match_capture (MatchState *ms, const char *s, int l) { |
| 551 | size_t len; | 551 | size_t len; |
| 552 | l = check_capture(ms, l); | 552 | l = check_capture(ms, l); |
| 553 | len = ms->capture[l].len; | 553 | len = cast_sizet(ms->capture[l].len); |
| 554 | if ((size_t)(ms->src_end-s) >= len && | 554 | if ((size_t)(ms->src_end-s) >= len && |
| 555 | memcmp(ms->capture[l].init, s, len) == 0) | 555 | memcmp(ms->capture[l].init, s, len) == 0) |
| 556 | return s+len; | 556 | return s+len; |
| @@ -674,7 +674,7 @@ static const char *lmemfind (const char *s1, size_t l1, | |||
| 674 | if (memcmp(init, s2+1, l2) == 0) | 674 | if (memcmp(init, s2+1, l2) == 0) |
| 675 | return init-1; | 675 | return init-1; |
| 676 | else { /* correct 'l1' and 's1' to try again */ | 676 | else { /* correct 'l1' and 's1' to try again */ |
| 677 | l1 -= init-s1; | 677 | l1 -= ct_diff2sz(init - s1); |
| 678 | s1 = init; | 678 | s1 = init; |
| 679 | } | 679 | } |
| 680 | } | 680 | } |
| @@ -690,13 +690,13 @@ static const char *lmemfind (const char *s1, size_t l1, | |||
| 690 | ** its length and put its address in '*cap'. If it is an integer | 690 | ** its length and put its address in '*cap'. If it is an integer |
| 691 | ** (a position), push it on the stack and return CAP_POSITION. | 691 | ** (a position), push it on the stack and return CAP_POSITION. |
| 692 | */ | 692 | */ |
| 693 | static size_t get_onecapture (MatchState *ms, int i, const char *s, | 693 | static ptrdiff_t get_onecapture (MatchState *ms, int i, const char *s, |
| 694 | const char *e, const char **cap) { | 694 | const char *e, const char **cap) { |
| 695 | if (i >= ms->level) { | 695 | if (i >= ms->level) { |
| 696 | if (l_unlikely(i != 0)) | 696 | if (l_unlikely(i != 0)) |
| 697 | luaL_error(ms->L, "invalid capture index %%%d", i + 1); | 697 | luaL_error(ms->L, "invalid capture index %%%d", i + 1); |
| 698 | *cap = s; | 698 | *cap = s; |
| 699 | return e - s; | 699 | return (e - s); |
| 700 | } | 700 | } |
| 701 | else { | 701 | else { |
| 702 | ptrdiff_t capl = ms->capture[i].len; | 702 | ptrdiff_t capl = ms->capture[i].len; |
| @@ -718,7 +718,7 @@ static void push_onecapture (MatchState *ms, int i, const char *s, | |||
| 718 | const char *cap; | 718 | const char *cap; |
| 719 | ptrdiff_t l = get_onecapture(ms, i, s, e, &cap); | 719 | ptrdiff_t l = get_onecapture(ms, i, s, e, &cap); |
| 720 | if (l != CAP_POSITION) | 720 | if (l != CAP_POSITION) |
| 721 | lua_pushlstring(ms->L, cap, l); | 721 | lua_pushlstring(ms->L, cap, cast_sizet(l)); |
| 722 | /* else position was already pushed */ | 722 | /* else position was already pushed */ |
| 723 | } | 723 | } |
| 724 | 724 | ||
| @@ -776,7 +776,7 @@ static int str_find_aux (lua_State *L, int find) { | |||
| 776 | const char *s2 = lmemfind(s + init, ls - init, p, lp); | 776 | const char *s2 = lmemfind(s + init, ls - init, p, lp); |
| 777 | if (s2) { | 777 | if (s2) { |
| 778 | lua_pushinteger(L, (s2 - s) + 1); | 778 | lua_pushinteger(L, (s2 - s) + 1); |
| 779 | lua_pushinteger(L, (s2 - s) + lp); | 779 | lua_pushinteger(L, cast_st2S(ct_diff2sz(s2 - s) + lp)); |
| 780 | return 2; | 780 | return 2; |
| 781 | } | 781 | } |
| 782 | } | 782 | } |
| @@ -866,23 +866,23 @@ static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, | |||
| 866 | const char *news = lua_tolstring(L, 3, &l); | 866 | const char *news = lua_tolstring(L, 3, &l); |
| 867 | const char *p; | 867 | const char *p; |
| 868 | while ((p = (char *)memchr(news, L_ESC, l)) != NULL) { | 868 | while ((p = (char *)memchr(news, L_ESC, l)) != NULL) { |
| 869 | luaL_addlstring(b, news, p - news); | 869 | luaL_addlstring(b, news, ct_diff2sz(p - news)); |
| 870 | p++; /* skip ESC */ | 870 | p++; /* skip ESC */ |
| 871 | if (*p == L_ESC) /* '%%' */ | 871 | if (*p == L_ESC) /* '%%' */ |
| 872 | luaL_addchar(b, *p); | 872 | luaL_addchar(b, *p); |
| 873 | else if (*p == '0') /* '%0' */ | 873 | else if (*p == '0') /* '%0' */ |
| 874 | luaL_addlstring(b, s, e - s); | 874 | luaL_addlstring(b, s, ct_diff2sz(e - s)); |
| 875 | else if (isdigit(cast_uchar(*p))) { /* '%n' */ | 875 | else if (isdigit(cast_uchar(*p))) { /* '%n' */ |
| 876 | const char *cap; | 876 | const char *cap; |
| 877 | ptrdiff_t resl = get_onecapture(ms, *p - '1', s, e, &cap); | 877 | ptrdiff_t resl = get_onecapture(ms, *p - '1', s, e, &cap); |
| 878 | if (resl == CAP_POSITION) | 878 | if (resl == CAP_POSITION) |
| 879 | luaL_addvalue(b); /* add position to accumulated result */ | 879 | luaL_addvalue(b); /* add position to accumulated result */ |
| 880 | else | 880 | else |
| 881 | luaL_addlstring(b, cap, resl); | 881 | luaL_addlstring(b, cap, cast_sizet(resl)); |
| 882 | } | 882 | } |
| 883 | else | 883 | else |
| 884 | luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); | 884 | luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); |
| 885 | l -= p + 1 - news; | 885 | l -= ct_diff2sz(p + 1 - news); |
| 886 | news = p + 1; | 886 | news = p + 1; |
| 887 | } | 887 | } |
| 888 | luaL_addlstring(b, news, l); | 888 | luaL_addlstring(b, news, l); |
| @@ -917,7 +917,7 @@ static int add_value (MatchState *ms, luaL_Buffer *b, const char *s, | |||
| 917 | } | 917 | } |
| 918 | if (!lua_toboolean(L, -1)) { /* nil or false? */ | 918 | if (!lua_toboolean(L, -1)) { /* nil or false? */ |
| 919 | lua_pop(L, 1); /* remove value */ | 919 | lua_pop(L, 1); /* remove value */ |
| 920 | luaL_addlstring(b, s, e - s); /* keep original text */ | 920 | luaL_addlstring(b, s, ct_diff2sz(e - s)); /* keep original text */ |
| 921 | return 0; /* no changes */ | 921 | return 0; /* no changes */ |
| 922 | } | 922 | } |
| 923 | else if (l_unlikely(!lua_isstring(L, -1))) | 923 | else if (l_unlikely(!lua_isstring(L, -1))) |
| @@ -936,7 +936,8 @@ static int str_gsub (lua_State *L) { | |||
| 936 | const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ | 936 | const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ |
| 937 | const char *lastmatch = NULL; /* end of last match */ | 937 | const char *lastmatch = NULL; /* end of last match */ |
| 938 | int tr = lua_type(L, 3); /* replacement type */ | 938 | int tr = lua_type(L, 3); /* replacement type */ |
| 939 | lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ | 939 | /* max replacements */ |
| 940 | lua_Integer max_s = luaL_optinteger(L, 4, cast_st2S(srcl) + 1); | ||
| 940 | int anchor = (*p == '^'); | 941 | int anchor = (*p == '^'); |
| 941 | lua_Integer n = 0; /* replacement count */ | 942 | lua_Integer n = 0; /* replacement count */ |
| 942 | int changed = 0; /* change flag */ | 943 | int changed = 0; /* change flag */ |
| @@ -966,7 +967,7 @@ static int str_gsub (lua_State *L) { | |||
| 966 | if (!changed) /* no changes? */ | 967 | if (!changed) /* no changes? */ |
| 967 | lua_pushvalue(L, 1); /* return original string */ | 968 | lua_pushvalue(L, 1); /* return original string */ |
| 968 | else { /* something changed */ | 969 | else { /* something changed */ |
| 969 | luaL_addlstring(&b, src, ms.src_end-src); | 970 | luaL_addlstring(&b, src, ct_diff2sz(ms.src_end - src)); |
| 970 | luaL_pushresult(&b); /* create and return new string */ | 971 | luaL_pushresult(&b); /* create and return new string */ |
| 971 | } | 972 | } |
| 972 | lua_pushinteger(L, n); /* number of substitutions */ | 973 | lua_pushinteger(L, n); /* number of substitutions */ |
| @@ -1004,15 +1005,15 @@ static int str_gsub (lua_State *L) { | |||
| 1004 | /* | 1005 | /* |
| 1005 | ** Add integer part of 'x' to buffer and return new 'x' | 1006 | ** Add integer part of 'x' to buffer and return new 'x' |
| 1006 | */ | 1007 | */ |
| 1007 | static lua_Number adddigit (char *buff, int n, lua_Number x) { | 1008 | static lua_Number adddigit (char *buff, unsigned n, lua_Number x) { |
| 1008 | lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ | 1009 | lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ |
| 1009 | int d = (int)dd; | 1010 | int d = (int)dd; |
| 1010 | buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ | 1011 | buff[n] = cast_char(d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ |
| 1011 | return x - dd; /* return what is left */ | 1012 | return x - dd; /* return what is left */ |
| 1012 | } | 1013 | } |
| 1013 | 1014 | ||
| 1014 | 1015 | ||
| 1015 | static int num2straux (char *buff, int sz, lua_Number x) { | 1016 | static int num2straux (char *buff, unsigned sz, lua_Number x) { |
| 1016 | /* if 'inf' or 'NaN', format it like '%g' */ | 1017 | /* if 'inf' or 'NaN', format it like '%g' */ |
| 1017 | if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) | 1018 | if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) |
| 1018 | return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); | 1019 | return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); |
| @@ -1023,7 +1024,7 @@ static int num2straux (char *buff, int sz, lua_Number x) { | |||
| 1023 | else { | 1024 | else { |
| 1024 | int e; | 1025 | int e; |
| 1025 | lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ | 1026 | lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ |
| 1026 | int n = 0; /* character count */ | 1027 | unsigned n = 0; /* character count */ |
| 1027 | if (m < 0) { /* is number negative? */ | 1028 | if (m < 0) { /* is number negative? */ |
| 1028 | buff[n++] = '-'; /* add sign */ | 1029 | buff[n++] = '-'; /* add sign */ |
| 1029 | m = -m; /* make it positive */ | 1030 | m = -m; /* make it positive */ |
| @@ -1037,20 +1038,20 @@ static int num2straux (char *buff, int sz, lua_Number x) { | |||
| 1037 | m = adddigit(buff, n++, m * 16); | 1038 | m = adddigit(buff, n++, m * 16); |
| 1038 | } while (m > 0); | 1039 | } while (m > 0); |
| 1039 | } | 1040 | } |
| 1040 | n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ | 1041 | n += cast_uint(l_sprintf(buff + n, sz - n, "p%+d", e)); /* add exponent */ |
| 1041 | lua_assert(n < sz); | 1042 | lua_assert(n < sz); |
| 1042 | return n; | 1043 | return cast_int(n); |
| 1043 | } | 1044 | } |
| 1044 | } | 1045 | } |
| 1045 | 1046 | ||
| 1046 | 1047 | ||
| 1047 | static int lua_number2strx (lua_State *L, char *buff, int sz, | 1048 | static int lua_number2strx (lua_State *L, char *buff, unsigned sz, |
| 1048 | const char *fmt, lua_Number x) { | 1049 | const char *fmt, lua_Number x) { |
| 1049 | int n = num2straux(buff, sz, x); | 1050 | int n = num2straux(buff, sz, x); |
| 1050 | if (fmt[SIZELENMOD] == 'A') { | 1051 | if (fmt[SIZELENMOD] == 'A') { |
| 1051 | int i; | 1052 | int i; |
| 1052 | for (i = 0; i < n; i++) | 1053 | for (i = 0; i < n; i++) |
| 1053 | buff[i] = toupper(cast_uchar(buff[i])); | 1054 | buff[i] = cast_char(toupper(cast_uchar(buff[i]))); |
| 1054 | } | 1055 | } |
| 1055 | else if (l_unlikely(fmt[SIZELENMOD] != 'a')) | 1056 | else if (l_unlikely(fmt[SIZELENMOD] != 'a')) |
| 1056 | return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); | 1057 | return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); |
| @@ -1151,9 +1152,9 @@ static int quotefloat (lua_State *L, char *buff, lua_Number n) { | |||
| 1151 | int nb = lua_number2strx(L, buff, MAX_ITEM, | 1152 | int nb = lua_number2strx(L, buff, MAX_ITEM, |
| 1152 | "%" LUA_NUMBER_FRMLEN "a", n); | 1153 | "%" LUA_NUMBER_FRMLEN "a", n); |
| 1153 | /* ensures that 'buff' string uses a dot as the radix character */ | 1154 | /* ensures that 'buff' string uses a dot as the radix character */ |
| 1154 | if (memchr(buff, '.', nb) == NULL) { /* no dot? */ | 1155 | if (memchr(buff, '.', cast_uint(nb)) == NULL) { /* no dot? */ |
| 1155 | char point = lua_getlocaledecpoint(); /* try locale point */ | 1156 | char point = lua_getlocaledecpoint(); /* try locale point */ |
| 1156 | char *ppoint = (char *)memchr(buff, point, nb); | 1157 | char *ppoint = (char *)memchr(buff, point, cast_uint(nb)); |
| 1157 | if (ppoint) *ppoint = '.'; /* change it to a dot */ | 1158 | if (ppoint) *ppoint = '.'; /* change it to a dot */ |
| 1158 | } | 1159 | } |
| 1159 | return nb; | 1160 | return nb; |
| @@ -1183,7 +1184,7 @@ static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { | |||
| 1183 | : LUA_INTEGER_FMT; /* else use default format */ | 1184 | : LUA_INTEGER_FMT; /* else use default format */ |
| 1184 | nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); | 1185 | nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); |
| 1185 | } | 1186 | } |
| 1186 | luaL_addsize(b, nb); | 1187 | luaL_addsize(b, cast_uint(nb)); |
| 1187 | break; | 1188 | break; |
| 1188 | } | 1189 | } |
| 1189 | case LUA_TNIL: case LUA_TBOOLEAN: { | 1190 | case LUA_TNIL: case LUA_TBOOLEAN: { |
| @@ -1277,7 +1278,7 @@ static int str_format (lua_State *L) { | |||
| 1277 | luaL_addchar(&b, *strfrmt++); /* %% */ | 1278 | luaL_addchar(&b, *strfrmt++); /* %% */ |
| 1278 | else { /* format item */ | 1279 | else { /* format item */ |
| 1279 | char form[MAX_FORMAT]; /* to store the format ('%...') */ | 1280 | char form[MAX_FORMAT]; /* to store the format ('%...') */ |
| 1280 | int maxitem = MAX_ITEM; /* maximum length for the result */ | 1281 | unsigned maxitem = MAX_ITEM; /* maximum length for the result */ |
| 1281 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ | 1282 | char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ |
| 1282 | int nb = 0; /* number of bytes in result */ | 1283 | int nb = 0; /* number of bytes in result */ |
| 1283 | if (++arg > top) | 1284 | if (++arg > top) |
| @@ -1360,8 +1361,8 @@ static int str_format (lua_State *L) { | |||
| 1360 | return luaL_error(L, "invalid conversion '%s' to 'format'", form); | 1361 | return luaL_error(L, "invalid conversion '%s' to 'format'", form); |
| 1361 | } | 1362 | } |
| 1362 | } | 1363 | } |
| 1363 | lua_assert(nb < maxitem); | 1364 | lua_assert(cast_uint(nb) < maxitem); |
| 1364 | luaL_addsize(&b, nb); | 1365 | luaL_addsize(&b, cast_uint(nb)); |
| 1365 | } | 1366 | } |
| 1366 | } | 1367 | } |
| 1367 | luaL_pushresult(&b); | 1368 | luaL_pushresult(&b); |
| @@ -1409,7 +1410,7 @@ static const union { | |||
| 1409 | typedef struct Header { | 1410 | typedef struct Header { |
| 1410 | lua_State *L; | 1411 | lua_State *L; |
| 1411 | int islittle; | 1412 | int islittle; |
| 1412 | int maxalign; | 1413 | unsigned maxalign; |
| 1413 | } Header; | 1414 | } Header; |
| 1414 | 1415 | ||
| 1415 | 1416 | ||
| @@ -1443,7 +1444,7 @@ static size_t getnum (const char **fmt, size_t df) { | |||
| 1443 | else { | 1444 | else { |
| 1444 | size_t a = 0; | 1445 | size_t a = 0; |
| 1445 | do { | 1446 | do { |
| 1446 | a = a*10 + (*((*fmt)++) - '0'); | 1447 | a = a*10 + cast_uint(*((*fmt)++) - '0'); |
| 1447 | } while (digit(**fmt) && a <= (MAX_SIZE - 9)/10); | 1448 | } while (digit(**fmt) && a <= (MAX_SIZE - 9)/10); |
| 1448 | return a; | 1449 | return a; |
| 1449 | } | 1450 | } |
| @@ -1454,12 +1455,12 @@ static size_t getnum (const char **fmt, size_t df) { | |||
| 1454 | ** Read an integer numeral and raises an error if it is larger | 1455 | ** Read an integer numeral and raises an error if it is larger |
| 1455 | ** than the maximum size of integers. | 1456 | ** than the maximum size of integers. |
| 1456 | */ | 1457 | */ |
| 1457 | static int getnumlimit (Header *h, const char **fmt, int df) { | 1458 | static unsigned getnumlimit (Header *h, const char **fmt, size_t df) { |
| 1458 | size_t sz = getnum(fmt, df); | 1459 | size_t sz = getnum(fmt, df); |
| 1459 | if (l_unlikely((sz - 1u) >= MAXINTSIZE)) | 1460 | if (l_unlikely((sz - 1u) >= MAXINTSIZE)) |
| 1460 | return luaL_error(h->L, "integral size (%d) out of limits [1,%d]", | 1461 | return cast_uint(luaL_error(h->L, |
| 1461 | sz, MAXINTSIZE); | 1462 | "integral size (%d) out of limits [1,%d]", sz, MAXINTSIZE)); |
| 1462 | return cast_int(sz); | 1463 | return cast_uint(sz); |
| 1463 | } | 1464 | } |
| 1464 | 1465 | ||
| 1465 | 1466 | ||
| @@ -1510,7 +1511,7 @@ static KOption getoption (Header *h, const char **fmt, size_t *size) { | |||
| 1510 | case '>': h->islittle = 0; break; | 1511 | case '>': h->islittle = 0; break; |
| 1511 | case '=': h->islittle = nativeendian.little; break; | 1512 | case '=': h->islittle = nativeendian.little; break; |
| 1512 | case '!': { | 1513 | case '!': { |
| 1513 | const int maxalign = offsetof(struct cD, u); | 1514 | const size_t maxalign = offsetof(struct cD, u); |
| 1514 | h->maxalign = getnumlimit(h, fmt, maxalign); | 1515 | h->maxalign = getnumlimit(h, fmt, maxalign); |
| 1515 | break; | 1516 | break; |
| 1516 | } | 1517 | } |
| @@ -1529,8 +1530,8 @@ static KOption getoption (Header *h, const char **fmt, size_t *size) { | |||
| 1529 | ** the maximum alignment ('maxalign'). Kchar option needs no alignment | 1530 | ** the maximum alignment ('maxalign'). Kchar option needs no alignment |
| 1530 | ** despite its size. | 1531 | ** despite its size. |
| 1531 | */ | 1532 | */ |
| 1532 | static KOption getdetails (Header *h, size_t totalsize, | 1533 | static KOption getdetails (Header *h, size_t totalsize, const char **fmt, |
| 1533 | const char **fmt, size_t *psize, int *ntoalign) { | 1534 | size_t *psize, unsigned *ntoalign) { |
| 1534 | KOption opt = getoption(h, fmt, psize); | 1535 | KOption opt = getoption(h, fmt, psize); |
| 1535 | size_t align = *psize; /* usually, alignment follows size */ | 1536 | size_t align = *psize; /* usually, alignment follows size */ |
| 1536 | if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ | 1537 | if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ |
| @@ -1540,11 +1541,15 @@ static KOption getdetails (Header *h, size_t totalsize, | |||
| 1540 | if (align <= 1 || opt == Kchar) /* need no alignment? */ | 1541 | if (align <= 1 || opt == Kchar) /* need no alignment? */ |
| 1541 | *ntoalign = 0; | 1542 | *ntoalign = 0; |
| 1542 | else { | 1543 | else { |
| 1543 | if (align > cast_sizet(h->maxalign)) /* enforce maximum alignment */ | 1544 | if (align > h->maxalign) /* enforce maximum alignment */ |
| 1544 | align = h->maxalign; | 1545 | align = h->maxalign; |
| 1545 | if (l_unlikely(!ispow2(align))) /* not a power of 2? */ | 1546 | if (l_unlikely(!ispow2(align))) /* not a power of 2? */ |
| 1546 | luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); | 1547 | luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); |
| 1547 | *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); | 1548 | else { |
| 1549 | /* 'szmoda' = totalsize % align */ | ||
| 1550 | unsigned szmoda = cast_uint(totalsize & (align - 1)); | ||
| 1551 | *ntoalign = cast_uint((align - szmoda) & (align - 1)); | ||
| 1552 | } | ||
| 1548 | } | 1553 | } |
| 1549 | return opt; | 1554 | return opt; |
| 1550 | } | 1555 | } |
| @@ -1557,9 +1562,9 @@ static KOption getdetails (Header *h, size_t totalsize, | |||
| 1557 | ** bytes if necessary (by default they would be zeros). | 1562 | ** bytes if necessary (by default they would be zeros). |
| 1558 | */ | 1563 | */ |
| 1559 | static void packint (luaL_Buffer *b, lua_Unsigned n, | 1564 | static void packint (luaL_Buffer *b, lua_Unsigned n, |
| 1560 | int islittle, int size, int neg) { | 1565 | int islittle, unsigned size, int neg) { |
| 1561 | char *buff = luaL_prepbuffsize(b, size); | 1566 | char *buff = luaL_prepbuffsize(b, size); |
| 1562 | int i; | 1567 | unsigned i; |
| 1563 | buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ | 1568 | buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ |
| 1564 | for (i = 1; i < size; i++) { | 1569 | for (i = 1; i < size; i++) { |
| 1565 | n >>= NB; | 1570 | n >>= NB; |
| @@ -1578,7 +1583,7 @@ static void packint (luaL_Buffer *b, lua_Unsigned n, | |||
| 1578 | ** given 'islittle' is different from native endianness. | 1583 | ** given 'islittle' is different from native endianness. |
| 1579 | */ | 1584 | */ |
| 1580 | static void copywithendian (char *dest, const char *src, | 1585 | static void copywithendian (char *dest, const char *src, |
| 1581 | int size, int islittle) { | 1586 | unsigned size, int islittle) { |
| 1582 | if (islittle == nativeendian.little) | 1587 | if (islittle == nativeendian.little) |
| 1583 | memcpy(dest, src, size); | 1588 | memcpy(dest, src, size); |
| 1584 | else { | 1589 | else { |
| @@ -1599,7 +1604,7 @@ static int str_pack (lua_State *L) { | |||
| 1599 | lua_pushnil(L); /* mark to separate arguments from string buffer */ | 1604 | lua_pushnil(L); /* mark to separate arguments from string buffer */ |
| 1600 | luaL_buffinit(L, &b); | 1605 | luaL_buffinit(L, &b); |
| 1601 | while (*fmt != '\0') { | 1606 | while (*fmt != '\0') { |
| 1602 | int ntoalign; | 1607 | unsigned ntoalign; |
| 1603 | size_t size; | 1608 | size_t size; |
| 1604 | KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); | 1609 | KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); |
| 1605 | luaL_argcheck(L, size + ntoalign <= MAX_SIZE - totalsize, arg, | 1610 | luaL_argcheck(L, size + ntoalign <= MAX_SIZE - totalsize, arg, |
| @@ -1615,7 +1620,7 @@ static int str_pack (lua_State *L) { | |||
| 1615 | lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); | 1620 | lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); |
| 1616 | luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); | 1621 | luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); |
| 1617 | } | 1622 | } |
| 1618 | packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); | 1623 | packint(&b, (lua_Unsigned)n, h.islittle, cast_uint(size), (n < 0)); |
| 1619 | break; | 1624 | break; |
| 1620 | } | 1625 | } |
| 1621 | case Kuint: { /* unsigned integers */ | 1626 | case Kuint: { /* unsigned integers */ |
| @@ -1623,7 +1628,7 @@ static int str_pack (lua_State *L) { | |||
| 1623 | if (size < SZINT) /* need overflow check? */ | 1628 | if (size < SZINT) /* need overflow check? */ |
| 1624 | luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), | 1629 | luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), |
| 1625 | arg, "unsigned overflow"); | 1630 | arg, "unsigned overflow"); |
| 1626 | packint(&b, (lua_Unsigned)n, h.islittle, size, 0); | 1631 | packint(&b, (lua_Unsigned)n, h.islittle, cast_uint(size), 0); |
| 1627 | break; | 1632 | break; |
| 1628 | } | 1633 | } |
| 1629 | case Kfloat: { /* C float */ | 1634 | case Kfloat: { /* C float */ |
| @@ -1669,7 +1674,8 @@ static int str_pack (lua_State *L) { | |||
| 1669 | luaL_argcheck(L, size >= sizeof(lua_Unsigned) || | 1674 | luaL_argcheck(L, size >= sizeof(lua_Unsigned) || |
| 1670 | len < ((lua_Unsigned)1 << (size * NB)), | 1675 | len < ((lua_Unsigned)1 << (size * NB)), |
| 1671 | arg, "string length does not fit in given size"); | 1676 | arg, "string length does not fit in given size"); |
| 1672 | packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ | 1677 | /* pack length */ |
| 1678 | packint(&b, (lua_Unsigned)len, h.islittle, cast_uint(size), 0); | ||
| 1673 | luaL_addlstring(&b, s, len); | 1679 | luaL_addlstring(&b, s, len); |
| 1674 | totalsize += len; | 1680 | totalsize += len; |
| 1675 | break; | 1681 | break; |
| @@ -1697,20 +1703,20 @@ static int str_pack (lua_State *L) { | |||
| 1697 | static int str_packsize (lua_State *L) { | 1703 | static int str_packsize (lua_State *L) { |
| 1698 | Header h; | 1704 | Header h; |
| 1699 | const char *fmt = luaL_checkstring(L, 1); /* format string */ | 1705 | const char *fmt = luaL_checkstring(L, 1); /* format string */ |
| 1700 | lua_Integer totalsize = 0; /* accumulate total size of result */ | 1706 | size_t totalsize = 0; /* accumulate total size of result */ |
| 1701 | initheader(L, &h); | 1707 | initheader(L, &h); |
| 1702 | while (*fmt != '\0') { | 1708 | while (*fmt != '\0') { |
| 1703 | int ntoalign; | 1709 | unsigned ntoalign; |
| 1704 | size_t size; | 1710 | size_t size; |
| 1705 | KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); | 1711 | KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); |
| 1706 | luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, | 1712 | luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, |
| 1707 | "variable-length format"); | 1713 | "variable-length format"); |
| 1708 | size += ntoalign; /* total space used by option */ | 1714 | size += ntoalign; /* total space used by option */ |
| 1709 | luaL_argcheck(L, totalsize <= LUA_MAXINTEGER - cast(lua_Integer, size), | 1715 | luaL_argcheck(L, totalsize <= LUA_MAXINTEGER - size, |
| 1710 | 1, "format result too large"); | 1716 | 1, "format result too large"); |
| 1711 | totalsize += size; | 1717 | totalsize += size; |
| 1712 | } | 1718 | } |
| 1713 | lua_pushinteger(L, totalsize); | 1719 | lua_pushinteger(L, cast_st2S(totalsize)); |
| 1714 | return 1; | 1720 | return 1; |
| 1715 | } | 1721 | } |
| 1716 | 1722 | ||
| @@ -1759,7 +1765,7 @@ static int str_unpack (lua_State *L) { | |||
| 1759 | luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); | 1765 | luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); |
| 1760 | initheader(L, &h); | 1766 | initheader(L, &h); |
| 1761 | while (*fmt != '\0') { | 1767 | while (*fmt != '\0') { |
| 1762 | int ntoalign; | 1768 | unsigned ntoalign; |
| 1763 | size_t size; | 1769 | size_t size; |
| 1764 | KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); | 1770 | KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); |
| 1765 | luaL_argcheck(L, ntoalign + size <= ld - pos, 2, | 1771 | luaL_argcheck(L, ntoalign + size <= ld - pos, 2, |
| @@ -1771,8 +1777,8 @@ static int str_unpack (lua_State *L) { | |||
| 1771 | switch (opt) { | 1777 | switch (opt) { |
| 1772 | case Kint: | 1778 | case Kint: |
| 1773 | case Kuint: { | 1779 | case Kuint: { |
| 1774 | lua_Integer res = unpackint(L, data + pos, h.islittle, size, | 1780 | lua_Integer res = unpackint(L, data + pos, h.islittle, |
| 1775 | (opt == Kint)); | 1781 | cast_int(size), (opt == Kint)); |
| 1776 | lua_pushinteger(L, res); | 1782 | lua_pushinteger(L, res); |
| 1777 | break; | 1783 | break; |
| 1778 | } | 1784 | } |
| @@ -1800,7 +1806,7 @@ static int str_unpack (lua_State *L) { | |||
| 1800 | } | 1806 | } |
| 1801 | case Kstring: { | 1807 | case Kstring: { |
| 1802 | lua_Unsigned len = (lua_Unsigned)unpackint(L, data + pos, | 1808 | lua_Unsigned len = (lua_Unsigned)unpackint(L, data + pos, |
| 1803 | h.islittle, size, 0); | 1809 | h.islittle, cast_int(size), 0); |
| 1804 | luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); | 1810 | luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); |
| 1805 | lua_pushlstring(L, data + pos + size, len); | 1811 | lua_pushlstring(L, data + pos + size, len); |
| 1806 | pos += len; /* skip string */ | 1812 | pos += len; /* skip string */ |
| @@ -1820,7 +1826,7 @@ static int str_unpack (lua_State *L) { | |||
| 1820 | } | 1826 | } |
| 1821 | pos += size; | 1827 | pos += size; |
| 1822 | } | 1828 | } |
| 1823 | lua_pushinteger(L, pos + 1); /* next position */ | 1829 | lua_pushinteger(L, cast_st2S(pos) + 1); /* next position */ |
| 1824 | return n + 1; | 1830 | return n + 1; |
| 1825 | } | 1831 | } |
| 1826 | 1832 | ||
