142f4d724SArnon Warshavsky# SPDX-License-Identifier: BSD-3-Clause 242f4d724SArnon Warshavsky# Copyright 2018 Arnon Warshavsky <arnon@qwilt.com> 342f4d724SArnon Warshavsky 442f4d724SArnon Warshavsky# This awk script receives a list of expressions to monitor 542f4d724SArnon Warshavsky# and a list of folders to search these expressions in 642f4d724SArnon Warshavsky# - No search is done inside comments 742f4d724SArnon Warshavsky# - Both additions and removals of the expressions are checked 842f4d724SArnon Warshavsky# A positive balance of additions fails the check 942f4d724SArnon Warshavsky 1042f4d724SArnon WarshavskyBEGIN { 1142f4d724SArnon Warshavsky split(FOLDERS,deny_folders," "); 1242f4d724SArnon Warshavsky split(EXPRESSIONS,deny_expr," "); 13*129f38c5SDavid Marchand split(SKIP_FILES,skip_files," "); 1442f4d724SArnon Warshavsky in_file=0; 1542f4d724SArnon Warshavsky in_comment=0; 1642f4d724SArnon Warshavsky count=0; 17d500e69fSDavid Marchand warned=0; 1842f4d724SArnon Warshavsky comment_start="/*" 1942f4d724SArnon Warshavsky comment_end="*/" 2042f4d724SArnon Warshavsky} 2142f4d724SArnon Warshavsky# search for add/remove instances in current file 2242f4d724SArnon Warshavsky# state machine assumes the comments structure is enforced by 2342f4d724SArnon Warshavsky# checkpatches.pl 2442f4d724SArnon Warshavsky(in_file) { 25fdcc8970SDavid Marchand if ($0 ~ "^@@") { 26fdcc8970SDavid Marchand in_comment = 0 27fdcc8970SDavid Marchand } 2842f4d724SArnon Warshavsky # comment start 2942f4d724SArnon Warshavsky if (index($0,comment_start) > 0) { 3042f4d724SArnon Warshavsky in_comment = 1 3142f4d724SArnon Warshavsky } 3242f4d724SArnon Warshavsky # non comment code 3342f4d724SArnon Warshavsky if (in_comment == 0) { 3442f4d724SArnon Warshavsky for (i in deny_expr) { 3542f4d724SArnon Warshavsky forbidden_added = "^\\+.*" deny_expr[i]; 3642f4d724SArnon Warshavsky forbidden_removed="^-.*" deny_expr[i]; 3742f4d724SArnon Warshavsky if ($0 ~ forbidden_added) { 3884cf9b71SDavid Marchand count = count + 1 3942f4d724SArnon Warshavsky } 4042f4d724SArnon Warshavsky if ($0 ~ forbidden_removed) { 4184cf9b71SDavid Marchand count = count - 1 4242f4d724SArnon Warshavsky } 4342f4d724SArnon Warshavsky } 4442f4d724SArnon Warshavsky } 4542f4d724SArnon Warshavsky # comment end 4642f4d724SArnon Warshavsky if (index($0,comment_end) > 0) { 4742f4d724SArnon Warshavsky in_comment = 0 4842f4d724SArnon Warshavsky } 4942f4d724SArnon Warshavsky} 5042f4d724SArnon Warshavsky# switch to next file , check if the balance of add/remove 5142f4d724SArnon Warshavsky# of previous file had new additions 5242f4d724SArnon Warshavsky($0 ~ "^\\+\\+\\+ b/") { 5342f4d724SArnon Warshavsky in_file = 0; 5442f4d724SArnon Warshavsky if (count > 0) { 55d500e69fSDavid Marchand warned = warned + 1 56d500e69fSDavid Marchand print "Warning in " substr(last_file,7) ":" 5742f4d724SArnon Warshavsky } 5884cf9b71SDavid Marchand count = 0 5942f4d724SArnon Warshavsky for (i in deny_folders) { 60*129f38c5SDavid Marchand if (!($0 ~ "^\\+\\+\\+ b/" deny_folders[i])) { 61*129f38c5SDavid Marchand continue 62*129f38c5SDavid Marchand } 63*129f38c5SDavid Marchand skip = 0 64*129f38c5SDavid Marchand for (j in skip_files) { 65*129f38c5SDavid Marchand if (!($0 ~ "^\\+\\+\\+ b/" skip_files[j])) { 66*129f38c5SDavid Marchand continue 67*129f38c5SDavid Marchand } 68*129f38c5SDavid Marchand skip = 1 69*129f38c5SDavid Marchand break 70*129f38c5SDavid Marchand } 71*129f38c5SDavid Marchand if (skip == 0) { 7242f4d724SArnon Warshavsky in_file = 1 7342f4d724SArnon Warshavsky last_file = $0 7442f4d724SArnon Warshavsky } 75*129f38c5SDavid Marchand break 7642f4d724SArnon Warshavsky } 777e421ae3SJerin Jacob} 7842f4d724SArnon WarshavskyEND { 7942f4d724SArnon Warshavsky if (count > 0) { 80d500e69fSDavid Marchand warned = warned + 1 818d4a222eSDavid Marchand print "Warning in " substr(last_file,7) ":" 82d500e69fSDavid Marchand } 83d500e69fSDavid Marchand if (warned > 0) { 84b467d382SArnon Warshavsky print MESSAGE 8542f4d724SArnon Warshavsky exit RET_ON_FAIL 8642f4d724SArnon Warshavsky } 8742f4d724SArnon Warshavsky} 88