diff --git a/coreutils/wc.c b/coreutils/wc.c index 43e8ed492..08f3c2dc4 100644 --- a/coreutils/wc.c +++ b/coreutils/wc.c @@ -129,7 +129,7 @@ int wc_main(int argc UNUSED_PARAM, char **argv) --counts[WC_CHARS]; goto DO_EOF; /* Treat an EOF as '\r'. */ } - if (isprint(c)) { + if (isprint_asciionly(c)) { ++linepos; if (!isspace(c)) { in_word = 1; diff --git a/editors/vi.c b/editors/vi.c index 7d83db642..58c6f5a05 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -30,9 +30,10 @@ #if ENABLE_LOCALE_SUPPORT #if ENABLE_FEATURE_VI_8BIT -# define Isprint(c) isprint(c) +//FIXME: this does not work properly for Unicode anyway +# define Isprint(c) (isprint)(c) #else -# define Isprint(c) (isprint(c) && (unsigned char)(c) < 0x7f) +# define Isprint(c) isprint_asciionly(c) #endif #else @@ -891,7 +892,7 @@ static void colon(char *buf) li, ch); } else if (strncmp(cmd, "file", i) == 0) { // what File is this if (b != -1 || e != -1) { - not_implemented("No address allowed on this command"); + status_line_bold("No address allowed on this command"); goto vc1; } if (args[0]) { @@ -2588,36 +2589,41 @@ static void status_line(const char *format, ...) // copy s to buf, convert unprintable static void print_literal(char *buf, const char *s) { + char *d; unsigned char c; - char b[2]; - b[1] = '\0'; buf[0] = '\0'; if (!s[0]) s = "(NULL)"; + + d = buf; for (; *s; s++) { int c_is_no_print; c = *s; c_is_no_print = (c & 0x80) && !Isprint(c); if (c_is_no_print) { - strcat(buf, SOn); + strcpy(d, SOn); + d += sizeof(SOn)-1; c = '.'; } - if (c < ' ' || c == 127) { - strcat(buf, "^"); - if (c == 127) + if (c < ' ' || c == 0x7f) { + *d++ = '^'; + c |= '@'; /* 0x40 */ + if (c == 0x7f) c = '?'; - else - c += '@'; } - b[0] = c; - strcat(buf, b); - if (c_is_no_print) - strcat(buf, SOs); - if (*s == '\n') - strcat(buf, "$"); - if (strlen(buf) > MAX_INPUT_LEN - 10) // paranoia + *d++ = c; + *d = '\0'; + if (c_is_no_print) { + strcpy(d, SOs); + d += sizeof(SOs)-1; + } + if (*s == '\n') { + *d++ = '$'; + *d = '\0'; + } + if (d - buf > MAX_INPUT_LEN - 10) // paranoia break; } } @@ -2982,11 +2988,6 @@ static void do_cmd(int c) default: // unrecognized command buf[0] = c; buf[1] = '\0'; - if (c < ' ') { - buf[0] = '^'; - buf[1] = c + '@'; - buf[2] = '\0'; - } not_implemented(buf); end_cmd_q(); // stop adding to q case 0x00: // nul- ignore diff --git a/shell/hush.c b/shell/hush.c index 2d6f55bc7..3044024a0 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -5572,6 +5572,10 @@ static int process_command_subs(o_string *dest, const char *s) } #endif /* ENABLE_HUSH_TICK */ +#if !ENABLE_HUSH_FUNCTIONS +#define parse_group(dest, ctx, input, ch) \ + parse_group(ctx, input, ch) +#endif static int parse_group(o_string *dest, struct parse_context *ctx, struct in_str *input, int ch) {