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