#endif
#include <locale.h>
+#include <langinfo.h>
#if USE_NCURSES
# define NCURSES_OPAQUE 1
/* http://newsgroups.derkeiler.com/Archive/Rec/rec.games.roguelike.development/2010-09/msg00050.html */
# define _X_OPEN_SOURCE_EXTENDED
-# include <ncursesw/ncurses.h>
-/* some evilness: ncurses knows how to detect unicode, but won't
- expose it, yet there's this function that does what we want, so we
- steal it away from it */
-extern int _nc_unicode_locale(void);
+# if HAVE_NCURSESW_NCURSES_H
+# include <ncursesw/ncurses.h>
+# elif HAVE_NCURSES_H
+# include <ncurses.h>
+# endif
# define OPING_GREEN 1
# define OPING_YELLOW 2
static int opt_count = -1;
static int opt_send_ttl = 64;
static uint8_t opt_send_qos = 0;
+#if USE_NCURSES
+static int opt_utf8 = 0;
+#endif
static int host_num = 0;
" -I srcaddr source address\n"
" -D device outgoing interface name\n"
" -f filename filename to read hosts from\n"
+#if USE_NCURSES
+ " -u / -U force / disable UTF-8 output\n"
+#endif
"\noping "PACKAGE_VERSION", http://verplant.org/liboping/\n"
"by Florian octo Forster <octo@verplant.org>\n"
while (1)
{
- optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:");
+ optchar = getopt (argc, argv, "46c:hi:I:t:Q:f:D:"
+#if USE_NCURSES
+ "uU"
+#endif
+ );
if (optchar == -1)
break;
set_opt_send_qos (optarg);
break;
+#if USE_NCURSES
+ case 'u':
+ opt_utf8 = 2;
+ break;
+ case 'U':
+ opt_utf8 = 1;
+ break;
+#endif
+
case 'h':
usage_exit (argv[0], 0);
break;
} /* }}} void time_calc */
#if USE_NCURSES
+static _Bool has_utf8() /* {{{ */
+{
+# if HAVE_NCURSESW_NCURSES_H
+ if (!opt_utf8)
+ {
+ /* Automatically determine */
+ if (strcasecmp ("UTF-8", nl_langinfo (CODESET)) == 0)
+ opt_utf8 = 2;
+ else
+ opt_utf8 = 1;
+ }
+ return ((_Bool) (opt_utf8 - 1));
+# else
+ return (0);
+# endif
+} /* }}} _Bool has_utf8 */
+
static int update_prettyping_graph (ping_context_t *ctx, /* {{{ */
double latency, unsigned int sequence)
{
int color = OPING_RED;
char const *symbol = "!";
int symbolc = '!';
- size_t hist_symbols_num;
- size_t index_symbols;
int x_max;
int x_pos;
x_max = getmaxx (ctx->window);
x_pos = ((sequence - 1) % (x_max - 4)) + 2;
- if (_nc_unicode_locale())
- {
- hist_symbols_num = hist_symbols_utf8_num;
- }
- else {
- hist_symbols_num = hist_symbols_acs_num;
- }
-
if (latency >= 0.0)
{
double ratio;
- size_t intensity;
+
+ size_t symbols_num = hist_symbols_acs_num;
+ size_t colors_num = 1;
+
+ size_t index_symbols;
size_t index_colors;
+ size_t intensity;
- ratio = latency / PING_DEF_TTL;
+ /* latency is in milliseconds, opt_interval is in seconds. */
+ ratio = (latency * 0.001) / opt_interval;
if (ratio > 1) {
ratio = 1.0;
}
- intensity = (size_t) ((ratio * hist_symbols_num
- * hist_colors_num) - 1);
+ if (has_utf8 ())
+ symbols_num = hist_symbols_utf8_num;
+
+ if (has_colors () == TRUE)
+ colors_num = hist_colors_num;
+
+ intensity = (size_t) (ratio * ((double) (symbols_num * colors_num)));
+ if (intensity >= (symbols_num * colors_num))
+ intensity = (symbols_num * colors_num) - 1;
+
+ index_symbols = intensity % symbols_num;
+ assert (index_symbols < symbols_num);
- index_colors = intensity / hist_symbols_num;
- assert (index_colors < hist_colors_num);
+ index_colors = intensity / symbols_num;
+ assert (index_colors < colors_num);
- index_symbols = intensity % hist_symbols_num;
- if (_nc_unicode_locale())
+ if (has_utf8())
{
color = hist_colors_utf8[index_colors];
symbol = hist_symbols_utf8[index_symbols];
color = hist_colors_acs[index_colors];
symbolc = hist_symbols_acs[index_symbols] | A_ALTCHARSET;
}
- }
+ }
else /* if (!(latency >= 0.0)) */
wattron (ctx->window, A_BOLD);
- wattron (ctx->window, COLOR_PAIR(color));
- if (_nc_unicode_locale())
- {
- mvwprintw (ctx->window,
- /* y = */ 3,
- /* x = */ x_pos,
- symbol);
- }
- else {
- mvwaddch (ctx->window,
- /* y = */ 3,
- /* x = */ x_pos,
- symbolc);
- }
- wattroff (ctx->window, COLOR_PAIR(color));
+ if (has_colors () == TRUE)
+ wattron (ctx->window, COLOR_PAIR(color));
+
+ if (has_utf8())
+ mvwprintw (ctx->window, /* y = */ 3, /* x = */ x_pos, symbol);
+ else
+ mvwaddch (ctx->window, /* y = */ 3, /* x = */ x_pos, symbolc);
+
+ if (has_colors () == TRUE)
+ wattroff (ctx->window, COLOR_PAIR(color));
/* Use negation here to handle NaN correctly. */
if (!(latency >= 0.0))
deviation);
}
- if (has_colors () == TRUE)
- update_prettyping_graph (ctx, latency, sequence);
+ update_prettyping_graph (ctx, latency, sequence);
wrefresh (ctx->window);