@@ -2321,11 +2321,26 @@ emit_default_string_value(arg_t *arg, asn1p_value_t *v) {
2321
2321
uint8_t * e = v -> value .string .size + b ;
2322
2322
OUT ("{ " );
2323
2323
for (;b < e ; b ++ )
2324
- OUT ("0x%02x , " , * b );
2324
+ OUT ("0x%02X , " , * b );
2325
2325
OUT ("0 };\n" );
2326
2326
}
2327
2327
}
2328
2328
2329
+ static void
2330
+ emit_default_bitstring_value (arg_t * arg , asn1p_value_t * v ) {
2331
+
2332
+ OUT ("static const uint8_t defv[] = { " );
2333
+ assert (v -> type == ATV_BITVECTOR );
2334
+
2335
+ uint8_t * b = v -> value .binary_vector .bits ;
2336
+ for (int i = 0 ; i < (v -> value .binary_vector .size_in_bits + 7 )/8 ; i ++ , b ++ ) {
2337
+ OUT ("0x%02X" , * b );
2338
+ if (i < (v -> value .binary_vector .size_in_bits + 7 )/8 - 1 )
2339
+ OUT (", " );
2340
+ }
2341
+ OUT (" };\n" );
2342
+ }
2343
+
2329
2344
static int
2330
2345
try_inline_default (arg_t * arg , asn1p_expr_t * expr , int out ) {
2331
2346
int save_target = arg -> target -> target ;
@@ -2421,9 +2436,9 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
2421
2436
//expr->marker.flags &= ~EM_INDIRECT;
2422
2437
return 0 ;
2423
2438
default :
2424
- if (etype & ASN_STRING_KM_MASK ) {
2425
- if (expr -> marker .default_value == NULL
2426
- || expr -> marker .default_value -> type != ATV_STRING )
2439
+ if (expr -> marker . default_value ) {
2440
+ if (( expr -> marker .default_value -> type != ATV_STRING ) &&
2441
+ ( expr -> marker .default_value -> type != ATV_BITVECTOR ) )
2427
2442
break ;
2428
2443
if (!out ) {
2429
2444
if (C99_MODE ) OUT (".default_value_cmp = " );
@@ -2441,15 +2456,23 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
2441
2456
OUT ("static int asn_DFL_%d_cmp(const void *sptr) {\n" ,
2442
2457
expr -> _type_unique_index );
2443
2458
INDENT (+1 );
2444
- emit_default_string_value (arg , expr -> marker .default_value );
2459
+ if (expr -> marker .default_value -> type == ATV_STRING )
2460
+ emit_default_string_value (arg , expr -> marker .default_value );
2461
+ else
2462
+ emit_default_bitstring_value (arg , expr -> marker .default_value );
2445
2463
OUT ("const %s *st = sptr;\n" , asn1c_type_name (arg , expr , TNF_CTYPE ));
2446
2464
OUT ("\n" );
2447
2465
OUT ("if(!st) {\n" );
2448
2466
OUT ("\treturn -1; /* No value is not a default value */\n" );
2449
2467
OUT ("}\n" );
2450
2468
OUT ("\n" );
2451
- OUT ("if(st->size == (sizeof(defv) - 1)\n" );
2452
- OUT ("&& memcmp(st->buf, &defv, sizeof(defv) - 1) == 0)\n" );
2469
+ if (expr -> marker .default_value -> type == ATV_STRING ) {
2470
+ OUT ("if(st->size == (sizeof(defv) - 1)\n" );
2471
+ OUT ("&& memcmp(st->buf, &defv, sizeof(defv) - 1) == 0)\n" );
2472
+ } else {
2473
+ OUT ("if(st->size == (sizeof(defv))\n" );
2474
+ OUT ("&& memcmp(st->buf, &defv, sizeof(defv)) == 0)\n" );
2475
+ }
2453
2476
OUT ("\treturn 0;\n" );
2454
2477
OUT ("return 1;\n" );
2455
2478
INDENT (-1 );
@@ -2458,7 +2481,10 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
2458
2481
OUT ("static int asn_DFL_%d_set(void **sptr) {\n" ,
2459
2482
expr -> _type_unique_index );
2460
2483
INDENT (+1 );
2461
- emit_default_string_value (arg , expr -> marker .default_value );
2484
+ if (expr -> marker .default_value -> type == ATV_STRING )
2485
+ emit_default_string_value (arg , expr -> marker .default_value );
2486
+ else
2487
+ emit_default_bitstring_value (arg , expr -> marker .default_value );
2462
2488
OUT ("%s *st = *sptr;\n" , asn1c_type_name (arg , expr , TNF_CTYPE ));
2463
2489
OUT ("uint8_t *nstr = MALLOC(sizeof(defv));\n" );
2464
2490
OUT ("\n" );
@@ -2472,7 +2498,13 @@ try_inline_default(arg_t *arg, asn1p_expr_t *expr, int out) {
2472
2498
OUT ("\tif(!st) { FREEMEM(nstr); return -1; }\n" );
2473
2499
OUT ("}\n" );
2474
2500
OUT ("st->buf = nstr;\n" );
2475
- OUT ("st->size = sizeof(defv) - 1;\n" );
2501
+ if (expr -> marker .default_value -> type == ATV_STRING ) {
2502
+ OUT ("st->size = sizeof(defv) - 1;\n" );
2503
+ } else {
2504
+ OUT ("st->size = sizeof(defv);\n" );
2505
+ if (etype == ASN_BASIC_BIT_STRING )
2506
+ OUT ("st->bits_unused = %d;\n" , (8 - expr -> marker .default_value -> value .binary_vector .size_in_bits % 8 ) % 8 );
2507
+ }
2476
2508
OUT ("\n" );
2477
2509
OUT ("return 0;\n" );
2478
2510
INDENT (-1 );
0 commit comments