1*22ce4affSfengbojiang#!/usr/bin/perl -w
2*22ce4affSfengbojiang
3*22ce4affSfengbojiangmy $usage = <<EOT;
4*22ce4affSfengbojiangusage: config-enum enum [file ...]
5*22ce4affSfengbojiang
6*22ce4affSfengbojiangReturns the elements from an enum declaration.
7*22ce4affSfengbojiang
8*22ce4affSfengbojiang"Best effort": we're not building an entire C interpreter here!
9*22ce4affSfengbojiangEOT
10*22ce4affSfengbojiang
11*22ce4affSfengbojianguse warnings;
12*22ce4affSfengbojianguse strict;
13*22ce4affSfengbojianguse Getopt::Std;
14*22ce4affSfengbojiang
15*22ce4affSfengbojiangmy %opts;
16*22ce4affSfengbojiang
17*22ce4affSfengbojiangif (!getopts("", \%opts) || @ARGV < 1) {
18*22ce4affSfengbojiang	print $usage;
19*22ce4affSfengbojiang	exit 2;
20*22ce4affSfengbojiang}
21*22ce4affSfengbojiang
22*22ce4affSfengbojiangmy $enum = shift;
23*22ce4affSfengbojiang
24*22ce4affSfengbojiangmy $in_enum = 0;
25*22ce4affSfengbojiang
26*22ce4affSfengbojiangwhile (<>) {
27*22ce4affSfengbojiang	# comments
28*22ce4affSfengbojiang	s/\/\*.*\*\///;
29*22ce4affSfengbojiang	if (m/\/\*/) {
30*22ce4affSfengbojiang		while ($_ .= <>) {
31*22ce4affSfengbojiang			last if s/\/\*.*\*\///s;
32*22ce4affSfengbojiang		}
33*22ce4affSfengbojiang	}
34*22ce4affSfengbojiang
35*22ce4affSfengbojiang	# preprocessor stuff
36*22ce4affSfengbojiang	next if /^#/;
37*22ce4affSfengbojiang
38*22ce4affSfengbojiang	# find our enum
39*22ce4affSfengbojiang	$in_enum = 1 if s/^\s*enum\s+${enum}(?:\s|$)//;
40*22ce4affSfengbojiang	next unless $in_enum;
41*22ce4affSfengbojiang
42*22ce4affSfengbojiang	# remove explicit values
43*22ce4affSfengbojiang	s/\s*=[^,]+,/,/g;
44*22ce4affSfengbojiang
45*22ce4affSfengbojiang	# extract each identifier
46*22ce4affSfengbojiang	while (m/\b([a-z_][a-z0-9_]*)\b/ig) {
47*22ce4affSfengbojiang		print $1, "\n";
48*22ce4affSfengbojiang	}
49*22ce4affSfengbojiang
50*22ce4affSfengbojiang	#
51*22ce4affSfengbojiang	# don't exit: there may be multiple versions of the same enum, e.g.
52*22ce4affSfengbojiang	# inside different #ifdef blocks. Let's explicitly return all of
53*22ce4affSfengbojiang	# them and let external tooling deal with it.
54*22ce4affSfengbojiang	#
55*22ce4affSfengbojiang	$in_enum = 0 if m/}\s*;/;
56*22ce4affSfengbojiang}
57*22ce4affSfengbojiang
58*22ce4affSfengbojiangexit 0;
59