COMPONENTS OF support and other enhancements


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@185 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1parser.c b/libasn1parser/asn1parser.c
index b5d9e1e..6a3477d 100644
--- a/libasn1parser/asn1parser.c
+++ b/libasn1parser/asn1parser.c
@@ -17,7 +17,7 @@
 extern int asn1p_lineno;
 
 static int _asn1p_set_flags(enum asn1p_flags flags);
-static int _asn1p_assign_filename(asn1p_t *a, const char *fname);
+static int _asn1p_fix_modules(asn1p_t *a, const char *fname);
 
 /*
  * Parse the given buffer.
@@ -52,7 +52,7 @@
 
 	if(ret == 0) {
 		assert(a);
-		if(_asn1p_assign_filename(a, "-"))
+		if(_asn1p_fix_modules(a, "-"))
 			return NULL;	/* FIXME: destroy (a) */
 	} else {
 		assert(a == NULL);
@@ -104,7 +104,7 @@
 
 	if(ret == 0) {
 		assert(a);
-		if(_asn1p_assign_filename(a, filename))
+		if(_asn1p_fix_modules(a, filename))
 			return NULL;	/* FIXME: destroy (a) */
 	} else {
 		assert(a == NULL);
@@ -159,13 +159,38 @@
 	return 0;
 }
 
+/*
+ * Perform last touches.
+ */
+static void
+_asn1p_apply_module2expr(asn1p_expr_t *expr, asn1p_module_t *mod) {
+	asn1p_expr_t *e;
+
+	expr->module = mod;	/* This is a useful thing */
+
+	/*
+	 * Do it to children also.
+	 */
+	TQ_FOR(e, &(expr->members), next) {
+		_asn1p_apply_module2expr(e, mod);
+	}
+}
+
 static int
-_asn1p_assign_filename(asn1p_t *a, const char *fname) {
+_asn1p_fix_modules(asn1p_t *a, const char *fname) {
 	asn1p_module_t *mod;
 	TQ_FOR(mod, &(a->modules), mod_next) {
+		asn1p_expr_t *expr;
+
 		mod->source_file_name = strdup(fname);
 		if(mod->source_file_name == NULL)
 			return -1;
+
+		TQ_FOR(expr, &(mod->members), next) {
+			_asn1p_apply_module2expr(expr, mod);
+		}
 	}
 	return 0;
 }
+
+