1abaf1f42SJosh Poimboeuf#!/usr/bin/awk -f 2abaf1f42SJosh Poimboeuf# SPDX-License-Identifier: GPL-2.0 3abaf1f42SJosh Poimboeuf# 4abaf1f42SJosh Poimboeuf# Use #line directives to preserve original __LINE__ numbers across patches to 5abaf1f42SJosh Poimboeuf# avoid unwanted compilation changes. 6abaf1f42SJosh Poimboeuf 7abaf1f42SJosh PoimboeufBEGIN { 8abaf1f42SJosh Poimboeuf in_hunk = 0 9abaf1f42SJosh Poimboeuf skip = 0 10abaf1f42SJosh Poimboeuf} 11abaf1f42SJosh Poimboeuf 12abaf1f42SJosh Poimboeuf/^--- / { 13abaf1f42SJosh Poimboeuf skip = $2 !~ /\.(c|h)$/ 14abaf1f42SJosh Poimboeuf print 15abaf1f42SJosh Poimboeuf next 16abaf1f42SJosh Poimboeuf} 17abaf1f42SJosh Poimboeuf 18abaf1f42SJosh Poimboeuf/^@@/ { 19abaf1f42SJosh Poimboeuf if (skip) { 20abaf1f42SJosh Poimboeuf print 21abaf1f42SJosh Poimboeuf next 22abaf1f42SJosh Poimboeuf } 23abaf1f42SJosh Poimboeuf 24abaf1f42SJosh Poimboeuf in_hunk = 1 25abaf1f42SJosh Poimboeuf 26*24ebfcd6SJosh Poimboeuf # @@ -1,3 +1,4 @@: 27abaf1f42SJosh Poimboeuf # 1: line number in old file 28abaf1f42SJosh Poimboeuf # 3: how many lines the hunk covers in old file 29abaf1f42SJosh Poimboeuf # 1: line number in new file 30abaf1f42SJosh Poimboeuf # 4: how many lines the hunk covers in new file 31abaf1f42SJosh Poimboeuf 32abaf1f42SJosh Poimboeuf match($0, /^@@ -([0-9]+)(,([0-9]+))? \+([0-9]+)(,([0-9]+))? @@/, m) 33abaf1f42SJosh Poimboeuf 34abaf1f42SJosh Poimboeuf # Set 'cur' to the old file's line number at the start of the hunk. It 35abaf1f42SJosh Poimboeuf # gets incremented for every context line and every line removal, so 36abaf1f42SJosh Poimboeuf # that it always represents the old file's current line number. 37abaf1f42SJosh Poimboeuf cur = m[1] 38abaf1f42SJosh Poimboeuf 39abaf1f42SJosh Poimboeuf # last = last line number of current hunk 40abaf1f42SJosh Poimboeuf last = cur + (m[3] ? m[3] : 1) - 1 41abaf1f42SJosh Poimboeuf 42abaf1f42SJosh Poimboeuf need_line_directive = 0 43abaf1f42SJosh Poimboeuf 44abaf1f42SJosh Poimboeuf print 45abaf1f42SJosh Poimboeuf next 46abaf1f42SJosh Poimboeuf} 47abaf1f42SJosh Poimboeuf 48abaf1f42SJosh Poimboeuf{ 49abaf1f42SJosh Poimboeuf if (skip || !in_hunk || $0 ~ /^\\ No newline at end of file/) { 50abaf1f42SJosh Poimboeuf print 51abaf1f42SJosh Poimboeuf next 52abaf1f42SJosh Poimboeuf } 53abaf1f42SJosh Poimboeuf 54abaf1f42SJosh Poimboeuf # change line 55abaf1f42SJosh Poimboeuf if ($0 ~ /^[+-]/) { 56abaf1f42SJosh Poimboeuf # inject #line after this group of changes 57abaf1f42SJosh Poimboeuf need_line_directive = 1 58abaf1f42SJosh Poimboeuf 59abaf1f42SJosh Poimboeuf if ($0 ~ /^-/) 60abaf1f42SJosh Poimboeuf cur++ 61abaf1f42SJosh Poimboeuf 62abaf1f42SJosh Poimboeuf print 63abaf1f42SJosh Poimboeuf next 64abaf1f42SJosh Poimboeuf } 65abaf1f42SJosh Poimboeuf 66abaf1f42SJosh Poimboeuf # If this is the first context line after a group of changes, inject 67abaf1f42SJosh Poimboeuf # the #line directive to force the compiler to correct the line 68abaf1f42SJosh Poimboeuf # numbering to match the original file. 69abaf1f42SJosh Poimboeuf if (need_line_directive) { 70abaf1f42SJosh Poimboeuf print "+#line " cur 71abaf1f42SJosh Poimboeuf need_line_directive = 0 72abaf1f42SJosh Poimboeuf } 73abaf1f42SJosh Poimboeuf 74abaf1f42SJosh Poimboeuf if (cur == last) 75abaf1f42SJosh Poimboeuf in_hunk = 0 76abaf1f42SJosh Poimboeuf 77abaf1f42SJosh Poimboeuf cur++ 78abaf1f42SJosh Poimboeuf print 79abaf1f42SJosh Poimboeuf} 80