[git commit master] fix fallout from isprint() changes

Denys Vlasenko vda.linux at googlemail.com
Fri Nov 20 18:14:19 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=c270454f8f1f33e5438e46cb13bebd8fb190a40a
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/wc.c |    2 +-
 editors/vi.c   |   49 +++++++++++++++++++++++++------------------------
 shell/hush.c   |    4 ++++
 3 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/coreutils/wc.c b/coreutils/wc.c
index 43e8ed4..08f3c2d 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 7d83db6..58c6f5a 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 2d6f55b..3044024 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)
 {
-- 
1.6.3.3



More information about the busybox-cvs mailing list