add OER
diff --git a/skeletons/converter-sample.c b/skeletons/converter-sample.c
index de42326..5133114 100644
--- a/skeletons/converter-sample.c
+++ b/skeletons/converter-sample.c
@@ -1,6 +1,6 @@
/*
* Generic converter template for a selected ASN.1 type.
- * Copyright (c) 2005, 2006, 2007 Lev Walkin <vlm@lionet.info>.
+ * Copyright (c) 2005-2017 Lev Walkin <vlm@lionet.info>.
* All rights reserved.
*
* To compile with your own ASN.1 type, please redefine the PDU as shown:
@@ -50,6 +50,7 @@
static enum input_format {
INP_BER, /* -iber: BER input */
INP_XER, /* -ixer: XER input */
+ INP_OER, /* -ioer: OER input */
INP_PER /* -iper: Unaligned PER input */
} iform; /* -i<format> */
@@ -57,6 +58,7 @@
static enum output_format {
OUT_XER, /* -oxer: XER (XML) output */
OUT_DER, /* -oder: DER (BER) output */
+ OUT_OER, /* -ooer: Canonical OER output */
OUT_PER, /* -oper: Unaligned PER output */
OUT_TEXT, /* -otext: semi-structured text */
OUT_NULL /* -onull: No pretty-printing */
@@ -91,8 +93,10 @@
int num;
int ch;
- /* Figure out if Unaligned PER needs to be default */
- if(pduType->uper_decoder)
+ /* Figure out if specialty decoder needs to be default */
+ if(pduType->oer_decoder)
+ iform = INP_OER;
+ else if(pduType->uper_decoder)
iform = INP_PER;
/*
@@ -103,6 +107,8 @@
case 'i':
if(optarg[0] == 'b') { iform = INP_BER; break; }
if(optarg[0] == 'x') { iform = INP_XER; break; }
+ if(pduType->oer_decoder
+ && optarg[0] == 'p') { iform = INP_OER; break; }
if(pduType->uper_decoder
&& optarg[0] == 'p') { iform = INP_PER; break; }
fprintf(stderr, "-i<format>: '%s': improper format selector\n",
@@ -110,6 +116,8 @@
exit(EX_UNAVAILABLE);
case 'o':
if(optarg[0] == 'd') { oform = OUT_DER; break; }
+ if(pduType->oer_encoder
+ && optarg[0] == 'o') { oform = OUT_OER; break; }
if(pduType->uper_encoder
&& optarg[0] == 'p') { oform = OUT_PER; break; }
if(optarg[0] == 'x') { oform = OUT_XER; break; }
@@ -194,14 +202,22 @@
#endif
fprintf(stderr, "Usage: %s [options] <data.ber> ...\n", av[0]);
fprintf(stderr, "Where options are:\n");
+ if(pduType->oer_decoder)
+ fprintf(stderr,
+ " -ioer Input is in OER (Octet Encoding Rules)%s\n",
+ iform == INP_OER ? " (DEFAULT)" : "");
if(pduType->uper_decoder)
fprintf(stderr,
- " -iper Input is in Unaligned PER (Packed Encoding Rules) (DEFAULT)\n");
+ " -iper Input is in Unaligned PER (Packed Encoding Rules)%s\n",
+ iform == INP_PER ? " (DEFAULT)" : "");
fprintf(stderr,
" -iber Input is in BER (Basic Encoding Rules)%s\n",
- iform == INP_PER ? "" : " (DEFAULT)");
+ iform == INP_BER ? " (DEFAULT)" : "");
fprintf(stderr,
" -ixer Input is in XER (XML Encoding Rules)\n");
+ if(pduType->oer_encoder)
+ fprintf(stderr,
+ " -ooer Output in Canonical OER (Octet Encoding Rules)\n");
if(pduType->uper_encoder)
fprintf(stderr,
" -oper Output in Unaligned PER (Packed Encoding Rules)\n");
@@ -312,6 +328,16 @@
}
DEBUG("Encoded in %ld bytes of DER", (long)erv.encoded);
break;
+ case OUT_OER:
+ erv = oer_encode(pduType, structure, write_out, stdout);
+ if(erv.encoded < 0) {
+ fprintf(stderr,
+ "%s: Cannot convert %s into oER\n",
+ name, pduType->name);
+ exit(EX_UNAVAILABLE);
+ }
+ DEBUG("Encoded in %ld bytes of OER", (long)erv.encoded);
+ break;
case OUT_PER:
erv = uper_encode(pduType, structure, write_out, stdout);
if(erv.encoded < 0) {
@@ -631,6 +657,10 @@
rval = ber_decode(opt_codec_ctx, pduType,
(void **)&structure, i_bptr, i_size);
break;
+ case INP_OER:
+ rval = oer_decode(opt_codec_ctx, pduType,
+ (void **)&structure, i_bptr, i_size);
+ break;
case INP_XER:
rval = xer_decode(opt_codec_ctx, pduType,
(void **)&structure, i_bptr, i_size);