Fix licensing issues
[ric-plt/resource-status-manager.git] / RSM / 3rdparty / asn1codec / e2ap_engine / asn_random_fill.c
1
2 /*
3  * Copyright (c) 2017 Lev Walkin <vlm@lionet.info>.
4  * All rights reserved.
5  * Redistribution and modifications are permitted subject to BSD license.
6  */
7 #include <asn_internal.h>
8 #include <asn_random_fill.h>
9 #include <constr_TYPE.h>
10
11 int
12 asn_random_fill(const struct asn_TYPE_descriptor_s *td, void **struct_ptr,
13                 size_t length) {
14
15     if(td && td->op->random_fill) {
16         asn_random_fill_result_t res =
17             td->op->random_fill(td, struct_ptr, 0, length);
18         return (res.code == ARFILL_OK) ? 0 : -1;
19     } else {
20         return -1;
21     }
22 }
23
24 static uintmax_t
25 asn__intmax_range(intmax_t lb, intmax_t ub) {
26     assert(lb <= ub);
27     if((ub < 0) == (lb < 0)) {
28         return ub - lb;
29     } else if(lb < 0) {
30         return 1 + ((uintmax_t)ub + (uintmax_t)-(lb + 1));
31     } else {
32         assert(!"Unreachable");
33         return 0;
34     }
35 }
36
37 intmax_t
38 asn_random_between(intmax_t lb, intmax_t rb) {
39     if(lb == rb) {
40         return lb;
41     } else {
42         const uintmax_t intmax_max = ((~(uintmax_t)0) >> 1);
43         uintmax_t range = asn__intmax_range(lb, rb);
44         uintmax_t value = 0;
45         uintmax_t got_entropy = 0;
46
47         assert(RAND_MAX > 0xffffff);    /* Seen 7ffffffd! */
48         assert(range < intmax_max);
49
50         for(; got_entropy < range;) {
51             got_entropy = (got_entropy << 24) | 0xffffff;
52             value = (value << 24) | (random() % 0xffffff);
53         }
54
55         return lb + (intmax_t)(value % (range + 1));
56     }
57 }