Generate automatically correct tests for %if and %elif
authorH. Peter Anvin <hpa@zytor.com>
Wed, 12 Sep 2007 02:12:07 +0000 (02:12 +0000)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 12 Sep 2007 02:12:07 +0000 (02:12 +0000)
Automatically generate macros to test for %if and %elif variants, which
are guaranteed to be correct across future changes.

pptok.pl
preproc.c

index df64cde..8fe0415 100755 (executable)
--- a/pptok.pl
+++ b/pptok.pl
@@ -27,6 +27,10 @@ while (defined($line = <IN>)) {
 }
 close(IN);
 
+@cctok = sort @cctok;
+@cond = sort @cond;
+
+# Generate the expanded list including conditionals
 foreach $ct (@cctok) {
     foreach $cc (@cond) {
        push(@pptok, $ct.$cc);
@@ -52,6 +56,16 @@ if ($what eq 'h') {
     }
     print OUT "    PP_INVALID = -1\n";
     print OUT "};\n";
+    print OUT "\n";
+
+    $first_cc = $cond[0];
+    $last_cc  = $cond[(scalar @cond)-1];
+
+    foreach $ct (@cctok) {
+       (my $cx = $ct) =~ s/\%//g;
+       print OUT "#define IS_PP_\U$cx\E(x) ((x) >= PP_\U$cx$first_cc\E && ";
+       print OUT "(x) <= PP_\U$cx$last_cc\E)\n";
+    }
 }
 
 #
index 8778a6b..68aea7e 100644 (file)
--- a/preproc.c
+++ b/preproc.c
@@ -272,10 +272,10 @@ static int inverse_ccs[] = {
  * Directive names.
  */
 /* If this is a an IF, ELIF, ELSE or ENDIF keyword */
-static int is_condition(int arg)
+static int is_condition(enum preproc_token arg)
 {
-    return ((arg >= PP_ELIF) && (arg <= PP_ENDIF)) ||
-        ((arg >= PP_IF) && (arg <= PP_IFSTR));
+    return IS_PP_IF(arg) || IS_PP_ELIF(arg) ||
+       (arg == PP_ELSE) || (arg == PP_ENDIF);
 }
 
 /* For TASM compatibility we need to be able to recognise TASM compatible