OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [tui/] [tui-source.c] - Diff between revs 816 and 834

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 834
/* TUI display source window.
/* TUI display source window.
 
 
   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009,
   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009,
   2010 Free Software Foundation, Inc.
   2010 Free Software Foundation, Inc.
 
 
   Contributed by Hewlett-Packard Company.
   Contributed by Hewlett-Packard Company.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include <ctype.h>
#include <ctype.h>
#include "symtab.h"
#include "symtab.h"
#include "frame.h"
#include "frame.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "source.h"
#include "source.h"
#include "symtab.h"
#include "symtab.h"
#include "objfiles.h"
#include "objfiles.h"
 
 
#include "tui/tui.h"
#include "tui/tui.h"
#include "tui/tui-data.h"
#include "tui/tui-data.h"
#include "tui/tui-stack.h"
#include "tui/tui-stack.h"
#include "tui/tui-winsource.h"
#include "tui/tui-winsource.h"
#include "tui/tui-source.h"
#include "tui/tui-source.h"
 
 
#include "gdb_string.h"
#include "gdb_string.h"
#include "gdb_curses.h"
#include "gdb_curses.h"
 
 
/* Function to display source in the source window.  */
/* Function to display source in the source window.  */
enum tui_status
enum tui_status
tui_set_source_content (struct symtab *s,
tui_set_source_content (struct symtab *s,
                        int line_no,
                        int line_no,
                        int noerror)
                        int noerror)
{
{
  enum tui_status ret = TUI_FAILURE;
  enum tui_status ret = TUI_FAILURE;
 
 
  if (s != (struct symtab *) NULL && s->filename != (char *) NULL)
  if (s != (struct symtab *) NULL && s->filename != (char *) NULL)
    {
    {
      FILE *stream;
      FILE *stream;
      int i, desc, c, line_width, nlines;
      int i, desc, c, line_width, nlines;
      char *src_line = 0;
      char *src_line = 0;
 
 
      if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS)
      if ((ret = tui_alloc_source_buffer (TUI_SRC_WIN)) == TUI_SUCCESS)
        {
        {
          line_width = TUI_SRC_WIN->generic.width - 1;
          line_width = TUI_SRC_WIN->generic.width - 1;
          /* Take hilite (window border) into account, when
          /* Take hilite (window border) into account, when
             calculating the number of lines.  */
             calculating the number of lines.  */
          nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no;
          nlines = (line_no + (TUI_SRC_WIN->generic.height - 2)) - line_no;
          desc = open_source_file (s);
          desc = open_source_file (s);
          if (desc < 0)
          if (desc < 0)
            {
            {
              if (!noerror)
              if (!noerror)
                {
                {
                  char *name = alloca (strlen (s->filename) + 100);
                  char *name = alloca (strlen (s->filename) + 100);
                  sprintf (name, "%s:%d", s->filename, line_no);
                  sprintf (name, "%s:%d", s->filename, line_no);
                  print_sys_errmsg (name, errno);
                  print_sys_errmsg (name, errno);
                }
                }
              ret = TUI_FAILURE;
              ret = TUI_FAILURE;
            }
            }
          else
          else
            {
            {
              if (s->line_charpos == 0)
              if (s->line_charpos == 0)
                find_source_lines (s, desc);
                find_source_lines (s, desc);
 
 
              if (line_no < 1 || line_no > s->nlines)
              if (line_no < 1 || line_no > s->nlines)
                {
                {
                  close (desc);
                  close (desc);
                  printf_unfiltered (
                  printf_unfiltered (
                          "Line number %d out of range; %s has %d lines.\n",
                          "Line number %d out of range; %s has %d lines.\n",
                                      line_no, s->filename, s->nlines);
                                      line_no, s->filename, s->nlines);
                }
                }
              else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0)
              else if (lseek (desc, s->line_charpos[line_no - 1], 0) < 0)
                {
                {
                  close (desc);
                  close (desc);
                  perror_with_name (s->filename);
                  perror_with_name (s->filename);
                }
                }
              else
              else
                {
                {
                  int offset, cur_line_no, cur_line, cur_len, threshold;
                  int offset, cur_line_no, cur_line, cur_len, threshold;
                  struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
                  struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
                  struct tui_source_info *src = &TUI_SRC_WIN->detail.source_info;
                  struct tui_source_info *src = &TUI_SRC_WIN->detail.source_info;
 
 
                  if (TUI_SRC_WIN->generic.title)
                  if (TUI_SRC_WIN->generic.title)
                    xfree (TUI_SRC_WIN->generic.title);
                    xfree (TUI_SRC_WIN->generic.title);
                  TUI_SRC_WIN->generic.title = xstrdup (s->filename);
                  TUI_SRC_WIN->generic.title = xstrdup (s->filename);
 
 
                  if (src->filename)
                  if (src->filename)
                    xfree (src->filename);
                    xfree (src->filename);
                  src->filename = xstrdup (s->filename);
                  src->filename = xstrdup (s->filename);
 
 
                  /* Determine the threshold for the length of the
                  /* Determine the threshold for the length of the
                     line and the offset to start the display.  */
                     line and the offset to start the display.  */
                  offset = src->horizontal_offset;
                  offset = src->horizontal_offset;
                  threshold = (line_width - 1) + offset;
                  threshold = (line_width - 1) + offset;
                  stream = fdopen (desc, FOPEN_RT);
                  stream = fdopen (desc, FOPEN_RT);
                  clearerr (stream);
                  clearerr (stream);
                  cur_line = 0;
                  cur_line = 0;
                  src->gdbarch = get_objfile_arch (s->objfile);
                  src->gdbarch = get_objfile_arch (s->objfile);
                  src->start_line_or_addr.loa = LOA_LINE;
                  src->start_line_or_addr.loa = LOA_LINE;
                  cur_line_no = src->start_line_or_addr.u.line_no = line_no;
                  cur_line_no = src->start_line_or_addr.u.line_no = line_no;
                  if (offset > 0)
                  if (offset > 0)
                    src_line = (char *) xmalloc (
                    src_line = (char *) xmalloc (
                                           (threshold + 1) * sizeof (char));
                                           (threshold + 1) * sizeof (char));
                  while (cur_line < nlines)
                  while (cur_line < nlines)
                    {
                    {
                      struct tui_win_element *element = (struct tui_win_element *)
                      struct tui_win_element *element = (struct tui_win_element *)
                      TUI_SRC_WIN->generic.content[cur_line];
                      TUI_SRC_WIN->generic.content[cur_line];
 
 
                      /* Get the first character in the line.  */
                      /* Get the first character in the line.  */
                      c = fgetc (stream);
                      c = fgetc (stream);
 
 
                      if (offset == 0)
                      if (offset == 0)
                        src_line = ((struct tui_win_element *)
                        src_line = ((struct tui_win_element *)
                                   TUI_SRC_WIN->generic.content[
                                   TUI_SRC_WIN->generic.content[
                                        cur_line])->which_element.source.line;
                                        cur_line])->which_element.source.line;
                      /* Init the line with the line number.  */
                      /* Init the line with the line number.  */
                      sprintf (src_line, "%-6d", cur_line_no);
                      sprintf (src_line, "%-6d", cur_line_no);
                      cur_len = strlen (src_line);
                      cur_len = strlen (src_line);
                      i = cur_len -
                      i = cur_len -
                        ((cur_len / tui_default_tab_len ()) * tui_default_tab_len ());
                        ((cur_len / tui_default_tab_len ()) * tui_default_tab_len ());
                      while (i < tui_default_tab_len ())
                      while (i < tui_default_tab_len ())
                        {
                        {
                          src_line[cur_len] = ' ';
                          src_line[cur_len] = ' ';
                          i++;
                          i++;
                          cur_len++;
                          cur_len++;
                        }
                        }
                      src_line[cur_len] = (char) 0;
                      src_line[cur_len] = (char) 0;
 
 
                      /* Set whether element is the execution point
                      /* Set whether element is the execution point
                         and whether there is a break point on it.  */
                         and whether there is a break point on it.  */
                      element->which_element.source.line_or_addr.loa =
                      element->which_element.source.line_or_addr.loa =
                        LOA_LINE;
                        LOA_LINE;
                      element->which_element.source.line_or_addr.u.line_no =
                      element->which_element.source.line_or_addr.u.line_no =
                        cur_line_no;
                        cur_line_no;
                      element->which_element.source.is_exec_point =
                      element->which_element.source.is_exec_point =
                        (strcmp (((struct tui_win_element *)
                        (strcmp (((struct tui_win_element *)
                                  locator->content[0])->which_element.locator.file_name,
                                  locator->content[0])->which_element.locator.file_name,
                                 s->filename) == 0
                                 s->filename) == 0
                         && cur_line_no == ((struct tui_win_element *)
                         && cur_line_no == ((struct tui_win_element *)
                                            locator->content[0])->which_element.locator.line_no);
                                            locator->content[0])->which_element.locator.line_no);
                      if (c != EOF)
                      if (c != EOF)
                        {
                        {
                          i = strlen (src_line) - 1;
                          i = strlen (src_line) - 1;
                          do
                          do
                            {
                            {
                              if ((c != '\n') && (c != '\r')
                              if ((c != '\n') && (c != '\r')
                                  && (++i < threshold))
                                  && (++i < threshold))
                                {
                                {
                                  if (c < 040 && c != '\t')
                                  if (c < 040 && c != '\t')
                                    {
                                    {
                                      src_line[i++] = '^';
                                      src_line[i++] = '^';
                                      src_line[i] = c + 0100;
                                      src_line[i] = c + 0100;
                                    }
                                    }
                                  else if (c == 0177)
                                  else if (c == 0177)
                                    {
                                    {
                                      src_line[i++] = '^';
                                      src_line[i++] = '^';
                                      src_line[i] = '?';
                                      src_line[i] = '?';
                                    }
                                    }
                                  else
                                  else
                                    { /* Store the charcter in the
                                    { /* Store the charcter in the
                                         line buffer.  If it is a tab,
                                         line buffer.  If it is a tab,
                                         then translate to the correct
                                         then translate to the correct
                                         number of chars so we don't
                                         number of chars so we don't
                                         overwrite our buffer.  */
                                         overwrite our buffer.  */
                                      if (c == '\t')
                                      if (c == '\t')
                                        {
                                        {
                                          int j, max_tab_len = tui_default_tab_len ();
                                          int j, max_tab_len = tui_default_tab_len ();
 
 
                                          for (j = i - ((i / max_tab_len) * max_tab_len);
                                          for (j = i - ((i / max_tab_len) * max_tab_len);
                                               j < max_tab_len
                                               j < max_tab_len
                                                 && i < threshold;
                                                 && i < threshold;
                                               i++, j++)
                                               i++, j++)
                                            src_line[i] = ' ';
                                            src_line[i] = ' ';
                                          i--;
                                          i--;
                                        }
                                        }
                                      else
                                      else
                                        src_line[i] = c;
                                        src_line[i] = c;
                                    }
                                    }
                                  src_line[i + 1] = 0;
                                  src_line[i + 1] = 0;
                                }
                                }
                              else
                              else
                                { /* If we have not reached EOL, then
                                { /* If we have not reached EOL, then
                                     eat chars until we do.  */
                                     eat chars until we do.  */
                                  while (c != EOF && c != '\n' && c != '\r')
                                  while (c != EOF && c != '\n' && c != '\r')
                                    c = fgetc (stream);
                                    c = fgetc (stream);
                                  /* Handle non-'\n' end-of-line.  */
                                  /* Handle non-'\n' end-of-line.  */
                                  if (c == '\r'
                                  if (c == '\r'
                                      && (c = fgetc (stream)) != '\n'
                                      && (c = fgetc (stream)) != '\n'
                                      && c != EOF)
                                      && c != EOF)
                                    {
                                    {
                                       ungetc (c, stream);
                                       ungetc (c, stream);
                                       c = '\r';
                                       c = '\r';
                                    }
                                    }
 
 
                                }
                                }
                            }
                            }
                          while (c != EOF && c != '\n' && c != '\r'
                          while (c != EOF && c != '\n' && c != '\r'
                                 && i < threshold
                                 && i < threshold
                                 && (c = fgetc (stream)));
                                 && (c = fgetc (stream)));
                        }
                        }
                      /* Now copy the line taking the offset into
                      /* Now copy the line taking the offset into
                         account.  */
                         account.  */
                      if (strlen (src_line) > offset)
                      if (strlen (src_line) > offset)
                        strcpy (((struct tui_win_element *) TUI_SRC_WIN->generic.content[
                        strcpy (((struct tui_win_element *) TUI_SRC_WIN->generic.content[
                                        cur_line])->which_element.source.line,
                                        cur_line])->which_element.source.line,
                                &src_line[offset]);
                                &src_line[offset]);
                      else
                      else
                        ((struct tui_win_element *)
                        ((struct tui_win_element *)
                         TUI_SRC_WIN->generic.content[
                         TUI_SRC_WIN->generic.content[
                          cur_line])->which_element.source.line[0] = (char) 0;
                          cur_line])->which_element.source.line[0] = (char) 0;
                      cur_line++;
                      cur_line++;
                      cur_line_no++;
                      cur_line_no++;
                    }
                    }
                  if (offset > 0)
                  if (offset > 0)
                    xfree (src_line);
                    xfree (src_line);
                  fclose (stream);
                  fclose (stream);
                  TUI_SRC_WIN->generic.content_size = nlines;
                  TUI_SRC_WIN->generic.content_size = nlines;
                  ret = TUI_SUCCESS;
                  ret = TUI_SUCCESS;
                }
                }
            }
            }
        }
        }
    }
    }
  return ret;
  return ret;
}
}
 
 
 
 
/* elz: This function sets the contents of the source window to empty
/* elz: This function sets the contents of the source window to empty
   except for a line in the middle with a warning message about the
   except for a line in the middle with a warning message about the
   source not being available.  This function is called by
   source not being available.  This function is called by
   tui_erase_source_contents(), which in turn is invoked when the
   tui_erase_source_contents(), which in turn is invoked when the
   source files cannot be accessed.  */
   source files cannot be accessed.  */
 
 
