From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9483 invoked by alias); 10 Feb 2009 00:15:20 -0000 Received: (qmail 9473 invoked by uid 22791); 10 Feb 2009 00:15:19 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_66 X-Spam-Check-By: sourceware.org Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.200.153) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 10 Feb 2009 00:15:10 +0000 Received: from baal.u-strasbg.fr (baal.u-strasbg.fr [IPv6:2001:660:2402::41]) by mailhost.u-strasbg.fr (8.14.2/jtpda-5.5pre1) with ESMTP id n1A0F4tc021760 ; Tue, 10 Feb 2009 01:15:04 +0100 (CET) Received: from mailserver.u-strasbg.fr (ms2.u-strasbg.fr [IPv6:2001:660:2402:d::11]) by baal.u-strasbg.fr (8.14.0/jtpda-5.5pre1) with ESMTP id n1A0F3ic094396 ; Tue, 10 Feb 2009 01:15:04 +0100 (CET) (envelope-from muller@ics.u-strasbg.fr) Received: from d620muller (lec67-4-82-230-53-140.fbx.proxad.net [82.230.53.140]) (user=mullerp mech=LOGIN) by mailserver.u-strasbg.fr (8.14.3/jtpda-5.5pre1) with ESMTP id n1A0F0sF062613 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO) ; Tue, 10 Feb 2009 01:15:02 +0100 (CET) (envelope-from muller@ics.u-strasbg.fr) From: "Pierre Muller" To: "'gdb-patches ml'" Cc: "'FPC Core Developer List'" , Subject: [Commit] gdb/pascal language 2 or 4 byte char support in strings Date: Tue, 10 Feb 2009 00:15:00 -0000 Message-ID: <000001c98b14$a4cb8d60$ee62a820$@u-strasbg.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-02/txt/msg00211.txt.bz2 I committed the patch below to add support for fixed width chars greater than 1 for pascal language. This works nicely for Free Pascal, I couldn't test it for GPC because I didn't find out if those kind of char are supported... Pierre Muller Pascal language support maintainer for GDB ChangeLog entry: 2009-02-08 Pierre Muller * p-lang.c (is_pascal_string_type): Fix comment. Determine exact size of char elements for GPC strings. (pascal_printstr): Handle char width of 2 or 4. * p-valprint.c (pascal_val_print): Handle char of width 2 or 4. Index: gdb/p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.45 diff -u -p -r1.45 p-lang.c --- gdb/p-lang.c 5 Feb 2009 12:16:25 -0000 1.45 +++ gdb/p-lang.c 9 Feb 2009 23:54:58 -0000 @@ -86,7 +86,7 @@ pascal_main_name (void) } /* Determines if type TYPE is a pascal string type. - Returns 1 if the type is a known pascal type + Returns a positive value if the type is a known pascal string type. This function is used by p-valprint.c code to allow better string display. If it is a pascal string type, then it also sets info needed to get the length and the data of the string @@ -126,14 +126,20 @@ is_pascal_string_type (struct type *type && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0 && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0) { - if (length_pos) + struct type *char_type; + if (length_pos) *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; - if (length_size) + if (length_size) *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 1)); - if (string_pos) + if (string_pos) *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT; /* FIXME: how can I detect wide chars in GPC ?? */ - if (char_size) + char_type = TYPE_FIELD_TYPE (type,2); + if (char_size && TYPE_CODE (char_type) == TYPE_CODE_ARRAY) + { + *char_size = TYPE_LENGTH (TYPE_TARGET_TYPE (char_type)); + } + else if (char_size) *char_size = 1; if (arrayname) *arrayname = TYPE_FIELDS (type)[2].name; @@ -218,7 +224,8 @@ pascal_printstr (struct ui_file *stream, /* 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 style. */ - if ((!force_ellipses) && length > 0 && string[length - 1] == '\0') + if ((!force_ellipses) && length > 0 + && extract_unsigned_integer (string + (length - 1) * width, width) == 0) length--; if (length == 0) @@ -234,6 +241,7 @@ pascal_printstr (struct ui_file *stream, unsigned int rep1; /* Number of repetitions we have detected so far. */ unsigned int reps; + unsigned long int current_char; QUIT; @@ -243,9 +251,13 @@ pascal_printstr (struct ui_file *stream, need_comma = 0; } + current_char = extract_unsigned_integer (string + i * width, width); + rep1 = i + 1; reps = 1; - while (rep1 < length && string[rep1] == string[i]) + while (rep1 < length + && extract_unsigned_integer (string + rep1 * width, width) + == current_char) { ++rep1; ++reps; @@ -261,7 +273,7 @@ pascal_printstr (struct ui_file *stream, fputs_filtered ("', ", stream); in_quotes = 0; } - pascal_printchar (string[i], stream); + pascal_printchar (current_char, stream); fprintf_filtered (stream, " ", reps); i = rep1 - 1; things_printed += options->repeat_count_threshold; @@ -269,8 +281,7 @@ pascal_printstr (struct ui_file *stream, } else { - int c = string[i]; - if ((!in_quotes) && (PRINT_LITERAL_FORM (c))) + if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char))) { if (options->inspect_it) fputs_filtered ("\\'", stream); @@ -278,7 +289,7 @@ pascal_printstr (struct ui_file *stream, fputs_filtered ("'", stream); in_quotes = 1; } - pascal_one_char (c, stream, &in_quotes); + pascal_one_char (current_char, stream, &in_quotes); ++things_printed; } } Index: gdb/p-valprint.c =================================================================== RCS file: /cvs/src/src/gdb/p-valprint.c,v retrieving revision 1.59 diff -u -p -r1.59 p-valprint.c --- gdb/p-valprint.c 3 Jan 2009 05:57:52 -0000 1.59 +++ gdb/p-valprint.c 9 Feb 2009 23:54:58 -0000 @@ -79,7 +79,7 @@ pascal_val_print (struct type *type, con print_spaces_filtered (2 + 2 * recurse, stream); } /* For an array of chars, print with string syntax. */ - if (eltlen == 1 + if ((eltlen == 1 || eltlen == 2 || eltlen == 4) && ((TYPE_CODE (elttype) == TYPE_CODE_INT) || ((current_language->la_language == language_pascal) && (TYPE_CODE (elttype) == TYPE_CODE_CHAR))) @@ -93,14 +93,15 @@ pascal_val_print (struct type *type, con /* Look for a NULL char. */ for (temp_len = 0; - (valaddr + embedded_offset)[temp_len] + extract_unsigned_integer (valaddr + embedded_offset + + temp_len * eltlen, eltlen) && temp_len < len && temp_len < options->print_max; temp_len++); len = temp_len; } - LA_PRINT_STRING (stream, valaddr + embedded_offset, len, 1, 0, - options); + LA_PRINT_STRING (stream, valaddr + embedded_offset, len, + eltlen, 0, options); i = len; } else @@ -165,14 +166,17 @@ pascal_val_print (struct type *type, con /* For a pointer to char or unsigned char, also print the string pointed to, unless pointer is null. */ - if (TYPE_LENGTH (elttype) == 1 - && (TYPE_CODE (elttype) == TYPE_CODE_INT - || TYPE_CODE(elttype) == TYPE_CODE_CHAR) + if (((TYPE_LENGTH (elttype) == 1 + && (TYPE_CODE (elttype) == TYPE_CODE_INT + || TYPE_CODE (elttype) == TYPE_CODE_CHAR)) + || ((TYPE_LENGTH (elttype) == 2 || TYPE_LENGTH (elttype) == 4) + && TYPE_CODE (elttype) == TYPE_CODE_CHAR)) && (options->format == 0 || options->format == 's') && addr != 0) { /* no wide string yet */ - i = val_print_string (addr, -1, 1, stream, options); + i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream, + options); } /* also for pointers to pascal strings */ /* Note: this is Free Pascal specific: