From 9c202860ad2bc391a0ac8bc2e99b3e5624d2b472 Mon Sep 17 00:00:00 2001 From: midipix Date: Wed, 30 Dec 2015 05:27:21 -0500 Subject: amgc_init_unit_meta(): initial implementation and integration. --- src/driver/amgc_unit_ctx.c | 4 +++ src/internal/apimagic_driver_impl.h | 1 + src/logic/amgc_init_unit_meta.c | 62 +++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/logic/amgc_init_unit_meta.c (limited to 'src') diff --git a/src/driver/amgc_unit_ctx.c b/src/driver/amgc_unit_ctx.c index a37706c..4da986a 100644 --- a/src/driver/amgc_unit_ctx.c +++ b/src/driver/amgc_unit_ctx.c @@ -154,8 +154,12 @@ int amgc_get_unit_ctx( ctx->uctx.path = &ctx->path; ctx->uctx.map = &ctx->map; ctx->uctx.cctx = &ctx->cctx; + ctx->uctx.meta = &ctx->meta; ctx->uctx.ccunit= &ctx->ccunit; + if (amgc_init_unit_meta(&ctx->uctx,&ctx->meta)) + return amgc_free_unit_ctx_impl(ctx,-1); + *pctx = &ctx->uctx; return 0; } diff --git a/src/internal/apimagic_driver_impl.h b/src/internal/apimagic_driver_impl.h index beb12b7..98f4465 100644 --- a/src/internal/apimagic_driver_impl.h +++ b/src/internal/apimagic_driver_impl.h @@ -25,6 +25,7 @@ struct amgc_unit_ctx_impl { struct amgc_input map; struct amgc_common_ctx cctx; struct amgc_unit_ctx uctx; + struct amgc_unit_meta meta; struct compilation_unit_t ccunit; }; diff --git a/src/logic/amgc_init_unit_meta.c b/src/logic/amgc_init_unit_meta.c new file mode 100644 index 0000000..fec660d --- /dev/null +++ b/src/logic/amgc_init_unit_meta.c @@ -0,0 +1,62 @@ +/**********************************************************/ +/* apimagic: cparser-based API normalization utility */ +/* Copyright (C) 2015--2016 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.APIMAGIC. */ +/**********************************************************/ + +#include +#include + +#include + +int amgc_init_unit_meta( + const struct amgc_unit_ctx * uctx, + struct amgc_unit_meta * meta) +{ + union entity_t * entity; + + entity = uctx->ccunit->ast->scope.first_entity; + + for (; entity; entity=entity->base.next) { + if (strcmp(*uctx->path,entity->base.pos.input_name)) + continue; + + if ((is_declaration(entity)) && (entity->declaration.implicit)) + meta->ngenerated++; + + else { + switch (entity->kind) { + case ENTITY_ENUM: + meta->nenums++; + break; + + case ENTITY_ENUM_VALUE: + meta->nenumvals++; + break; + + case ENTITY_TYPEDEF: + meta->ntypedefs++; + break; + + case ENTITY_STRUCT: + if (entity->base.symbol || entity->compound.alias) + meta->nstructs++; + break; + + case ENTITY_UNION: + if (entity->base.symbol || entity->compound.alias) + meta->nunions++; + break; + + case ENTITY_FUNCTION: + meta->nfunctions++; + break; + + default: + break; + } + } + } + + return 0; +} -- cgit v1.2.3