--- src/pstree.c
+++ src/pstree.c	2007-04-25 00:00:00.000000000 +0200
@@ -63,6 +63,7 @@ extern const char *__progname;
 #define UTF_HD	"\342\224\254"	/* U+252C, Horizontal and down */
 
 #define VT_BEG	"\033(0\017"	/* use graphic chars */
+#define VT_BEG_LEN 4
 #define VT_END	"\033(B"	/* back to normal char set */
 #define VT_V	"x"		/* see UTF definitions above */
 #define VT_VR	"t"
@@ -113,13 +114,21 @@ sym_ascii =
     UTF_VR UTF_H,
 
     UTF_V " ",
-    UTF_UR UTF_H, UTF_H UTF_H UTF_H, UTF_H UTF_HD UTF_H}, sym_vt100 =
+    UTF_UR UTF_H, UTF_H UTF_H UTF_H, UTF_H UTF_HD UTF_H}
+
+, sym_vt100 =
+/*
+ * For the vt100 line drawing fix: Do not append VT_END here
+ * because we may need to end the line drawing prematurely and
+ * we have to turn off line drawing mode by sending VT_END
+ * then anyway. That's why VT_END is sent by out_sym().
+ */
 {
   "  ",
-    VT_BEG VT_VR VT_H VT_END,
-    VT_BEG VT_V VT_END " ",
-    VT_BEG VT_UR VT_H VT_END,
-    VT_BEG VT_H VT_H VT_H VT_END, VT_BEG VT_H VT_HD VT_H VT_END}
+    VT_BEG VT_VR VT_H,
+    VT_BEG VT_V " ",
+    VT_BEG VT_UR VT_H,
+    VT_BEG VT_H VT_H VT_H, VT_BEG VT_H VT_HD VT_H}
 
 , *sym = &sym_ascii;
 
@@ -144,9 +153,13 @@ out_char (char c)
     putchar (c);
   if (cur_x == output_width + 1 && trunc && ((c & 0xc0) != 0x80))
   {
-    if (last_char || (c & 0x80))
+    if (last_char || (c & 0x80)) {
+/*
+ * pstree: UTF-8: never draw >1 '+' at end of line(no change for ASCII):
+ */
+      cur_x++;
       putchar ('+');
-    else
+    } else
       {
 	last_char = c;
 	cur_x--;
@@ -163,6 +176,26 @@ out_string (const char *str)
     out_char (*str++);
 }
 
+/*
+ * Only affects vt100 line drawing mode: Do not count the strlen of
+ * VT_BEG to prevent doing end-of-line way too early:
+ */
+static void
+out_sym (const char *str)
+{
+  int seq = 0;
+  if (sym == &sym_vt100 && *str == '\033') {
+    seq = 1;
+    if (cur_x <= output_width || !trunc)
+      cur_x -= VT_BEG_LEN;
+  }
+  out_string(str);
+  if (seq) {
+      str = VT_END;
+      while (*str)
+        putchar (*str++);
+  }
+}
 
 static int
 out_int (int x)			/* non-negative integers only */
@@ -379,7 +412,11 @@ dump_tree (PROC * current, int level, in
       {
 	for (i = width[lvl] + 1; i; i--)
 	  out_char (' ');
-	out_string (lvl == level - 1 ? last ? sym->last_2 : sym->branch_2 :
+        /*
+         * Replace all three symbol-drawing calls with calls to out_sym()
+         * to handle VT100 line drawing sequences if VT100 mode is active:
+         */
+	out_sym (lvl == level - 1 ? last ? sym->last_2 : sym->branch_2 :
 		    more[lvl + 1] ? sym->vert_2 : sym->empty_2);
       }
   if (rep < 2)
@@ -489,7 +526,7 @@ dump_tree (PROC * current, int level, in
       width[level] = comm_len + cur_x - offset + add;
       if (cur_x >= output_width && trunc)
 	{
-	  out_string (sym->first_3);
+	  out_sym (sym->first_3);
 	  out_string ("+");
 	  out_newline ();
 	}
@@ -516,7 +553,7 @@ dump_tree (PROC * current, int level, in
 		}
 	      if (first)
 		{
-		  out_string (next ? sym->first_3 : sym->single_3);
+		  out_sym (next ? sym->first_3 : sym->single_3);
 		  first = 0;
 		}
 	      dump_tree (walk->child, level + 1, count + 1,