/* Support for printing Fortran types for GDB, the GNU debugger.
- Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
+ Copyright 1986, 1988, 1989, 1991, 1993, 1994 Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C version by Farooq Butt
(fmbutt@engage.sps.mot.com).
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "defs.h"
#include "obstack.h"
#include "typeprint.h"
#include "frame.h" /* ??? */
-#include <string.h>
+#include "gdb_string.h"
#include <errno.h>
-static void f_type_print_args PARAMS ((struct type *, FILE *));
+#if 0 /* Currently unused */
+static void f_type_print_args PARAMS ((struct type *, GDB_FILE *));
+#endif
-static void f_type_print_varspec_suffix PARAMS ((struct type *, FILE *,
+static void print_equivalent_f77_float_type PARAMS ((struct type *,
+ GDB_FILE *));
+
+static void f_type_print_varspec_suffix PARAMS ((struct type *, GDB_FILE *,
int, int, int));
-void f_type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int));
+void f_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *,
+ int, int));
-void f_type_print_base PARAMS ((struct type *, FILE *, int, int));
+void f_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
\f
/* LEVEL is the depth to indent lines by. */
f_print_type (type, varstring, stream, show, level)
struct type *type;
char *varstring;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int level;
{
void
f_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int passed_a_ptr;
{
- char *name;
if (type == 0)
return;
case TYPE_CODE_SET:
case TYPE_CODE_RANGE:
case TYPE_CODE_STRING:
+ case TYPE_CODE_BITSTRING:
+ case TYPE_CODE_METHOD:
+ case TYPE_CODE_MEMBER:
+ case TYPE_CODE_REF:
+ case TYPE_CODE_COMPLEX:
+ case TYPE_CODE_TYPEDEF:
/* These types need no prefix. They are listed here so that
gcc -Wall will reveal any types that haven't been handled. */
break;
}
}
+#if 0 /* Currently unused */
+
static void
f_type_print_args (type, stream)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
{
int i;
struct type **args;
fprintf_filtered (stream, ")");
}
+#endif /* 0 */
+
/* Print any array sizes, function arguments or close parentheses
needed after the variable name (to describe its type).
Args work like c_type_print_varspec_prefix. */
static void
f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int passed_a_ptr;
int demangled_args;
{
- CORE_ADDR current_frame_addr = 0;
- int upper_bound,lower_bound;
+ int upper_bound, lower_bound;
int lower_bound_was_default = 0;
static int arrayprint_recurse_level = 0;
int retcode;
if (arrayprint_recurse_level == 1)
fprintf_filtered(stream,"(");
- else
- 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);
retcode = f77_get_dynamic_lowerbound (type,&lower_bound);
fprintf_filtered(stream,"%d",upper_bound);
}
- f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
+ if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY)
+ f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
if (arrayprint_recurse_level == 1)
fprintf_filtered (stream, ")");
+ else
+ fprintf_filtered(stream,",");
arrayprint_recurse_level--;
break;
case TYPE_CODE_BOOL:
case TYPE_CODE_SET:
case TYPE_CODE_RANGE:
- case TYPE_CODE_LITERAL_STRING:
case TYPE_CODE_STRING:
+ case TYPE_CODE_BITSTRING:
+ case TYPE_CODE_METHOD:
+ case TYPE_CODE_MEMBER:
+ case TYPE_CODE_COMPLEX:
+ case TYPE_CODE_TYPEDEF:
/* These types do not need a suffix. They are listed so that
gcc -Wall will report types that may not have been considered. */
break;
}
}
-
-void
+static void
print_equivalent_f77_float_type (type, stream)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
{
/* Override type name "float" and make it the
appropriate real. XLC stupidly outputs -12 as a type
for real when it really should be outputting -18 */
- switch (TYPE_LENGTH (type))
- {
- case 4:
- fprintf_filtered (stream, "real*4");
- break;
-
- case 8:
- fprintf_filtered(stream,"real*8");
- break;
- }
+ fprintf_filtered (stream, "real*%d", TYPE_LENGTH (type));
}
/* Print the name of the type (or the ultimate pointer target,
void
f_type_print_base (type, stream, show, level)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int level;
{
- char *name;
- register int i;
- register int len;
- register int lastval;
- char *mangled_name;
- char *demangled_name;
- enum {s_none, s_public, s_private, s_protected} section_type;
- int retcode,upper_bound;
+ int retcode;
+ int upper_bound;
+
QUIT;
wrap_here (" ");
if ((show <= 0) && (TYPE_NAME (type) != NULL))
{
- /* Damn builtin types on RS6000! They call a float "float"
- so we gotta translate to appropriate F77'isms */
-
if (TYPE_CODE (type) == TYPE_CODE_FLT)
print_equivalent_f77_float_type (type, stream);
else
return;
}
+ if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
+ CHECK_TYPEDEF (type);
+
switch (TYPE_CODE (type))
{
- case TYPE_CODE_ARRAY:
- f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+ 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, show, level);
+ f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
break;
case TYPE_CODE_VOID:
through as TYPE_CODE_INT since dbxstclass.h is so
C-oriented, we must change these to "character" from "char". */
- if (STREQ(TYPE_NAME(type),"char"))
- fprintf_filtered (stream,"character");
+ if (STREQ (TYPE_NAME (type), "char"))
+ fprintf_filtered (stream, "character");
else
goto default_case;
break;
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_LITERAL_COMPLEX:
- fprintf_filtered (stream,"complex*");
- fprintf_filtered (stream,"%d",TYPE_LENGTH(type));
+ fprintf_filtered (stream, "complex*%d", TYPE_LENGTH (type));
break;
case TYPE_CODE_FLT:
- print_equivalent_f77_float_type(type,stream);
+ print_equivalent_f77_float_type (type, stream);
break;
- case TYPE_CODE_LITERAL_STRING:
- fprintf_filtered (stream, "character*%d",
- TYPE_ARRAY_UPPER_BOUND_VALUE (type));
- break;
-
case TYPE_CODE_STRING:
- /* Strings may have dynamic upperbounds (lengths) like arrays */
+ /* Strings may have dynamic upperbounds (lengths) like arrays. */
if (TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED)
- fprintf_filtered("character*(*)");
+ fprintf_filtered (stream, "character*(*)");
else
{
- retcode = f77_get_dynamic_upperbound(type,&upper_bound);
+ retcode = f77_get_dynamic_upperbound (type, &upper_bound);
if (retcode == BOUND_FETCH_ERROR)
- fprintf_filtered(stream,"character*???");
+ fprintf_filtered (stream, "character*???");
else
- fprintf_filtered(stream,"character*%d",upper_bound);
+ fprintf_filtered (stream, "character*%d", upper_bound);
}
break;