regcomp.pl: Teach to handle wider range of exprs
authorKarl Williamson <khw@khw-desktop.(none)>
Tue, 20 Jul 2010 03:46:49 +0000 (21:46 -0600)
committerRafael Garcia-Suarez <rgs@consttype.org>
Thu, 29 Jul 2010 10:10:18 +0000 (12:10 +0200)
In particular teach it to handle definitions using <<, e.g.
    #define SYMBOL (1<<3)
and to remember previous symbol definitons in the file so that symbol
can be  used in later definitions.

regcomp.pl

index 9370487..aa0f0fe 100644 (file)
@@ -258,17 +258,32 @@ EOP
 
 open my $fh,"<","regexp.h" or die "Can't read regexp.h: $!";
 my %rxfv;
+my %definitions;    # Remember what the symbol definitions are
 my $val = 0;
 my %reverse;
 while (<$fh>) {
-    if (/#define\s+(RXf_\w+)\s+(0x[A-F\d]+)/i) {
-       my $newval = eval $2;
-       if($val & $newval) {
-           die sprintf "Both $1 and $reverse{$newval} use %08X", $newval;
-       }
+
+    # optional leading '_'.  Return symbol in $1, and strip it from
+    # rest of line
+    if (s/ \#define \s+ ( _? RXf_ \w+ ) \s+ //xi) {
+        chomp;
+        my $define = $1;
+        s: / \s* \* .*? \* \s* / : :x;    # Replace comments by a blank
+
+        # Replace any prior defined symbols by their values
+        foreach my $key (keys %definitions) {
+            s/\b$key\b/$definitions{$key}/g;
+        }
+        my $newval = eval $_;   # Get numeric definition
+
+        $definitions{$define} = $newval;
+
+        if($val & $newval) {
+            die sprintf "Both $define and $reverse{$newval} use %08X", $newval;
+        }
         $val|=$newval;
-        $rxfv{$1}= $newval;
-       $reverse{$newval} = $1;
+        $rxfv{$define}= $newval;
+        $reverse{$newval} = $define;
     }
 }    
 my %vrxf=reverse %rxfv;