matthiasm@27: /*
matthiasm@27:  *  Copyright (C) 2004 Steve Harris
matthiasm@27:  *
matthiasm@27:  *  This program is free software; you can redistribute it and/or
matthiasm@27:  *  modify it under the terms of the GNU Lesser General Public License
matthiasm@27:  *  as published by the Free Software Foundation; either version 2.1
matthiasm@27:  *  of the License, or (at your option) any later version.
matthiasm@27:  *
matthiasm@27:  *  This program is distributed in the hope that it will be useful,
matthiasm@27:  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
matthiasm@27:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
matthiasm@27:  *  GNU Lesser General Public License for more details.
matthiasm@27:  *
matthiasm@27:  *  $Id$
matthiasm@27:  */
matthiasm@27: 
matthiasm@27: #ifndef LO_MACROS_H
matthiasm@27: #define LO_MACROS_H
matthiasm@27: 
matthiasm@27: /* macros that have to be defined after function signatures */
matthiasm@27: 
matthiasm@27: #ifdef __cplusplus
matthiasm@27: extern "C" {
matthiasm@27: #endif
matthiasm@27: 
matthiasm@27: /* \brief Maximum length of UDP messages in bytes
matthiasm@27:  */
matthiasm@27: #define LO_MAX_MSG_SIZE 32768
matthiasm@27: 
matthiasm@27: /* \brief A set of macros to represent different communications transports
matthiasm@27:  */
matthiasm@27: #define LO_DEFAULT 0x0
matthiasm@27: #define LO_UDP     0x1
matthiasm@27: #define LO_UNIX    0x2
matthiasm@27: #define LO_TCP     0x4
matthiasm@27: 
matthiasm@27: /* an internal value, ignored in transmission but check against LO_MARKER in the
matthiasm@27:  * argument list. Used to do primitive bounds checking */
matthiasm@27: #define LO_MARKER_A 0xdeadbeef
matthiasm@27: #define LO_MARKER_B 0xf00baa23
matthiasm@27: #define LO_ARGS_END LO_MARKER_A, LO_MARKER_B
matthiasm@27: 
matthiasm@27: #define lo_message_add_varargs(msg, types, list) \
matthiasm@27:     lo_message_add_varargs_internal(msg, types, list, __FILE__, __LINE__)
matthiasm@27: 
matthiasm@27: #ifdef __GNUC__
matthiasm@27: 
matthiasm@27: #define lo_message_add(msg, types...)                         \
matthiasm@27:     lo_message_add_internal(msg, __FILE__, __LINE__, types,   \
matthiasm@27:                             LO_MARKER_A, LO_MARKER_B)
matthiasm@27: 
matthiasm@27: #define lo_send(targ, path, types...) \
matthiasm@27:         lo_send_internal(targ, __FILE__, __LINE__, path, types, \
matthiasm@27: 			 LO_MARKER_A, LO_MARKER_B)
matthiasm@27: 
matthiasm@27: #define lo_send_timestamped(targ, ts, path, types...) \
matthiasm@27:         lo_send_timestamped_internal(targ, __FILE__, __LINE__, ts, path, \
matthiasm@27: 		       	             types, LO_MARKER_A, LO_MARKER_B)
matthiasm@27: 
matthiasm@27: #define lo_send_from(targ, from, ts, path, types...) \
matthiasm@27:         lo_send_from_internal(targ, from, __FILE__, __LINE__, ts, path, \
matthiasm@27: 		       	             types, LO_MARKER_A, LO_MARKER_B)
matthiasm@27: 
matthiasm@27: #else
matthiasm@27: 
matthiasm@27: /* In non-GCC compilers, there is no support for variable-argument
matthiasm@27:  * macros, so provide "internal" vararg functions directly instead. */
matthiasm@27: 
matthiasm@27: int lo_message_add(lo_message msg, const char *types, ...);
matthiasm@27: int lo_send(lo_address targ, const char *path, const char *types, ...);
matthiasm@27: int lo_send_timestamped(lo_address targ, lo_timetag ts, const char *path, const char *types, ...);
matthiasm@27: int lo_send_from(lo_address targ, lo_server from, lo_timetag ts, const char *path, const char *types, ...);
matthiasm@27: 
matthiasm@27: #endif
matthiasm@27: 
matthiasm@27: #ifdef __cplusplus
matthiasm@27: }
matthiasm@27: #endif
matthiasm@27: 
matthiasm@27: #endif