diff options
author | midipix <writeonce@midipix.org> | 2015-12-30 05:27:21 -0500 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2016-01-01 22:50:24 -0500 |
commit | 9c202860ad2bc391a0ac8bc2e99b3e5624d2b472 (patch) | |
tree | 29e6995f8b40a2b019c71cea9b707f4d2d2385b9 /src | |
parent | f0e1b6834ba12762c51f2f1430238fac62ab47ef (diff) | |
download | apimagic-9c202860ad2bc391a0ac8bc2e99b3e5624d2b472.tar.bz2 apimagic-9c202860ad2bc391a0ac8bc2e99b3e5624d2b472.tar.xz |
amgc_init_unit_meta(): initial implementation and integration.
Diffstat (limited to 'src')
-rw-r--r-- | src/driver/amgc_unit_ctx.c | 4 | ||||
-rw-r--r-- | src/internal/apimagic_driver_impl.h | 1 | ||||
-rw-r--r-- | src/logic/amgc_init_unit_meta.c | 62 |
3 files changed, 67 insertions, 0 deletions
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 <cparser/ast/ast_t.h> +#include <cparser/ast/entity_t.h> + +#include <apimagic/apimagic.h> + +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; +} |