From 6c316c08d5bdea01d091399aab78250ddc460b76 Mon Sep 17 00:00:00 2001 From: Karl Williamson <khw@cpan.org> Date: Sat, 3 Feb 2024 13:50:42 -0700 Subject: [PATCH 1/2] locale.c: Two loop indices are confined to an enum They don't take on all possible unsigned values. Create a macro to do the casting necessary for some compilers --- locale.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/locale.c b/locale.c index 1c94217d1b7f..429171a3b76e 100644 --- a/locale.c +++ b/locale.c @@ -500,6 +500,10 @@ S_wsetlocale(const int category, const wchar_t * wlocale) #endif /* WIN32_USE_FAKE_OLD_MINGW_LOCALES */ /* 'for' loop headers to hide the necessary casts */ +#define for_category_indexes_between(i, m, n) \ + for (locale_category_index i = (locale_category_index) (m); \ + i <= (locale_category_index) (n); \ + i = (locale_category_index) ((int) i + 1)) #define for_all_individual_category_indexes(i) \ for (locale_category_index i = (locale_category_index) 0; \ i < LC_ALL_INDEX_; \ @@ -3226,9 +3230,9 @@ S_find_locale_from_environment(pTHX_ const locale_category_index index) /* For each desired category, use any corresponding environment variable; * or the default if none such exists. */ bool is_disparate = false; /* Assume is uniform until proven otherwise */ - for (unsigned i = lower; i <= upper; i++) { + for_category_indexes_between(i, lower, upper) { const char * const env_override = PerlEnv_getenv(category_names[i]); - unsigned int j = i - offset; + locale_category_index j = (locale_category_index) (i - offset); if (env_override && strNE(env_override, "")) { locale_names[j] = env_override; From bc861f8b3e5281e063a0785717f6d0a3e9c68f30 Mon Sep 17 00:00:00 2001 From: Karl Williamson <khw@cpan.org> Date: Mon, 5 Feb 2024 07:37:07 -0700 Subject: [PATCH 2/2] locale.c: Use macro created in previous commit This is a more general macro than these others, which can be rewritten more simply in terms of it. --- locale.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/locale.c b/locale.c index 429171a3b76e..ec3411351ace 100644 --- a/locale.c +++ b/locale.c @@ -505,19 +505,11 @@ S_wsetlocale(const int category, const wchar_t * wlocale) i <= (locale_category_index) (n); \ i = (locale_category_index) ((int) i + 1)) #define for_all_individual_category_indexes(i) \ - for (locale_category_index i = (locale_category_index) 0; \ - i < LC_ALL_INDEX_; \ - i = (locale_category_index) ((int) i + 1)) - + for_category_indexes_between(i, 0, LC_ALL_INDEX_ - 1) #define for_all_but_0th_individual_category_indexes(i) \ - for (locale_category_index i = (locale_category_index) 1; \ - i < LC_ALL_INDEX_; \ - i = (locale_category_index) ((int) i + 1)) - + for_category_indexes_between(i, 1, LC_ALL_INDEX_ - 1) #define for_all_category_indexes(i) \ - for (locale_category_index i = (locale_category_index) 0; \ - i <= LC_ALL_INDEX_; \ - i = (locale_category_index) ((int) i + 1)) + for_category_indexes_between(i, 0, LC_ALL_INDEX_) #ifdef USE_LOCALE # if defined(USE_FAKE_LC_ALL_POSITIONAL_NOTATION) && defined(LC_ALL)