1*d30ea906Sjfb8856606# SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606# Copyright 2018 Arnon Warshavsky <[email protected]>
3*d30ea906Sjfb8856606
4*d30ea906Sjfb8856606# This awk script receives a list of expressions to monitor
5*d30ea906Sjfb8856606# and a list of folders to search these expressions in
6*d30ea906Sjfb8856606# - No search is done inside comments
7*d30ea906Sjfb8856606# - Both additions and removals of the expressions are checked
8*d30ea906Sjfb8856606#   A positive balance of additions fails the check
9*d30ea906Sjfb8856606
10*d30ea906Sjfb8856606BEGIN {
11*d30ea906Sjfb8856606	split(FOLDERS,deny_folders," ");
12*d30ea906Sjfb8856606	split(EXPRESSIONS,deny_expr," ");
13*d30ea906Sjfb8856606	in_file=0;
14*d30ea906Sjfb8856606	in_comment=0;
15*d30ea906Sjfb8856606	count=0;
16*d30ea906Sjfb8856606	comment_start="/*"
17*d30ea906Sjfb8856606	comment_end="*/"
18*d30ea906Sjfb8856606}
19*d30ea906Sjfb8856606# search for add/remove instances in current file
20*d30ea906Sjfb8856606# state machine assumes the comments structure is enforced by
21*d30ea906Sjfb8856606# checkpatches.pl
22*d30ea906Sjfb8856606(in_file) {
23*d30ea906Sjfb8856606	# comment start
24*d30ea906Sjfb8856606	if (index($0,comment_start) > 0) {
25*d30ea906Sjfb8856606		in_comment = 1
26*d30ea906Sjfb8856606	}
27*d30ea906Sjfb8856606	# non comment code
28*d30ea906Sjfb8856606	if (in_comment == 0) {
29*d30ea906Sjfb8856606		for (i in deny_expr) {
30*d30ea906Sjfb8856606			forbidden_added = "^\\+.*" deny_expr[i];
31*d30ea906Sjfb8856606			forbidden_removed="^-.*" deny_expr[i];
32*d30ea906Sjfb8856606			current = expressions[deny_expr[i]]
33*d30ea906Sjfb8856606			if ($0 ~ forbidden_added) {
34*d30ea906Sjfb8856606				count = count + 1;
35*d30ea906Sjfb8856606				expressions[deny_expr[i]] = current + 1
36*d30ea906Sjfb8856606			}
37*d30ea906Sjfb8856606			if ($0 ~ forbidden_removed) {
38*d30ea906Sjfb8856606				count = count - 1;
39*d30ea906Sjfb8856606				expressions[deny_expr[i]] = current - 1
40*d30ea906Sjfb8856606			}
41*d30ea906Sjfb8856606		}
42*d30ea906Sjfb8856606	}
43*d30ea906Sjfb8856606	# comment end
44*d30ea906Sjfb8856606	if (index($0,comment_end) > 0) {
45*d30ea906Sjfb8856606		in_comment = 0
46*d30ea906Sjfb8856606	}
47*d30ea906Sjfb8856606}
48*d30ea906Sjfb8856606# switch to next file , check if the balance of add/remove
49*d30ea906Sjfb8856606# of previous filehad new additions
50*d30ea906Sjfb8856606($0 ~ "^\\+\\+\\+ b/") {
51*d30ea906Sjfb8856606	in_file = 0;
52*d30ea906Sjfb8856606	if (count > 0) {
53*d30ea906Sjfb8856606		exit;
54*d30ea906Sjfb8856606	}
55*d30ea906Sjfb8856606	for (i in deny_folders) {
56*d30ea906Sjfb8856606		re = "^\\+\\+\\+ b/" deny_folders[i];
57*d30ea906Sjfb8856606		if ($0 ~ deny_folders[i]) {
58*d30ea906Sjfb8856606			in_file = 1
59*d30ea906Sjfb8856606			last_file = $0
60*d30ea906Sjfb8856606		}
61*d30ea906Sjfb8856606	}
62*d30ea906Sjfb8856606}
63*d30ea906Sjfb8856606END {
64*d30ea906Sjfb8856606	if (count > 0) {
65*d30ea906Sjfb8856606		print "Warning in " substr(last_file,6) ":"
66*d30ea906Sjfb8856606		print MESSAGE
67*d30ea906Sjfb8856606		exit RET_ON_FAIL
68*d30ea906Sjfb8856606	}
69*d30ea906Sjfb8856606}
70