more precise OER and PER code bundling
diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c
index c734062..2aaee05 100644
--- a/libasn1compiler/asn1c_save.c
+++ b/libasn1compiler/asn1c_save.c
@@ -38,10 +38,10 @@
     TI_INCLUDED_FROM_CMDLINE
 };
 
-static int asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *, int, char **);
+static int asn1c_dump_streams(arg_t *arg, asn1c_dep_chainset *, int, char **);
 static int asn1c_print_streams(arg_t *arg);
-static int asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *, int, char **);
-static int asn1c_copy_over(arg_t *arg, char *path);
+static int asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *, int, char **);
+static int asn1c_copy_over(arg_t *arg, const char *path, const char *msg);
 static int identical_files(const char *fname1, const char *fname2);
 static int need_to_generate_pdu_collection(arg_t *arg);
 static abuf *generate_pdu_collection(arg_t *arg);
@@ -54,8 +54,8 @@
 static int asn1c__pdu_type_lookup(const char *typename);
 
 static int
-asn1c__save_library_makefile(arg_t *arg, const asn1c_fdeps_t *deps, const char *datadir, const char *makefile_name) {
-	asn1c_fdeps_t *dlist;
+asn1c__save_library_makefile(arg_t *arg, const asn1c_dep_chainset *deps,
+                             const char *datadir, const char *makefile_name) {
 	asn1p_module_t *mod;
     FILE *mkf;
 
@@ -90,49 +90,51 @@
 	/*
 	 * Move necessary skeleton files and add them to Makefile.am.targets.
 	 */
-	dlist = asn1c_deps_flatten(deps);
-	if(dlist) {
-		char buf[8129];
+    asn1c_dep_chain *dlist = asn1c_deps_flatten(deps, ~FDEP_CONVERTER);
+    if(dlist) {
+		char dstpath[PATH_MAX];
 		char *dir_end;
 		size_t dlen = strlen(datadir);
 
-		assert(dlen < (sizeof(buf) / 2 - 2));
-		memcpy(buf, datadir, dlen);
-		dir_end = buf + dlen;
+		assert(dlen < (sizeof(dstpath) / 2 - 2));
+		memcpy(dstpath, datadir, dlen);
+		dir_end = dstpath + dlen;
 		*dir_end++ = '/';
 
-		for(int i = 0; i < dlist->el_count; i++) {
+        for(size_t i = 0; i < dlist->deps_count; i++) {
+            char where[32]; /* Location of the */
 			char *what_kind;	/* HEADERS or SOURCES */
-			char *fname = dlist->elements[i]->filename;
+            const asn1c_dep_filename *dep_file = dlist->deps[i];
+			char *fname = dep_file->filename;
 			char *dotH;
 
-			assert(strlen(fname) < (sizeof(buf) / 2));
+			assert(strlen(fname) < (sizeof(dstpath) / 2));
 			strcpy(dir_end, fname);
 
-            if(dlist->elements[i]->usage == FDEP_CONVERTER
-               && !(arg->flags & A1C_GEN_EXAMPLE))
-                continue;
+            if(arg->flags & A1C_DEBUG) {
+                snprintf(where, sizeof(where), "(line %d col %d)",
+                         dep_file->lineno, dep_file->column);
+            } else {
+                where[0] = '\0';
+            }
 
-            if(asn1c_copy_over(arg, buf) == -1) {
+            if(asn1c_copy_over(arg, dstpath, where) == -1) {
 				safe_fprintf(mkf, ">>>ABORTED<<<");
 				fclose(mkf);
 				return -1;
 			}
 
-			/* no CONVERTER data in Makefile.am.targets */
-			if(dlist->elements[i]->usage != FDEP_CONVERTER) {
-				/* HEADERS versus SOURCES */
-				dotH = strrchr(fname, 'h');
-				if(dotH && fname<dotH && dotH[-1] == '.' && !dotH[1])
-					what_kind = "HEADERS";
-				else
-					what_kind = "SOURCES";
-				safe_fprintf(mkf, "ASN_MODULE_%s+=%s\n",
-					what_kind, fname);
-			}
+            /* HEADERS versus SOURCES */
+            dotH = strrchr(fname, 'h');
+            if(dotH && fname < dotH && dotH[-1] == '.' && !dotH[1]) {
+                what_kind = "HEADERS";
+            } else {
+                what_kind = "SOURCES";
+            }
+            safe_fprintf(mkf, "ASN_MODULE_%s+=%s\n", what_kind, fname);
 		}
 
-		asn1c_deps_freelist(dlist);
+		asn1c_dep_chain_free(dlist);
 	}
 
 	safe_fprintf(
@@ -156,8 +158,8 @@
 }
 
 static int
-asn1c__save_example_makefile(arg_t *arg, const asn1c_fdeps_t *deps,
-                             const char *makefile_name,
+asn1c__save_example_makefile(arg_t *arg, const asn1c_dep_chainset *deps,
+                             const char *datadir, const char *makefile_name,
                              const char *library_makefile_name, int argc,
                              char **argv) {
     FILE *mkf;
@@ -180,15 +182,21 @@
         need_to_generate_pdu_collection(arg) ? "-DASN_PDU_COLLECTION " : "");
 
     if(arg->flags & A1C_GEN_EXAMPLE) {
-        asn1c_fdeps_t *dlist = asn1c_deps_flatten(deps);
+        asn1c_dep_chain *dlist = asn1c_deps_flatten(deps, FDEP_CONVERTER);
         if(dlist) {
-            /* only CONVERTER data in the makefile */
-            for(int i = 0; i < dlist->el_count; i++) {
-                if(dlist->elements[i]->usage == FDEP_CONVERTER) {
-                    safe_fprintf(mkf, "\\\n\t%s", dlist->elements[i]->filename);
+            for(size_t i = 0; i < dlist->deps_count; i++) {
+                char dstpath[PATH_MAX];
+                int ret = snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir,
+                                   dlist->deps[i]->filename);
+                assert(ret > 0 && (size_t)ret < sizeof(dstpath));
+                if(asn1c_copy_over(arg, dstpath, "implicit") == -1) {
+                    safe_fprintf(mkf, ">>>ABORTED<<<");
+                    fclose(mkf);
+                    return -1;
                 }
+                safe_fprintf(mkf, "\\\n\t%s", dlist->deps[i]->filename);
             }
-            asn1c_deps_freelist(dlist);
+            asn1c_dep_chain_free(dlist);
         }
     }
 
@@ -237,7 +245,6 @@
 int
 asn1c_save_compiled_output(arg_t *arg, const char *datadir,
 		int argc, int optc, char **argv) {
-    asn1c_fdeps_t *deps = 0;
     int ret = -1;
 
     /*
@@ -247,6 +254,7 @@
         return -1;
     }
 
+    asn1c_dep_chainset *deps;
     do {
         asn1p_module_t *mod;
 
@@ -281,14 +289,14 @@
         if(ret) break;
 
         if(arg->flags & A1C_GEN_EXAMPLE) {
-            ret = asn1c__save_example_makefile(arg, deps, "Makefile.am.example",
-                                               "Makefile.am.libasncodec", argc,
-                                               argv);
+            ret = asn1c__save_example_makefile(
+                arg, deps, datadir, "Makefile.am.example",
+                "Makefile.am.libasncodec", argc, argv);
             if(ret) break;
         }
     } while(0);
 
-    asn1c_deps_freelist(deps);
+    asn1c_dep_chainset_free(deps);
     asn1c__cleanup_pdu_type();
 
     return ret;
@@ -298,8 +306,9 @@
  * Dump the streams.
  */
 static int
-asn1c_dump_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv)  {
-	if(arg->flags & A1C_PRINT_COMPILED) {
+asn1c_dump_streams(arg_t *arg, asn1c_dep_chainset *deps, int optc,
+                   char **argv) {
+    if(arg->flags & A1C_PRINT_COMPILED) {
 		return asn1c_print_streams(arg);
 	} else {
 		return asn1c_save_streams(arg, deps, optc, argv);
@@ -330,8 +339,9 @@
 }
 
 static int
-asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) {
-	asn1p_expr_t *expr = arg->expr;
+asn1c_save_streams(arg_t *arg, asn1c_dep_chainset *deps, int optc,
+                   char **argv) {
+    asn1p_expr_t *expr = arg->expr;
 	compiler_streams_t *cs = expr->data;
 	out_chunk_t *ot;
 	FILE *fp_c, *fp_h;
@@ -373,7 +383,7 @@
 	if(TQ_FIRST(&(cs->destination[idx].chunks)) && *msg)		\
 		safe_fprintf(fp, "\n/* %s */\n", msg);			\
 	TQ_FOR(ot, &(cs->destination[idx].chunks), next) {		\
-		if(actdep) asn1c_activate_dependency(deps, 0, ot->buf);	\
+		if(actdep) asn1c_activate_dependency(deps, ot->buf, header_id);	\
 		safe_fwrite(ot->buf, ot->len, 1, fp);			\
 	}								\
 } while(0)
@@ -554,7 +564,7 @@
 }
 
 static int
-asn1c_copy_over(arg_t *arg, char *path) {
+asn1c_copy_over(arg_t *arg, const char *path, const char *msg) {
 #ifdef	_WIN32
 	int use_real_copy = 1;
 #else
@@ -595,10 +605,12 @@
 		}
 	}
 
-	safe_fprintf(stderr, "%s %s\t-> %s\n",
-		use_real_copy ? "Copied" : "Symlinked", path, fname);
+    const int has_msg = msg && *msg;
+    safe_fprintf(stderr, "%s %s\t-> %s%s%s\n",
+                 use_real_copy ? "Copied" : "Symlinked", path, fname,
+                 has_msg ? " " : "", has_msg ? msg : "");
 
-	return 1;
+    return 1;
 }