gdb/p-lang.c - gdb
Global variables defined
Data types defined
Functions defined
Source code
- #include "defs.h"
- #include "symtab.h"
- #include "gdbtypes.h"
- #include "expression.h"
- #include "parser-defs.h"
- #include "language.h"
- #include "varobj.h"
- #include "p-lang.h"
- #include "valprint.h"
- #include "value.h"
- #include <ctype.h>
- extern void _initialize_pascal_language (void);
- static const char GPC_P_INITIALIZE[] = "_p_initialize";
- static const char GPC_MAIN_PROGRAM_NAME_1[] = "_p__M0_main_program";
- static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
- const char *
- pascal_main_name (void)
- {
- struct bound_minimal_symbol msym;
- msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL);
-
- if (msym.minsym == NULL)
- return NULL;
- msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL);
- if (msym.minsym != NULL)
- {
- return GPC_MAIN_PROGRAM_NAME_1;
- }
- msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL);
- if (msym.minsym != NULL)
- {
- return GPC_MAIN_PROGRAM_NAME_2;
- }
-
- return NULL;
- }
- FIXME
- int
- is_pascal_string_type (struct type *type,int *length_pos,
- int *length_size, int *string_pos,
- struct type **char_type,
- const char **arrayname)
- {
- if (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT)
- {
-
-
- if (TYPE_NFIELDS (type) == 2
- && TYPE_FIELD_NAME (type, 0)
- && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
- && TYPE_FIELD_NAME (type, 1)
- && strcmp (TYPE_FIELD_NAME (type, 1), "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_type)
- *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1));
- if (arrayname)
- *arrayname = TYPE_FIELD_NAME (type, 1);
- return 2;
- };
-
-
- if (TYPE_NFIELDS (type) == 3
- && TYPE_FIELD_NAME (type, 0)
- && strcmp (TYPE_FIELD_NAME (type, 0), "Capacity") == 0
- && TYPE_FIELD_NAME (type, 1)
- && strcmp (TYPE_FIELD_NAME (type, 1), "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
- if (char_type)
- {
- *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2));
- if (TYPE_CODE (*char_type) == TYPE_CODE_ARRAY)
- *char_type = TYPE_TARGET_TYPE (*char_type);
- }
- if (arrayname)
- *arrayname = TYPE_FIELD_NAME (type, 2);
- return 3;
- };
- }
- return 0;
- }
- static void pascal_one_char (int, struct ui_file *, int *);
- static void
- pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
- {
- if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c))))
- {
- if (!(*in_quotes))
- fputs_filtered ("'", stream);
- *in_quotes = 1;
- if (c == '\'')
- {
- fputs_filtered ("''", stream);
- }
- else
- fprintf_filtered (stream, "%c", c);
- }
- else
- {
- if (*in_quotes)
- fputs_filtered ("'", stream);
- *in_quotes = 0;
- fprintf_filtered (stream, "#%d", (unsigned int) c);
- }
- }
- static void pascal_emit_char (int c, struct type *type,
- struct ui_file *stream, int quoter);
- static void
- pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
- {
- int in_quotes = 0;
- pascal_one_char (c, stream, &in_quotes);
- if (in_quotes)
- fputs_filtered ("'", stream);
- }
- void
- pascal_printchar (int c, struct type *type, struct ui_file *stream)
- {
- int in_quotes = 0;
- pascal_one_char (c, stream, &in_quotes);
- if (in_quotes)
- fputs_filtered ("'", stream);
- }
- void
- pascal_printstr (struct ui_file *stream, struct type *type,
- const gdb_byte *string, unsigned int length,
- const char *encoding, int force_ellipses,
- const struct value_print_options *options)
- {
- enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
- unsigned int i;
- unsigned int things_printed = 0;
- int in_quotes = 0;
- int need_comma = 0;
- int width;
-
- check_typedef (type);
- width = TYPE_LENGTH (type);
-
- if ((!force_ellipses) && length > 0
- && extract_unsigned_integer (string + (length - 1) * width, width,
- byte_order) == 0)
- length--;
- if (length == 0)
- {
- fputs_filtered ("''", stream);
- return;
- }
- for (i = 0; i < length && things_printed < options->print_max; ++i)
- {
-
- unsigned int rep1;
-
- unsigned int reps;
- unsigned long int current_char;
- QUIT;
- if (need_comma)
- {
- fputs_filtered (", ", stream);
- need_comma = 0;
- }
- current_char = extract_unsigned_integer (string + i * width, width,
- byte_order);
- rep1 = i + 1;
- reps = 1;
- while (rep1 < length
- && extract_unsigned_integer (string + rep1 * width, width,
- byte_order) == current_char)
- {
- ++rep1;
- ++reps;
- }
- if (reps > options->repeat_count_threshold)
- {
- if (in_quotes)
- {
- fputs_filtered ("', ", stream);
- in_quotes = 0;
- }
- pascal_printchar (current_char, type, stream);
- fprintf_filtered (stream, " <repeats %u times>", reps);
- i = rep1 - 1;
- things_printed += options->repeat_count_threshold;
- need_comma = 1;
- }
- else
- {
- if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
- {
- fputs_filtered ("'", stream);
- in_quotes = 1;
- }
- pascal_one_char (current_char, stream, &in_quotes);
- ++things_printed;
- }
- }
-
- if (in_quotes)
- fputs_filtered ("'", stream);
- if (force_ellipses || i < length)
- fputs_filtered ("...", stream);
- }
- const struct op_print pascal_op_print_tab[] =
- {
- {",", BINOP_COMMA, PREC_COMMA, 0},
- {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
- {"or", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
- {"xor", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
- {"and", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
- {"=", BINOP_EQUAL, PREC_EQUAL, 0},
- {"<>", BINOP_NOTEQUAL, PREC_EQUAL, 0},
- {"<=", BINOP_LEQ, PREC_ORDER, 0},
- {">=", BINOP_GEQ, PREC_ORDER, 0},
- {">", BINOP_GTR, PREC_ORDER, 0},
- {"<", BINOP_LESS, PREC_ORDER, 0},
- {"shr", BINOP_RSH, PREC_SHIFT, 0},
- {"shl", BINOP_LSH, PREC_SHIFT, 0},
- {"+", BINOP_ADD, PREC_ADD, 0},
- {"-", BINOP_SUB, PREC_ADD, 0},
- {"*", BINOP_MUL, PREC_MUL, 0},
- {"/", BINOP_DIV, PREC_MUL, 0},
- {"div", BINOP_INTDIV, PREC_MUL, 0},
- {"mod", BINOP_REM, PREC_MUL, 0},
- {"@", BINOP_REPEAT, PREC_REPEAT, 0},
- {"-", UNOP_NEG, PREC_PREFIX, 0},
- {"not", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
- {"^", UNOP_IND, PREC_SUFFIX, 1},
- {"@", UNOP_ADDR, PREC_PREFIX, 0},
- {"sizeof", UNOP_SIZEOF, PREC_PREFIX, 0},
- {NULL, 0, 0, 0}
- };
- enum pascal_primitive_types {
- pascal_primitive_type_int,
- pascal_primitive_type_long,
- pascal_primitive_type_short,
- pascal_primitive_type_char,
- pascal_primitive_type_float,
- pascal_primitive_type_double,
- pascal_primitive_type_void,
- pascal_primitive_type_long_long,
- pascal_primitive_type_signed_char,
- pascal_primitive_type_unsigned_char,
- pascal_primitive_type_unsigned_short,
- pascal_primitive_type_unsigned_int,
- pascal_primitive_type_unsigned_long,
- pascal_primitive_type_unsigned_long_long,
- pascal_primitive_type_long_double,
- pascal_primitive_type_complex,
- pascal_primitive_type_double_complex,
- nr_pascal_primitive_types
- };
- static void
- pascal_language_arch_info (struct gdbarch *gdbarch,
- struct language_arch_info *lai)
- {
- const struct builtin_type *builtin = builtin_type (gdbarch);
- lai->string_char_type = builtin->builtin_char;
- lai->primitive_type_vector
- = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_pascal_primitive_types + 1,
- struct type *);
- lai->primitive_type_vector [pascal_primitive_type_int]
- = builtin->builtin_int;
- lai->primitive_type_vector [pascal_primitive_type_long]
- = builtin->builtin_long;
- lai->primitive_type_vector [pascal_primitive_type_short]
- = builtin->builtin_short;
- lai->primitive_type_vector [pascal_primitive_type_char]
- = builtin->builtin_char;
- lai->primitive_type_vector [pascal_primitive_type_float]
- = builtin->builtin_float;
- lai->primitive_type_vector [pascal_primitive_type_double]
- = builtin->builtin_double;
- lai->primitive_type_vector [pascal_primitive_type_void]
- = builtin->builtin_void;
- lai->primitive_type_vector [pascal_primitive_type_long_long]
- = builtin->builtin_long_long;
- lai->primitive_type_vector [pascal_primitive_type_signed_char]
- = builtin->builtin_signed_char;
- lai->primitive_type_vector [pascal_primitive_type_unsigned_char]
- = builtin->builtin_unsigned_char;
- lai->primitive_type_vector [pascal_primitive_type_unsigned_short]
- = builtin->builtin_unsigned_short;
- lai->primitive_type_vector [pascal_primitive_type_unsigned_int]
- = builtin->builtin_unsigned_int;
- lai->primitive_type_vector [pascal_primitive_type_unsigned_long]
- = builtin->builtin_unsigned_long;
- lai->primitive_type_vector [pascal_primitive_type_unsigned_long_long]
- = builtin->builtin_unsigned_long_long;
- lai->primitive_type_vector [pascal_primitive_type_long_double]
- = builtin->builtin_long_double;
- lai->primitive_type_vector [pascal_primitive_type_complex]
- = builtin->builtin_complex;
- lai->primitive_type_vector [pascal_primitive_type_double_complex]
- = builtin->builtin_double_complex;
- lai->bool_type_symbol = "boolean";
- lai->bool_type_default = builtin->builtin_bool;
- }
- const struct language_defn pascal_language_defn =
- {
- "pascal",
- "Pascal",
- language_pascal,
- range_check_on,
- case_sensitive_on,
- array_row_major,
- macro_expansion_no,
- &exp_descriptor_standard,
- pascal_parse,
- pascal_error,
- null_post_parser,
- pascal_printchar,
- pascal_printstr,
- pascal_emit_char,
- pascal_print_type,
- pascal_print_typedef,
- pascal_val_print,
- pascal_value_print,
- default_read_var_value,
- NULL,
- "this",
- basic_lookup_symbol_nonlocal,
- basic_lookup_transparent_type,
- NULL,
- NULL,
- pascal_op_print_tab,
- 1,
- 0,
- default_word_break_characters,
- default_make_symbol_completion_list,
- pascal_language_arch_info,
- default_print_array_index,
- default_pass_by_reference,
- default_get_string,
- NULL,
- iterate_over_symbols,
- &default_varobj_ops,
- NULL,
- NULL,
- LANG_MAGIC
- };
- void
- _initialize_pascal_language (void)
- {
- add_language (&pascal_language_defn);
- }