xref: /linux/scripts/livepatch/fix-patch-lines (revision abaf1f42ddd070662fb419aed29c985ea209bd88)
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