void
void
tui_set_source_content_nil (struct tui_win_info *win_info,
tui_set_source_content_nil (struct tui_win_info *win_info,
                            char *warning_string)
                            char *warning_string)
{
{
  int line_width;
  int line_width;
  int n_lines;
  int n_lines;
  int curr_line = 0;
  int curr_line = 0;
 
 
  line_width = win_info->generic.width - 1;
  line_width = win_info->generic.width - 1;
  n_lines = win_info->generic.height - 2;
  n_lines = win_info->generic.height - 2;
 
 
  /* Set to empty each line in the window, except for the one which
  /* Set to empty each line in the window, except for the one which
     contains the message.  */
     contains the message.  */
  while (curr_line < win_info->generic.content_size)
  while (curr_line < win_info->generic.content_size)
    {
    {
      /* Set the information related to each displayed line to null:
      /* Set the information related to each displayed line to null:
         i.e. the line number is 0, there is no bp, it is not where
         i.e. the line number is 0, there is no bp, it is not where
         the program is stopped.  */
         the program is stopped.  */
 
 
      struct tui_win_element *element =
      struct tui_win_element *element =
        (struct tui_win_element *) win_info->generic.content[curr_line];
        (struct tui_win_element *) win_info->generic.content[curr_line];
      element->which_element.source.line_or_addr.loa = LOA_LINE;
      element->which_element.source.line_or_addr.loa = LOA_LINE;
      element->which_element.source.line_or_addr.u.line_no = 0;
      element->which_element.source.line_or_addr.u.line_no = 0;
      element->which_element.source.is_exec_point = FALSE;
      element->which_element.source.is_exec_point = FALSE;
      element->which_element.source.has_break = FALSE;
      element->which_element.source.has_break = FALSE;
 
 
      /* Set the contents of the line to blank.  */
      /* Set the contents of the line to blank.  */
      element->which_element.source.line[0] = (char) 0;
      element->which_element.source.line[0] = (char) 0;
 
 
      /* If the current line is in the middle of the screen, then we
      /* If the current line is in the middle of the screen, then we
         want to display the 'no source available' message in it.
         want to display the 'no source available' message in it.
         Note: the 'weird' arithmetic with the line width and height
         Note: the 'weird' arithmetic with the line width and height
         comes from the function tui_erase_source_content().  We need
         comes from the function tui_erase_source_content().  We need
         to keep the screen and the window's actual contents in
         to keep the screen and the window's actual contents in
         synch.  */
         synch.  */
 
 
      if (curr_line == (n_lines / 2 + 1))
      if (curr_line == (n_lines / 2 + 1))
        {
        {
          int i;
          int i;
          int xpos;
          int xpos;
          int warning_length = strlen (warning_string);
          int warning_length = strlen (warning_string);
          char *src_line;
          char *src_line;
 
 
          src_line = element->which_element.source.line;
          src_line = element->which_element.source.line;
 
 
          if (warning_length >= ((line_width - 1) / 2))
          if (warning_length >= ((line_width - 1) / 2))
            xpos = 1;
            xpos = 1;
          else
          else
            xpos = (line_width - 1) / 2 - warning_length;
            xpos = (line_width - 1) / 2 - warning_length;
 
 
          for (i = 0; i < xpos; i++)
          for (i = 0; i < xpos; i++)
            src_line[i] = ' ';
            src_line[i] = ' ';
 
 
          sprintf (src_line + i, "%s", warning_string);
          sprintf (src_line + i, "%s", warning_string);
 
 
          for (i = xpos + warning_length; i < line_width; i++)
          for (i = xpos + warning_length; i < line_width; i++)
            src_line[i] = ' ';
            src_line[i] = ' ';
 
 
          src_line[i] = '\n';
          src_line[i] = '\n';
 
 
        }                       /* end if */
        }                       /* end if */
 
 
      curr_line++;
      curr_line++;
 
 
    }                           /* end while */
    }                           /* end while */
}
}
 
 
 
 
/* Function to display source in the source window.  This function
/* Function to display source in the source window.  This function
   initializes the horizontal scroll to 0.  */
   initializes the horizontal scroll to 0.  */
void
void
tui_show_symtab_source (struct gdbarch *gdbarch, struct symtab *s,
tui_show_symtab_source (struct gdbarch *gdbarch, struct symtab *s,
                        struct tui_line_or_address line,
                        struct tui_line_or_address line,
                        int noerror)
                        int noerror)
{
{
  TUI_SRC_WIN->detail.source_info.horizontal_offset = 0;
  TUI_SRC_WIN->detail.source_info.horizontal_offset = 0;
  tui_update_source_window_as_is (TUI_SRC_WIN, gdbarch, s, line, noerror);
  tui_update_source_window_as_is (TUI_SRC_WIN, gdbarch, s, line, noerror);
}
}
 
 
 
 
/* Answer whether the source is currently displayed in the source
/* Answer whether the source is currently displayed in the source
   window.  */
   window.  */
int
int
tui_source_is_displayed (char *fname)
tui_source_is_displayed (char *fname)
{
{
  return (TUI_SRC_WIN->generic.content_in_use
  return (TUI_SRC_WIN->generic.content_in_use
          && (strcmp (((struct tui_win_element *) (tui_locator_win_info_ptr ())->
          && (strcmp (((struct tui_win_element *) (tui_locator_win_info_ptr ())->
                       content[0])->which_element.locator.file_name, fname) == 0));
                       content[0])->which_element.locator.file_name, fname) == 0));
}
}
 
 
 
 
/* Scroll the source forward or backward vertically.  */
/* Scroll the source forward or backward vertically.  */
void
void
tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction,
tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction,
                            int num_to_scroll)
                            int num_to_scroll)
{
{
  if (TUI_SRC_WIN->generic.content != NULL)
  if (TUI_SRC_WIN->generic.content != NULL)
    {
    {
      struct tui_line_or_address l;
      struct tui_line_or_address l;
      struct symtab *s;
      struct symtab *s;
      tui_win_content content = (tui_win_content) TUI_SRC_WIN->generic.content;
      tui_win_content content = (tui_win_content) TUI_SRC_WIN->generic.content;
      struct symtab_and_line cursal = get_current_source_symtab_and_line ();
      struct symtab_and_line cursal = get_current_source_symtab_and_line ();
 
 
      if (cursal.symtab == (struct symtab *) NULL)
      if (cursal.symtab == (struct symtab *) NULL)
        s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
        s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
      else
      else
        s = cursal.symtab;
        s = cursal.symtab;
 
 
      l.loa = LOA_LINE;
      l.loa = LOA_LINE;
      if (scroll_direction == FORWARD_SCROLL)
      if (scroll_direction == FORWARD_SCROLL)
        {
        {
          l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no
          l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no
            + num_to_scroll;
            + num_to_scroll;
          if (l.u.line_no > s->nlines)
          if (l.u.line_no > s->nlines)
            /* line = s->nlines - win_info->generic.content_size + 1; */
            /* line = s->nlines - win_info->generic.content_size + 1; */
            /* elz: fix for dts 23398.  */
            /* elz: fix for dts 23398.  */
            l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no;
            l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no;
        }
        }
      else
      else
        {
        {
          l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no
          l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no
            - num_to_scroll;
            - num_to_scroll;
          if (l.u.line_no <= 0)
          if (l.u.line_no <= 0)
            l.u.line_no = 1;
            l.u.line_no = 1;
        }
        }
 
 
      print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0);
      print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0);
    }
    }
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.