gdb/f-typeprint.c - gdb
Functions defined
Source code
- #include "defs.h"
- #include "gdb_obstack.h"
- #include "bfd.h"
- #include "symtab.h"
- #include "gdbtypes.h"
- #include "expression.h"
- #include "value.h"
- #include "gdbcore.h"
- #include "target.h"
- #include "f-lang.h"
- #if 0
- #endif
- static void f_type_print_varspec_suffix (struct type *, struct ui_file *, int,
- int, int, int);
- void f_type_print_varspec_prefix (struct type *, struct ui_file *,
- int, int);
- void f_type_print_base (struct type *, struct ui_file *, int, int);
- void
- f_print_type (struct type *type, const char *varstring, struct ui_file *stream,
- int show, int level, const struct type_print_options *flags)
- {
- enum type_code code;
- int demangled_args;
- f_type_print_base (type, stream, show, level);
- code = TYPE_CODE (type);
- if ((varstring != NULL && *varstring != '\0')
-
- || ((show > 0 || TYPE_NAME (type) == 0)
- && (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
- || code == TYPE_CODE_METHOD
- || code == TYPE_CODE_ARRAY
- || code == TYPE_CODE_REF)))
- fputs_filtered (" ", stream);
- f_type_print_varspec_prefix (type, stream, show, 0);
- if (varstring != NULL)
- {
- fputs_filtered (varstring, stream);
-
- demangled_args = varstring[strlen (varstring) - 1] == ')';
- f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0);
- }
- }
- void
- f_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
- int show, int passed_a_ptr)
- {
- if (type == 0)
- return;
- if (TYPE_NAME (type) && show <= 0)
- return;
- QUIT;
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_PTR:
- f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
- break;
- case TYPE_CODE_FUNC:
- f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
- if (passed_a_ptr)
- fprintf_filtered (stream, "(");
- break;
- case TYPE_CODE_ARRAY:
- f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
- break;
- case TYPE_CODE_UNDEF:
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_INT:
- case TYPE_CODE_FLT:
- case TYPE_CODE_VOID:
- case TYPE_CODE_ERROR:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_SET:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_STRING:
- case TYPE_CODE_METHOD:
- case TYPE_CODE_REF:
- case TYPE_CODE_COMPLEX:
- case TYPE_CODE_TYPEDEF:
-
- break;
- }
- }
- static void
- f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
- int show, int passed_a_ptr, int demangled_args,
- int arrayprint_recurse_level)
- {
- int upper_bound, lower_bound;
-
- if (type == 0)
- return;
- if (TYPE_NAME (type) && show <= 0)
- return;
- QUIT;
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_ARRAY:
- arrayprint_recurse_level++;
- if (arrayprint_recurse_level == 1)
- fprintf_filtered (stream, "(");
- if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY)
- f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0,
- arrayprint_recurse_level);
- lower_bound = f77_get_lowerbound (type);
- if (lower_bound != 1)
- fprintf_filtered (stream, "%d:", lower_bound);
-
- if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
- fprintf_filtered (stream, "*");
- else
- {
- upper_bound = f77_get_upperbound (type);
- fprintf_filtered (stream, "%d", upper_bound);
- }
- if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY)
- f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0,
- arrayprint_recurse_level);
- if (arrayprint_recurse_level == 1)
- fprintf_filtered (stream, ")");
- else
- fprintf_filtered (stream, ",");
- arrayprint_recurse_level--;
- break;
- case TYPE_CODE_PTR:
- case TYPE_CODE_REF:
- f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0,
- arrayprint_recurse_level);
- fprintf_filtered (stream, ")");
- break;
- case TYPE_CODE_FUNC:
- f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
- passed_a_ptr, 0, arrayprint_recurse_level);
- if (passed_a_ptr)
- fprintf_filtered (stream, ")");
- fprintf_filtered (stream, "()");
- break;
- case TYPE_CODE_UNDEF:
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- case TYPE_CODE_ENUM:
- case TYPE_CODE_INT:
- case TYPE_CODE_FLT:
- case TYPE_CODE_VOID:
- case TYPE_CODE_ERROR:
- case TYPE_CODE_CHAR:
- case TYPE_CODE_BOOL:
- case TYPE_CODE_SET:
- case TYPE_CODE_RANGE:
- case TYPE_CODE_STRING:
- case TYPE_CODE_METHOD:
- case TYPE_CODE_COMPLEX:
- case TYPE_CODE_TYPEDEF:
-
- break;
- }
- }
- void
- f_type_print_base (struct type *type, struct ui_file *stream, int show,
- int level)
- {
- int upper_bound;
- int index;
- QUIT;
- wrap_here (" ");
- if (type == NULL)
- {
- fputs_filtered ("<type unknown>", stream);
- return;
- }
-
- if ((show <= 0) && (TYPE_NAME (type) != NULL))
- {
- fputs_filtered (TYPE_NAME (type), stream);
- return;
- }
- if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
- CHECK_TYPEDEF (type);
- switch (TYPE_CODE (type))
- {
- case TYPE_CODE_TYPEDEF:
- f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
- break;
- case TYPE_CODE_ARRAY:
- case TYPE_CODE_FUNC:
- f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
- break;
- case TYPE_CODE_PTR:
- fprintf_filtered (stream, "PTR TO -> ( ");
- f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
- break;
- case TYPE_CODE_REF:
- fprintf_filtered (stream, "REF TO -> ( ");
- f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
- break;
- case TYPE_CODE_VOID:
- fprintfi_filtered (level, stream, "VOID");
- break;
- case TYPE_CODE_UNDEF:
- fprintfi_filtered (level, stream, "struct <unknown>");
- break;
- case TYPE_CODE_ERROR:
- fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type));
- break;
- case TYPE_CODE_RANGE:
-
- fprintfi_filtered (level, stream, "<range type>");
- break;
- case TYPE_CODE_CHAR:
- case TYPE_CODE_INT:
-
- if (strcmp (TYPE_NAME (type), "char") == 0)
- fprintfi_filtered (level, stream, "character");
- else
- goto default_case;
- break;
- case TYPE_CODE_STRING:
-
- if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
- fprintfi_filtered (level, stream, "character*(*)");
- else
- {
- upper_bound = f77_get_upperbound (type);
- fprintf_filtered (stream, "character*%d", upper_bound);
- }
- break;
- case TYPE_CODE_STRUCT:
- case TYPE_CODE_UNION:
- if (TYPE_CODE (type) == TYPE_CODE_UNION)
- fprintfi_filtered (level, stream, "Type, C_Union :: ");
- else
- fprintfi_filtered (level, stream, "Type ");
- fputs_filtered (TYPE_TAG_NAME (type), stream);
- fputs_filtered ("\n", stream);
- for (index = 0; index < TYPE_NFIELDS (type); index++)
- {
- f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show,
- level + 4);
- fputs_filtered (" :: ", stream);
- fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
- f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
- stream, 0, 0, 0, 0);
- fputs_filtered ("\n", stream);
- }
- fprintfi_filtered (level, stream, "End Type ");
- fputs_filtered (TYPE_TAG_NAME (type), stream);
- break;
- case TYPE_CODE_MODULE:
- fprintfi_filtered (level, stream, "module %s", TYPE_TAG_NAME (type));
- break;
- default_case:
- default:
-
- if (TYPE_NAME (type) != NULL)
- fprintfi_filtered (level, stream, "%s", TYPE_NAME (type));
- else
- error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type));
- break;
- }
- }