From 42512a67b0c1fb6eaf6754e1514e255fd561dae6 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Sun, 26 Jul 2020 16:42:12 -0700 Subject: [PATCH] Don't use extern for num_wished_langs WORK IN PROGRESS -- Attempting to mend an issue where stamp descriptions are not loading. Also, making things safer when a problem occurs. Using gcc 9.3.0 compiler, this was happening in 0.9.25 during development, but also affected 0.9.24 and 0.9.23, which worked fine under earlier versions of gcc. --- docs/CHANGES.txt | 6 ++++++ src/i18n.c | 24 +++++++++++++----------- src/i18n.h | 7 +++---- src/tuxpaint.c | 29 ++++++++++++++++++++++++++--- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index 02730434b..8d36fdb4f 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -38,6 +38,12 @@ $Id$ ---- * Improved safety when copying things into string buffers. + * [WIP] Mending issue where stamp descriptions are not loading, + and making things safer when a problem occurs. + (Using gcc 9.3.0 compiler, this was happening in 0.9.25 during + development, but also affected 0.9.24 and 0.9.23, which worked + fine under earlier versions of gcc.) + 2020.April.24 (0.9.24) * New tools --------- diff --git a/src/i18n.c b/src/i18n.c index 55727f3c1..6f27c2c42 100644 --- a/src/i18n.c +++ b/src/i18n.c @@ -25,7 +25,7 @@ $Id$ - June 14, 2002 - April 2, 2020 + June 14, 2002 - July 26, 2020 */ #include @@ -239,7 +239,6 @@ int need_right_to_left; int need_right_to_left_word; const char *lang_prefix, *short_lang_prefix; -int num_wished_langs = 0; w_langs wished_langs[255]; /* Mappings from human-readable language names (found in @@ -979,18 +978,17 @@ static void mysetenv(const char *name, const char *value) * @param loc Locale * @return The Y-nudge value for font rendering in the language. */ -/* *INDENT-OFF* */ -static int set_current_language(const char *restrict locale_choice) MUST_CHECK; -/* *INDENT-ON* */ -static int set_current_language(const char *restrict loc) +static int set_current_language(const char *restrict loc, int * ptr_num_wished_langs) { int i; int j = 0; char *oldloc; char *env_language; char *env_language_lang; + int num_wished_langs = 0; + *ptr_num_wished_langs = 0; if (strlen(loc) > 0) { @@ -1140,6 +1138,8 @@ static int set_current_language(const char *restrict loc) printf("lang_prefixes[%d] is \"%s\"\n", get_current_language(), lang_prefixes[get_current_language()]); #endif + *ptr_num_wished_langs = num_wished_langs; + return wished_langs[0].lang_y_nudge; } @@ -1150,11 +1150,12 @@ static int set_current_language(const char *restrict loc) * if asked (either 'locale' or 'lang' are "help"), or if the * given input is not recognized. * - * @param lang Language name (or NULL) - * @param locale Locale (or NULL) + * @param char * lang Language name (or NULL) + * @param char * locale Locale (or NULL) + * @param int * a place to return the number of languages we want to use, when scanning stamp descriptions * @return Y-nudge */ -int setup_i18n(const char *restrict lang, const char *restrict locale) +int setup_i18n(const char *restrict lang, const char *restrict locale, int * num_wished_langs) { #ifdef DEBUG printf("lang %p, locale %p\n", lang, locale); @@ -1174,7 +1175,7 @@ int setup_i18n(const char *restrict lang, const char *restrict locale) if (lang) locale = language_to_locale(lang); - return set_current_language(locale); + return set_current_language(locale, num_wished_langs); } #ifdef NO_SDLPANGO @@ -1183,6 +1184,7 @@ int setup_i18n(const char *restrict lang, const char *restrict locale) */ int smash_i18n(void) { - return set_current_language("C"); + int tmp; + return set_current_language("C", &tmp); } #endif diff --git a/src/i18n.h b/src/i18n.h index b2ffa383e..8d090833e 100644 --- a/src/i18n.h +++ b/src/i18n.h @@ -4,7 +4,7 @@ For Tux Paint Language-related functions - Copyright (c) 2002-2012 by Bill Kendrick and others + Copyright (c) 2002-2020 by Bill Kendrick and others bill@newbreedsoftware.com http://www.tuxpaint.org/ @@ -25,7 +25,7 @@ $Id$ - June 14, 2002 - December 11, 2016 + June 14, 2002 - July 26, 2020 */ @@ -188,7 +188,6 @@ extern int need_own_font; extern int need_right_to_left; // Right-justify extern int need_right_to_left_word; // Words need to be reversed, too! (e.g., Hebrew, but not Arabic) extern const char *lang_prefix, *short_lang_prefix; -extern int num_wished_langs; typedef struct w_langs { @@ -206,7 +205,7 @@ extern w_langs wished_langs[255]; /* Function prototypes: */ int get_current_language(void); -int setup_i18n(const char *restrict lang, const char *restrict locale) MUST_CHECK; +int setup_i18n(const char *restrict lang, const char *restrict locale, int * ptr_num_wished_languages) MUST_CHECK; #ifdef NO_SDLPANGO int smash_i18n(void) MUST_CHECK; diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 5ff9dcb35..adbc6a0a5 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -1828,6 +1828,8 @@ static int tool_avail[NUM_TOOLS], tool_avail_bak[NUM_TOOLS]; static Uint32 cur_toggle_count; +static int num_wished_langs; + typedef struct edge_type { int y_upper; @@ -10985,14 +10987,26 @@ static char *loaddesc(const char *const fname, Uint8 * locale_text) extptr = strcasestr(txt_fname, ".svg"); #endif + printf("### txt_fname = %s\n", txt_fname); + printf("### extptr = %s\n", extptr); + +/* +### txt_fname = /usr/local/share/tuxpaint/stamps/animals/amphibians//frog-1.png +### extptr = .png +'/usr/local/share/tuxpaint/stamps/animals/amphibians//frog-1.png' has no locale-specific translation, using English: '01��7' +*/ + if (extptr != NULL) { found = 0; + strcpy(def_buf, ""); /* In case of total inability to find anything */ /* Set the first available language */ for (i = 0; i < num_wished_langs && !found; i++) { - strcpy((char *)extptr, ".txt"); /* safe; pointing into a safe spot within an existing string */ + strcpy((char *)extptr, ".txt"); /* safe; pointing into a safe spot within an existing string (txt_fname) */ + + fprintf(stderr, "### txt_fname now '%s'\n", txt_fname); fi = fopen(txt_fname, "r"); @@ -11009,11 +11023,15 @@ static char *loaddesc(const char *const fname, Uint8 * locale_text) do { + fprintf(stderr, "### reading...\n"); + if (fgets(buf, sizeof(buf), fi)) { if (!feof(fi)) { + fprintf(stderr, "### READ '%s'\n", buf); strip_trailing_whitespace(buf); + fprintf(stderr, "### TRIMMED '%s'\n", buf); if (!got_first) { @@ -11021,9 +11039,9 @@ static char *loaddesc(const char *const fname, Uint8 * locale_text) strcpy(def_buf, buf); /* safe; both the same size */ got_first = 1; + fprintf(stderr, "### THAT WAS FIRST, using as default!\n"); } - debug(buf); @@ -11068,19 +11086,24 @@ static char *loaddesc(const char *const fname, Uint8 * locale_text) if (found) { *locale_text = 1; + fprintf(stderr, "'%s' has a locale-specific translation, using it: '%s'\n", fname, buf + strlen(lang_prefix) + 6); /* FIXME Remove */ return (strdup(buf + (strlen(lang_prefix)) + 6)); } else { /* No locale-specific translation; use the default (English) */ + fprintf(stderr, "'%s' has no locale-specific translation, using English: '%s'\n", fname, def_buf); /* FIXME Remove */ return (strdup(def_buf)); } } else { + fprintf(stderr, "Somehow, '%s' doesn't have a filename extension!?\n", fname); return NULL; } + + printf("\n"); } @@ -22801,7 +22824,7 @@ static void setup_config(char *argv[]) tmpcfg.parsertmp_lang = NULL; if (tmpcfg.parsertmp_locale == PARSE_CLOBBER) tmpcfg.parsertmp_locale = NULL; - button_label_y_nudge = setup_i18n(tmpcfg.parsertmp_lang, tmpcfg.parsertmp_locale); + button_label_y_nudge = setup_i18n(tmpcfg.parsertmp_lang, tmpcfg.parsertmp_locale, &num_wished_langs); /* FIXME: most of this is not required before starting the font scanner */