aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1fix
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 /libasn1fix
parent4649987b1fa638eed2318b02f067434fdf3f80f8 (diff)
standard modules are being picked up
Diffstat (limited to 'libasn1fix')
-rw-r--r--libasn1fix/asn1fix_retrieve.c59
-rw-r--r--libasn1fix/check_fixer.c19
2 files changed, 61 insertions, 17 deletions
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;
}