From 6b3ff543138c5e8ba660573ebb473b06f86e3a2c Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Mon, 6 Mar 2006 14:51:00 +0000 Subject: [PATCH] standard modules are being picked up --- ChangeLog | 1 + libasn1fix/asn1fix_retrieve.c | 59 ++++++++++++++++++++++++-------- libasn1fix/check_fixer.c | 19 ++++++++-- libasn1parser/asn1p_oid.c | 20 +++++++++++ libasn1parser/asn1p_oid.h | 3 +- libasn1print/asn1print.c | 5 ++- tests/96-type-identifier-OK.asn1 | 22 ++++++++++++ 7 files changed, 108 insertions(+), 21 deletions(-) create mode 100644 tests/96-type-identifier-OK.asn1 diff --git a/ChangeLog b/ChangeLog index b6b2a5b4a..379b88fa9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 0.9.21: 2006-Mar-06 + * skeletons/standard-modules directory is now used for standard types. 0.9.20: 2006-Mar-06 diff --git a/libasn1fix/asn1fix_retrieve.c b/libasn1fix/asn1fix_retrieve.c index 423685822..161e0da10 100644 --- a/libasn1fix/asn1fix_retrieve.c +++ b/libasn1fix/asn1fix_retrieve.c @@ -217,6 +217,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { return NULL; } } else { + /* Search inside the IMPORTS section of the current module */ imports_from = asn1f_lookup_in_imports(arg, mod, identifier); if(imports_from == NULL && errno != ESRCH) { /* @@ -231,6 +232,7 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { /* * The symbol is being imported from another module. */ + importing: if(imports_from) { asn1p_ref_t tmpref = *ref; asn1p_expr_t *expr; @@ -274,23 +276,52 @@ asn1f_lookup_symbol(arg_t *arg, asn1p_module_t *mod, asn1p_ref_t *ref) { if(strcmp(ref_tc->Identifier, identifier) == 0) break; } - if(ref_tc == NULL) { - DEBUG("Module \"%s\" does not contain \"%s\" " - "mentioned at line %d: %s", - mod->ModuleName, - identifier, - ref->_lineno, - strerror(errno) - ); - if(asn1f_check_known_external_type(identifier) == 0) { - errno = EEXIST; /* Exists somewhere */ - } else { - errno = ESRCH; + if(ref_tc) + return ref_tc; + + { + /* Search inside standard module */ + static asn1p_oid_t *uioc_oid; + if(!uioc_oid) { + asn1p_oid_arc_t arcs[] = { + { 1, "iso" }, + { 3, "org" }, + { 6, "dod" }, + { 1, "internet" }, + { 4, "private" }, + { 1, "enterprise" }, + { 9363, "spelio" }, + { 1, "software" }, + { 5, "asn1c" }, + { 3, "standard-modules" }, + { 0, "auto-imported" }, + { 1, 0 } + }; + uioc_oid = asn1p_oid_construct(arcs, + sizeof(arcs)/sizeof(arcs[0])); + } + if(!imports_from && mod->module_oid + && asn1p_oid_compare(mod->module_oid, uioc_oid)) { + imports_from = asn1f_lookup_module(arg, + "ASN1C-UsefulInformationObjectClasses", + uioc_oid); + if(imports_from) goto importing; } - return NULL; } - return ref_tc; + DEBUG("Module \"%s\" does not contain \"%s\" " + "mentioned at line %d: %s", + mod->ModuleName, + identifier, + ref->_lineno, + strerror(errno)); + + if(asn1f_check_known_external_type(identifier) == 0) { + errno = EEXIST; /* Exists somewhere */ + } else { + errno = ESRCH; + } + return NULL; } diff --git a/libasn1fix/check_fixer.c b/libasn1fix/check_fixer.c index 6a13fda13..a64d9bd17 100644 --- a/libasn1fix/check_fixer.c +++ b/libasn1fix/check_fixer.c @@ -178,11 +178,23 @@ check(const char *fname, "yet parsing was successfull!\n", fname); r_value = -1; } + if(!asn) return r_value; + + if(r_value == 0) { + asn1p_t *std_asn; + std_asn = asn1p_parse_file("../skeletons/standard-modules/ASN1C-UsefulInformationObjectClasses.asn1", A1P_NOFLAGS); + if(std_asn) { + asn1p_module_t *mod; + while((mod = TQ_REMOVE(&(std_asn->modules), mod_next))) + TQ_ADD(&(asn->modules), mod, mod_next); + asn1p_free(std_asn); + } + } /* * Perform semantical checks and fixes. */ - if(asn && r_value == 0) { + if(r_value == 0) { int ret; if(expected_fix_code) @@ -214,14 +226,15 @@ check(const char *fname, * Check validity of some values, if grammar has special * instructions for that. */ - if(asn && r_value == 0) { + if(r_value == 0) { if(post_fix_check(asn)) r_value = -1; } /* - * TODO: destroy the asn. + * Destroy the asn. */ + asn1p_free(asn); return r_value; } diff --git a/libasn1parser/asn1p_oid.c b/libasn1parser/asn1p_oid.c index deb8c381d..7d1c1a50b 100644 --- a/libasn1parser/asn1p_oid.c +++ b/libasn1parser/asn1p_oid.c @@ -4,6 +4,26 @@ #include "asn1parser.h" +asn1p_oid_t * +asn1p_oid_construct(asn1p_oid_arc_t *arc, int narcs) { + asn1p_oid_t *oid; + + if(narcs <= 0) + return NULL; + + oid = asn1p_oid_new(); + if(oid) { + for(; narcs--; arc++) { + if(asn1p_oid_add_arc(oid, arc)) { + asn1p_oid_free(oid); + return NULL; + } + } + } + + return oid; +} + asn1p_oid_t * asn1p_oid_new() { return calloc(1, sizeof(asn1p_oid_t)); diff --git a/libasn1parser/asn1p_oid.h b/libasn1parser/asn1p_oid.h index d561c52d6..489a3c5a6 100644 --- a/libasn1parser/asn1p_oid.h +++ b/libasn1parser/asn1p_oid.h @@ -41,9 +41,10 @@ typedef struct asn1p_oid_s { } asn1p_oid_t; /* - * OID constructor. + * OID constructors. */ asn1p_oid_t *asn1p_oid_new(void); +asn1p_oid_t *asn1p_oid_construct(asn1p_oid_arc_t *, int narcs); /* * Add another arc using given one as a template diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index cb1445b79..83c31a10b 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -45,6 +45,8 @@ asn1print(asn1p_t *asn, enum asn1print_flags flags) { printf("\n\n"); TQ_FOR(mod, &(asn->modules), mod_next) { + if(mod->_tags & MT_STANDARD_MODULE) + return 0; /* Ignore modules imported from skeletons */ if(modno++) printf("\n"); asn1print_module(asn, mod, flags); } @@ -62,9 +64,6 @@ static int asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) { asn1p_expr_t *tc; - if(mod->_tags & MT_STANDARD_MODULE) - return 0; /* Ignore modules imported from skeletons */ - if(flags & APF_PRINT_XML_DTD) printf("