Open Broadcaster Software
Free, open source software for live streaming and recording
calldata.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Hugh Bailey <obs.jim@gmail.com>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #pragma once
18 
19 #include <string.h>
20 #include "../util/c99defs.h"
21 #include "../util/bmem.h"
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /*
28  * Procedure call data structure
29  *
30  * This is used to store parameters (and return value) sent to/from signals,
31  * procedures, and callbacks.
32  */
33 
41 };
42 
43 #define CALL_PARAM_IN (1<<0)
44 #define CALL_PARAM_OUT (1<<1)
45 
46 struct calldata {
48  size_t size; /* size of the stack, in bytes */
49  size_t capacity; /* capacity of the stack, in bytes */
50  bool fixed; /* fixed size (using call stack) */
51 };
52 
53 typedef struct calldata calldata_t;
54 
55 static inline void calldata_init(struct calldata *data)
56 {
57  memset(data, 0, sizeof(struct calldata));
58 }
59 
60 static inline void calldata_clear(struct calldata *data);
61 
62 static inline void calldata_init_fixed(struct calldata *data, uint8_t *stack,
63  size_t size)
64 {
65  data->stack = stack;
66  data->capacity = size;
67  data->fixed = true;
68  data->size = 0;
69  calldata_clear(data);
70 }
71 
72 static inline void calldata_free(struct calldata *data)
73 {
74  if (!data->fixed)
75  bfree(data->stack);
76 }
77 
78 EXPORT bool calldata_get_data(const calldata_t *data, const char *name,
79  void *out, size_t size);
80 EXPORT void calldata_set_data(calldata_t *data, const char *name,
81  const void *in, size_t new_size);
82 
83 static inline void calldata_clear(struct calldata *data)
84 {
85  if (data->stack) {
86  data->size = sizeof(size_t);
87  memset(data->stack, 0, sizeof(size_t));
88  }
89 }
90 
91 /* ------------------------------------------------------------------------- */
92 /* NOTE: 'get' functions return true only if paramter exists, and is the
93  * same type. They return false otherwise. */
94 
95 static inline bool calldata_get_int(const calldata_t *data, const char *name,
96  long long *val)
97 {
98  return calldata_get_data(data, name, val, sizeof(*val));
99 }
100 
101 static inline bool calldata_get_float (const calldata_t *data, const char *name,
102  double *val)
103 {
104  return calldata_get_data(data, name, val, sizeof(*val));
105 }
106 
107 static inline bool calldata_get_bool (const calldata_t *data, const char *name,
108  bool *val)
109 {
110  return calldata_get_data(data, name, val, sizeof(*val));
111 }
112 
113 static inline bool calldata_get_ptr (const calldata_t *data, const char *name,
114  void *p_ptr)
115 {
116  return calldata_get_data(data, name, p_ptr, sizeof(p_ptr));
117 }
118 
119 EXPORT bool calldata_get_string(const calldata_t *data, const char *name,
120  const char **str);
121 
122 /* ------------------------------------------------------------------------- */
123 /* call if you know your data is valid */
124 
125 static inline long long calldata_int(const calldata_t *data, const char *name)
126 {
127  long long val = 0;
128  calldata_get_int(data, name, &val);
129  return val;
130 }
131 
132 static inline double calldata_float(const calldata_t *data, const char *name)
133 {
134  double val = 0.0;
135  calldata_get_float(data, name, &val);
136  return val;
137 }
138 
139 static inline bool calldata_bool(const calldata_t *data, const char *name)
140 {
141  bool val = false;
142  calldata_get_bool(data, name, &val);
143  return val;
144 }
145 
146 static inline void *calldata_ptr(const calldata_t *data, const char *name)
147 {
148  void *val = NULL;
149  calldata_get_ptr(data, name, &val);
150  return val;
151 }
152 
153 static inline const char *calldata_string(const calldata_t *data,
154  const char *name)
155 {
156  const char *val = NULL;
157  calldata_get_string(data, name, &val);
158  return val;
159 }
160 
161 /* ------------------------------------------------------------------------- */
162 
163 static inline void calldata_set_int (calldata_t *data, const char *name,
164  long long val)
165 {
166  calldata_set_data(data, name, &val, sizeof(val));
167 }
168 
169 static inline void calldata_set_float (calldata_t *data, const char *name,
170  double val)
171 {
172  calldata_set_data(data, name, &val, sizeof(val));
173 }
174 
175 static inline void calldata_set_bool (calldata_t *data, const char *name,
176  bool val)
177 {
178  calldata_set_data(data, name, &val, sizeof(val));
179 }
180 
181 static inline void calldata_set_ptr (calldata_t *data, const char *name,
182  void *ptr)
183 {
184  calldata_set_data(data, name, &ptr, sizeof(ptr));
185 }
186 
187 static inline void calldata_set_string(calldata_t *data, const char *name,
188  const char *str)
189 {
190  if (str)
191  calldata_set_data(data, name, str, strlen(str)+1);
192  else
193  calldata_set_data(data, name, NULL, 0);
194 }
195 
196 #ifdef __cplusplus
197 }
198 #endif
EXPORT bool calldata_get_string(const calldata_t *data, const char *name, const char **str)
Definition: calldata.h:46
Definition: calldata.h:36
Definition: calldata.h:39
uint8_t * stack
Definition: calldata.h:47
Definition: calldata.h:35
Definition: calldata.h:40
unsigned char uint8_t
Definition: vc_stdint.h:27
EXPORT void calldata_set_data(calldata_t *data, const char *name, const void *in, size_t new_size)
#define EXPORT
Definition: c99defs.h:53
Definition: calldata.h:37
call_param_type
Definition: calldata.h:34
Definition: calldata.h:38
EXPORT bool calldata_get_data(const calldata_t *data, const char *name, void *out, size_t size)
bool fixed
Definition: calldata.h:50
size_t size
Definition: calldata.h:48
size_t capacity
Definition: calldata.h:49
EXPORT void bfree(void *ptr)