#!/usr/bin/env perl my $usage = <<EOT; usage: config-enum enum [file ...] Returns the elements from an enum declaration. "Best effort": we're not building an entire C interpreter here! EOT use warnings; use strict; use Getopt::Std; my %opts; if (!getopts("", \%opts) || @ARGV < 1) { print $usage; exit 2; } my $enum = shift; my $in_enum = 0; while (<>) { # comments s/\/\*.*\*\///; if (m/\/\*/) { while ($_ .= <>) { last if s/\/\*.*\*\///s; } } # preprocessor stuff next if /^#/; # find our enum $in_enum = 1 if s/^\s*enum\s+${enum}(?:\s|$)//; next unless $in_enum; # remove explicit values s/\s*=[^,]+,/,/g; # extract each identifier while (m/\b([a-z_][a-z0-9_]*)\b/ig) { print $1, "\n"; } # # don't exit: there may be multiple versions of the same enum, e.g. # inside different #ifdef blocks. Let's explicitly return all of # them and let external tooling deal with it. # $in_enum = 0 if m/}\s*;/; } exit 0;