From 0c91ec9d3ffdcc3a978eaa3bc02470462d34df7a Mon Sep 17 00:00:00 2001
From: midipix <writeonce@midipix.org>
Date: Sat, 30 Jan 2016 20:15:20 -0500
Subject: driver: --print-structs and --print-unions: initial integration.

---
 src/driver/amgc_driver_ctx.c        | 10 ++++++++++
 src/driver/amgc_unit_action.c       |  6 ++++++
 src/internal/apimagic_driver_impl.h |  2 ++
 src/output/amgc_output_compound.c   | 28 ++++++++++++++++++++++++++++
 src/output/amgc_output_entities.c   |  6 ++++++
 src/skin/amgc_skin_default.c        |  6 ++++++
 6 files changed, 58 insertions(+)

(limited to 'src')

diff --git a/src/driver/amgc_driver_ctx.c b/src/driver/amgc_driver_ctx.c
index 4489109..ffe319d 100644
--- a/src/driver/amgc_driver_ctx.c
+++ b/src/driver/amgc_driver_ctx.c
@@ -209,6 +209,16 @@ int amgc_get_driver_ctx(
 					if (!strcmp("primary",entry->arg))
 						ctx->actions[nactions++].subset = TYPE_ATOMIC;
 					break;
+
+				case TAG_PRINT_STRUCTS:
+					ctx->actions[nactions].type = AMGC_ACTION_OUTPUT;
+					ctx->actions[nactions++].action = AMGC_OUTPUT_STRUCT;
+					break;
+
+				case TAG_PRINT_UNIONS:
+					ctx->actions[nactions].type = AMGC_ACTION_OUTPUT;
+					ctx->actions[nactions++].action = AMGC_OUTPUT_UNION;
+					break;
 			}
 
 	ctx->ctx.program	= program;
diff --git a/src/driver/amgc_unit_action.c b/src/driver/amgc_unit_action.c
index b1d018a..29bc446 100644
--- a/src/driver/amgc_unit_action.c
+++ b/src/driver/amgc_unit_action.c
@@ -33,6 +33,12 @@ int amgc_perform_unit_action(
 			return amgc_output_unit_entities(
 				uctx,ENTITY_TYPEDEF,action->subset,
 				layout,fout);
+
+		case AMGC_OUTPUT_STRUCT:
+			return amgc_output_unit_structs(uctx,layout,fout);
+
+		case AMGC_OUTPUT_UNION:
+			return amgc_output_unit_unions(uctx,layout,fout);
 	}
 
 	return -1;
diff --git a/src/internal/apimagic_driver_impl.h b/src/internal/apimagic_driver_impl.h
index c3aa6a6..27f1f15 100644
--- a/src/internal/apimagic_driver_impl.h
+++ b/src/internal/apimagic_driver_impl.h
@@ -21,6 +21,8 @@ enum app_tags {
 	TAG_PRINT_ENUMS,
 	TAG_LIST_ENUMS,
 	TAG_PRINT_TYPEDEFS,
+	TAG_PRINT_STRUCTS,
+	TAG_PRINT_UNIONS,
 	TAG_LANG_STD,
 };
 
diff --git a/src/output/amgc_output_compound.c b/src/output/amgc_output_compound.c
index 07bd730..fc95af7 100644
--- a/src/output/amgc_output_compound.c
+++ b/src/output/amgc_output_compound.c
@@ -346,3 +346,31 @@ int amgc_output_union(
 	else
 		return -1;
 }
+
+int  amgc_output_unit_structs(
+	const struct amgc_unit_ctx *	uctx,
+	const struct amgc_layout *	layout,
+	FILE *				fout)
+{
+	const struct amgc_entity * aentity;
+
+	for (aentity=uctx->entities->structs; aentity->entity; aentity++)
+		if (output_compound_entity(uctx,aentity,layout,fout))
+			return -1;
+
+	return 0;
+}
+
+int  amgc_output_unit_unions(
+	const struct amgc_unit_ctx *	uctx,
+	const struct amgc_layout *	layout,
+	FILE *				fout)
+{
+	const struct amgc_entity * aentity;
+
+	for (aentity=uctx->entities->unions; aentity->entity; aentity++)
+		if (output_compound_entity(uctx,aentity,layout,fout))
+			return -1;
+
+	return 0;
+}
diff --git a/src/output/amgc_output_entities.c b/src/output/amgc_output_entities.c
index 9d8d017..c1618c2 100644
--- a/src/output/amgc_output_entities.c
+++ b/src/output/amgc_output_entities.c
@@ -40,6 +40,12 @@ int amgc_output_unit_entities(
 
 		case ENTITY_TYPEDEF:
 			return output_typedefs(uctx,subset,layout,fout);
+
+		case ENTITY_STRUCT:
+			return amgc_output_unit_structs(uctx,layout,fout);
+
+		case ENTITY_UNION:
+			return amgc_output_unit_unions(uctx,layout,fout);
 	}
 
 	return -1;
diff --git a/src/skin/amgc_skin_default.c b/src/skin/amgc_skin_default.c
index 80a003f..804985b 100644
--- a/src/skin/amgc_skin_default.c
+++ b/src/skin/amgc_skin_default.c
@@ -24,6 +24,12 @@ const struct argv_option amgc_default_options[] = {
 			"output forward declarations for "
 			"the translation unit's enums."},
 
+	{"print-structs",0,TAG_PRINT_STRUCTS,ARGV_OPTARG_NONE,0,0,0,
+			"output the translation unit's structs."},
+
+	{"print-unions",0,TAG_PRINT_UNIONS,ARGV_OPTARG_NONE,0,0,0,
+			"output the translation unit's unions."},
+
 	{"print-typedefs",0,TAG_PRINT_TYPEDEFS,ARGV_OPTARG_REQUIRED,0,
 			"primary",0,
 			"output (a subset of) the translation unit's "
-- 
cgit v1.2.3