Open Broadcaster Software
Free, open source software for live streaming and recording
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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:49
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)