psmisc/psmisc-22.5-pstree.patch

112 lines
3.1 KiB
Diff
Raw Normal View History

--- 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,