Tom de Vries <tom_devr...@mentor.com> writes:
> [ attached patch ]
>
> On 06/10/2017 09:57 AM, Tom de Vries wrote:
>> Hi,
>> 
>> one thing that has bothered me on a regular basis is the inability to 
>> spread long dejagnu directives over multiple lines.
>> 
>> I've written a demonstrator patch (for the dejagnu sources) and tested 
>> it by splitting this 108 chars line:
>> ...
>> /* { dg-additional-options "-DSTACK_SIZE=[dg-effective-target-value 
>> stack_size]" { target { stack_size } } } */
>> ...
>> into:
>> ...
>> /* { dg-additional-options }
>>     { dg-dc "-DSTACK_SIZE=[dg-effective-target-value stack_size]" }
>>     { dg-dc { target { stack_size } } } */
>> ...
>> 
>> Good idea to fix this?
>> 
>> Good idea to fix this like this?
>> 
>> If so, any other comments, before I suggest this at dejagnu project?
>> 
>> Thanks,
>> - Tom
>> 
>
> Add dg-dc support
>
> ---
>  lib/dg.exp | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/lib/dg.exp b/lib/dg.exp
> index 7a894cb..67f46ab 100644
> --- a/lib/dg.exp
> +++ b/lib/dg.exp
> @@ -181,15 +181,64 @@ proc dg-format-linenum { linenum } {
>  # we return:
>  #
>  # { dg-prms-id 1 1234 } { dg-build 2 fatal "some comment" }
> +#
> +# Directive dg-dc (short for dg-directive-continue) can be used for 
> multi-line
> +# directives.  This:
> +#
> +# /* { dg-x a b c } */
> +#
> +# is equivalent to:
> +#
> +# /* { dg-x } */
> +# /* { dg-dc a b } */
> +# /* { dg-dc c } */
> +#
> +# and to:
> +#
> +# /* { dg-x a } */
> +# /* { dg-dc b c} */
>  
>  proc dg-get-options { prog } {
>      set result ""
> -
> -    set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line]
> +    set cmd_prev ""
> +
> +    set grep_pattern [join {
> +     "{"
> +     "\[ \t\]\+"
> +     "dg-\[-a-z\]\+"
> +     "\[ \t\]\+"
> +     "(.*\[ \t\]\+)?"
> +     "}"
> +    } ""]
> +    set tmp [grep $prog $grep_pattern line]
>      if {![string match "" $tmp]} {
> +     set pattern [join {
> +         "(\[0-9\]+)"
> +         "\[ \t\]+"
> +         "{"
> +         "\[ \t\]+"
> +         "(dg-\[-a-z\]+)"
> +         "\[ \t\]+"
> +         "((.*)\[ \t\]+)?"
> +         "}"
> +         "\[^\}\]*"
> +         "(\n|$)"
> +     } ""]
>       foreach i $tmp {
> -         regexp "(\[0-9\]+)\[ \t\]+{\[ \t\]+(dg-\[-a-z\]+)\[ \t\]+(.*)\[ 
> \t\]+}\[^\}\]*(\n|$)" $i i line cmd args
> -         append result " { $cmd $line $args }"
> +         regexp $pattern $i dummy line cmd ws_args args
> +         if { "$cmd" == "dg-dc" } {
> +             set args_prev "$args_prev $args"
> +         } else {
> +             if { "$cmd_prev" != "" } {
> +                 append result " { $cmd_prev $line_prev $args_prev }"
> +             }
> +             set cmd_prev $cmd
> +             set line_prev $line
> +             set args_prev "$args"
> +         }
> +     }
> +     if { "$cmd_prev" != "" } {
> +         append result " { $cmd_prev $line_prev $args_prev }"
>       }
>      }
>      return $result

I realise there's probably more that can go wrong with it, but how
about instead treating unbalanced { ... } as a sign that the directive
continues to the next line?  This would allow:

/* { dg-additional-options
      "-DSTACK_SIZE=[dg-effective-target-value stack_size]"
      { target { stack_size } } } */

To support per-line comments we probably need to drop the characters
before the start column, as in:

! { dg-additional-options
!     "-DSTACK_SIZE=[dg-effective-target-value stack_size]"
!     { target { stack_size } } }

Only lightly tested.

Thanks,
Richard


--- utils.exp.1 2017-06-12 08:07:34.004143966 +0100
+++ utils.exp   2017-06-12 08:54:13.609875614 +0100
@@ -161,6 +161,8 @@
 #            second is the pattern,
 #            third are any options.
 #     Options: line  - puts line numbers of match in list
+#              tcl   - match trailing characters until a complete Tcl
+#                      script is read
 #
 proc grep { args } {
 
@@ -178,20 +180,51 @@
     } else {
        set options ""
     }
+    set line_p [expr { [lsearch $options line] >= 0 }]
+    set tcl_p [expr { [lsearch $options tcl] >= 0 }]
 
     set i 0
     set fd [open $file r]
-    while { [gets $fd cur_line]>=0 } {
+    while { $i >= 0 && [gets $fd cur_line] >= 0 } {
        incr i
-       if [regexp -- "$pattern" $cur_line match] {
-           if ![string match "" $options] {
-               foreach opt $options {
-                   case $opt in {
-                       "line" {
-                           lappend grep_out [concat $i $match]
+       if [regexp -indices -- "$pattern" $cur_line indices] {
+           set line $i
+           set start [lindex $indices 0]
+           set end [lindex $indices 1]
+           set match [string range $cur_line $start $end]
+           if { $tcl_p } {
+               incr end
+               while { ![info complete $match] } {
+                   set next [string first "\}" $cur_line $end]
+                   if { $next >= 0 } {
+                       append match [string range $cur_line $end $next]
+                       set end [expr $next + 1]
+                   } else {
+                       append match [string trimright \
+                                         [string range $cur_line $end end]]
+                       # Expect the same number of characters of indentation.
+                       # If we don't get a line that we expect, still treat
+                       # this as a match (by breaking), so that it gets
+                       # reported where appropriate.
+                       if { [gets $fd cur_line] < 0 } {
+                           break
                        }
+                       incr i
+                       if { [string length $cur_line] < $start } {
+                           break
+                       }
+                       set cur_line [string trimleft \
+                                         [string range $cur_line $start end]]
+                       if { [string is space $cur_line] } {
+                           break
+                       }
+                       append match " "
+                       set end 0
                    }
                }
+           }
+           if { $line_p } {
+               lappend grep_out [concat $line $match]
            } else {
                lappend grep_out $match
            }
--- dg.exp.1    2017-06-12 08:06:55.292935737 +0100
+++ dg.exp      2017-06-12 08:32:14.309351359 +0100
@@ -186,7 +186,7 @@
 proc dg-get-options { prog } {
     set result ""
 
-    set tmp [grep $prog "{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]\+.*\[ \t\]\+}" line]
+    set tmp [grep $prog "\{\[ \t\]\+dg-\[-a-z\]\+\[ \t\]" line tcl]
     if ![string match "" $tmp] {
        foreach i $tmp {
            #send_user "Found: $i\n"

Reply via email to