+sub add_flag {
+# manage string like: "<ann_flag,type_flag,body_flag>"
+# "ann_flag" may be one of "ann_YES", "ann_NO"
+# "type_flag" may be one of "types_NO", "types_YES", "types_ANN"
+# "body_flag" may be one of "body_NO", "body_YES", "body_ANN"
+# when adding a flag the max between the current flag and the new flag
+# is taken, the orders are ann_NO < ann_YES, types_NO < types_YES <
+# types_ANN and body_NO < body_YES < body_ANN
+ my ($flagtype,$newflag,$str) = @_;
+ $str = "<,,>" if ($str eq "");
+ ($str =~ s/^<(.*,.*,.*)>$/$1/) or die "Internal error: ".
+ "wrong string format for flag adding in $str";
+ my ($annflag,$typeflag,$bodyflag) = split /,/,$str;
+ if ($flagtype eq "ann") { # ANN flag handling
+ if ($newflag eq "YES") {
+ $annflag = "YES";
+ } elsif ($newflag eq "NO") {
+ $annflag = "NO" unless ($annflag eq "YES");
+ } else {
+ die "Internal error: annflag must be \"YES\" or \"NO\"";
+ }
+ } elsif ($flagtype eq "types") { # TYPES flag handling
+ if ($newflag eq "ANN") {
+ $typeflag = "ANN";
+ } elsif ($newflag eq "YES") {
+ $typeflag = "YES" unless ($typeflag eq "ANN");
+ } elsif ($newflag eq "NO") {
+ $typeflag = "NO"
+ unless (($typeflag eq "ANN") or ($typeflag eq "YES"));
+ } else {
+ die "Internal error: typeflag must be \"YES\", \"NO\" or \"ANN\"";
+ }
+ } elsif ($flagtype eq "body") { # BODY flag handling
+ if ($newflag eq "ANN") {
+ $bodyflag = "ANN";
+ } elsif ($newflag eq "YES") {
+ $bodyflag = "YES" unless ($bodyflag eq "ANN");
+ } elsif ($newflag eq "NO") {
+ $bodyflag = "NO"
+ unless (($bodyflag eq "ANN") or ($bodyflag eq "YES"));
+ } else {
+ die "Internal error: typeflag must be \"YES\", \"NO\" or \"ANN\"";
+ }
+ } else {
+ die "Internal error: unsupported flagtype \"$flagtype\"";
+ }
+ $str = "<$annflag,$typeflag,$bodyflag>";
+}
+