Skip to content

Commit 3e286a1

Browse files
committed
Redefine opaque types as pointers to structs.
Warning: This may break source compatibility! This fixes casting-related errors in the C++ wrapper related to passing a lo::ServerThread object to lo::Address::send_from, see #101 To summarize, the C++ template cannot differentiate between lo_server and lo_server_thread because they are both (void*), and therefore performs the wrong cast. This can be fixed by making these opaque types pointers to different types instead of all pointing to void. It could be possible to redefine just these types, but this patch takes this to the full extent and redefines all the opaque pointers so that they are different types, to avoid any potential similar issues. It is more correct, but could lead to incompatibility with older code, particularly because it redefines the lo_method_handler prototype.
1 parent d4db49c commit 3e286a1

File tree

5 files changed

+26
-26
lines changed

5 files changed

+26
-26
lines changed

examples/example_server.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ int done = 0;
2626
void error(int num, const char *m, const char *path);
2727

2828
int generic_handler(const char *path, const char *types, lo_arg ** argv,
29-
int argc, void *data, void *user_data);
29+
int argc, lo_message data, void *user_data);
3030

3131
int foo_handler(const char *path, const char *types, lo_arg ** argv,
32-
int argc, void *data, void *user_data);
32+
int argc, lo_message data, void *user_data);
3333

3434
int blobtest_handler(const char *path, const char *types, lo_arg ** argv,
35-
int argc, void *data, void *user_data);
35+
int argc, lo_message data, void *user_data);
3636

3737
int quit_handler(const char *path, const char *types, lo_arg ** argv,
38-
int argc, void *data, void *user_data);
38+
int argc, lo_message data, void *user_data);
3939

4040
int main()
4141
{
@@ -79,7 +79,7 @@ void error(int num, const char *msg, const char *path)
7979
/* catch any incoming messages and display them. returning 1 means that the
8080
* message has not been fully handled and the server should try other methods */
8181
int generic_handler(const char *path, const char *types, lo_arg ** argv,
82-
int argc, void *data, void *user_data)
82+
int argc, lo_message data, void *user_data)
8383
{
8484
int i;
8585

@@ -96,7 +96,7 @@ int generic_handler(const char *path, const char *types, lo_arg ** argv,
9696
}
9797

9898
int foo_handler(const char *path, const char *types, lo_arg ** argv,
99-
int argc, void *data, void *user_data)
99+
int argc, lo_message data, void *user_data)
100100
{
101101
/* example showing pulling the argument values out of the argv array */
102102
printf("%s <- f:%f, i:%d\n\n", path, argv[0]->f, argv[1]->i);
@@ -106,7 +106,7 @@ int foo_handler(const char *path, const char *types, lo_arg ** argv,
106106
}
107107

108108
int blobtest_handler(const char *path, const char *types, lo_arg ** argv,
109-
int argc, void *data, void *user_data)
109+
int argc, lo_message data, void *user_data)
110110
{
111111
/* example showing how to get data for a blob */
112112
int i, size = argv[0]->blob.size;
@@ -136,7 +136,7 @@ int blobtest_handler(const char *path, const char *types, lo_arg ** argv,
136136
}
137137

138138
int quit_handler(const char *path, const char *types, lo_arg ** argv,
139-
int argc, void *data, void *user_data)
139+
int argc, lo_message data, void *user_data)
140140
{
141141
done = 1;
142142
printf("quiting\n\n");

examples/example_tcp_echo_server.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ int count = 0;
3636
void error(int num, const char *m, const char *path);
3737

3838
int echo_handler(const char *path, const char *types, lo_arg ** argv,
39-
int argc, void *data, void *user_data);
39+
int argc, lo_message data, void *user_data);
4040

4141
int quit_handler(const char *path, const char *types, lo_arg ** argv,
42-
int argc, void *data, void *user_data);
42+
int argc, lo_message data, void *user_data);
4343

4444
void ctrlc(int sig)
4545
{
@@ -114,7 +114,7 @@ void error(int num, const char *msg, const char *path)
114114
/* catch any incoming messages, display them, and send them
115115
* back. */
116116
int echo_handler(const char *path, const char *types, lo_arg ** argv,
117-
int argc, void *data, void *user_data)
117+
int argc, lo_message data, void *user_data)
118118
{
119119
int i;
120120
lo_message m = (lo_message)data;
@@ -159,7 +159,7 @@ int echo_handler(const char *path, const char *types, lo_arg ** argv,
159159
}
160160

161161
int quit_handler(const char *path, const char *types, lo_arg ** argv,
162-
int argc, void *data, void *user_data)
162+
int argc, lo_message data, void *user_data)
163163
{
164164
done = 1;
165165
printf("quitting\n\n");

examples/nonblocking_server_example.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ int done = 0;
3434
void error(int num, const char *m, const char *path);
3535

3636
int generic_handler(const char *path, const char *types, lo_arg ** argv,
37-
int argc, void *data, void *user_data);
37+
int argc, lo_message data, void *user_data);
3838

