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;
{
case TYPE_CODE_MEMBER:
case TYPE_CODE_REF:
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_LITERAL_COMPLEX:
- case TYPE_CODE_LITERAL_STRING:
+ 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;
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_METHOD:
case TYPE_CODE_MEMBER:
case TYPE_CODE_COMPLEX:
- case TYPE_CODE_LITERAL_COMPLEX:
- case TYPE_CODE_LITERAL_STRING:
+ 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;
{
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:
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);
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. */
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);