xref: /aosp_15_r20/external/grpc-grpc/tools/distrib/guard_headers.sh (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker#!/bin/bash
2*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2015 gRPC authors.
3*cc02d7e2SAndroid Build Coastguard Worker#
4*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*cc02d7e2SAndroid Build Coastguard Worker#
8*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
9*cc02d7e2SAndroid Build Coastguard Worker#
10*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
15*cc02d7e2SAndroid Build Coastguard Worker
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard Workerset -e
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Workercd `dirname $0`/../..
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard Workerfunction process_dir {
22*cc02d7e2SAndroid Build Coastguard Worker  base_dir=$1
23*cc02d7e2SAndroid Build Coastguard Worker  prefix=$2
24*cc02d7e2SAndroid Build Coastguard Worker  comment_language=$3
25*cc02d7e2SAndroid Build Coastguard Worker  (
26*cc02d7e2SAndroid Build Coastguard Worker    cd $base_dir
27*cc02d7e2SAndroid Build Coastguard Worker    find . -name "*.h" | while read f ; do
28*cc02d7e2SAndroid Build Coastguard Worker      guard=${prefix}_`echo ${f#*/} | tr '[:lower:]/.-' '[:upper:]___'`
29*cc02d7e2SAndroid Build Coastguard Worker      if [ "$comment_language" = "c++" ] ; then
30*cc02d7e2SAndroid Build Coastguard Worker        comment="// $guard"
31*cc02d7e2SAndroid Build Coastguard Worker      else
32*cc02d7e2SAndroid Build Coastguard Worker        comment="/* $guard */"
33*cc02d7e2SAndroid Build Coastguard Worker      fi
34*cc02d7e2SAndroid Build Coastguard Worker      awk '
35*cc02d7e2SAndroid Build Coastguard Worker        BEGIN {
36*cc02d7e2SAndroid Build Coastguard Worker          guard = "'${guard}'";
37*cc02d7e2SAndroid Build Coastguard Worker          comment_language = "'${comment_language}'";
38*cc02d7e2SAndroid Build Coastguard Worker        }
39*cc02d7e2SAndroid Build Coastguard Worker        prev ~ /^#ifndef/ && !got_first_ifndef {
40*cc02d7e2SAndroid Build Coastguard Worker          got_first_ifndef = 1;
41*cc02d7e2SAndroid Build Coastguard Worker          prev = "#ifndef " guard;
42*cc02d7e2SAndroid Build Coastguard Worker        }
43*cc02d7e2SAndroid Build Coastguard Worker        prev ~ /^#define/ && !got_first_define {
44*cc02d7e2SAndroid Build Coastguard Worker          got_first_define = 1;
45*cc02d7e2SAndroid Build Coastguard Worker          prev = "#define " guard;
46*cc02d7e2SAndroid Build Coastguard Worker        }
47*cc02d7e2SAndroid Build Coastguard Worker        NR > 1 { print prev; }
48*cc02d7e2SAndroid Build Coastguard Worker        { prev = $0; }
49*cc02d7e2SAndroid Build Coastguard Worker        END {
50*cc02d7e2SAndroid Build Coastguard Worker          if (prev ~ /^#endif/) {
51*cc02d7e2SAndroid Build Coastguard Worker            if (comment_language ~ /^c$/) {
52*cc02d7e2SAndroid Build Coastguard Worker              print "#endif  /* " guard " */";
53*cc02d7e2SAndroid Build Coastguard Worker            } else if (comment_language ~ /^c\+\+$/) {
54*cc02d7e2SAndroid Build Coastguard Worker              print "#endif  // " guard;
55*cc02d7e2SAndroid Build Coastguard Worker            } else {
56*cc02d7e2SAndroid Build Coastguard Worker              print "ERROR: unknown comment language: " comment_language;
57*cc02d7e2SAndroid Build Coastguard Worker            }
58*cc02d7e2SAndroid Build Coastguard Worker          } else {
59*cc02d7e2SAndroid Build Coastguard Worker            print "ERROR: file does not end with #endif";
60*cc02d7e2SAndroid Build Coastguard Worker          }
61*cc02d7e2SAndroid Build Coastguard Worker        }
62*cc02d7e2SAndroid Build Coastguard Worker      ' "${f}" > "${f}.rewritten"
63*cc02d7e2SAndroid Build Coastguard Worker      mv "${f}.rewritten" "${f}"
64*cc02d7e2SAndroid Build Coastguard Worker    done
65*cc02d7e2SAndroid Build Coastguard Worker  )
66*cc02d7e2SAndroid Build Coastguard Worker}
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard Workerprocess_dir include/grpc GRPC c
69*cc02d7e2SAndroid Build Coastguard Workerprocess_dir include/grpc++ GRPCXX c++
70*cc02d7e2SAndroid Build Coastguard Workerprocess_dir src/core GRPC_INTERNAL_CORE c
71*cc02d7e2SAndroid Build Coastguard Workerprocess_dir src/cpp GRPC_INTERNAL_CPP c++
72*cc02d7e2SAndroid Build Coastguard Workerprocess_dir src/compiler GRPC_INTERNAL_COMPILER c++
73*cc02d7e2SAndroid Build Coastguard Workerprocess_dir test/core GRPC_TEST_CORE c
74*cc02d7e2SAndroid Build Coastguard Workerprocess_dir test/cpp GRPC_TEST_CPP c++
75*cc02d7e2SAndroid Build Coastguard Workerprocess_dir examples GRPC_EXAMPLES c++
76