]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/scm-valprint.c
Switch the license of all .c files to GPLv3.
[thirdparty/binutils-gdb.git] / gdb / scm-valprint.c
index 802751f346a2ddb4b8e8d7c34ad3bd23a82e7ca1..735cf8a2701bb86260dbd995dd0279ff9ef2158c 100644 (file)
@@ -1,11 +1,13 @@
 /* Scheme/Guile language support routines for GDB, the GNU debugger.
 /* Scheme/Guile language support routines for GDB, the GNU debugger.
-   Copyright 1995, 2000 Free Software Foundation, Inc.
+
+   Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2005, 2007 Free Software
+   Foundation, Inc.
 
    This file is part of GDB.
 
    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
 
    This file is part of GDB.
 
    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
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -14,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
 
 #include "defs.h"
 #include "symtab.h"
 #include "scm-lang.h"
 #include "valprint.h"
 #include "gdbcore.h"
 #include "scm-lang.h"
 #include "valprint.h"
 #include "gdbcore.h"
-
-/* FIXME: Should be in a header file that we import. */
-extern int c_val_print (struct type *, char *, int, CORE_ADDR,
-                       struct ui_file *, int, int, int,
-                       enum val_prettyprint);
+#include "c-lang.h"
+#include "infcall.h"
 
 static void scm_ipruk (char *, LONGEST, struct ui_file *);
 static void scm_scmlist_print (LONGEST, struct ui_file *, int, int,
 
 static void scm_ipruk (char *, LONGEST, struct ui_file *);
 static void scm_scmlist_print (LONGEST, struct ui_file *, int, int,
@@ -41,19 +38,55 @@ static int scm_inferior_print (LONGEST, struct ui_file *, int, int,
                               int, enum val_prettyprint);
 
 /* Prints the SCM value VALUE by invoking the inferior, if appropraite.
                               int, enum val_prettyprint);
 
 /* Prints the SCM value VALUE by invoking the inferior, if appropraite.
-   Returns >= 0 on succes;  retunr -1 if the inferior cannot/should not
+   Returns >= 0 on success;  return -1 if the inferior cannot/should not
    print VALUE. */
 
 static int
    print VALUE. */
 
 static int
-scm_inferior_print (value, stream, format, deref_ref, recurse, pretty)
-     LONGEST value;
-     struct ui_file *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+scm_inferior_print (LONGEST value, struct ui_file *stream, int format,
+                   int deref_ref, int recurse, enum val_prettyprint pretty)
 {
 {
-  return -1;
+  struct value *func, *arg, *result;
+  struct symbol *gdb_output_sym, *gdb_output_len_sym;
+  char *output;
+  int ret, output_len;
+
+  func = find_function_in_inferior ("gdb_print");
+  arg = value_from_longest (builtin_type_CORE_ADDR, value);
+
+  result = call_function_by_hand (func, 1, &arg);
+  ret = (int) value_as_long (result);
+  if (ret == 0)
+    {
+      /* XXX: Should we cache these symbols?  */
+      gdb_output_sym =
+       lookup_symbol_global ("gdb_output", NULL, NULL,
+                             VAR_DOMAIN,
+                             (struct symtab **) NULL);
+      gdb_output_len_sym =
+       lookup_symbol_global ("gdb_output_length", NULL, NULL,
+                             VAR_DOMAIN,
+                             (struct symtab **) NULL);
+
+      if ((gdb_output_sym == NULL) || (gdb_output_len_sym == NULL))
+       ret = -1;
+      else
+       {
+         struct value *remote_buffer;
+
+         read_memory (SYMBOL_VALUE_ADDRESS (gdb_output_len_sym),
+                      (char *) &output_len, sizeof (output_len));
+
+         output = (char *) alloca (output_len);
+         remote_buffer = value_at (builtin_type_CORE_ADDR,
+                                   SYMBOL_VALUE_ADDRESS (gdb_output_sym));
+         read_memory (value_as_address (remote_buffer),
+                      output, output_len);
+
+         ui_file_write (stream, output, output_len);
+       }
+    }
+
+  return ret;
 }
 
 /* {Names of immediate symbols}
 }
 
 /* {Names of immediate symbols}
@@ -96,13 +129,8 @@ static char *scm_isymnames[] =
 };
 
 static void
 };
 
 static void
-scm_scmlist_print (svalue, stream, format, deref_ref, recurse, pretty)
-     LONGEST svalue;
-     struct ui_file *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+scm_scmlist_print (LONGEST svalue, struct ui_file *stream, int format,
+                  int deref_ref, int recurse, enum val_prettyprint pretty)
 {
   unsigned int more = print_max;
   if (recurse > 6)
 {
   unsigned int more = print_max;
   if (recurse > 6)
@@ -135,10 +163,7 @@ scm_scmlist_print (svalue, stream, format, deref_ref, recurse, pretty)
 }
 
 static void
 }
 
 static void
-scm_ipruk (hdr, ptr, stream)
-     char *hdr;
-     LONGEST ptr;
-     struct ui_file *stream;
+scm_ipruk (char *hdr, LONGEST ptr, struct ui_file *stream)
 {
   fprintf_filtered (stream, "#<unknown-%s", hdr);
 #define SCM_SIZE TYPE_LENGTH (builtin_type_scm)
 {
   fprintf_filtered (stream, "#<unknown-%s", hdr);
 #define SCM_SIZE TYPE_LENGTH (builtin_type_scm)
@@ -149,13 +174,8 @@ scm_ipruk (hdr, ptr, stream)
 }
 
 void
 }
 
 void
-scm_scmval_print (svalue, stream, format, deref_ref, recurse, pretty)
-     LONGEST svalue;
-     struct ui_file *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+scm_scmval_print (LONGEST svalue, struct ui_file *stream, int format,
+                 int deref_ref, int recurse, enum val_prettyprint pretty)
 {
 taloop:
   switch (7 & (int) svalue)
 {
 taloop:
   switch (7 & (int) svalue)
@@ -240,7 +260,7 @@ taloop:
            int i;
            int done = 0;
            int buf_size;
            int i;
            int done = 0;
            int buf_size;
-           char buffer[64];
+           gdb_byte buffer[64];
            int truncate = print_max && len > (int) print_max;
            if (truncate)
              len = print_max;
            int truncate = print_max && len > (int) print_max;
            if (truncate)
              len = print_max;
@@ -268,8 +288,8 @@ taloop:
          {
            int len = SCM_LENGTH (svalue);
 
          {
            int len = SCM_LENGTH (svalue);
 
-           char *str = (char *) alloca (len);
-           read_memory (SCM_CDR (svalue), str, len + 1);
+           char *str = alloca (len);
+           read_memory (SCM_CDR (svalue), (gdb_byte *) str, len + 1);
            /* Should handle weird characters FIXME */
            str[len] = '\0';
            fputs_filtered (str, stream);
            /* Should handle weird characters FIXME */
            str[len] = '\0';
            fputs_filtered (str, stream);
@@ -307,8 +327,9 @@ taloop:
              {
                result
                  = scm_apply (hook,
              {
                result
                  = scm_apply (hook,
-                       scm_listify (exp, port, (writing ? BOOL_T : BOOL_F),
-                                    SCM_UNDEFINED),
+                              scm_listify (exp, port, 
+                                           (writing ? BOOL_T : BOOL_F),
+                                           SCM_UNDEFINED),
                               EOL);
                if (result == BOOL_F)
                  goto punk;
                               EOL);
                if (result == BOOL_F)
                  goto punk;
@@ -355,7 +376,9 @@ taloop:
          break;
        case tc7_port:
          i = PTOBNUM (exp);
          break;
        case tc7_port:
          i = PTOBNUM (exp);
-         if (i < scm_numptob && scm_ptobs[i].print && (scm_ptobs[i].print) (exp, port, writing))
+         if (i < scm_numptob 
+             && scm_ptobs[i].print 
+             && (scm_ptobs[i].print) (exp, port, writing))
            break;
          goto punk;
        case tc7_smob:
            break;
          goto punk;
        case tc7_smob:
@@ -376,21 +399,15 @@ taloop:
 }
 
 int
 }
 
 int
-scm_val_print (type, valaddr, embedded_offset, address,
-              stream, format, deref_ref, recurse, pretty)
-     struct type *type;
-     char *valaddr;
-     int embedded_offset;
-     CORE_ADDR address;
-     struct ui_file *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+scm_val_print (struct type *type, const gdb_byte *valaddr,
+              int embedded_offset, CORE_ADDR address,
+              struct ui_file *stream, int format, int deref_ref,
+              int recurse, enum val_prettyprint pretty)
 {
   if (is_scmvalue_type (type))
     {
       LONGEST svalue = extract_signed_integer (valaddr, TYPE_LENGTH (type));
 {
   if (is_scmvalue_type (type))
     {
       LONGEST svalue = extract_signed_integer (valaddr, TYPE_LENGTH (type));
+
       if (scm_inferior_print (svalue, stream, format,
                              deref_ref, recurse, pretty) >= 0)
        {
       if (scm_inferior_print (svalue, stream, format,
                              deref_ref, recurse, pretty) >= 0)
        {
@@ -412,12 +429,8 @@ scm_val_print (type, valaddr, embedded_offset, address,
 }
 
 int
 }
 
 int
-scm_value_print (val, stream, format, pretty)
-     value_ptr val;
-     struct ui_file *stream;
-     int format;
-     enum val_prettyprint pretty;
+scm_value_print (struct value *val, struct ui_file *stream, int format,
+                enum val_prettyprint pretty)
 {
 {
-  return (val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
-                    VALUE_ADDRESS (val), stream, format, 1, 0, pretty));
+  return (common_val_print (val, stream, format, 1, 0, pretty));
 }
 }