diff --git a/src/charset.c b/src/charset.c
index 440084406d2f5837d239a356da48b5f068294a9f..61a34cbcf449a6dd0eb870cfc9dd239d83109cf5 100644 (file)
--- a/src/charset.c
+++ b/src/charset.c
/* ncmpc (Ncurses MPD Client)
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2009 The Music Player Daemon Project
+ * (c) 2004-2017 The Music Player Daemon Project
* Project homepage: http://musicpd.org
* Project homepage: http://musicpd.org
-
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
-
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-
+ *
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
+ */
#include "charset.h"
#include "charset.h"
}
#endif
}
#endif
-#ifdef ENABLE_WIDE
+#ifdef HAVE_CURSES_ENHANCED
static inline unsigned
unicode_char_width(gunichar ch)
{
static inline unsigned
unicode_char_width(gunichar ch)
{
+ if (g_unichar_iszerowidth(ch))
+ return 0;
+
if (g_unichar_iswide(ch))
return 2;
return 1;
}
if (g_unichar_iswide(ch))
return 2;
return 1;
}
-#endif /* ENABLE_WIDE */
+#endif /* HAVE_CURSES_ENHANCED */
unsigned
utf8_width(const char *str)
{
assert(str != NULL);
unsigned
utf8_width(const char *str)
{
assert(str != NULL);
-#if defined(ENABLE_MULTIBYTE) && !defined(ENABLE_WIDE)
+#if defined(ENABLE_MULTIBYTE) && !defined(HAVE_CURSES_ENHANCED)
return g_utf8_strlen(str, -1);
#else
return g_utf8_strlen(str, -1);
#else
-#ifdef ENABLE_WIDE
+#ifdef HAVE_CURSES_ENHANCED
if (g_utf8_validate(str, -1, NULL)) {
size_t len = g_utf8_strlen(str, -1);
unsigned width = 0;
if (g_utf8_validate(str, -1, NULL)) {
size_t len = g_utf8_strlen(str, -1);
unsigned width = 0;
return width;
#else
return width;
#else
- return strlen(str);
+ return strlen(p);
#endif
}
#endif
}
-static inline unsigned
+gcc_unused
+static unsigned
ascii_cut_width(char *p, unsigned max_width)
{
size_t length = strlen(p);
ascii_cut_width(char *p, unsigned max_width)
{
size_t length = strlen(p);
return max_width;
}
return max_width;
}
-static inline unsigned
+gcc_unused
+static unsigned
narrow_cut_width(char *p, unsigned max_width)
{
size_t length = g_utf8_strlen(p, -1);
narrow_cut_width(char *p, unsigned max_width)
{
size_t length = g_utf8_strlen(p, -1);
return max_width;
}
return max_width;
}
-static inline unsigned
+gcc_unused
+static unsigned
wide_cut_width(char *p, unsigned max_width)
{
size_t length = g_utf8_strlen(p, -1);
unsigned width = 0, prev_width;
wide_cut_width(char *p, unsigned max_width)
{
size_t length = g_utf8_strlen(p, -1);
unsigned width = 0, prev_width;
- gunichar c;
while (length-- > 0) {
while (length-- > 0) {
- c = g_utf8_get_char(p);
+ gunichar c = g_utf8_get_char(p);
prev_width = width;
width += g_unichar_iswide(c) ? 2 : 1;
if (width > max_width) {
prev_width = width;
width += g_unichar_iswide(c) ? 2 : 1;
if (width > max_width) {
{
assert(p != NULL);
{
assert(p != NULL);
-#ifdef ENABLE_WIDE
+#ifdef HAVE_CURSES_ENHANCED
if (!g_utf8_validate(p, -1, NULL))
return ascii_cut_width(p, max_width);
return wide_cut_width(p, max_width);
if (!g_utf8_validate(p, -1, NULL))
return ascii_cut_width(p, max_width);
return wide_cut_width(p, max_width);
-#elif defined(ENABLE_MULTIBYTE) && !defined(ENABLE_WIDE)
+#elif defined(ENABLE_MULTIBYTE) && !defined(HAVE_CURSES_ENHANCED)
return narrow_cut_width(p, max_width);
#else
return ascii_cut_width(p, max_width);
return narrow_cut_width(p, max_width);
#else
return ascii_cut_width(p, max_width);
utf8_to_locale(const char *utf8str)
{
#ifdef ENABLE_LOCALE
utf8_to_locale(const char *utf8str)
{
#ifdef ENABLE_LOCALE
- gchar *str;
-
assert(utf8str != NULL);
if (noconvert)
return g_strdup(utf8str);
assert(utf8str != NULL);
if (noconvert)
return g_strdup(utf8str);
- str = g_convert_with_fallback(utf8str, -1,
- charset, "utf-8",
- NULL, NULL, NULL, NULL);
+ gchar *str = g_convert_with_fallback(utf8str, -1,
+ charset, "utf-8",
+ NULL, NULL, NULL, NULL);
if (str == NULL)
return g_strdup(utf8str);
if (str == NULL)
return g_strdup(utf8str);
locale_to_utf8(const char *localestr)
{
#ifdef ENABLE_LOCALE
locale_to_utf8(const char *localestr)
{
#ifdef ENABLE_LOCALE
- gchar *str;
-
assert(localestr != NULL);
if (noconvert)
return g_strdup(localestr);
assert(localestr != NULL);
if (noconvert)
return g_strdup(localestr);
- str = g_convert_with_fallback(localestr, -1,
- "utf-8", charset,
- NULL, NULL, NULL, NULL);
+ gchar *str = g_convert_with_fallback(localestr, -1,
+ "utf-8", charset,
+ NULL, NULL, NULL, NULL);
if (str == NULL)
return g_strdup(localestr);
if (str == NULL)
return g_strdup(localestr);