3939
int foo_handler(const char *path, const char *types, lo_arg ** argv,
40-
int argc, void *data, void *user_data);
40+
int argc, lo_message data, void *user_data);
4141

4242
int quit_handler(const char *path, const char *types, lo_arg ** argv,
43-
int argc, void *data, void *user_data);
43+
int argc, lo_message data, void *user_data);
4444

4545
void read_stdin(void);
4646

@@ -151,7 +151,7 @@ void error(int num, const char *msg, const char *path)
151151
/* catch any incoming messages and display them. returning 1 means that the
152152
* message has not been fully handled and the server should try other methods */
153153
int generic_handler(const char *path, const char *types, lo_arg ** argv,
154-
int argc, void *data, void *user_data)
154+
int argc, lo_message data, void *user_data)
155155
{
156156
int i;
157157

@@ -168,7 +168,7 @@ int generic_handler(const char *path, const char *types, lo_arg ** argv,
168168
}
169169

170170
int foo_handler(const char *path, const char *types, lo_arg ** argv,
171-
int argc, void *data, void *user_data)
171+
int argc, lo_message data, void *user_data)
172172
{
173173
/* example showing pulling the argument values out of the argv array */
174174
printf("%s <- f:%f, i:%d\n\n", path, argv[0]->f, argv[1]->i);
@@ -178,7 +178,7 @@ int foo_handler(const char *path, const char *types, lo_arg ** argv,
178178
}
179179

180180
int quit_handler(const char *path, const char *types, lo_arg ** argv,
181-
int argc, void *data, void *user_data)
181+
int argc, lo_message data, void *user_data)
182182
{
183183
done = 1;
184184
printf("quiting\n\n");

lo/lo_cpp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
std::unique_ptr<handler>(new handler_type<r ht>(h))); \
5151
lo_method m = _add_method(path, types, \
5252
[](const char *path, const char *types, \
53-
lo_arg **argv, int argc, void *msg, \
53+
lo_arg **argv, int argc, lo_message msg, \
5454
void *data)->int \
5555
{ \
5656
r1 (*static_cast<handler_type<r ht>*>(data)) args; \

lo/lo_types.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,22 @@ extern "C" {
4242
*
4343
* Created by calls to lo_address_new() or lo_address_new_from_url().
4444
*/
45-
typedef void *lo_address;
45+
typedef struct lo_address_ {} *lo_address;
4646

4747
/**
4848
* \brief A object to store an opaque binary data object.
4949
*
5050
* Can be passed over OSC using the 'b' type. Created by calls to lo_blob_new().
5151
*/
52-
typedef void *lo_blob;
52+
typedef struct lo_blob_ {} *lo_blob;
5353

5454
/**
5555
* \brief A low-level object used to represent messages passed over OSC.
5656
*
5757
* Created by calls to lo_message_new(), arguments can be added with calls to
5858
* lo_message_add_*().
5959
*/
60-
typedef void *lo_message;
60+
typedef struct lo_message_ {} *lo_message;
6161

6262
/**
6363
* \brief A low-level object used to represent bundles of messages passed over
@@ -66,30 +66,30 @@ typedef void *lo_message;
6666
* Created by calls to lo_bundle_new(), messages can be added with calls to
6767
* lo_bundle_add_message().
6868
*/
69-
typedef void *lo_bundle;
69+
typedef struct lo_bundle_ {} *lo_bundle;
7070

7171
/**
7272
* \brief An object representing an method on a server.
7373
*
7474
* Returned by calls to lo_server_thread_add_method() and
7575
* lo_server_add_method().
7676
*/
77-
typedef void *lo_method;
77+
typedef struct lo_method_ {} *lo_method;
7878

7979
/**
8080
* \brief An object representing an instance of an OSC server.
8181
*
8282
* Created by calls to lo_server_new(). If you wish to have the server
8383
* operate in a background thread, use lo_server_thread instead.
8484
*/
85-
typedef void *lo_server;
85+
typedef struct lo_server_ {} *lo_server;
8686

8787
/**
8888
* \brief An object representing a thread containing an OSC server.
8989
*
9090
* Created by calls to lo_server_thread_new().
9191
*/
92-
typedef void *lo_server_thread;
92+
typedef struct lo_server_thread_ {} *lo_server_thread;
9393

9494
/**
9595
* \brief A callback function to receive notification of an error in a server or

0 commit comments

Comments
 (0)