Add macros for checking individual features
authorFather Chrysostomos <sprout@cpan.org>
Fri, 23 Dec 2011 00:33:01 +0000 (16:33 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 24 Dec 2011 17:25:15 +0000 (09:25 -0800)
feature.h
regen/feature.pl

index 3ce6e85..a56ac8b 100644 (file)
--- a/feature.h
+++ b/feature.h
     (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints)
 #define CURRENT_FEATURE_BUNDLE (CURRENT_HINTS >> HINT_FEATURE_SHIFT)
 
+#define FEATURE_SAY_IS_ENABLED \
+    ( \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_515) \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("say")) \
+    )
+
+#define FEATURE_STATE_IS_ENABLED \
+    ( \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_515) \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("state")) \
+    )
+
+#define FEATURE_SWITCH_IS_ENABLED \
+    ( \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_510 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_515) \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("switch")) \
+    )
+
+#define FEATURE_EVALBYTES_IS_ENABLED \
+    ( \
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("evalbytes")) \
+    )
+
+#define FEATURE_ARYBASE_IS_ENABLED \
+    ( \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_DEFAULT && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_511) \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED_d("arybase")) \
+    )
+
+#define FEATURE___SUB___IS_ENABLED \
+    ( \
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("__SUB__")) \
+    )
+
+#define FEATURE_UNIEVAL_IS_ENABLED \
+    ( \
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_515 \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("unieval")) \
+    )
+
+#define FEATURE_UNICODE_IS_ENABLED \
+    ( \
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_515) \
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+        FEATURE_IS_ENABLED("unicode")) \
+    )
+
+
 #endif /* PERL_CORE or PERL_EXT */
 
 /* ex: set ro: */
index 18e2ece..914040e 100755 (executable)
@@ -68,6 +68,7 @@ for my $bund (
     sort { $a eq 'default' ? -1 : $b eq 'default' ? 1 : $a cmp $b }
          values %UniqueBundles
 ) {
+    next if $bund =~ /[^\d.]/ and $bund ne 'default';
     for (@{$feature_bundle{$bund}}) {
        if (@{$BundleRanges{$_} ||= []} == 2) {
            $BundleRanges{$_}[1] = $bund
@@ -186,6 +187,44 @@ print $h <<EOH;
     (PL_curcop == &PL_compiling ? PL_hints : PL_curcop->cop_hints)
 #define CURRENT_FEATURE_BUNDLE (CURRENT_HINTS >> HINT_FEATURE_SHIFT)
 
+EOH
+
+for (
+    sort { length $a <=> length $b } keys %feature, keys %default_feature
+) {
+    my($first,$last) =
+       map { (my $__ = uc) =~ y/.//d; $__ } @{$BundleRanges{$_}};
+    my $default = '';
+    my $name = $feature{$_}               # skip "no"
+           || ($default = '_d', substr $default_feature{$_}, 2);
+    my $NAME = uc $name;
+    if ($last) {
+       print $h <<EOH3;
+#define FEATURE_$NAME\_IS_ENABLED \\
+    ( \\
+       (CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_$first && \\
+        CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_$last) \\
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \\
+        FEATURE_IS_ENABLED$default("$name")) \\
+    )
+
+EOH3
+    }
+    else {
+       print $h <<EOH4;
+#define FEATURE_$NAME\_IS_ENABLED \\
+    ( \\
+       CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_$first \\
+     || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \\
+        FEATURE_IS_ENABLED$default("$name")) \\
+    )
+
+EOH4
+    }
+}
+
+print $h <<EOH;
+
 #endif /* PERL_CORE or PERL_EXT */
 EOH