mirror of https://gerrit.osmocom.org/asn1c
standard modules are being picked up
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1045 59561ff5-6e30-0410-9f3c-9617f08c8826
This commit is contained in:
parent
d02739ba26
commit
79d4e63a56
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG("Module \"%s\" does not contain \"%s\" "
|
||||
"mentioned at line %d: %s",
|
||||
mod->ModuleName,
|
||||
identifier,
|
||||
ref->_lineno,
|
||||
strerror(errno)
|
||||
);
|
||||
strerror(errno));
|
||||
|
||||
if(asn1f_check_known_external_type(identifier) == 0) {
|
||||
errno = EEXIST; /* Exists somewhere */
|
||||
} else {
|
||||
errno = ESRCH;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ref_tc;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue