Index: trunk/psModules/src/objects/mksource.pl
===================================================================
--- trunk/psModules/src/objects/mksource.pl	(revision 32633)
+++ trunk/psModules/src/objects/mksource.pl	(revision 34259)
@@ -1,3 +1,4 @@
 #!/usr/bin/env perl
+$DEBUG = 0;
 
 # this program takes the pmSourceIO_CMF.in.c template file and generates the .c version based on the given I/O format made
@@ -17,8 +18,6 @@
 	     "PS1_V2", 2,
 	     "PS1_V3", 3,
-	     "PS1_V4", 4);
-
-print "1: $cmfmodes{1}\n";
-print "PS1_V1: $cmfmodes{'PS1_V1'}\n";
+	     "PS1_V4", 4,
+    );
 
 open (FILE, "$template") || die "failed to open template $template\n";
@@ -35,4 +34,15 @@
 # @<MODE@ : remove and keep if cmfmode > MODE
 
+# XXX need to add features: split @foo,bar,baz@ by commas
+# treat each chunk as a rule
+# add the following options:
+# !MODE -- exclude the given entry (defaults to all, or is ALL required?)
+# * and ? regexp 
+
+# some examples:
+# @ALL,!PS1_V1@
+# @PS1_DV?@
+# @PS1_V?,!PS1_V1@
+
 foreach $line (@list) {
 
@@ -40,36 +50,123 @@
     $line =~ s|\@CMFMODE\@|$cmfmode|g;
     
-    if ($line =~ m|\@ALL\@|) {
-	$line =~ s|\@ALL\@\s*||;
+    # print and continue if we do not match @RULES@
+    unless ($line =~ m|\@.*\@|) { 
+	print "no rule\n" if $DEBUG;
+	print FILE $line;
+	next;
     }
 
-    ($isMode) = ($line =~ m|\@=(\S*)\@|);
-    ($gtMode) = ($line =~ m|\@>(\S*)\@|);
-    ($ltMode) = ($line =~ m|\@<(\S*)\@|);
+    # grab the rules and the rest of the line
+    ($prefix,$rules,$content) = ($line =~ m|(.*)\@(.*)\@\s*(.*)|);
     
-    if ($isMode) {
-	if ($isMode ne $cmfmode) { next; }
-	$line =~ s|\@=\S*\@\s*||;
+    # split the rules into separate items
+    @rules = split (",", $rules);
+
+    $keepLine = 0;
+    # does $cmfmode match any of the rules?
+    foreach $rule (@rules) {
+	print "rule: $rule\n" if $DEBUG;
+
+	# special rule "ALL"
+	if ($rule eq "ALL") { 
+	    print "ALL match\n" if $DEBUG;
+	    $keepLine = 1; 
+	    next; 
+	} # look for other rules (esp !foo)
+
+	# pure match
+	if ($cmfmode eq $rule) { 
+	    print "simple match\n" if $DEBUG;
+	    $keepLine = 1; 
+	    next; 
+	} # skip to end?
+
+	# NOT match
+	if ($rule =~ m|^!|) {
+	    print "NOT rule: $rule\n" if $DEBUG;
+	    ($realrule) = ($rule =~ m|^!(.*)|);
+	    if ($cmfmode eq $realrule) { $keepLine = 0; } # skip to end?
+	    next; 
+	}
+
+	# simple regexp: foo*
+	if ($rule =~ m|\*$|) {
+	    print "regexp * rule: $rule\n" if $DEBUG;
+	    ($realrule) = ($rule =~ m|(.*)\*$|);
+	    if ($cmfmode =~ m|$realrule|) { $keepLine = 1; } # skip to end?
+	    next; 
+	}
+
+	# simple regexp: foo?
+	if ($rule =~ m|\?$|) {
+	    print "regexp ? rule: $rule\n" if $DEBUG;
+	    ($realrule) = ($rule =~ m|(.*)\?$|);
+	    if (substr($cmfmode,0,-1) eq $realrule) { $keepLine = 1; } # skip to end?
+	    next; 
+	}
+
+	# rule: =FOO
+	if ($rule =~ m|^=|) {
+	    print "= rule: $rule\n" if $DEBUG;
+	    $realrule = substr($cmfmode,1);
+	    if ($cmfmode eq $realrule) { $keepLine = 1; } # skip to end?
+	    next; 
+	}
+
+	# only apply the < > <= >= rules if cmfmode is one of cmfmodes
+	# rule: >=FOO
+	if ($rule =~ m|^>=|) {
+	    print ">= rule: $rule\n" if $DEBUG;
+	    if ($cmfmodes{$cmfmode} == 0) { next; }
+	    $realrule = substr($rule,2);
+	    $thisLevel = $cmfmodes{$realrule};
+	    $myLevel = $cmfmodes{$cmfmode};
+	    print "levels: $cmfmode, $realrule, $myLevel, $thisLevel\n" if $DEBUG;
+	    if ($myLevel >= $thisLevel) { $keepLine = 1; }
+	    next; 
+	}
+
+	# rule: >FOO
+	if ($rule =~ m|^>|) {
+	    print "> rule: $rule\n" if $DEBUG;
+	    if ($cmfmodes{$cmfmode} == 0) { next; }
+	    $realrule = substr($rule,1);
+	    $thisLevel = $cmfmodes{$realrule};
+	    $myLevel = $cmfmodes{$cmfmode};
+	    print "levels: $cmfmode, $realrule, $myLevel, $thisLevel\n" if $DEBUG;
+	    if ($myLevel > $thisLevel) { $keepLine = 1; }
+	    next; 
+	}
+
+	# rule: <=FOO
+	if ($rule =~ m|^<=|) {
+	    print "<= rule: $rule\n" if $DEBUG;
+	    if ($cmfmodes{$cmfmode} == 0) { next; }
+	    $realrule = substr($rule,2);
+	    $thisLevel = $cmfmodes{$realrule};
+	    $myLevel = $cmfmodes{$cmfmode};
+	    print "levels: $cmfmode, $realrule, $myLevel, $thisLevel\n" if $DEBUG;
+	    if ($myLevel <= $thisLevel) { $keepLine = 1; }
+	    next; 
+	}
+
+	# rule: <FOO
+	if ($rule =~ m|^<|) {
+	    print "< rule: $rule\n" if $DEBUG;
+	    if ($cmfmodes{$cmfmode} == 0) { next; }
+	    $realrule = substr($rule,1);
+	    $thisLevel = $cmfmodes{$realrule};
+	    $myLevel = $cmfmodes{$cmfmode};
+	    print "levels: $cmfmode, $realrule, $myLevel, $thisLevel\n" if $DEBUG;
+	    if ($myLevel < $thisLevel) { $keepLine = 1; }
+	    next; 
+	}
+
     }
+    print "line: $line\n" if $DEBUG;
 
-    if ($gtMode) {
-	# print "gtMode : $line\n";
-	$thisLevel = $cmfmodes{$gtMode};
-	$myLevel = $cmfmodes{$cmfmode};
-	print "gtMode : $gtMode vs $cmfmode, $thisLevel, $myLevel\n";
-	if ($myLevel <= $thisLevel) { next; }
-	$line =~ s|\@>\S*\@\s*||;
+    if ($keepLine) {
+	print FILE "$prefix $content\n";
     }
-
-    if ($ltMode) {
-	# print "ltMode : $line\n";
-	$thisLevel = $cmfmodes{$ltMode};
-	$myLevel = $cmfmodes{$cmfmode};
-	print "ltMode : $ltMode vs $cmfmode, $thisLevel, $myLevel\n";
-	if ($myLevel >= $thisLevel) { next; }
-	$line =~ s|\@<\S*\@\s*||;
-    }
-
-    print FILE $line;
 }
 
