/* 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.
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 "gdb_string.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "language.h"
#include "p-lang.h"
#include "valprint.h"
-
+#include "value.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,
+ char **arrayname)
+{
+ 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)
+ {
+ if (length_pos)
+ *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
+ if (length_size)
+ *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0));
+ if (string_pos)
+ *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
+ if (char_size)
+ *char_size = 1;
+ if (arrayname)
+ *arrayname = TYPE_FIELDS (type)[1].name;
+ return 2;
+ };
+ /* 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)
+ {
+ if (length_pos)
+ *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
+ if (length_size)
+ *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 1));
+ if (string_pos)
+ *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
+ /* FIXME: how can I detect wide chars in GPC ?? */
+ if (char_size)
+ *char_size = 1;
+ if (arrayname)
+ *arrayname = TYPE_FIELDS (type)[2].name;
+ return 3;
+ };
+ }
+ 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
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 (int c, struct ui_file *stream, int *in_quotes)
{
c &= 0xFF; /* Avoid sign bit follies */
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 (int c, struct ui_file *stream, int quoter)
{
int in_quotes = 0;
pascal_one_char (c, stream, &in_quotes);
}
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);
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 i;
unsigned int things_printed = 0;
int in_quotes = 0;
int need_comma = 0;
- extern int inspect_it;
/* If the string was not truncated due to `set print elements', and
the last byte of it is a null, we don't print that, in traditional C
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;
+ struct type *type = NULL;
switch (typeid)
{
0, "void", objfile);
break;
case FT_CHAR:
- type = init_type (TYPE_CODE_INT,
+ type = init_type (TYPE_CODE_CHAR,
TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0, "char", objfile);
break;
{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,
pascal_builtin_types,
range_check_on,
type_check_on,
+ case_sensitive_on,
+ &exp_descriptor_standard,
pascal_parse,
pascal_error,
- evaluate_subexp_standard,
pascal_printchar, /* Print a character constant */
pascal_printstr, /* Function to print string constant */
pascal_emit_char, /* Print a single char */
pascal_print_type, /* Print a type using appropriate syntax */
pascal_val_print, /* Print a value using appropriate syntax */
pascal_value_print, /* Print a top-level value */
+ NULL, /* Language specific skip_trampoline */
+ value_of_this, /* value_of_this */
+ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
+ NULL, /* Language specific symbol demangler */
{"", "%", "b", ""}, /* Binary format info */
{"0%lo", "0", "o", ""}, /* Octal format info */
{"%ld", "", "d", ""}, /* Decimal format info */
};
void
-_initialize_pascal_language ()
+_initialize_pascal_language (void)
{
add_language (&pascal_language_defn);
}