unifdefall.sh revision 199842
1#!/bin/sh 2# 3# unifdefall: remove all the #if's from a source file 4# 5# Copyright (c) 2002 - 2009 Tony Finch <dot@dotat.at>. All rights reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# $dotat: unifdef/unifdefall.sh,v 1.24 2009/11/26 12:54:39 fanf2 Exp $ 29# $FreeBSD: head/usr.bin/unifdef/unifdefall.sh 199842 2009-11-26 19:08:33Z fanf $ 30 31set -e 32 33basename=$(basename $0) 34tmp=$(mktemp -d "${TMPDIR:-/tmp}/$basename.XXXXXXXXXX") || exit 2 35trap 'rm -r "$tmp" || exit 1' EXIT 36 37export LC_ALL=C 38 39# list of all controlling macros 40unifdef -s "$@" | sort | uniq >"$tmp/ctrl" 41# list of all macro definitions 42cpp -dM "$@" | sort | sed 's/^#define //' >"$tmp/hashdefs" 43# list of defined macro names 44sed 's/[^A-Za-z0-9_].*$//' <"$tmp/hashdefs" >"$tmp/alldef" 45# list of undefined and defined controlling macros 46comm -23 "$tmp/ctrl" "$tmp/alldef" >"$tmp/undef" 47comm -12 "$tmp/ctrl" "$tmp/alldef" >"$tmp/def" 48# create a sed script that extracts the controlling macro definitions 49# and converts them to unifdef command-line arguments 50sed 's|.*|s/^&\\(([^)]*)\\)\\{0,1\\} /-D&=/p|' <"$tmp/def" >"$tmp/script" 51# create the final unifdef command 52{ echo unifdef -k \\ 53 # convert the controlling undefined macros to -U arguments 54 sed 's/.*/-U& \\/' <"$tmp/undef" 55 # convert the controlling defined macros to quoted -D arguments 56 sed -nf "$tmp/script" <"$tmp/hashdefs" | 57 sed "s/'/'\\\\''/g;s/.*/'&' \\\\/" 58 echo '"$@"' 59} >"$tmp/cmd" 60# run the command we just created 61sh "$tmp/cmd" "$@" 62