top: maximize recent locale aware numeric enhancements
When startup argument parsing was recently enhanced to
account for LC_NUMERIC settings, some user input logic
dealing with numbers fails to exploit that capability.
This patch extends such enhancements to a running top.
Reference(s):
commit f7b84f45c7
http://www.freelists.org/post/procps/topwatch-floating-point-input,2
Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
parent
cacba5613e
commit
2199af404a
1
NEWS
1
NEWS
@ -11,6 +11,7 @@ procps-ng-3.3.10
|
|||||||
* top is now immune to distortions when system time is reset
|
* top is now immune to distortions when system time is reset
|
||||||
* top standardized the <Esc> key support with prompted input
|
* top standardized the <Esc> key support with prompted input
|
||||||
* top missing summary area info added to man document, ubuntu #574624
|
* top missing summary area info added to man document, ubuntu #574624
|
||||||
|
* top properly responds to the current locale LC_NUMERIC setting
|
||||||
* top provides alternate graph modes for cpu states and memory usage
|
* top provides alternate graph modes for cpu states and memory usage
|
||||||
|
|
||||||
|
|
||||||
|
40
top/top.c
40
top/top.c
@ -1258,6 +1258,21 @@ static char *ioline (const char *prompt) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make locale aware float (but maybe restrict to whole numbers). */
|
||||||
|
static int mkfloat (const char *str, float *num, int whole) {
|
||||||
|
char *ep;
|
||||||
|
|
||||||
|
if (whole)
|
||||||
|
*num = (float)strtol(str, &ep, 0);
|
||||||
|
else
|
||||||
|
*num = strtof(str, &ep);
|
||||||
|
if (ep != str && *ep == '\0' && *num < MAXINT)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
} // end: mkfloat
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This routine provides the i/o in support of files whose size
|
* This routine provides the i/o in support of files whose size
|
||||||
* cannot be determined in advance. Given a stream pointer, he'll
|
* cannot be determined in advance. Given a stream pointer, he'll
|
||||||
@ -1302,11 +1317,10 @@ static float get_float (const char *prompt) {
|
|||||||
if (line[0] == kbd_ESC || Frames_signal) return GET_NUM_ESC;
|
if (line[0] == kbd_ESC || Frames_signal) return GET_NUM_ESC;
|
||||||
if (!line[0]) return GET_NUM_NOT;
|
if (!line[0]) return GET_NUM_NOT;
|
||||||
// note: we're not allowing negative floats
|
// note: we're not allowing negative floats
|
||||||
if (strcspn(line, "+,.0123456789")) {
|
if (!mkfloat(line, &f, 0) || f < 0) {
|
||||||
show_msg(N_txt(BAD_numfloat_txt));
|
show_msg(N_txt(BAD_numfloat_txt));
|
||||||
return GET_NUM_BAD;
|
return GET_NUM_BAD;
|
||||||
}
|
}
|
||||||
sscanf(line, "%f", &f);
|
|
||||||
return f;
|
return f;
|
||||||
} // end: get_float
|
} // end: get_float
|
||||||
|
|
||||||
@ -1315,18 +1329,17 @@ static float get_float (const char *prompt) {
|
|||||||
* Get an integer from the user, returning INT_MIN for error */
|
* Get an integer from the user, returning INT_MIN for error */
|
||||||
static int get_int (const char *prompt) {
|
static int get_int (const char *prompt) {
|
||||||
char *line;
|
char *line;
|
||||||
int n;
|
float f;
|
||||||
|
|
||||||
line = ioline(prompt);
|
line = ioline(prompt);
|
||||||
if (line[0] == kbd_ESC || Frames_signal) return GET_NUM_ESC;
|
if (line[0] == kbd_ESC || Frames_signal) return GET_NUM_ESC;
|
||||||
if (!line[0]) return GET_NUM_NOT;
|
if (!line[0]) return GET_NUM_NOT;
|
||||||
// note: we've got to allow negative ints (renice)
|
// note: we've got to allow negative ints (renice)
|
||||||
if (strcspn(line, "-+0123456789")) {
|
if (!mkfloat(line, &f, 1)) {
|
||||||
show_msg(N_txt(BAD_integers_txt));
|
show_msg(N_txt(BAD_integers_txt));
|
||||||
return GET_NUM_BAD;
|
return GET_NUM_BAD;
|
||||||
}
|
}
|
||||||
sscanf(line, "%d", &n);
|
return (int)f;
|
||||||
return n;
|
|
||||||
} // end: get_int
|
} // end: get_int
|
||||||
|
|
||||||
|
|
||||||
@ -1349,21 +1362,6 @@ static inline const char *hex_make (KLONG num, int noz) {
|
|||||||
} // end: hex_make
|
} // end: hex_make
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make locale aware float (but maybe restrict to whole numbers). */
|
|
||||||
static int mkfloat (const char *str, float *num, int whole) {
|
|
||||||
char *ep;
|
|
||||||
|
|
||||||
if (whole)
|
|
||||||
*num = (float)strtol(str, &ep, 0);
|
|
||||||
else
|
|
||||||
*num = strtof(str, &ep);
|
|
||||||
if (ep != str && *ep == '\0' && *num < MAXINT)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
} // end: mkfloat
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This sructure is hung from a WIN_t when other filtering is active */
|
* This sructure is hung from a WIN_t when other filtering is active */
|
||||||
struct osel_s {
|
struct osel_s {
|
||||||
|
@ -677,12 +677,12 @@ typedef struct WIN_t {
|
|||||||
//atic int ioch (int ech, char *buf, unsigned cnt);
|
//atic int ioch (int ech, char *buf, unsigned cnt);
|
||||||
//atic int iokey (int action);
|
//atic int iokey (int action);
|
||||||
//atic char *ioline (const char *prompt);
|
//atic char *ioline (const char *prompt);
|
||||||
|
//atic int mkfloat (const char *str, float *num, int whole);
|
||||||
//atic int readfile (FILE *fp, char **baddr, size_t *bsize, size_t *bread);
|
//atic int readfile (FILE *fp, char **baddr, size_t *bsize, size_t *bread);
|
||||||
/*------ Small Utility routines ----------------------------------------*/
|
/*------ Small Utility routines ----------------------------------------*/
|
||||||
//atic float get_float (const char *prompt);
|
//atic float get_float (const char *prompt);
|
||||||
//atic int get_int (const char *prompt);
|
//atic int get_int (const char *prompt);
|
||||||
//atic inline const char *hex_make (KLONG num, int noz);
|
//atic inline const char *hex_make (KLONG num, int noz);
|
||||||
//atic int mkfloat (const char *str, float *num, int whole);
|
|
||||||
//atic void osel_clear (WIN_t *q);
|
//atic void osel_clear (WIN_t *q);
|
||||||
//atic inline int osel_matched (const WIN_t *q, FLG_t enu, const char *str);
|
//atic inline int osel_matched (const WIN_t *q, FLG_t enu, const char *str);
|
||||||
//atic const char *user_certify (WIN_t *q, const char *str, char typ);
|
//atic const char *user_certify (WIN_t *q, const char *str, char typ);
|
||||||
|
Loading…
Reference in New Issue
Block a user