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