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