1# $NetBSD: unif.awk,v 1.4 2008/04/29 06:53:01 martin Exp $
2
3# Copyright (c) 2003 The NetBSD Foundation, Inc.
4# All rights reserved.
5#
6# This code is derived from software contributed to The NetBSD Foundation
7# by David Laight.
8#
9# Redistribution and use in source and binary forms, with or without
10# modification, are permitted provided that the following conditions
11# are met:
12# 1. Redistributions of source code must retain the above copyright
13#    notice, this list of conditions and the following disclaimer.
14# 2. Redistributions in binary form must reproduce the above copyright
15#    notice, this list of conditions and the following disclaimer in the
16#    documentation and/or other materials provided with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28# POSSIBILITY OF SUCH DAMAGE.
29
30# 'unif' lines of file
31#
32# usage: awk -f unif.awk -v defines=varlist file
33#
34# looks for blocks of the form:
35#
36# .if var [|| var]
37# ...
38# .else
39# ...
40# .endif
41#
42# and removes the unwanted lines
43# There is some error detection...
44
45BEGIN {
46	split(defines, defns)
47	for (v in defns)
48		deflist[defns[v]] = 1
49	delete defns
50	nested = 0
51	skip = 0
52}
53
54/^\.if/ {
55	nested++
56	else_ok[nested] = 1
57	if (skip)
58		next
59	for (i = 2; i <= NF; i += 2) {
60		if ($i in deflist)
61			next
62		if ($(i+1) != "" && $(i+1) != "||")
63			exit 1
64	}
65	if (!skip)
66		skip = nested
67	next
68}
69
70/^\.else/  {
71	if (!else_ok[nested])
72		exit 1
73	else_ok[nested] = 0
74	if (skip == nested)
75		skip = 0
76	else if (!skip)
77		skip = nested
78	next
79}
80
81/^\.endif/ {
82	if (nested == 0)
83		exit 1
84	if (skip == nested)
85		skip = 0
86	nested--
87	next
88}
89
90{
91	if (skip == 0)
92		print
93}
94	
95END {
96	if (nested != 0)
97		exit 1
98}
99