| #!/usr/bin/gawk -f | |
| ############################################################################ | |
| # | |
| # Script for filtering TRACE_ENTRY(), TRACE_EXIT() and TRACE_EXIT_RES() | |
| # statements from a patch. | |
| # | |
| # Copyright (C) 2009 Bart Van Assche <bvanassche@acm.org> | |
| # | |
| # This program is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU General Public License | |
| # as published by the Free Software Foundation, version 2 | |
| # of the License. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| ############################################################################ | |
| function categorize_line(line) { | |
| is_blank = 0 | |
| is_trace_entry = 0 | |
| is_trace_exit = 0 | |
| is_label = 0 | |
| is_return_void = 0 | |
| is_brace_at_start_of_line = 0 | |
| if (line ~ "^+$") | |
| is_blank = 1 | |
| else if (line ~ "^+\tTRACE_ENTRY\\(\\);$") | |
| is_trace_entry = 1 | |
| else if (line ~ "^+\tTRACE_EXIT\\(\\);$" \ | |
| || line ~ "^+\tTRACE_EXIT_RES\\(.*\\);$" \ | |
| || line ~ "^+\tTRACE_EXIT_HRES\\(.*\\);$") | |
| is_trace_exit = 1 | |
| else if (line ~ ":$") | |
| is_label = 1 | |
| else if (line ~ "^+\treturn;$") | |
| is_return_void = 1 | |
| else if (line ~ "^+}$") | |
| is_brace_at_start_of_line = 1 | |
| } | |
| # Leave out TRACE_ENTRY() and the blank line below it and also TRACE_EXIT() | |
| # and the blank line before it. | |
| function print_conditionally() { | |
| if (previous_is_trace_entry \ | |
| || (before_previous_is_trace_entry && previous_is_blank) \ | |
| || previous_is_trace_exit \ | |
| || (previous_is_blank && is_trace_exit) \ | |
| || (!before_previous_is_label \ | |
| && previous_is_return_void \ | |
| && is_brace_at_start_of_line)) | |
| { | |
| # print "deleted", previous_line | |
| lines_deleted++ | |
| reverse_shift_state_variables() | |
| } | |
| else | |
| { | |
| # printf "[%d] %s\n", lines, previous_line | |
| line[lines++] = previous_line | |
| } | |
| } | |
| function shift_state_variables(line) { | |
| previous_line = line | |
| before_previous_is_blank = previous_is_blank | |
| before_previous_is_trace_entry = previous_is_trace_entry | |
| before_previous_is_trace_exit = previous_is_trace_exit | |
| before_previous_is_label = previous_is_label | |
| previous_is_blank = is_blank | |
| previous_is_trace_entry = is_trace_entry | |
| previous_is_trace_exit = is_trace_exit | |
| previous_is_label = is_label | |
| previous_is_return_void = is_return_void | |
| } | |
| function reverse_shift_state_variables() { | |
| previous_is_blank = before_previous_is_blank | |
| previous_is_trace_entry = before_previous_is_trace_entry | |
| previous_is_trace_exit = before_previous_is_trace_exit | |
| previous_is_label = before_previous_is_label | |
| } | |
| function reset_hunk_state_variables() { | |
| lines = 0 | |
| lines_deleted = 0 | |
| first_line_of_hunk = 1 | |
| before_previous_is_blank = 0 | |
| before_previous_is_trace_entry = 0 | |
| before_previous_is_trace_exit = 0 | |
| before_previous_is_label = 0 | |
| previous_is_blank = 0 | |
| previous_is_trace_entry = 0 | |
| previous_is_trace_exit = 0 | |
| previous_is_label = 0 | |
| previous_is_return_void = 0 | |
| } | |
| function dump_lines() { | |
| # Detect empty hunks | |
| first_modif = -1 | |
| for (i = 0; i < lines; i++) | |
| { | |
| if (line[i] ~ "^[+-]") | |
| { | |
| first_modif = i | |
| break | |
| } | |
| } | |
| # printf "dump_lines(): lines = %d, first_modif = %d\n", lines, first_modif | |
| # Dump line[] as a hunk, but only if the hunk is not empty. | |
| if (first_modif >= 0) | |
| { | |
| if (h[0] != "") | |
| printf "@@ -%d,%d +%d,%d @@%s\n",h[1],h[2],h[3],h[4]-lines_deleted,h[5] | |
| for (i = 0; i < lines; i++) | |
| print line[i] | |
| } | |
| reset_hunk_state_variables() | |
| } | |
| BEGIN { | |
| reset_hunk_state_variables() | |
| } | |
| { | |
| # If the line currently being processed is a hunk header, print all lines | |
| # that were stored in the array line[] since the last hunk header was read. | |
| if (match($0, "^@@ -([0-9]*),([0-9]*) \\+([0-9]*),([0-9]*) @@(.*)$")) | |
| { | |
| categorize_line("") | |
| print_conditionally() | |
| dump_lines() | |
| match($0, "^@@ -([0-9]*),([0-9]*) \\+([0-9]*),([0-9]*) @@(.*)$", h) | |
| } | |
| else | |
| { | |
| if (first_line_of_hunk) | |
| first_line_of_hunk = 0 | |
| else | |
| { | |
| categorize_line($0) | |
| print_conditionally() | |
| } | |
| shift_state_variables($0) | |
| } | |
| } | |
| END { | |
| categorize_line("") | |
| print_conditionally() | |
| dump_lines() | |
| } | |
| # Local variables: | |
| # indent-tabs-mode: nil | |
| # c-basic-offset: 2 | |
| # End: |