* alpha-opc.c (alpha_opcodes): Fix thinko in ret pseudo
[deliverable/binutils-gdb.git] / gdb / p-lang.c
index db33eb787b7dd9cf64d7f06504779188e6a3899e..62c8a641a7c82b5f8e333dfbd0a698f858209217 100644 (file)
@@ -1,5 +1,5 @@
 /* Pascal language support routines for GDB, the GNU debugger.
-   Copyright 2000 Free Software Foundation, Inc.
+   Copyright 2000, 2002 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -17,7 +17,7 @@
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-/* This file is derived from p-lang.c */
+/* This file is derived from c-lang.c */
 
 #include "defs.h"
 #include "symtab.h"
 #include "language.h"
 #include "p-lang.h"
 #include "valprint.h"
-
+#include <ctype.h>
 extern void _initialize_pascal_language (void);
+
+
+/* Determines if type TYPE is a pascal string type.
+   Returns 1 if the type is a known pascal type
+   This function is used by p-valprint.c code to allow better string display.
+   If it is a pascal string type, then it also sets info needed
+   to get the length and the data of the string
+   length_pos, length_size and string_pos are given in bytes.
+   char_size gives the element size in bytes.
+   FIXME: if the position or the size of these fields
+   are not multiple of TARGET_CHAR_BIT then the results are wrong
+   but this does not happen for Free Pascal nor for GPC.  */
+int
+is_pascal_string_type (struct type *type,int *length_pos,
+                       int * length_size, int *string_pos, int *char_size)
+{
+  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
+    {
+      /* Old Borland type pascal strings from Free Pascal Compiler.  */
+      /* Two fields: length and st.  */
+      if (TYPE_NFIELDS (type) == 2 
+          && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0 
+          && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
+        {
+          *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
+          *length_size = TYPE_FIELD_TYPE (type, 0)->length;
+          *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
+          *char_size = 1;
+          return 1;
+        };
+      /* GNU pascal strings.  */
+      /* Three fields: Capacity, length and schema$ or _p_schema.  */
+      if (TYPE_NFIELDS (type) == 3
+          && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
+          && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
+        {
+          *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
+          *length_size = TYPE_FIELD_TYPE (type, 1)->length;
+          *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
+          /* FIXME: how can I detect wide chars in GPC ?? */
+          *char_size = 1;
+          return 1;
+        };
+    }
+  return 0;
+}
+
 static void pascal_one_char (int, struct ui_file *, int *);
 
 /* Print the character C on STREAM as part of the contents of a literal
@@ -36,10 +84,7 @@ static void pascal_one_char (int, struct ui_file *, int *);
    In_quotes is reset to 0 if a char is written with #4 notation */
 
 static void
-pascal_one_char (c, stream, in_quotes)
-     register int c;
-     struct ui_file *stream;
-     int *in_quotes;
+pascal_one_char (register int c, struct ui_file *stream, int *in_quotes)
 {
 
   c &= 0xFF;                   /* Avoid sign bit follies */
@@ -72,10 +117,7 @@ static void pascal_emit_char (int c, struct ui_file *stream, int quoter);
    characters and strings is language specific. */
 
 static void
-pascal_emit_char (c, stream, quoter)
-     register int c;
-     struct ui_file *stream;
-     int quoter;
+pascal_emit_char (register int c, struct ui_file *stream, int quoter)
 {
   int in_quotes = 0;
   pascal_one_char (c, stream, &in_quotes);
@@ -84,9 +126,7 @@ pascal_emit_char (c, stream, quoter)
 }
 
 void
-pascal_printchar (c, stream)
-     int c;
-     struct ui_file *stream;
+pascal_printchar (int c, struct ui_file *stream)
 {
   int in_quotes = 0;
   pascal_one_char (c, stream, &in_quotes);
@@ -100,12 +140,8 @@ pascal_printchar (c, stream)
    had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.  */
 
 void
-pascal_printstr (stream, string, length, width, force_ellipses)
-     struct ui_file *stream;
-     char *string;
-     unsigned int length;
-     int width;
-     int force_ellipses;
+pascal_printstr (struct ui_file *stream, char *string, unsigned int length,
+                int width, int force_ellipses)
 {
   register unsigned int i;
   unsigned int things_printed = 0;
@@ -222,9 +258,7 @@ pascal_printstr (stream, string, length, width, force_ellipses)
 
 
 struct type *
-pascal_create_fundamental_type (objfile, typeid)
-     struct objfile *objfile;
-     int typeid;
+pascal_create_fundamental_type (struct objfile *objfile, int typeid)
 {
   register struct type *type = NULL;
 
@@ -373,7 +407,7 @@ const struct op_print pascal_op_print_tab[] =
   {NULL, 0, 0, 0}
 };
 \f
-struct type **const /* CONST_PTR v 4.17 */ (pascal_builtin_types[]) =
+struct type **const (pascal_builtin_types[]) =
 {
   &builtin_type_int,
     &builtin_type_long,
@@ -402,6 +436,7 @@ const struct language_defn pascal_language_defn =
   pascal_builtin_types,
   range_check_on,
   type_check_on,
+  case_sensitive_on,
   pascal_parse,
   pascal_error,
   evaluate_subexp_standard,
@@ -424,7 +459,7 @@ const struct language_defn pascal_language_defn =
 };
 
 void
-_initialize_pascal_language ()
+_initialize_pascal_language (void)
 {
   add_language (&pascal_language_defn);
 }
This page took 0.02585 seconds and 4 git commands to generate.