different marker semantics

diff --git a/libasn1parser/asn1p_expr.h b/libasn1parser/asn1p_expr.h
index 461f42d..2c284ff 100644
--- a/libasn1parser/asn1p_expr.h
+++ b/libasn1parser/asn1p_expr.h
@@ -173,18 +173,19 @@
 		asn1_integer_t tag_value;
 	} tag;
 
+	enum asn1p_expr_marker_e {
+		EM_NOMARK,
+		EM_INDIRECT	= 0x01,	/* 0001: Represent as pointer */
+		EM_OPTIONAL	= 0x03,	/* 0011: Optional member */
+		EM_DEFAULT	= 0x07,	/* 0111: FIXME: store the value */
+	} marker;
+	int unique;	/* UNIQUE */
+
 	/*
 	 * Whether automatic tagging is applicable for subtypes.
 	 */
 	int auto_tags_OK;
 
-	enum asn1p_expr_marker_e {
-		EM_NOMARK,
-		EM_OPTIONAL,
-		EM_DEFAULT,	/* FIXME: store the value somewhere. */
-	} marker;
-	int unique;	/* UNIQUE */
-
 	/*
 	 * Members of the constructed type.
 	 */
diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c
index e8281df..41b2b71 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -533,11 +533,10 @@
 			 * Print the expression as it were a stand-alone type.
 			 */
 			asn1print_expr(asn, mod, se, flags, level + 4);
-			switch(se->marker) {
-			case EM_NOMARK: break;
-			case EM_OPTIONAL: printf(" OPTIONAL"); break;
-			case EM_DEFAULT: printf(" DEFAULT <?>"); break;
-			}
+			if(se->marker & EM_DEFAULT)
+				printf(" DEFAULT <?>");
+			else if(se->marker & EM_OPTIONAL)
+				printf(" OPTIONAL");
 			if(TQ_NEXT(se, next)) {
 				printf(",");
 				INDENT("\n");