Fixed watch 8 bit so its optional

You can make watch 8bit clean by using the configure option
--enable-watch8bit
This commit is contained in:
Craig Small 2011-12-20 22:12:37 +11:00
parent 8967f0fca3
commit 367b8bb616
4 changed files with 104 additions and 7 deletions

View File

@ -54,7 +54,7 @@ dist_man_MANS += \
watch.1
slabtop_LDADD = @NCURSES_LIBS@
top_LDADD = @NCURSES_LIBS@
watch_LDADD = @NCURSES_LIBS@
watch_LDADD = @WATCH_NCURSES_LIBS@
endif
kill_SOURCES = skill.c

30
NEWS
View File

@ -2,6 +2,36 @@ procps-ng-3.3.1 --> procps-ng-3.3.2
--------------------------------
* Redefined library to use version-info
* Imported a bunch of distribution patches:
watch: support unicode
watch: add precision wait time option -p
watch: interpret ANSI color code sequences
watch: add -exec and -beep flags and has better quoting
w: use environment to set user and from/host column widths
w: use COLUMNS environment if TIOCGWINSZ fails
w: bassman emulation with -o option
vmstat: do not scale si/so just like bi/bo
libprocps-ng: sysinfo.c: truncate the vmstat figure to 32 bits
tload: remote unneeded optarg and optind variables
sysctl: fix up some option processing
skill: kill prints perror
skill: do not treat skill null parameter as 0
skill: fix too greedy option parser
libprocps-ng: readproc.c: some type conversion help
ps: rename SZ to SIZE
ps: add sorting to %mem for ps
pmap: provide information for -x option
pgrep: distinguish between invalid commandline parameters and '-?'
pgrep: fix compiler warning saved_start_time might be used uninitialized
pgrep: add -c option for counting number of matched proceesses
pwdx & libprocps-ng: Hurd does not have MAX_PATH defined
ps: --sort does not work with time argument
skill: add CR to warning line
contrib: minimal ps: define mips PAGE_SIZE
libproc-ng: prettyfy proc mount messages
ps: add build option to disable ps option warning
libproc-ng: support building without WCHAR support
sysctl: remove index() for buildroot
procps-ng-3.3.0 --> procps-ng-3.3.1
--------------------------------

View File

@ -17,6 +17,15 @@ AM_PROG_CC_C_O
AC_PROG_INSTALL
AC_PROG_LN_S
AC_SUBST([WITH_WATCH8BIT])
AC_ARG_ENABLE([watch8bit],
AS_HELP_STRING([--enable-watch8bit], [enable watch to be 8bit clean (requires ncursesw)]),
[enable_watch8bit=$enableval],
[enable_watch8bit="no"])
if test "$enable_watch8bit" = "yes"; then
AC_DEFINE([WITH_WATCH8BIT], [1], [Enable 8 bit clean watch])
fi
# Checks for header files.
AC_HEADER_MAJOR
AC_CHECK_HEADERS([\
@ -106,9 +115,16 @@ else
AC_MSG_ERROR([ncurses support missing/incomplete (for partial build use --without-ncurses)])
fi
AM_CONDITIONAL(WITH_NCURSES, true)
if test "$enable_watch8bit" = yes; then
AC_CHECK_LIB([ncursesw], [addwstr], [WATCH_NCURSES_LIBS=-lncursesw],
[AC_MSG_ERROR([Cannot find ncurses wide library ncursesw with --enable-watch8bit])])
else
WATCH_NCURSES_LIBS="-lncurses"
fi
NCURSES_LIBS="-lncurses"
fi
AC_SUBST([NCURSES_LIBS])
AC_SUBST([WATCH_NCURSES_LIBS])
usrbin_execdir='${exec_prefix}/usr/bin'
AC_SUBST([usrbin_execdir])

63
watch.c
View File

@ -12,10 +12,10 @@
* Unicode Support added by Jarrod Lowe <procps@rrod.net> in 2009.
*/
#include "config.h"
#include <ctype.h>
#include <getopt.h>
#include <signal.h>
#include <ncurses.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -26,8 +26,13 @@
#include <termios.h>
#include <locale.h>
#include "proc/procps.h"
#include "config.h"
#include <errno.h>
#ifdef WITH_WATCH8BIT
#include <wchar.h>
#include <ncursesw/ncurses.h>
#else
#include <ncurses.h>
#endif /* WITH_WATCH8BIT */
#ifdef FORCE_8BIT
#undef isprint
@ -220,6 +225,7 @@ watch_usec_t get_time_usec() {
return USECS_PER_SEC*now.tv_sec + now.tv_usec;
}
#ifdef WITH_WATCH8BIT
// read a wide character from a popen'd stream
#define MAX_ENC_BYTES 16
wint_t my_getwc(FILE *s);
@ -245,6 +251,7 @@ wint_t my_getwc(FILE *s) {
}
}
}
#endif /* WITH_WATCH8BIT */
int
main(int argc, char *argv[])
@ -259,13 +266,16 @@ main(int argc, char *argv[])
option_help = 0, option_version = 0;
double interval = 2;
char *command;
wchar_t *wcommand = NULL;
char **command_argv;
int command_length = 0; /* not including final \0 */
int wcommand_columns = 0; /* not including final \0 */
int wcommand_characters = 0; /* not including final \0 */
watch_usec_t next_loop; /* next loop time in us, used for precise time
keeping only */
#ifdef WITH_WATCH8BIT
wchar_t *wcommand = NULL;
int wcommand_columns = 0; /* not including final \0 */
int wcommand_characters = 0; /* not including final \0 */
#endif /* WITH_WATCH8BIT */
int pipefd[2];
int status;
pid_t child;
@ -362,6 +372,7 @@ main(int argc, char *argv[])
command[command_length] = '\0';
}
#ifdef WITH_WATCH8BIT
// convert to wide for printing purposes
//mbstowcs(NULL, NULL, 0);
wcommand_characters = mbstowcs(NULL, command, 0);
@ -376,7 +387,7 @@ main(int argc, char *argv[])
}
mbstowcs(wcommand, command, wcommand_characters+1);
wcommand_columns = wcswidth(wcommand, -1);
#endif /* WITH_WATCH8BIT */
get_terminal_size();
@ -444,6 +455,7 @@ main(int argc, char *argv[])
if(width < tsl + hlen + 4) {
mvaddstr(0, width - tsl - 4, "... ");
}else{
#ifdef WITH_WATCH8BIT
if(width < tsl + hlen + wcommand_columns) {
// print truncated
int avail_columns = width - tsl - hlen;
@ -458,6 +470,9 @@ main(int argc, char *argv[])
}else{
mvaddwstr(0, hlen, wcommand);
}
#else
mvaddnstr(0, hlen, command, width - tsl - hlen);
#endif /* WITH_WATCH8BIT */
}
}
}
@ -520,15 +535,22 @@ main(int argc, char *argv[])
for (y = show_title; y < height; y++) {
int eolseen = 0, tabpending = 0;
#ifdef WITH_WATCH8BIT
wint_t carry = WEOF;
#endif /* WITH_WATCH8BIT */
for (x = 0; x < width; x++) {
#ifdef WITH_WATCH8BIT
wint_t c = ' ';
#else
int c = ' ';
#endif /* WITH_WATCH8BIT */
int attr = 0;
if (!eolseen) {
/* if there is a tab pending, just spit spaces until the
next stop instead of reading characters */
if (!tabpending)
#ifdef WITH_WATCH8BIT
do {
if(carry == WEOF) {
c = my_getwc(p);
@ -541,6 +563,14 @@ main(int argc, char *argv[])
&& c != L'\n'
&& c != L'\t'
&& (c != L'\033' || option_color != 1));
#else
do
c = getc(p);
while (c != EOF && !isprint(c)
&& c != '\n'
&& c != '\t'
&& (c != L'\033' || option_color != 1));
#endif /* WITH_WATCH8BIT */
if (c == L'\033' && option_color == 1) {
x--;
process_ansi(p);
@ -555,6 +585,7 @@ main(int argc, char *argv[])
eolseen = 1;
else if (c == L'\t')
tabpending = 1;
#ifdef WITH_WATCH8BIT
if (x==width-1 && wcwidth(c)==2) {
y++;
x = -1; //process this double-width
@ -563,11 +594,16 @@ main(int argc, char *argv[])
}
if (c == WEOF || c == L'\n' || c == L'\t')
c = L' ';
#else
if (c == EOF || c == '\n' || c == '\t')
c = ' ';
#endif /* WITH_WATCH8BIT */
if (tabpending && (((x + 1) % 8) == 0))
tabpending = 0;
}
move(y, x);
if (option_differences) {
#ifdef WITH_WATCH8BIT
cchar_t oldc;
in_wch(&oldc);
attr = !first_screen
@ -575,14 +611,29 @@ main(int argc, char *argv[])
||
(option_differences_cumulative
&& (oldc.attr & A_ATTRIBUTES)));
#else
chtype oldch = inch();
unsigned char oldc = oldch & A_CHARTEXT;
attr = !first_screen
&& ((unsigned char)c != oldc
||
(option_differences_cumulative
&& (oldch & A_ATTRIBUTES)));
#endif /* WITH_WATCH8BIT */
}
if (attr)
standout();
#ifdef WITH_WATCH8BIT
addnwstr((wchar_t*)&c,1);
#else
addch(c);
#endif /* WITH_WATCH8BIT */
if (attr)
standend();
#ifdef WITH_WATCH8BIT
if(wcwidth(c) == 0) { x--; }
if(wcwidth(c) == 2) { x++; }
#endif /* WITH_WATCH8BIT */
}
oldeolseen = eolseen;
}