From 50265402245de3e54551c2b2e6e06885e89c734f Mon Sep 17 00:00:00 2001 From: Stephane Carrez Date: Sun, 1 Sep 2002 10:20:48 +0000 Subject: [PATCH] * tuiStack.c (tui_make_status_line): New function to create the status line. (tuiShowLocatorContent): Use it instead of displayableWinContentAt. * tuiData.h (PROC_PREFIX): Use "In:" to reduce length of prefix. (PC_PREFIX): Use upper case. (SINGLE_KEY, MIN_LINE_WIDTH, MIN_PROC_WIDTH): Define. (MAX_TARGET_WIDTH, MAX_PID_WIDTH): Define. --- gdb/tui/ChangeLog | 10 +++ gdb/tui/tuiData.h | 12 ++- gdb/tui/tuiStack.c | 181 +++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 185 insertions(+), 18 deletions(-) diff --git a/gdb/tui/ChangeLog b/gdb/tui/ChangeLog index d72ddc5c306..9b8e26042c7 100644 --- a/gdb/tui/ChangeLog +++ b/gdb/tui/ChangeLog @@ -1,3 +1,13 @@ +2002-09-01 Stephane Carrez + + * tuiStack.c (tui_make_status_line): New function to create the + status line. + (tuiShowLocatorContent): Use it instead of displayableWinContentAt. + * tuiData.h (PROC_PREFIX): Use "In:" to reduce length of prefix. + (PC_PREFIX): Use upper case. + (SINGLE_KEY, MIN_LINE_WIDTH, MIN_PROC_WIDTH): Define. + (MAX_TARGET_WIDTH, MAX_PID_WIDTH): Define. + 2002-08-31 Stephane Carrez * tuiSourceWin.h (tuiUpdateAllExecInfos): Don't declare. diff --git a/gdb/tui/tuiData.h b/gdb/tui/tuiData.h index 9de5c6fa6ee..0ce7ed208ee 100644 --- a/gdb/tui/tuiData.h +++ b/gdb/tui/tuiData.h @@ -71,10 +71,18 @@ TuiGenWinInfo, *TuiGenWinInfoPtr; #define MIN_WIN_HEIGHT 3 #define MIN_CMD_WIN_HEIGHT 3 +/* Strings to display in the TUI status line. */ #define FILE_PREFIX "File: " -#define PROC_PREFIX "Procedure: " +#define PROC_PREFIX "In: " #define LINE_PREFIX "Line: " -#define PC_PREFIX "pc: " +#define PC_PREFIX "PC: " +#define SINGLE_KEY "(SingleKey)" + +/* Minimum/Maximum length of some fields displayed in the TUI status line. */ +#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line numbers. */ +#define MIN_PROC_WIDTH 12 +#define MAX_TARGET_WIDTH 10 +#define MAX_PID_WIDTH 14 #define TUI_FLOAT_REGS_NAME "$FREGS" #define TUI_FLOAT_REGS_NAME_LOWER "$fregs" diff --git a/gdb/tui/tuiStack.c b/gdb/tui/tuiStack.c index d3f040484c0..10bd259bfdc 100644 --- a/gdb/tui/tuiStack.c +++ b/gdb/tui/tuiStack.c @@ -44,6 +44,8 @@ #include "breakpoint.h" #include "frame.h" #include "command.h" +#include "inferior.h" +#include "target.h" #include "top.h" #include "tui.h" @@ -70,6 +72,154 @@ static void tui_set_locator_info (const char *filename, const char *procname, static void tui_update_command (char *, int); +/* Create the status line to display as much information as we + can on this single line: target name, process number, current + function, current line, current PC, SingleKey mode. */ +static char* +tui_make_status_line (TuiLocatorElement* loc) +{ + char* string; + char line_buf[50], buf[50], *pname; + int status_size = termWidth (); + int i, proc_width; + const char* pid_name; + const char* pc_buf; + int target_width; + int pid_width; + int line_width; + int pc_width; + struct ui_file *pc_out; + + if (ptid_equal (inferior_ptid, null_ptid)) + pid_name = "No process"; + else + pid_name = target_pid_to_str (inferior_ptid); + + target_width = strlen (target_shortname); + if (target_width > MAX_TARGET_WIDTH) + target_width = MAX_TARGET_WIDTH; + + pid_width = strlen (pid_name); + if (pid_width > MAX_PID_WIDTH) + pid_width = MAX_PID_WIDTH; + + string = (char *) xmalloc (status_size + 1); + + /* Translate line number and obtain its size. */ + if (loc->lineNo > 0) + sprintf (line_buf, "%d", loc->lineNo); + else + strcpy (line_buf, "??"); + line_width = strlen (line_buf); + if (line_width < MIN_LINE_WIDTH) + line_width = MIN_LINE_WIDTH; + + /* Translate PC address. */ + pc_out = tui_sfileopen (128); + print_address_numeric (loc->addr, 1, pc_out); + pc_buf = tui_file_get_strbuf (pc_out); + pc_width = strlen (pc_buf); + + /* First determine the amount of proc name width we have available. + The +1 are for a space separator between fields. + The -1 are to take into account the \0 counted by sizeof. */ + proc_width = (status_size + - (target_width + 1) + - (pid_width + 1) + - (sizeof (PROC_PREFIX) - 1 + 1) + - (sizeof (LINE_PREFIX) - 1 + line_width + 1) + - (sizeof (PC_PREFIX) - 1 + pc_width + 1) + - (tui_current_key_mode == tui_single_key_mode + ? (sizeof (SINGLE_KEY) - 1 + 1) + : 0)); + + /* If there is no room to print the function name, try by removing + some fields. */ + if (proc_width < MIN_PROC_WIDTH) + { + proc_width += target_width + 1; + target_width = 0; + if (proc_width < MIN_PROC_WIDTH) + { + proc_width += pid_width + 1; + pid_width = 0; + if (proc_width <= MIN_PROC_WIDTH) + { + proc_width += pc_width + sizeof (PC_PREFIX) - 1 + 1; + pc_width = 0; + if (proc_width < 0) + { + proc_width += line_width + sizeof (LINE_PREFIX) - 1 + 1; + line_width = 0; + if (proc_width < 0) + proc_width = 0; + } + } + } + } + + /* Now convert elements to string form */ + pname = loc->procName; + + /* Now create the locator line from the string version + of the elements. We could use sprintf() here but + that wouldn't ensure that we don't overrun the size + of the allocated buffer. strcat_to_buf() will. */ + *string = (char) 0; + + if (target_width > 0) + { + sprintf (buf, "%*.*s ", + -target_width, target_width, target_shortname); + strcat_to_buf (string, status_size, buf); + } + if (pid_width > 0) + { + sprintf (buf, "%*.*s ", + -pid_width, pid_width, pid_name); + strcat_to_buf (string, status_size, buf); + } + + /* Show whether we are in SingleKey mode. */ + if (tui_current_key_mode == tui_single_key_mode) + { + strcat_to_buf (string, status_size, SINGLE_KEY); + strcat_to_buf (string, status_size, " "); + } + + /* procedure/class name */ + if (proc_width > 0) + { + if (strlen (pname) > proc_width) + sprintf (buf, "%s%*.*s* ", PROC_PREFIX, + 1 - proc_width, proc_width - 1, pname); + else + sprintf (buf, "%s%*.*s ", PROC_PREFIX, + -proc_width, proc_width, pname); + strcat_to_buf (string, status_size, buf); + } + + if (line_width > 0) + { + sprintf (buf, "%s%*.*s ", LINE_PREFIX, + -line_width, line_width, line_buf); + strcat_to_buf (string, status_size, buf); + } + if (pc_width > 0) + { + strcat_to_buf (string, status_size, PC_PREFIX); + strcat_to_buf (string, status_size, pc_buf); + } + + + for (i = strlen (string); i < status_size; i++) + string[i] = ' '; + string[status_size] = (char) 0; + + ui_file_delete (pc_out); + return string; +} + /* Get a printable name for the function at the address. The symbol name is demangled if demangling is turned on. Returns a pointer to a static area holding the result. */ @@ -114,24 +264,23 @@ tuiShowLocatorContent (void) if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL) { - string = displayableWinContentAt (locator, 0); - if (string != (char *) NULL) - { - wmove (locator->handle, 0, 0); - wstandout (locator->handle); - waddstr (locator->handle, string); - wclrtoeol (locator->handle); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - if (string != nullStr ()) - tuiFree (string); - locator->contentInUse = TRUE; - } + TuiWinElementPtr element; + + element = (TuiWinElementPtr) locator->content[0]; + + string = tui_make_status_line (&element->whichElement.locator); + wmove (locator->handle, 0, 0); + wstandout (locator->handle); + waddstr (locator->handle, string); + wclrtoeol (locator->handle); + wstandend (locator->handle); + tuiRefreshWin (locator); + wmove (locator->handle, 0, 0); + xfree (string); + locator->contentInUse = TRUE; } +} - return; -} /* tuiShowLocatorContent */ /* Set the filename portion of the locator. */ static void -- 2.30.2