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