aboutsummaryrefslogtreecommitdiffstats
path: root/libasn1parser
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-08-12 10:06:17 +0000
committerLev Walkin <vlm@lionet.info>2005-08-12 10:06:17 +0000
commit1ed22099a8ce508eb8b41459a549120c8cba4588 (patch)
tree02e66e70fb4852f6a6b1e397cce74caf28b27b9a /libasn1parser
parent58db695df8a1e34547db9b82d87877d7806f6357 (diff)
preliminary stupid things
Diffstat (limited to 'libasn1parser')
-rw-r--r--libasn1parser/asn1p_y.y98
1 files changed, 58 insertions, 40 deletions
diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y
index 8c714f1a..a2f31a8b 100644
--- a/libasn1parser/asn1p_y.y
+++ b/libasn1parser/asn1p_y.y
@@ -23,32 +23,37 @@ void asn1p_lexer_hack_push_encoding_control(void);
#define yylineno asn1p_lineno
extern int asn1p_lineno;
+/*
+ * This temporary variable is used to solve the shortcomings of 1-lookahead
+ * parser.
+ */
+static struct AssignedIdentifier *saved_aid;
static asn1p_value_t *
_convert_bitstring2binary(char *str, int base);
-#define checkmem(ptr) do { \
- if(!(ptr)) \
- return yyerror("Memory failure"); \
+#define checkmem(ptr) do { \
+ if(!(ptr)) \
+ return yyerror("Memory failure"); \
} while(0)
-#define CONSTRAINT_INSERT(root, constr_type, arg1, arg2) do { \
- if(arg1->type != constr_type) { \
- int __ret; \
- root = asn1p_constraint_new(yylineno); \
- checkmem(root); \
- root->type = constr_type; \
- __ret = asn1p_constraint_insert(root, \
- arg1); \
- checkmem(__ret == 0); \
- } else { \
- root = arg1; \
- } \
- if(arg2) { \
- int __ret \
- = asn1p_constraint_insert(root, arg2); \
- checkmem(__ret == 0); \
- } \
+#define CONSTRAINT_INSERT(root, lloc, constr_type, arg1, arg2) do { \
+ if(arg1->type != constr_type) { \
+ int __ret; \
+ root = asn1p_constraint_new(yylineno); \
+ checkmem(root); \
+ root->type = constr_type; \
+ __ret = asn1p_constraint_insert(root, \
+ arg1); \
+ checkmem(__ret == 0); \
+ } else { \
+ root = arg1; \
+ } \
+ if(arg2) { \
+ int __ret \
+ = asn1p_constraint_insert(root, arg2); \
+ checkmem(__ret == 0); \
+ } \
} while(0)
%}
@@ -68,6 +73,7 @@ static asn1p_value_t *
asn1p_constraint_t *a_constr; /* Constraint */
enum asn1p_constraint_type_e a_ctype;/* Constraint type */
asn1p_xports_t *a_xports; /* IMports/EXports */
+ struct AssignedIdentifier a_aid; /* Assigned Identifier */
asn1p_oid_t *a_oid; /* Object Identifier */
asn1p_oid_arc_t a_oid_arc; /* Single OID's arc */
struct asn1p_type_tag_s a_tag; /* A tag */
@@ -258,6 +264,7 @@ static asn1p_value_t *
%type <a_plist> ParameterArgumentList
%type <a_expr> ActualParameter
%type <a_expr> ActualParameterList
+%type <a_aid> AssignedIdentifier /* OID/DefinedValue */
%type <a_oid> ObjectIdentifier /* OID */
%type <a_oid> optObjectIdentifier /* Optional OID */
%type <a_oid> ObjectIdentifierBody
@@ -346,7 +353,7 @@ ModuleSpecification:
}
checkmem($$);
- $$->Identifier = $1;
+ $$->ModuleName = $1;
$$->module_oid = $2;
$$->module_flags = $4;
}
@@ -574,6 +581,10 @@ ModuleSpecificationElement:
*/
ImportsDefinition:
TOK_IMPORTS ImportsBundleSet ';' {
+ if(!saved_aid && 0)
+ return yyerror("Unterminated IMPORTS FROM, "
+ "expected semicolon ';'");
+ saved_aid = 0;
$$ = $2;
}
/*
@@ -596,11 +607,18 @@ ImportsBundleSet:
}
;
+AssignedIdentifier:
+ { memset(&$$, 0, sizeof($$)); }
+ | ObjectIdentifier { $$.oid = $1; };
+ /* | DefinedValue { $$.value = $1; }; // Handled through saved_aid */
+
ImportsBundle:
- ImportsList TOK_FROM TypeRefName optObjectIdentifier {
+ ImportsList TOK_FROM TypeRefName AssignedIdentifier {
$$ = $1;
- $$->from = $3;
- $$->from_oid = $4;
+ $$->fromModuleName = $3;
+ $$->identifier = $4;
+ /* This stupid thing is used for look-back hack. */
+ saved_aid = $$->identifier.oid ? 0 : &($$->identifier);
checkmem($$);
}
;
@@ -1520,14 +1538,14 @@ optConstraints:
Constraints:
SetOfConstraints {
- CONSTRAINT_INSERT($$, ACT_CA_SET, $1, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, 0);
}
| TOK_SIZE '(' ElementSetSpecs ')' {
/*
* This is a special case, for compatibility purposes.
* It goes without parentheses.
*/
- CONSTRAINT_INSERT($$, ACT_CT_SIZE, $3, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CT_SIZE, $3, 0);
}
;
@@ -1536,7 +1554,7 @@ SetOfConstraints:
$$ = $2;
}
| SetOfConstraints '(' ElementSetSpecs ')' {
- CONSTRAINT_INSERT($$, ACT_CA_SET, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_SET, $1, $3);
}
;
@@ -1548,15 +1566,15 @@ ElementSetSpecs:
asn1p_constraint_t *ct;
ct = asn1p_constraint_new(yylineno);
ct->type = ACT_EL_EXT;
- CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct);
}
| ElementSetSpec ',' TOK_ThreeDots ',' ElementSetSpec {
asn1p_constraint_t *ct;
ct = asn1p_constraint_new(yylineno);
ct->type = ACT_EL_EXT;
- CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct);
ct = $$;
- CONSTRAINT_INSERT($$, ACT_CA_CSV, ct, $5);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, ct, $5);
}
;
@@ -1565,16 +1583,16 @@ ElementSetSpec:
$$ = $1;
}
| TOK_ALL TOK_EXCEPT ConstraintSubtypeElement {
- CONSTRAINT_INSERT($$, ACT_CA_AEX, $3, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_AEX, $3, 0);
}
| ElementSetSpec Union ConstraintSubtypeElement {
- CONSTRAINT_INSERT($$, ACT_CA_UNI, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_UNI, $1, $3);
}
| ElementSetSpec Intersection ConstraintSubtypeElement {
- CONSTRAINT_INSERT($$, ACT_CA_INT, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_INT, $1, $3);
}
| ConstraintSubtypeElement Except ConstraintSubtypeElement {
- CONSTRAINT_INSERT($$, ACT_CA_EXC, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_EXC, $1, $3);
}
;
@@ -1718,10 +1736,10 @@ ContainedSubtype:
InnerTypeConstraint:
TOK_WITH TOK_COMPONENT SetOfConstraints {
- CONSTRAINT_INSERT($$, ACT_CT_WCOMP, $3, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMP, $3, 0);
}
| TOK_WITH TOK_COMPONENTS '{' WithComponentsList '}' {
- CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $4, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $4, 0);
}
;
@@ -1730,7 +1748,7 @@ WithComponentsList:
$$ = $1;
}
| WithComponentsList ',' WithComponentsElement {
- CONSTRAINT_INSERT($$, ACT_CT_WCOMPS, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CT_WCOMPS, $1, $3);
}
;
@@ -1794,13 +1812,13 @@ SimpleTableConstraint:
checkmem($$);
ct->type = ACT_EL_VALUE;
ct->value = asn1p_value_fromref(ref, 0);
- CONSTRAINT_INSERT($$, ACT_CA_CRC, ct, 0);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, ct, 0);
}
;
ComponentRelationConstraint:
SimpleTableConstraint '{' AtNotationList '}' {
- CONSTRAINT_INSERT($$, ACT_CA_CRC, $1, $3);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CRC, $1, $3);
}
;
@@ -1817,7 +1835,7 @@ AtNotationList:
checkmem(ct);
ct->type = ACT_EL_VALUE;
ct->value = asn1p_value_fromref($3, 0);
- CONSTRAINT_INSERT($$, ACT_CA_CSV, $1, ct);
+ CONSTRAINT_INSERT($$, @1, ACT_CA_CSV, $1, ct);
}
;