#!/usr/bin/awk -f
#
# $Id: unifdef.awk,v 1.2 2006/10/20 08:54:06 securedog Exp $
BEGIN {
cur[0] = 1
depth = 0
symlist = 0
parse_options()
if (ARGV[ARGC - 1] == "") ARGV[ARGC - 1] = "-"
}
function usage(val) {
print "usage: unifdef.awk -- [-st] [-Dsym[=val]] [-Usym] ... [file]"
exit val
}
function parse_options(i, opt, optarg, optval, delim) {
for (i = 1; i < ARGC; i++) {
opt = ARGV[i]
optarg = substr(opt, 3)
if (opt == "-s")
symlist = 1
else if (opt == "-t")
;
else if (opt ~ /^-D.+$/) {
if (delim = index(optarg, "=")) {
optval = substr(optarg, delim + 1)
optarg = substr(optarg, 0, delim - 1)
}
else
optval = 1
symbols[optarg] = optval
}
else if (opt ~ /^-U.+$/)
symbols[optarg] = 0
else if (opt ~ /^-/)
usage(1)
else
break
delete ARGV[i]
}
}
{
if ($1 == "#ifdef" || $1 == "#ifndef") {
depth++
if (symlist)
print $2
else if (cur[depth - 1]) {
if ($2 in symbols) {
cur[depth] = (symbols[$2])
if ($1 == "#ifndef") cur[depth] = ! cur[depth]
next
}
else
cur[depth] = -1
}
else {
cur[depth] = 0
next
}
}
if (depth > 0) {
if ($0 == "#else") {
if (cur[depth] != -1) {
if (cur[depth - 1]) cur[depth] = ! cur[depth]
next
}
}
if ($0 == "#endif") {
depth--
if (cur[depth + 1] != -1) next
}
}
if (!symlist && cur[depth]) print
}
syntax highlighted by Code2HTML, v. 0.9.1