Commit adf863fc authored by Lev Walkin's avatar Lev Walkin

support parsing realnumber tokens in constraints

parent 3cf7c3a1
......@@ -9,6 +9,9 @@ int
asn1constraint_compatible(asn1p_expr_type_e expr_type,
enum asn1p_constraint_type_e constr_type, int fbless_SIZE) {
if(expr_type == ASN_BASIC_REAL)
return -1; /* Not yet supported */
/*
* X.680-0207, Table 9.
*/
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -27,6 +27,7 @@ int asn1p_lexer_constructs_year = 0;
int asn1p_as_pointer;
static asn1c_integer_t _lex_atoi(const char *ptr);
static double _lex_atod(const char *ptr);
/*
* Check that the type is defined in the year of the standard choosen.
......@@ -240,6 +241,13 @@ WSP [\t\r\v\f\n ]
return TOK_number;
}
[-+]?[0-9]+[.]?([eE][-+]?)?[0-9]+ {
asn1p_lval.a_dbl = _lex_atod(yytext);
if(errno == ERANGE)
return -1;
return TOK_realnumber;
}
ABSENT return TOK_ABSENT;
ALL return TOK_ALL;
ANY {
......@@ -564,3 +572,19 @@ _lex_atoi(const char *ptr) {
}
return value;
}
static double
_lex_atod(const char *ptr) {
double value;
errno = 0;
value = strtod(ptr, 0);
if(errno) {
fprintf(stderr,
"Value \"%s\" at line %d is outside of `double` range "
"in this compiler! Please contact the asn1c author.\n",
ptr, yylineno);
errno = ERANGE;
}
return value;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -92,6 +92,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
struct asn1p_expr_marker_s a_marker; /* OPTIONAL/DEFAULT */
enum asn1p_constr_pres_e a_pres; /* PRESENT/ABSENT/OPTIONAL */
asn1c_integer_t a_int;
double a_dbl;
char *tv_str;
struct {
char *buf;
......@@ -114,9 +115,10 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
%token <tv_str> TOK_hstring
%token <tv_str> TOK_identifier
%token <a_int> TOK_number
%token <a_int> TOK_number_negative
%token <a_dbl> TOK_realnumber
%token <a_int> TOK_tuple
%token <a_int> TOK_quadruple
%token <a_int> TOK_number_negative
%token <tv_str> TOK_typereference
%token <tv_str> TOK_capitalreference /* "CLASS1" */
%token <tv_str> TOK_typefieldreference /* "&Pork" */
......@@ -258,6 +260,7 @@ static void _fixup_anonymous_identifier(asn1p_expr_t *expr);
%type <a_value> SimpleValue
%type <a_value> DefinedValue
%type <a_value> SignedNumber
%type <a_value> RealValue
%type <a_expr> optComponentTypeLists
%type <a_expr> ComponentTypeLists
%type <a_expr> ComponentType
......@@ -1838,12 +1841,8 @@ SingleValue:
checkmem($$);
$$->type = ATV_TRUE;
}
| SignedNumber {
$$ = $1;
}
| RestrictedCharacterStringValue {
$$ = $1;
}
| RealValue
| RestrictedCharacterStringValue
| Identifier {
asn1p_ref_t *ref;
int ret;
......@@ -2136,6 +2135,14 @@ SignedNumber:
}
;
RealValue:
SignedNumber
| TOK_realnumber {
$$ = asn1p_value_fromdouble($1);
checkmem($$);
}
;
/*
* SEQUENCE definition.
* === EXAMPLE ===
......
/*-
* Copyright (c) 2003, 2004, 2005 Lev Walkin <vlm@lionet.info>.
* Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin <vlm@lionet.info>.
* All rights reserved.
* Redistribution and modifications are permitted subject to BSD license.
*/
......@@ -122,6 +122,9 @@ SET_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
ASN_DEBUG("Decoding %s as SET", td->name);
if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx))
_ASN_DECODE_FAILED;
/*
* Create the target structure if it is not present already.
*/
......@@ -862,6 +865,144 @@ cb_failed:
_ASN_ENCODE_FAILED;
}
asn_dec_rval_t
SET_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) {
asn_SET_specifics_t *specs = (asn_SET_specifics_t *)td->specifics;
void *st = *sptr; /* Target structure. */
int extpresent = 0; /* Extension additions are present */
uint8_t *opres; /* Presence of optional root members */
asn_per_data_t opmd;
asn_dec_rval_t rv;
int edx;
(void)constraints;
ASN_DEBUG("Decoding %s as SET", td->name);
if(_ASN_STACK_OVERFLOW_CHECK(opt_codec_ctx))
_ASN_DECODE_FAILED;
if(!st) {
st = *sptr = CALLOC(1, specs->struct_size);
if(!st) _ASN_DECODE_FAILED;
}
ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name);
/* Handle extensions */
if(specs->ext_before >= 0) {
extpresent = per_get_few_bits(pd, 1);
if(extpresent < 0) _ASN_DECODE_FAILED;
}
/* Prepare a place and read-in the presence bitmap */
if(specs->roms_count) {
opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1);
if(!opres) _ASN_DECODE_FAILED;
/* Get the presence map */
if(per_get_many_bits(pd, opres, 0, specs->roms_count)) {
FREEMEM(opres);
_ASN_DECODE_FAILED;
}
opmd.buffer = opres;
opmd.nboff = 0;
opmd.nbits = specs->roms_count;
ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)",
td->name, specs->roms_count, *opres);
} else {
opres = 0;
memset(&opmd, 0, sizeof opmd);
}
/*
* Get the sequence ROOT elements.
*/
for(edx = 0; edx < ((specs->ext_before < 0)
? td->elements_count : specs->ext_before + 1); edx++) {
asn_TYPE_member_t *elm = &td->elements[edx];
void *memb_ptr; /* Pointer to the member */
void **memb_ptr2; /* Pointer to that pointer */
/* Fetch the pointer to this member */
if(elm->flags & ATF_POINTER) {
memb_ptr2 = (void **)((char *)st + elm->memb_offset);
} else {
memb_ptr = (char *)st + elm->memb_offset;
memb_ptr2 = &memb_ptr;
}
/* Deal with optionality */
if(elm->optional) {
int present = per_get_few_bits(&opmd, 1);
ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)",
td->name, elm->name, present,
(int)opmd.nboff, (int)opmd.nbits);
if(present == 0) {
/* This element is not present */
if(elm->default_value) {
/* Fill-in DEFAULT */
if(elm->default_value(1, memb_ptr2)) {
FREEMEM(opres);
_ASN_DECODE_FAILED;
}
}
/* The member is just not present */
continue;
}
/* Fall through */
}
/* Fetch the member from the stream */
ASN_DEBUG("Decoding member %s in %s", elm->name, td->name);
rv = elm->type->uper_decoder(opt_codec_ctx, elm->type,
elm->per_constraints, memb_ptr2, pd);
if(rv.code != RC_OK) {
ASN_DEBUG("Failed decode %s in %s",
elm->name, td->name);
FREEMEM(opres);
return rv;
}
}
/*
* Deal with extensions.
*/
if(extpresent) {
ASN_DEBUG("Extensibility for %s: NOT IMPLEMENTED", td->name);
_ASN_DECODE_FAILED;
} else {
for(edx = specs->roms_count; edx < specs->roms_count
+ specs->aoms_count; edx++) {
asn_TYPE_member_t *elm = &td->elements[edx];
void *memb_ptr; /* Pointer to the member */
void **memb_ptr2; /* Pointer to that pointer */
if(!elm->default_value) continue;
/* Fetch the pointer to this member */
if(elm->flags & ATF_POINTER) {
memb_ptr2 = (void **)((char *)st
+ elm->memb_offset);
} else {
memb_ptr = (char *)st + elm->memb_offset;
memb_ptr2 = &memb_ptr;
}
/* Set default value */
if(elm->default_value(1, memb_ptr2)) {
FREEMEM(opres);
_ASN_DECODE_FAILED;
}
}
}
rv.consumed = 0;
rv.code = RC_OK;
FREEMEM(opres);
return rv;
}
int
SET_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel,
asn_app_consume_bytes_f *cb, void *app_key) {
......
......@@ -52,6 +52,8 @@ ber_type_decoder_f SET_decode_ber;
der_type_encoder_f SET_encode_der;
xer_type_decoder_f SET_decode_xer;
xer_type_encoder_f SET_encode_xer;
per_type_decoder_f SET_decode_uper;
per_type_encoder_f SET_encode_uper;
/***********************
* Some handy helpers. *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment