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