sim: common: trim trailing whitespace
[deliverable/binutils-gdb.git] / gdb / p-lang.c
index 415cd9945667e273dd36753c36a58a7b82080a9a..0469de57cfe61fd58acd59e8af8a439b39c77a2e 100644 (file)
@@ -1,6 +1,6 @@
 /* Pascal language support routines for GDB, the GNU debugger.
 
-   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+   Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -36,7 +36,7 @@ extern void _initialize_pascal_language (void);
 
 
 /* All GPC versions until now (2007-09-27) also define a symbol called
-   '_p_initialize'. Check for the presence of this symbol first.  */
+   '_p_initialize'.  Check for the presence of this symbol first.  */
 static const char GPC_P_INITIALIZE[] = "_p_initialize";
 
 /* The name of the symbol that GPC uses as the name of the main
@@ -54,7 +54,7 @@ static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
    so that it finds the even if the program was compiled
    without debugging information.
    According to information supplied by Waldeck Hebisch,
-   this should work for all versions posterior to June 2000. */
+   this should work for all versions posterior to June 2000.  */
 
 const char *
 pascal_main_name (void)
@@ -105,9 +105,11 @@ is_pascal_string_type (struct type *type,int *length_pos,
     {
       /* Old Borland type pascal strings from Free Pascal Compiler.  */
       /* Two fields: length and st.  */
-      if (TYPE_NFIELDS (type) == 2 
-          && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0 
-          && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
+      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;
@@ -118,14 +120,16 @@ is_pascal_string_type (struct type *type,int *length_pos,
           if (char_type)
            *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1));
          if (arrayname)
-           *arrayname = TYPE_FIELDS (type)[1].name;
+           *arrayname = TYPE_FIELD_NAME (type, 1);
          return 2;
         };
       /* GNU pascal strings.  */
       /* Three fields: Capacity, length and schema$ or _p_schema.  */
       if (TYPE_NFIELDS (type) == 3
-          && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
-          && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
+         && 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;
@@ -133,15 +137,16 @@ is_pascal_string_type (struct type *type,int *length_pos,
            *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 1));
          if (string_pos)
            *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
-          /* FIXME: how can I detect wide chars in GPC ?? */
+          /* FIXME: how can I detect wide chars in GPC ??  */
           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_FIELDS (type)[2].name;
+           *arrayname = TYPE_FIELD_NAME (type, 2);
          return 3;
         };
     }
@@ -152,15 +157,12 @@ static void pascal_one_char (int, struct ui_file *, int *);
 
 /* Print the character C on STREAM as part of the contents of a literal
    string.
-   In_quotes is reset to 0 if a char is written with #4 notation */
+   In_quotes is reset to 0 if a char is written with #4 notation */
 
 static void
 pascal_one_char (int c, struct ui_file *stream, int *in_quotes)
 {
-
-  c &= 0xFF;                   /* Avoid sign bit follies */
-
-  if ((c == '\'') || (PRINT_LITERAL_FORM (c)))
+  if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c))))
     {
       if (!(*in_quotes))
        fputs_filtered ("'", stream);
@@ -186,12 +188,13 @@ static void pascal_emit_char (int c, struct type *type,
 
 /* Print the character C on STREAM as part of the contents of a literal
    string whose delimiter is QUOTER.  Note that that format for printing
-   characters and strings is language specific. */
+   characters and strings is language specific.  */
 
 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);
@@ -201,6 +204,7 @@ 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);
@@ -222,7 +226,11 @@ pascal_printstr (struct ui_file *stream, struct type *type,
   unsigned int things_printed = 0;
   int in_quotes = 0;
   int need_comma = 0;
-  int width = TYPE_LENGTH (type);
+  int width;
+
+  /* Preserve TYPE's original type, just set its LENGTH.  */
+  check_typedef (type);
+  width = TYPE_LENGTH (type);
 
   /* If the string was not truncated due to `set print elements', and
      the last byte of it is a null, we don't print that, in traditional C
@@ -372,6 +380,7 @@ 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,
This page took 0.02613 seconds and 4 git commands to generate.