| #!/usr/bin/awk -f |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # Use #line directives to preserve original __LINE__ numbers across patches to |
| # avoid unwanted compilation changes. |
| |
| BEGIN { |
| in_hunk = 0 |
| skip = 0 |
| } |
| |
| /^--- / { |
| skip = $2 !~ /\.(c|h)$/ |
| print |
| next |
| } |
| |
| /^@@/ { |
| if (skip) { |
| print |
| next |
| } |
| |
| in_hunk = 1 |
| |
| # @@ -1,3 +1,4 @@: |
| # 1: line number in old file |
| # 3: how many lines the hunk covers in old file |
| # 1: line number in new file |
| # 4: how many lines the hunk covers in new file |
| |
| match($0, /^@@ -([0-9]+)(,([0-9]+))? \+([0-9]+)(,([0-9]+))? @@/, m) |
| |
| # Set 'cur' to the old file's line number at the start of the hunk. It |
| # gets incremented for every context line and every line removal, so |
| # that it always represents the old file's current line number. |
| cur = m[1] |
| |
| # last = last line number of current hunk |
| last = cur + (m[3] ? m[3] : 1) - 1 |
| |
| need_line_directive = 0 |
| |
| print |
| next |
| } |
| |
| { |
| if (skip || !in_hunk || $0 ~ /^\\ No newline at end of file/) { |
| print |
| next |
| } |
| |
| # change line |
| if ($0 ~ /^[+-]/) { |
| # inject #line after this group of changes |
| need_line_directive = 1 |
| |
| if ($0 ~ /^-/) |
| cur++ |
| |
| print |
| next |
| } |
| |
| # If this is the first context line after a group of changes, inject |
| # the #line directive to force the compiler to correct the line |
| # numbering to match the original file. |
| if (need_line_directive) { |
| print "+#line " cur |
| need_line_directive = 0 |
| } |
| |
| if (cur == last) |
| in_hunk = 0 |
| |
| cur++ |
| print |
| } |