mirror of https://gerrit.osmocom.org/asn1c
standard modules are being picked up
This commit is contained in:
parent
4649987b1f
commit
6b3ff54313
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
0.9.21: 2006-Mar-06
|
0.9.21: 2006-Mar-06
|
||||||
|
|
||||||
* skeletons/standard-modules directory is now used for standard types.
|
* skeletons/standard-modules directory is now used for standard types.
|
||||||
|
|
||||||
0.9.20: 2006-Mar-06
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/* Search inside the IMPORTS section of the current module */
|
||||||
imports_from = asn1f_lookup_in_imports(arg, mod, identifier);
|
imports_from = asn1f_lookup_in_imports(arg, mod, identifier);
|
||||||
if(imports_from == NULL && errno != ESRCH) {
|
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.
|
* The symbol is being imported from another module.
|
||||||
*/
|
*/
|
||||||
|
importing:
|
||||||
if(imports_from) {
|
if(imports_from) {
|
||||||
asn1p_ref_t tmpref = *ref;
|
asn1p_ref_t tmpref = *ref;
|
||||||
asn1p_expr_t *expr;
|
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)
|
if(strcmp(ref_tc->Identifier, identifier) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(ref_tc == NULL) {
|
if(ref_tc)
|
||||||
DEBUG("Module \"%s\" does not contain \"%s\" "
|
return ref_tc;
|
||||||
"mentioned at line %d: %s",
|
|
||||||
mod->ModuleName,
|
{
|
||||||
identifier,
|
/* Search inside standard module */
|
||||||
ref->_lineno,
|
static asn1p_oid_t *uioc_oid;
|
||||||
strerror(errno)
|
if(!uioc_oid) {
|
||||||
);
|
asn1p_oid_arc_t arcs[] = {
|
||||||
if(asn1f_check_known_external_type(identifier) == 0) {
|
{ 1, "iso" },
|
||||||
errno = EEXIST; /* Exists somewhere */
|
{ 3, "org" },
|
||||||
} else {
|
{ 6, "dod" },
|
||||||
errno = ESRCH;
|
{ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -178,11 +178,23 @@ check(const char *fname,
|
||||||
"yet parsing was successfull!\n", fname);
|
"yet parsing was successfull!\n", fname);
|
||||||
r_value = -1;
|
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.
|
* Perform semantical checks and fixes.
|
||||||
*/
|
*/
|
||||||
if(asn && r_value == 0) {
|
if(r_value == 0) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if(expected_fix_code)
|
if(expected_fix_code)
|
||||||
|
@ -214,14 +226,15 @@ check(const char *fname,
|
||||||
* Check validity of some values, if grammar has special
|
* Check validity of some values, if grammar has special
|
||||||
* instructions for that.
|
* instructions for that.
|
||||||
*/
|
*/
|
||||||
if(asn && r_value == 0) {
|
if(r_value == 0) {
|
||||||
if(post_fix_check(asn))
|
if(post_fix_check(asn))
|
||||||
r_value = -1;
|
r_value = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: destroy the asn.
|
* Destroy the asn.
|
||||||
*/
|
*/
|
||||||
|
asn1p_free(asn);
|
||||||
|
|
||||||
return r_value;
|
return r_value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,26 @@
|
||||||
|
|
||||||
#include "asn1parser.h"
|
#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_t *
|
||||||
asn1p_oid_new() {
|
asn1p_oid_new() {
|
||||||
return calloc(1, sizeof(asn1p_oid_t));
|
return calloc(1, sizeof(asn1p_oid_t));
|
||||||
|
|
|
@ -41,9 +41,10 @@ typedef struct asn1p_oid_s {
|
||||||
} asn1p_oid_t;
|
} asn1p_oid_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OID constructor.
|
* OID constructors.
|
||||||
*/
|
*/
|
||||||
asn1p_oid_t *asn1p_oid_new(void);
|
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
|
* 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");
|
printf("<!-- XML DTD generated by asn1c-" VERSION " -->\n\n");
|
||||||
|
|
||||||
TQ_FOR(mod, &(asn->modules), mod_next) {
|
TQ_FOR(mod, &(asn->modules), mod_next) {
|
||||||
|
if(mod->_tags & MT_STANDARD_MODULE)
|
||||||
|
return 0; /* Ignore modules imported from skeletons */
|
||||||
if(modno++) printf("\n");
|
if(modno++) printf("\n");
|
||||||
asn1print_module(asn, mod, flags);
|
asn1print_module(asn, mod, flags);
|
||||||
}
|
}
|
||||||
|
@ -62,9 +64,6 @@ static int
|
||||||
asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) {
|
asn1print_module(asn1p_t *asn, asn1p_module_t *mod, enum asn1print_flags flags) {
|
||||||
asn1p_expr_t *tc;
|
asn1p_expr_t *tc;
|
||||||
|
|
||||||
if(mod->_tags & MT_STANDARD_MODULE)
|
|
||||||
return 0; /* Ignore modules imported from skeletons */
|
|
||||||
|
|
||||||
if(flags & APF_PRINT_XML_DTD)
|
if(flags & APF_PRINT_XML_DTD)
|
||||||
printf("<!-- ASN.1 module\n");
|
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