aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2006-03-06 14:51:00 +0000
committerLev Walkin <vlm@lionet.info>2006-03-06 14:51:00 +0000
commit6b3ff543138c5e8ba660573ebb473b06f86e3a2c (patch)
tree0bf98489fbd5ff0e3367e257194cbd0c34318de0
parent4649987b1fa638eed2318b02f067434fdf3f80f8 (diff)
standard modules are being picked up
-rw-r--r--ChangeLog1
-rw-r--r--libasn1fix/asn1fix_retrieve.c59
-rw-r--r--libasn1fix/check_fixer.c19
-rw-r--r--libasn1parser/asn1p_oid.c20
-rw-r--r--libasn1parser/asn1p_oid.h3
-rw-r--r--libasn1print/asn1print.c5
-rw-r--r--tests/96-type-identifier-OK.asn122
7 files changed, 108 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index b6b2a5b4..379b88fa 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 42368582..161e0da1 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 6a13fda1..a64d9bd1 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 deb8c381..7d1c1a50 100644
--- a/libasn1parser/asn1p_oid.c
+++ b/libasn1parser/asn1p_oid.c
@@ -5,6 +5,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 d561c52d..489a3c5a 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 cb1445b7..83c31a10 100644
--- a/libasn1print/asn1print.c
+++ b/libasn1print/asn1print.c
@@ -45,6 +45,8 @@ asn1print(asn1p_t *asn, enum asn1print_flags flags) {
printf("<!-- XML DTD generated by asn1c-" VERSION " -->\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("<!-- ASN.1 module\n");
diff --git a/tests/96-type-identifier-OK.asn1 b/tests/96-type-identifier-OK.asn1
new file mode 100644
index 00000000..17ce5d3f
--- /dev/null
+++ b/tests/96-type-identifier-OK.asn1
@@ -0,0 +1,22 @@
+
+-- OK: Everything is fine
+
+-- iso.org.dod.internet.private.enterprise (1.3.6.1.4.1)
+-- .spelio.software.asn1c.test (9363.1.5.1)
+-- .96
+
+ModuleTypeIdentifier
+ { iso org(3) dod(6) internet (1) private(4) enterprise(1)
+ spelio(9363) software(1) asn1c(5) test(1) 96 }
+ DEFINITIONS ::=
+BEGIN
+
+ /*
+ * TYPE-IDENTIFIER shall be automatically available.
+ */
+ T ::= SEQUENCE {
+ id TYPE-IDENTIFIER.&id,
+ type TYPE-IDENTIFIER.&Type
+ }
+
+END