tPad drug names by character, not byte - vaccinewars - be a doctor and try to v… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c3e83bb7dab692ce7febbe46d21261c4a664f6a7 | |
parent 0f3258aeb3b48e9d859770c2ba81750fc4460010 | |
Author: Ben Webb <[email protected]> | |
Date: Sun, 29 Nov 2020 22:58:32 -0800 | |
Pad drug names by character, not byte | |
If we're in a UTF-8 locale with accented characters, | |
strings might be longer in bytes than in characters; | |
tthis results in drug names not lining up in the curses | |
"drugs here" output. Pad using the length in characters | |
instead to fix this. | |
Diffstat: | |
M src/curses_client/curses_client.c | 25 +++++++++++++++++++++++-- | |
M src/dopewars.c | 3 +++ | |
M src/dopewars.h | 1 + | |
M src/winmain.c | 1 + | |
4 files changed, 28 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_clien… | |
t@@ -2241,6 +2241,25 @@ char *nice_input(char *prompt, int sy, int sx, gboolean… | |
return ReturnString; | |
} | |
+/* Return a blank string long enough to pad `name` out to `pad_len`. | |
+ This works with characters, not bytes, if in a UTF-8 locale */ | |
+static char *pad_name(const char *name, guint pad_len) | |
+{ | |
+ /* 40 character blank string (must be longer than max value of pad_len) */ | |
+ static char *pad = " "; | |
+ int slen; | |
+ if (LocaleIsUTF8) { | |
+ slen = g_utf8_strlen(name, -1); | |
+ } else { | |
+ slen = strlen(name); | |
+ } | |
+ if (slen > pad_len || slen > 40) { | |
+ return ""; | |
+ } else { | |
+ return pad + 40 - pad_len + slen; | |
+ } | |
+} | |
+ | |
static void DisplayDrugsHere(Player *Play) | |
{ | |
int NumDrugsHere, i, c; | |
t@@ -2265,8 +2284,9 @@ static void DisplayDrugsHere(Player *Play) | |
c++, i = GetNextDrugIndex(i, Play)) { | |
/* List of individual drug names for selection (%tde="Opium" etc. | |
by default) */ | |
- text = dpg_strdup_printf( _("%c. %-10tde %8P"), 'A' + c, | |
- Drug[i].Name, Play->Drugs[i].Price); | |
+ text = dpg_strdup_printf( _("%c. %tde%s %8P"), 'A' + c, | |
+ Drug[i].Name, pad_name(Drug[i].Name, 10), | |
+ Play->Drugs[i].Price); | |
names = g_slist_append(names, text); | |
} | |
display_select_list(names); | |
t@@ -2654,6 +2674,7 @@ void CursesLoop(struct CMDLINE *cmdline) | |
/* On Windows, force UTF-8 rather than the non-Unicode codepage */ | |
bind_textdomain_codeset(PACKAGE, "UTF-8"); | |
Conv_SetInternalCodeset("UTF-8"); | |
+ LocaleIsUTF8 = TRUE; | |
WantUTF8Errors(TRUE); | |
#endif | |
diff --git a/src/dopewars.c b/src/dopewars.c | |
t@@ -101,6 +101,7 @@ gboolean Daemonize = TRUE; | |
gchar *WebBrowser = NULL; | |
gint ConfigErrors = 0; | |
+gboolean LocaleIsUTF8 = FALSE; | |
int NumLocation = 0, NumGun = 0, NumCop = 0, NumDrug = 0, NumSubway = 0; | |
int NumPlaying = 0, NumStoppedTo = 0; | |
t@@ -2924,9 +2925,11 @@ int main(int argc, char *argv[]) | |
{ | |
struct CMDLINE *cmdline; | |
#ifdef ENABLE_NLS | |
+ const char *charset; | |
setlocale(LC_ALL, ""); | |
bindtextdomain(PACKAGE, LOCALEDIR); | |
textdomain(PACKAGE); | |
+ LocaleIsUTF8 = g_get_charset(&charset); | |
#endif | |
WantUTF8Errors(FALSE); | |
g_log_set_handler(NULL, LogMask(), DefaultLogMessage, NULL); | |
diff --git a/src/dopewars.h b/src/dopewars.h | |
t@@ -371,6 +371,7 @@ extern GSList *ServerList; | |
extern GScannerConfig ScannerConfig; | |
extern struct LOG Log; | |
extern gint ConfigErrors; | |
+extern gboolean LocaleIsUTF8; | |
GSList *RemovePlayer(Player *Play, GSList *First); | |
Player *GetPlayerByID(guint ID, GSList *First); | |
diff --git a/src/winmain.c b/src/winmain.c | |
t@@ -283,6 +283,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevI… | |
setlocale(LC_ALL, ""); | |
bindtextdomain(PACKAGE, LOCALEDIR); | |
textdomain(PACKAGE); | |
+ LocaleIsUTF8 = g_get_charset(&charset); | |
#endif | |
/* Informational comment placed at the start of the Windows log file |