d62aab3003210a5cb499f9e9d9bfccd843913de0
[ric-app/kpimon.git] / asn1c_defs / all-defs / asn_internal.c
1 #include <asn_internal.h>\r
2 \r
3 ssize_t\r
4 asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key,\r
5                         const char *fmt, ...) {\r
6     char scratch[64];\r
7     char *buf = scratch;\r
8     size_t buf_size = sizeof(scratch);\r
9     int wrote;\r
10     int cb_ret;\r
11 \r
12     do {\r
13         va_list args;\r
14         va_start(args, fmt);\r
15 \r
16         wrote = vsnprintf(buf, buf_size, fmt, args);\r
17         if(wrote < (ssize_t)buf_size) {\r
18             if(wrote < 0) {\r
19                 if(buf != scratch) FREEMEM(buf);\r
20                 va_end(args);\r
21                 return -1;\r
22             }\r
23             break;\r
24         }\r
25 \r
26         buf_size <<= 1;\r
27         if(buf == scratch) {\r
28             buf = MALLOC(buf_size);\r
29             if(!buf) return -1;\r
30         } else {\r
31             void *p = REALLOC(buf, buf_size);\r
32             if(!p) {\r
33                 FREEMEM(buf);\r
34                 return -1;\r
35             }\r
36             buf = p;\r
37         }\r
38     } while(1);\r
39 \r
40     cb_ret = cb(buf, wrote, key);\r
41     if(buf != scratch) FREEMEM(buf);\r
42     if(cb_ret < 0) {\r
43         return -1;\r
44     }\r
45 \r
46     return wrote;\r
47 }\r
48 \r