]> Git Repo - binutils.git/blob - gdb/valprint.c
gdb-2.5.2
[binutils.git] / gdb / valprint.c
1 /* Print values for GNU debugger gdb.
2    Copyright (C) 1986 Free Software Foundation, Inc.
3
4 GDB is distributed in the hope that it will be useful, but WITHOUT ANY
5 WARRANTY.  No author or distributor accepts responsibility to anyone
6 for the consequences of using it or for whether it serves any
7 particular purpose or works at all, unless he says so in writing.
8 Refer to the GDB General Public License for full details.
9
10 Everyone is granted permission to copy, modify and redistribute GDB,
11 but only under the conditions described in the GDB General Public
12 License.  A copy of this license is supposed to have been given to you
13 along with GDB so you can know your rights and responsibilities.  It
14 should be in a file named COPYING.  Among other things, the copyright
15 notice and this notice must be preserved on all copies.
16
17 In other words, go ahead and share GDB, but don't try to stop
18 anyone else from sharing it farther.  Help stamp out software hoarding!
19 */
20
21 #include <stdio.h>
22 #include "defs.h"
23 #include "initialize.h"
24 #include "symtab.h"
25 #include "value.h"
26
27 /* Maximum number of chars to print for a string pointer value
28    or vector contents.  */
29
30 static int print_max;
31
32 static void type_print_varspec_suffix ();
33 static void type_print_varspec_prefix ();
34 static void type_print_base ();
35 static void type_print_method_args ();
36
37 START_FILE
38
39 char **unsigned_type_table;
40 char **signed_type_table;
41 char **float_type_table;
42 \f
43 /* Print the value VAL in C-ish syntax on stream STREAM.
44    If the object printed is a string pointer, returns
45    the number of string bytes printed.  */
46
47 value_print (val, stream)
48      value val;
49      FILE *stream;
50 {
51   register int i, n, typelen;
52
53   /* A "repeated" value really contains several values in a row.
54      They are made by the @ operator.
55      Print such values as if they were arrays.  */
56
57   if (VALUE_REPEATED (val))
58     {
59       n = VALUE_REPETITIONS (val);
60       typelen = TYPE_LENGTH (VALUE_TYPE (val));
61       fputc ('{', stream);
62       /* Print arrays of characters using string syntax.  */
63       if (VALUE_TYPE (val) == builtin_type_char
64           || VALUE_TYPE (val) == builtin_type_unsigned_char)
65         {
66           fputc ('"', stream);
67           for (i = 0; i < n && i < print_max; i++)
68             {
69               QUIT;
70               printchar (VALUE_CONTENTS (val)[i], stream);
71             }
72           if (i < n)
73             fprintf (stream, "...");
74           fputc ('"', stream);
75         }
76       else
77         {
78           for (i = 0; i < n && i < print_max; i++)
79             {
80               if (i)
81                 fprintf (stream, ", ");
82               val_print (VALUE_TYPE (val), VALUE_CONTENTS (val) + typelen * i,
83                          VALUE_ADDRESS (val) + typelen * i, stream);
84             }
85           if (i < n)
86             fprintf (stream, "...");
87         }
88       fputc ('}', stream);
89     }
90   else
91     {
92       /* If it is a pointer, indicate what it points to.
93
94          C++: if it is a member pointer, we will take care
95          of that when we print it.  */
96       if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_PTR)
97         {
98           fprintf (stream, "(");
99           type_print (VALUE_TYPE (val), "", stream, -1);
100           fprintf (stream, ") ");
101         }
102       return val_print (VALUE_TYPE (val), VALUE_CONTENTS (val),
103                         VALUE_ADDRESS (val), stream);
104     }
105 }
106 \f
107 /* Print on STREAM data stored in debugger at address VALADDR
108    according to the format of type TYPE.
109    ADDRESS is the location in the inferior that the data
110    is supposed to have come from.
111
112    If the data are a string pointer, returns the number of
113    sting characters printed.  */
114
115 int
116 val_print (type, valaddr, address, stream)
117      struct type *type;
118      char *valaddr;
119      CORE_ADDR address;
120      FILE *stream;
121 {
122   register int i;
123   int len;
124   struct type *elttype;
125   int eltlen;
126   int val;
127   unsigned char c;
128
129   QUIT;
130
131   switch (TYPE_CODE (type))
132     {
133     case TYPE_CODE_ARRAY:
134       if (TYPE_LENGTH (type) >= 0)
135         {
136           elttype = TYPE_TARGET_TYPE (type);
137           eltlen = TYPE_LENGTH (elttype);
138           len = TYPE_LENGTH (type) / eltlen;
139           fprintf (stream, "{");
140           /* For an array of chars, print with string syntax.  */
141           if (elttype == builtin_type_char
142               || elttype == builtin_type_unsigned_char)
143             {
144               fputc ('"', stream);
145               for (i = 0; i < len && i < print_max; i++)
146                 {
147                   QUIT;
148                   printchar (valaddr[i], stream);
149                 }
150               if (i < len)
151                 fprintf (stream, "...");
152               fputc ('"', stream);
153             }
154           else
155             {
156               for (i = 0; i < len && i < print_max; i++)
157                 {
158                   if (i) fprintf (stream, ", ");
159                   val_print (elttype, valaddr + i * eltlen,
160                              0, stream);
161                 }
162               if (i < len)
163                 fprintf (stream, "...");
164             }
165           fprintf (stream, "}");
166           break;
167         }
168       /* Array of unspecified length: treat like pointer.  */
169
170     case TYPE_CODE_PTR:
171       if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_MEMBER)
172         {
173           struct type *domain = TYPE_DOMAIN_TYPE (TYPE_TARGET_TYPE (type));
174           struct type *target = TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type));
175           struct fn_field *f;
176           int j, len2;
177           char *kind = "";
178
179           val = unpack_long (builtin_type_int, valaddr);
180           if (TYPE_CODE (target) == TYPE_CODE_FUNC)
181             {
182               if (val < 128)
183                 {
184                   len = TYPE_NFN_FIELDS (domain);
185                   for (i = 0; i < len; i++)
186                     {
187                       f = TYPE_FN_FIELDLIST1 (domain, i);
188                       len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
189
190                       for (j = 0; j < len2; j++)
191                         {
192                           QUIT;
193                           if (TYPE_FN_FIELD_VOFFSET (f, j) == val)
194                             {
195                               kind = "virtual";
196                               goto common;
197                             }
198                         }
199                     }
200                 }
201               else
202                 {
203                   struct symbol *sym = find_pc_function (val);
204                   if (sym == 0)
205                     error ("invalid pointer to member function");
206                   len = TYPE_NFN_FIELDS (domain);
207                   for (i = 0; i < len; i++)
208                     {
209                       f = TYPE_FN_FIELDLIST1 (domain, i);
210                       len2 = TYPE_FN_FIELDLIST_LENGTH (domain, i);
211
212                       for (j = 0; j < len2; j++)
213                         {
214                           QUIT;
215                           if (!strcmp (SYMBOL_NAME (sym), TYPE_FN_FIELD_PHYSNAME (f, j)))
216                             goto common;
217                         }
218                     }
219                 }
220             common:
221               if (i < len)
222                 {
223                   fprintf (stream, "& ");
224                   type_print_varspec_prefix (TYPE_FN_FIELD_TYPE (f, j), stream, 0, 0);
225                   fprintf (stream, kind);
226                   if (TYPE_FN_FIELD_PHYSNAME (f, j)[0] == '_'
227                       && TYPE_FN_FIELD_PHYSNAME (f, j)[1] == '$')
228                     type_print_method_args
229                       (TYPE_FN_FIELD_ARGS (f, j) + 1, "~",
230                        TYPE_FN_FIELDLIST_NAME (domain, i), stream);
231                   else
232                     type_print_method_args
233                       (TYPE_FN_FIELD_ARGS (f, j), "",
234                        TYPE_FN_FIELDLIST_NAME (domain, i), stream);
235                   break;
236                 }
237             }
238           else
239             {
240               /* VAL is a byte offset into the structure type DOMAIN.
241                  Find the name of the field for that offset and
242                  print it.  */
243               int extra = 0;
244               int bits = 0;
245               len = TYPE_NFIELDS (domain);
246               val <<= 3;        /* @@ Make VAL into bit offset */
247               for (i = 0; i < len; i++)
248                 {
249                   int bitpos = TYPE_FIELD_BITPOS (domain, i);
250                   QUIT;
251                   if (val == bitpos)
252                     break;
253                   if (val < bitpos && i > 0)
254                     {
255                       int ptrsize = (TYPE_LENGTH (builtin_type_char) * TYPE_LENGTH (target));
256                       /* Somehow pointing into a field.  */
257                       i -= 1;
258                       extra = (val - TYPE_FIELD_BITPOS (domain, i));
259                       if (extra & 0x3)
260                         bits = 1;
261                       else
262                         extra >>= 3;
263                       break;
264                     }
265                 }
266               if (i < len)
267                 {
268                   fprintf (stream, "& ");
269                   type_print_base (domain, stream, 0, 0);
270                   fprintf (stream, "::");
271                   fprintf (stream, "%s", TYPE_FIELD_NAME (domain, i));
272                   if (extra)
273                     fprintf (stream, " + %d bytes", extra);
274                   if (bits)
275                     fprintf (stream, " (offset in bits)");
276                   break;
277                 }
278             }
279           fputc ('(', stream);
280           type_print (type, "", stream, -1);
281           fprintf (stream, ") %d", val >> 3);
282         }
283       else
284         {
285           fprintf (stream, "0x%x", * (int *) valaddr);
286           /* For a pointer to char or unsigned char,
287              also print the string pointed to, unless pointer is null.  */
288           if ((TYPE_TARGET_TYPE (type) == builtin_type_char
289                || TYPE_TARGET_TYPE (type) == builtin_type_unsigned_char)
290               && unpack_long (type, valaddr) != 0)
291             {
292               fputc (' ', stream);
293               fputc ('"', stream);
294               for (i = 0; i < print_max; i++)
295                 {
296                   QUIT;
297                   read_memory (unpack_long (type, valaddr) + i, &c, 1);
298                   if (c == 0)
299                     break;
300                   printchar (c, stream);
301                 }
302               fputc ('"', stream);
303               if (i == print_max)
304                 fprintf (stream, "...");
305               fflush (stream);
306               /* Return number of characters printed, plus one for the
307                  terminating null if we have "reached the end".  */
308               return i + (i != print_max);
309             }
310         }
311       break;
312
313     case TYPE_CODE_MEMBER:
314       error ("not implemented: member type in val_print");
315       break;
316
317     case TYPE_CODE_REF:
318       fprintf (stream, "(0x%x &) = ", * (int *) valaddr);
319       /* De-reference the reference.  */
320       if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_UNDEF)
321         {
322           value val = value_at (TYPE_TARGET_TYPE (type), * (int *)valaddr);
323           val_print (VALUE_TYPE (val), VALUE_CONTENTS (val),
324                      VALUE_ADDRESS (val), stream);
325         }
326       else
327         fprintf (stream, "???");
328       break;
329
330     case TYPE_CODE_STRUCT:
331     case TYPE_CODE_UNION:
332       fprintf (stream, "{");
333       len = TYPE_NFIELDS (type);
334       if (TYPE_BASECLASS (type))
335         {
336           i = 1;
337           fprintf (stream, "<%s> = ", TYPE_NAME (TYPE_BASECLASS (type)));
338           val_print (TYPE_FIELD_TYPE (type, 0),
339                      valaddr + TYPE_FIELD_BITPOS (type, 0) / 8,
340                      0, stream);
341
342         }
343       else i = 0;
344       for (; i < len; i++)
345         {
346           if (i) fprintf (stream, ", ");
347           fprintf (stream, "%s = ", TYPE_FIELD_NAME (type, i));
348           /* check if static field */
349           if (TYPE_FIELD_STATIC (type, i))
350             {
351               value v;
352
353               v = value_static_field (type, TYPE_FIELD_NAME (type, i), i);
354               val_print (TYPE_FIELD_TYPE (type, i),
355                          VALUE_CONTENTS (v), 0, stream);
356             }
357           else if (TYPE_FIELD_PACKED (type, i))
358             {
359               val = unpack_field_as_long (type, valaddr, i);
360               val_print (TYPE_FIELD_TYPE (type, i), &val, 0, stream);
361             }
362           else
363             {
364               val_print (TYPE_FIELD_TYPE (type, i), 
365                          valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
366                          0, stream);
367             }
368         }
369       fprintf (stream, "}");
370       break;
371
372     case TYPE_CODE_ENUM:
373       len = TYPE_NFIELDS (type);
374       val = unpack_long (builtin_type_int, valaddr);
375       for (i = 0; i < len; i++)
376         {
377           QUIT;
378           if (val == TYPE_FIELD_VALUE (type, i))
379             break;
380         }
381       if (i < len)
382         fprintf (stream, "%s", TYPE_FIELD_NAME (type, i));
383       else
384         fprintf (stream, "%d", val);
385       break;
386
387     case TYPE_CODE_FUNC:
388       fprintf (stream, "{");
389       type_print (type, "", stream, -1);
390       fprintf (stream, "} ");
391       fprintf (stream, "0x%x", address);
392       break;
393
394     case TYPE_CODE_INT:
395       fprintf (stream,
396                TYPE_UNSIGNED (type) ? "%u" : "%d",
397                unpack_long (type, valaddr));
398       if (type == builtin_type_char
399           || type == builtin_type_unsigned_char)
400         {
401           fprintf (stream, " '");
402           printchar (unpack_long (type, valaddr), stream);
403           fputc ('\'', stream);
404         }
405       break;
406
407     case TYPE_CODE_FLT:
408 #ifdef IEEE_FLOAT
409       if (is_nan (unpack_double (type, valaddr)))
410         {
411           fprintf (stream, "Nan");
412           break;
413         }
414 #endif
415       fprintf (stream, "%g", unpack_double (type, valaddr));
416       break;
417
418     case TYPE_CODE_VOID:
419       fprintf (stream, "void");
420       break;
421
422     default:
423       error ("Invalid type code in symbol table.");
424     }
425   fflush (stream);
426 }
427 \f
428 #ifdef IEEE_FLOAT
429
430 union ieee {
431   int i[2];
432   double d;
433 };
434
435 /* Nonzero if ARG (a double) is a NAN.  */
436
437 int
438 is_nan (arg)
439      union ieee arg;
440 {
441   int lowhalf, highhalf;
442   union { int i; char c; } test;
443
444   /* Separate the high and low words of the double.
445      Distinguish big and little-endian machines.  */
446   test.i = 1;
447   if (test.c != 1)
448     /* Big-endian machine */
449     lowhalf = arg.i[1], highhalf = arg.i[0];
450   else
451     lowhalf = arg.i[0], highhalf = arg.i[1];
452
453   /* Nan: exponent is the maximum possible, and fraction is nonzero.  */
454   return (((highhalf>>20) & 0x7ff) == 0x7ff
455           &&
456           ! ((highhalf & 0xfffff == 0) && (lowhalf == 0)));
457 }
458 #endif
459 \f
460 /* Print a description of a type TYPE
461    in the form of a declaration of a variable named VARSTRING.
462    Output goes to STREAM (via stdio).
463    If SHOW is positive, we show the contents of the outermost level
464    of structure even if there is a type name that could be used instead.
465    If SHOW is negative, we never show the details of elements' types.  */
466
467 type_print (type, varstring, stream, show)
468      struct type *type;
469      char *varstring;
470      FILE *stream;
471      int show;
472 {
473   type_print_1 (type, varstring, stream, show, 0);
474 }
475
476 /* LEVEL is the depth to indent lines by.  */
477
478 type_print_1 (type, varstring, stream, show, level)
479      struct type *type;
480      char *varstring;
481      FILE *stream;
482      int show;
483      int level;
484 {
485   register enum type_code code;
486   type_print_base (type, stream, show, level);
487   code = TYPE_CODE (type);
488   if ((varstring && *varstring)
489       ||
490       /* Need a space if going to print stars or brackets;
491          but not if we will print just a type name.  */
492       ((show > 0 || TYPE_NAME (type) == 0)
493        &&
494        (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
495         || code == TYPE_CODE_ARRAY
496         || code == TYPE_CODE_MEMBER
497         || code == TYPE_CODE_REF)))
498     fprintf (stream, " ");
499   type_print_varspec_prefix (type, stream, show, 0);
500   fprintf (stream, "%s", varstring);
501   type_print_varspec_suffix (type, stream, show, 0);
502 }
503
504 /* Print the method arguments ARGS to the file STREAM.  */
505 static void
506 type_print_method_args (args, prefix, varstring, stream)
507      struct type **args;
508      char *prefix, *varstring;
509      FILE *stream;
510 {
511   int i;
512
513   fprintf (stream, " %s%s (", prefix, varstring);
514   if (args[1] && args[1]->code != TYPE_CODE_VOID)
515     {
516       i = 1;                    /* skip the class variable */
517       while (1)
518         {
519           type_print (args[i++], "", stream, 0);
520           if (args[i]->code != TYPE_CODE_VOID)
521             {
522               fprintf (stream, ", ");
523             }
524           else break;
525         }
526     }
527   fprintf (stream, ")");
528 }
529   
530 /* Print any asterisks or open-parentheses needed before the
531    variable name (to describe its type).
532
533    On outermost call, pass 0 for PASSED_A_PTR.
534    On outermost call, SHOW > 0 means should ignore
535    any typename for TYPE and show its details.
536    SHOW is always zero on recursive calls.  */
537
538 static void
539 type_print_varspec_prefix (type, stream, show, passed_a_ptr)
540      struct type *type;
541      FILE *stream;
542      int show;
543      int passed_a_ptr;
544 {
545   if (TYPE_NAME (type) && show <= 0)
546     return;
547
548   QUIT;
549
550   switch (TYPE_CODE (type))
551     {
552     case TYPE_CODE_PTR:
553       type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
554       fputc ('*', stream);
555       break;
556
557     case TYPE_CODE_MEMBER:
558       type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
559       type_print_base (TYPE_DOMAIN_TYPE (type), stream, 0,
560                        passed_a_ptr);
561       fprintf (stream, "::");
562       break;
563
564     case TYPE_CODE_REF:
565       type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
566       fputc ('&', stream);
567       break;
568
569     case TYPE_CODE_FUNC:
570       type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0,
571                                  passed_a_ptr);
572       if (passed_a_ptr)
573         fputc ('(', stream);
574       break;
575
576     case TYPE_CODE_ARRAY:
577       type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0,
578                                  passed_a_ptr);
579     }
580 }
581
582 /* Print any array sizes, function arguments or close parentheses
583    needed after the variable name (to describe its type).
584    Args work like type_print_varspec_prefix.  */
585
586 static void
587 type_print_varspec_suffix (type, stream, show, passed_a_ptr)
588      struct type *type;
589      FILE *stream;
590      int show;
591      int passed_a_ptr;
592 {
593   if (TYPE_NAME (type) && show <= 0)
594     return;
595
596   QUIT;
597
598   switch (TYPE_CODE (type))
599     {
600     case TYPE_CODE_ARRAY:
601       type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
602                                  passed_a_ptr);
603       fprintf (stream, "[");
604       if (TYPE_LENGTH (type) >= 0)
605         fprintf (stream, "%d",
606                  TYPE_LENGTH (type) / TYPE_LENGTH (TYPE_TARGET_TYPE (type)));
607       fprintf (stream, "]");
608       break;
609
610     case TYPE_CODE_MEMBER:
611       if (passed_a_ptr)
612         fputc (')', stream);
613       type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0);
614       break;
615
616     case TYPE_CODE_PTR:
617     case TYPE_CODE_REF:
618       type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1);
619       break;
620
621     case TYPE_CODE_FUNC:
622       type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
623                                  passed_a_ptr);
624       if (passed_a_ptr)
625         fprintf (stream, ")");
626       fprintf (stream, "()");
627       break;
628     }
629 }
630
631 /* Print the name of the type (or the ultimate pointer target,
632    function value or array element), or the description of a
633    structure or union.
634
635    SHOW nonzero means don't print this type as just its name;
636    show its real definition even if it has a name.
637    SHOW zero means print just typename or struct tag if there is one
638    SHOW negative means abbreviate structure elements.
639    SHOW is decremented for printing of structure elements.
640
641    LEVEL is the depth to indent by.
642    We increase it for some recursive calls.  */
643
644 static void
645 type_print_base (type, stream, show, level)
646      struct type *type;
647      FILE *stream;
648      int show;
649      int level;
650 {
651   char *name;
652   register int i;
653   register int len;
654   register int lastval;
655
656   QUIT;
657
658   if (TYPE_NAME (type) && show <= 0)
659     {
660       fprintf (stream, TYPE_NAME (type));
661       return;
662     }
663
664   switch (TYPE_CODE (type))
665     {
666     case TYPE_CODE_ARRAY:
667     case TYPE_CODE_PTR:
668     case TYPE_CODE_MEMBER:
669     case TYPE_CODE_REF:
670     case TYPE_CODE_FUNC:
671       type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
672       break;
673
674     case TYPE_CODE_STRUCT:
675       fprintf (stream, "struct ");
676       goto struct_union;
677
678     case TYPE_CODE_UNION:
679       fprintf (stream, "union ");
680     struct_union:
681       if (TYPE_NAME (type) && (name = TYPE_NAME (type)))
682         {
683           while (*name != ' ') name++;
684           fprintf (stream, "%s ", name + 1);
685         }
686       if (show < 0)
687         fprintf (stream, "{...}");
688       else
689         {
690           struct type *basetype, *dtype;
691
692           dtype = type;
693           basetype = TYPE_BASECLASS (type);
694           while (basetype)
695             {
696               if (TYPE_NAME (basetype) && (name = TYPE_NAME (basetype)))
697                 {
698                   while (*name != ' ') name++;
699                   fprintf (stream, ": %s %s ",
700                            TYPE_VIA_PUBLIC (dtype) ? "public" : "private",
701                            name + 1);
702                 }
703               dtype = basetype;
704               basetype = TYPE_BASECLASS (basetype);
705             }
706           fprintf (stream, "{");
707           len = TYPE_NFIELDS (type);
708           if (len) fprintf (stream, "\n");
709           else fprintf (stream, "<no data fields>\n");
710
711           /* If there is a base class for this type,
712              do not print the field that it occupies.  */
713           for (i = !! TYPE_BASECLASS (type); i < len; i++)
714             {
715               QUIT;
716               /* Don't print out virtual function table.  */
717               if (! strncmp (TYPE_FIELD_NAME (type, i),
718                            "_vptr$", 6))
719                 continue;
720
721               print_spaces (level + 4, stream);
722               if (TYPE_FIELD_STATIC (type, i))
723                 {
724                   fprintf (stream, "static ");
725                 }
726               type_print_1 (TYPE_FIELD_TYPE (type, i),
727                             TYPE_FIELD_NAME (type, i),
728                             stream, show - 1, level + 4);
729               if (!TYPE_FIELD_STATIC (type, i)
730                   && TYPE_FIELD_PACKED (type, i))
731                 {
732                   /* ??? don't know what to put here ??? */;
733                 }
734               fprintf (stream, ";\n");
735             }
736
737           /* C++: print out the methods */
738           len = TYPE_NFN_FIELDS (type);
739           if (len) fprintf (stream, "\n");
740           for (i = 0; i < len; i++)
741             {
742               struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
743               int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
744
745               for (j = 0; j < len2; j++)
746                 {
747                   QUIT;
748                   print_spaces (level + 4, stream);
749                   if (TYPE_FN_FIELD_VIRTUAL_P (f, j))
750                     fprintf (stream, "virtual ");
751                   type_print_base (TYPE_FN_FIELD_TYPE (f, j), stream, 0, level);
752                   type_print_varspec_prefix (TYPE_FN_FIELD_TYPE (f, j), stream, 0, 0);
753                   if (TYPE_FN_FIELD_PHYSNAME (f, j)[0] == '_'
754                       && TYPE_FN_FIELD_PHYSNAME (f, j)[1] == '$')
755                     type_print_method_args
756                       (TYPE_FN_FIELD_ARGS (f, j) + 1, "~",
757                        TYPE_FN_FIELDLIST_NAME (type, i), stream);
758                   else
759                     type_print_method_args
760                       (TYPE_FN_FIELD_ARGS (f, j), "",
761                        TYPE_FN_FIELDLIST_NAME (type, i), stream);
762
763                   fprintf (stream, ";\n");
764                 }
765               if (len2) fprintf (stream, "\n");
766             }
767
768           print_spaces (level, stream);
769           fputc ('}', stream);
770         }
771       break;
772
773     case TYPE_CODE_ENUM:
774       fprintf (stream, "enum ");
775       if (TYPE_NAME (type))
776         {
777           name = TYPE_NAME (type);
778           while (*name != ' ') name++;
779           fprintf (stream, "%s ", name + 1);
780         }
781       if (show < 0)
782         fprintf (stream, "{...}");
783       else
784         {
785           fprintf (stream, "{");
786           len = TYPE_NFIELDS (type);
787           lastval = 0;
788           for (i = 0; i < len; i++)
789             {
790               QUIT;
791               if (i) fprintf (stream, ", ");
792               fprintf (stream, "%s", TYPE_FIELD_NAME (type, i));
793               if (lastval != TYPE_FIELD_VALUE (type, i))
794                 {
795                   fprintf (stream, " : %d", TYPE_FIELD_VALUE (type, i));
796                   lastval = TYPE_FIELD_VALUE (type, i);
797                 }
798               lastval++;
799             }
800           fprintf (stream, "}");
801         }
802       break;
803
804     case TYPE_CODE_INT:
805       if (TYPE_UNSIGNED (type))
806         name = unsigned_type_table[TYPE_LENGTH (type)];
807       else
808         name = signed_type_table[TYPE_LENGTH (type)];
809       fprintf (stream, "%s", name);
810       break;
811
812     case TYPE_CODE_FLT:
813       name = float_type_table[TYPE_LENGTH (type)];
814       fprintf (stream, "%s", name);
815       break;
816
817     case TYPE_CODE_VOID:
818       fprintf (stream, "void");
819       break;
820
821     case 0:
822       fprintf (stream, "struct unknown");
823       break;
824
825     default:
826       error ("Invalid type code in symbol table.");
827     }
828 }
829 \f
830 static void
831 set_maximum_command (arg)
832      char *arg;
833 {
834   if (!arg) error_no_arg ("value for maximum elements to print");
835   print_max = atoi (arg);
836 }
837
838 static
839 initialize ()
840 {
841   add_com ("set-maximum", class_vars, set_maximum_command,
842            "Set NUMBER as limit on string chars or array elements to print.");
843
844   print_max = 200;
845
846   unsigned_type_table
847     = (char **) xmalloc ((1 + sizeof (unsigned long)) * sizeof (char *));
848   bzero (unsigned_type_table, (1 + sizeof (unsigned long)));
849   unsigned_type_table[sizeof (unsigned char)] = "unsigned char";
850   unsigned_type_table[sizeof (unsigned short)] = "unsigned short";
851   unsigned_type_table[sizeof (unsigned long)] = "unsigned long";
852   unsigned_type_table[sizeof (unsigned int)] = "unsigned int";
853
854   signed_type_table
855     = (char **) xmalloc ((1 + sizeof (long)) * sizeof (char *));
856   bzero (signed_type_table, (1 + sizeof (long)));
857   signed_type_table[sizeof (char)] = "char";
858   signed_type_table[sizeof (short)] = "short";
859   signed_type_table[sizeof (long)] = "long";
860   signed_type_table[sizeof (int)] = "int";
861
862   float_type_table
863     = (char **) xmalloc ((1 + sizeof (double)) * sizeof (char *));
864   bzero (float_type_table, (1 + sizeof (double)));
865   float_type_table[sizeof (float)] = "float";
866   float_type_table[sizeof (double)] = "double";
867 }
868
869 END_FILE
This page took 0.075696 seconds and 4 git commands to generate.