constr_SET_OF_rfill.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
3  * All rights reserved.
4  * Redistribution and modifications are permitted subject to BSD license.
5  */
8 
11  const asn_encoding_constraints_t *constraints,
12  size_t max_length) {
13  const asn_SET_OF_specifics_t *specs =
14  (const asn_SET_OF_specifics_t *)td->specifics;
15  asn_random_fill_result_t res_ok = {ARFILL_OK, 0};
16  asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0};
17  asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0};
18  const asn_TYPE_member_t *elm = td->elements;
19  void *st = *sptr;
20  long max_elements = 5;
21  long slb = 0; /* Lower size bound */
22  long sub = 0; /* Upper size bound */
23  size_t rnd_len;
24 
25  if(max_length == 0) return result_skipped;
26 
27  if(st == NULL) {
28  st = (*sptr = CALLOC(1, specs->struct_size));
29  if(st == NULL) {
30  return result_failed;
31  }
32  }
33 
34  switch(asn_random_between(0, 6)) {
35  case 0: max_elements = 0; break;
36  case 1: max_elements = 1; break;
37  case 2: max_elements = 5; break;
38  case 3: max_elements = max_length; break;
39  case 4: max_elements = max_length / 2; break;
40  case 5: max_elements = max_length / 4; break;
41  default: break;
42  }
43  sub = slb + max_elements;
44 
45 #if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT)
46  if(!constraints || !constraints->per_constraints)
47  constraints = &td->encoding_constraints;
48  if(constraints->per_constraints) {
49  const asn_per_constraint_t *pc = &constraints->per_constraints->size;
50  if(pc->flags & APC_SEMI_CONSTRAINED) {
51  slb = pc->lower_bound;
52  sub = pc->lower_bound + max_elements;
53  } else if(pc->flags & APC_CONSTRAINED) {
54  slb = pc->lower_bound;
55  sub = pc->upper_bound;
56  if(sub - slb > max_elements) sub = slb + max_elements;
57  }
58  }
59 #else
60  if(!constraints) constraints = &td->encoding_constraints;
61 #endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */
62 
63  /* Bias towards edges of allowed space */
64  switch(asn_random_between(-1, 4)) {
65  default:
66  case -1:
67 #if !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT)
68  /* Prepare lengths somewhat outside of constrained range. */
69  if(constraints->per_constraints
70  && (constraints->per_constraints->size.flags & APC_EXTENSIBLE)) {
71  switch(asn_random_between(0, 5)) {
72  default:
73  case 0:
74  rnd_len = 0;
75  break;
76  case 1:
77  if(slb > 0) {
78  rnd_len = slb - 1;
79  } else {
80  rnd_len = 0;
81  }
82  break;
83  case 2:
84  rnd_len = asn_random_between(0, slb);
85  break;
86  case 3:
87  if(sub < (ssize_t)max_length) {
88  rnd_len = sub + 1;
89  } else {
90  rnd_len = max_length;
91  }
92  break;
93  case 4:
94  if(sub < (ssize_t)max_length) {
95  rnd_len = asn_random_between(sub + 1, max_length);
96  } else {
97  rnd_len = max_length;
98  }
99  break;
100  case 5:
101  rnd_len = max_length;
102  break;
103  }
104  break;
105  }
106 #endif /* !defined(ASN_DISABLE_UPER_SUPPORT) || !defined(ASN_DISABLE_APER_SUPPORT) */
107  /* Fall through */
108  case 0:
109  rnd_len = asn_random_between(slb, sub);
110  break;
111  case 1:
112  if(slb < sub) {
113  rnd_len = asn_random_between(slb + 1, sub);
114  break;
115  }
116  /* Fall through */
117  case 2:
118  rnd_len = asn_random_between(slb, slb);
119  break;
120  case 3:
121  if(slb < sub) {
122  rnd_len = asn_random_between(slb, sub - 1);
123  break;
124  }
125  /* Fall through */
126  case 4:
127  rnd_len = asn_random_between(sub, sub);
128  break;
129  }
130 
131  for(; rnd_len > 0; rnd_len--) {
132  asn_anonymous_set_ *list = _A_SET_FROM_VOID(st);
133  void *ptr = 0;
135  elm->type, &ptr, &elm->encoding_constraints,
136  (max_length > res_ok.length ? max_length - res_ok.length : 0)
137  / rnd_len);
138  switch(tmpres.code) {
139  case ARFILL_OK:
140  ASN_SET_ADD(list, ptr);
141  res_ok.length += tmpres.length;
142  break;
143  case ARFILL_SKIPPED:
144  break;
145  case ARFILL_FAILED:
146  assert(ptr == 0);
147  return tmpres;
148  }
149  }
150 
151  return res_ok;
152 }
asn_per_constraint_s::lower_bound
intmax_t lower_bound
Definition: per_support.h:27
asn_random_fill_result_s::code
enum asn_random_fill_result_s::@3 code
CALLOC
#define CALLOC(nmemb, size)
Definition: asn_internal.h:37
asn_random_fill_result_s::length
size_t length
Definition: asn_random_fill.h:30
asn_per_constraint_s
Definition: per_support.h:18
SET_OF_random_fill
asn_random_fill_result_t SET_OF_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, const asn_encoding_constraints_t *constraints, size_t max_length)
Definition: constr_SET_OF_rfill.c:10
asn_TYPE_descriptor_s
Definition: constr_TYPE.h:224
ASN_SET_ADD
#define ASN_SET_ADD(headptr, ptr)
Definition: asn_SET_OF.h:30
asn_TYPE_member_s::type
asn_TYPE_descriptor_t * type
Definition: constr_TYPE.h:278
asn_random_fill_result_s
Definition: asn_random_fill.h:24
asn_TYPE_descriptor_s::specifics
const void * specifics
Definition: constr_TYPE.h:259
asn_random_between
intmax_t asn_random_between(intmax_t min, intmax_t max)
Definition: asn_random_fill.c:38
asn_TYPE_operation_s::random_fill
asn_random_fill_f * random_fill
Definition: constr_TYPE.h:201
_A_SET_FROM_VOID
#define _A_SET_FROM_VOID(ptr)
Definition: asn_SET_OF.h:65
asn_TYPE_descriptor_s::op
asn_TYPE_operation_t * op
Definition: constr_TYPE.h:232
constr_SET_OF.h
asn_encoding_constraints_s
Definition: constr_TYPE.h:208
asn_internal.h
asn_TYPE_member_s
Definition: constr_TYPE.h:272
asn_per_constraint_s::upper_bound
intmax_t upper_bound
Definition: per_support.h:28
asn_per_constraint_s::flags
enum asn_per_constraint_s::asn_per_constraint_flags flags
asn_SET_OF_specifics_s
Definition: constr_SET_OF.h:15
asn_TYPE_member_s::encoding_constraints
asn_encoding_constraints_t encoding_constraints
Definition: constr_TYPE.h:280


etsi_its_denm_coding
Author(s): Jean-Pierre Busch , Guido Küppers , Lennart Reiher
autogenerated on Sun May 18 2025 02:23:47