[esnacc-dev] [PATCH 2/5] c++-code-gen: fix up whitespace, and add default encode

Aaron Conole aconole at redhat.com
Fri Jul 15 18:05:53 UTC 2016


Aaron Conole <aconole at bytheb.org> writes:

> Default encoding, for non-built-in ASN.1 types was broken.  This change
> adds a simple test and insertion for default types which aren't built-in.
>
> Signed-off-by: Aaron Conole <aconole at bytheb.org>
> ---
>  compiler/back-ends/c++-gen/gen-code.c | 104 ++++++++++++++++------------------
>  1 file changed, 49 insertions(+), 55 deletions(-)
>
> diff --git a/compiler/back-ends/c++-gen/gen-code.c b/compiler/back-ends/c++-gen/gen-code.c
> index 3a9f73d..8b23e19 100644
> --- a/compiler/back-ends/c++-gen/gen-code.c
> +++ b/compiler/back-ends/c++-gen/gen-code.c
> @@ -2241,73 +2241,67 @@ PrintCxxSeqDefCode (FILE *src, FILE *hdr, ModuleList *mods, Module *m,
>      fprintf (src, "}\n\n");
>  
>      /* BerEncodeContent method */
> -    if (printEncodersG)
> -    {
> -        fprintf (hdr, "  %s		B%s (%s &_b) const;\n", lenTypeNameG, r->encodeContentBaseName, bufTypeNameG);
> -        fprintf (src, "%s\n", lenTypeNameG);
> -        fprintf (src, "%s::B%s (%s &_b) const\n", td->cxxTypeDefInfo->className, r->encodeContentBaseName, bufTypeNameG);
> -        fprintf (src, "{\n");
> +    if (printEncodersG) {
> +        fprintf(hdr, "  %s		B%s (%s &_b) const;\n", lenTypeNameG,
> +                r->encodeContentBaseName, bufTypeNameG);
> +        fprintf(src, "%s\n", lenTypeNameG);
> +        fprintf(src, "%s::B%s (%s &_b) const\n", td->cxxTypeDefInfo->className,
> +                r->encodeContentBaseName, bufTypeNameG);
> +        fprintf(src, "{\n");
>  
>          /* print local vars */
> -        fprintf (src, "  %s totalLen = 0;\n", lenTypeNameG);
> -        fprintf (src, "  %s l=0;\n\n", lenTypeNameG);
> +        fprintf(src, "  %s totalLen = 0;\n", lenTypeNameG);
> +        fprintf(src, "  %s l=0;\n\n", lenTypeNameG);
>  
> -        FOR_EACH_LIST_ELMT_RVS (e, seq->basicType->a.sequence)
> -        {
> +        FOR_EACH_LIST_ELMT_RVS (e, seq->basicType->a.sequence) {
>              cxxtri =  e->type->cxxTypeRefInfo;
>              varName = cxxtri->fieldName;
>  
>              /* print optional test if nec */
> -            if (e->type->defaultVal != NULL)
> -            {
> -               Value *defVal = GetValue(e->type->defaultVal->value);
> -               /** PIERCE added DER DEFAULT encoding rules 8-16-2000 
> -                **/
> +            if (e->type->defaultVal != NULL) {
> +                Value *defVal = GetValue(e->type->defaultVal->value);
>  
> -               /* HANDLE DEFAULT VALUE ENCODING FOR DER
> -                */
> -               switch(ParanoidGetBuiltinType(e->type))
> -               {
> -                  case BASICTYPE_INTEGER:
> -                  case BASICTYPE_ENUMERATED:
> -                     fprintf(src,"  if ( %s(%s) && *%s != %d )\n  {\n", 
> -                        cxxtri->optTestRoutineName,
> -                        varName, varName, defVal->basicValue->a.integer);
> -                     break;
> -                  case BASICTYPE_BITSTRING:
> -                     {
> -                        if (defVal->basicValue->choiceId == BASICVALUE_VALUENOTATION)
> -                        {
> -                           char *defBitStr;
> -                           normalizeValue(&defBitStr, defVal->basicValue->a.valueNotation->octs);
> -                           fprintf(src,"  if ( %s(%s) && (! %s->soloBitCheck(%s::%s)) ) \n  {\n",
> -                               cxxtri->optTestRoutineName, varName, varName, cxxtri->className, defBitStr);
> -                           //RWC;ALLOW "}" alignment using editor...
> -                           free(defBitStr);
> +                /* HANDLE DEFAULT VALUE ENCODING FOR DER */
> +                switch(ParanoidGetBuiltinType(e->type)) {
> +                case BASICTYPE_INTEGER:
> +                case BASICTYPE_ENUMERATED:
> +                    fprintf(src,"  if ( %s(%s) && *%s != %d )\n  {\n", 

Will fix this whitespace error as well.

> +                            cxxtri->optTestRoutineName,
> +                            varName, varName, defVal->basicValue->a.integer);
> +                    break;
> +                case BASICTYPE_BITSTRING:
> +                    {
> +                        if (defVal->basicValue->choiceId ==
> +                            BASICVALUE_VALUENOTATION) {
> +                            char *defBitStr;
> +                            normalizeValue(&defBitStr,
> +                                           defVal->basicValue->a.valueNotation->octs);
> +                            fprintf(src, "    if (%s(%s) && (!%s->soloBitCheck(%s::%s))) {\n",
> +                                    cxxtri->optTestRoutineName, varName, varName,
> +                                    cxxtri->className, defBitStr);
> +
> +                            free(defBitStr);
> +                        } else {
> +                            fprintf(errFileG,
> +                                    "WARNING: unsupported use of default BIT STRING\n");
>                          }
> -                        else
> -                           printf("\nWARNING: unsupported use of default BIT STRING\n");
> -                     }
> -                     break;
> -                  case BASICTYPE_BOOLEAN:
> -                     fprintf(src,"  if ( %s(%s) && *%s != %s )\n  {\n", 
> -                        cxxtri->optTestRoutineName, varName, varName, defVal->basicValue->a.boolean ? "true" : "false");
> -                     //RWC;ALLOW "}" alignment using editor...
> -                     break;
> -					   default:
> -							/* TBD print error? */
> -							break;
> +                    }
> +                    break;
> +                case BASICTYPE_BOOLEAN:
> +                    fprintf(src, "    if (%s(%s) && *%s != %s ) {\n",
> +                            cxxtri->optTestRoutineName, varName, varName,
> +                            defVal->basicValue->a.boolean ? "true" : "false");
> +                    break;
> +                default:
> +                    fprintf(src, "    if (%s) {\n", varName);
> +                    break;
>                 }
> +            } else if (e->type->optional) {
> +                fprintf(src, "    if (%s(%s)) {\n", cxxtri->optTestRoutineName,
> +                        varName);
>              }
> -            else if (e->type->optional)            
> -	         {
> -                fprintf (src, "  if (%s (%s))\n", cxxtri->optTestRoutineName, varName);
> -                fprintf (src, "  {\n");
> -                //RWC;ALLOW "}" alignment using editor...
> -	         }
> -            
>  
> -            /* eSNACC 1.5 does not encode indefinite length
> +            /* eSNACC does not encode indefinite length
>               *
>               * PrintCxxEocEncoders (src, td, e->type, "_b");
>               */



More information about the dev mailing list