Fix licensing issues
[ric-plt/resource-status-manager.git] / RSM / 3rdparty / asn1codec / e2ap_engine / asn_internal.c
1 /*
2  *
3  * Copyright 2019 AT&T Intellectual Property
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18
19
20 #include <asn_internal.h>
21
22 ssize_t
23 asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key,
24                         const char *fmt, ...) {
25     char scratch[64];
26     char *buf = scratch;
27     size_t buf_size = sizeof(scratch);
28     int wrote;
29     int cb_ret;
30
31     do {
32         va_list args;
33         va_start(args, fmt);
34
35         wrote = vsnprintf(buf, buf_size, fmt, args);
36         if(wrote < (ssize_t)buf_size) {
37             if(wrote < 0) {
38                 if(buf != scratch) FREEMEM(buf);
39                 va_end(args);
40                 return -1;
41             }
42             break;
43         }
44
45         buf_size <<= 1;
46         if(buf == scratch) {
47             buf = MALLOC(buf_size);
48             if(!buf) return -1;
49         } else {
50             void *p = REALLOC(buf, buf_size);
51             if(!p) {
52                 FREEMEM(buf);
53                 return -1;
54             }
55             buf = p;
56         }
57     } while(1);
58
59     cb_ret = cb(buf, wrote, key);
60     if(buf != scratch) FREEMEM(buf);
61     if(cb_ret < 0) {
62         return -1;
63     }
64
65     return wrote;
66 }
67