18#include "IPlugOSC_msg.h"
22static int pad4(
int len)
27static int _strlen(
const char* p,
int maxlen)
30 while (i < maxlen && *p)
38OscMessageRead::OscMessageRead(
char* buf,
int len)
42 if (!buf || len < 1)
return;
43 if (len > MAX_OSC_MSG_LEN) len=MAX_OSC_MSG_LEN;
46 int n=pad4(_strlen(m_msg_ptr, len));
63 n += pad4(_strlen(m_type_ptr, len-n));
70 const char* t=m_type_ptr;
74 while (++t < m_type_end && *t && n < len)
78 OSC_MAKEINTMEM4BE(buf+n);
83 OSC_MAKEINTMEM4BE(buf+n);
88 n += pad4(_strlen(buf+n, len-n));
96 if (t <= m_type_end && !*t && n <= len)
106const char* OscMessageRead::GetMessage()
const
108 return (m_msgok ? m_msg_ptr :
"");
111int OscMessageRead::GetNumArgs()
const
113 if (!m_msgok)
return 0;
114 if (m_type_ptr >= m_type_end)
return 0;
115 return (
int) strlen(m_type_ptr);
118const char* OscMessageRead::PopWord()
120 if (!m_msgok)
return 0;
121 if (m_msg_ptr >= m_msg_end)
return 0;
124 char* q=strstr(p,
"/");
138const void *OscMessageRead::GetIndexedArg(
int idx,
char *typeOut)
const
140 if (!m_msgok || idx<0)
return 0;
141 const char *ptr = m_type_ptr;
142 const char *valptr = m_arg_ptr;
143 if (ptr >= m_type_end || valptr >= m_arg_end)
return 0;
147 if (*ptr ==
'i') valptr +=
sizeof(int);
148 else if (*ptr ==
'f') valptr +=
sizeof(float);
149 else if (*ptr ==
's') valptr += pad4((
int) strlen(valptr));
154 if (ptr >= m_type_end || valptr >= m_arg_end)
return 0;
159 const char *endptr = valptr;
160 if (*ptr ==
'i') endptr +=
sizeof(int);
161 else if (*ptr ==
'f') endptr +=
sizeof(float);
162 else if (*ptr ==
's') endptr += pad4((
int) strlen(valptr));
165 if (endptr > m_arg_end)
return 0;
170const int* OscMessageRead::PopIntArg(
bool peek)
172 if (!m_msgok)
return 0;
173 if (m_type_ptr >= m_type_end)
return 0;
174 if (*m_type_ptr !=
'i')
return 0;
175 if (m_arg_ptr+
sizeof(
int) > m_arg_end)
return 0;
177 int* p=(
int*)m_arg_ptr;
181 m_arg_ptr +=
sizeof(int);
187const float* OscMessageRead::PopFloatArg(
bool peek)
189 if (!m_msgok)
return 0;
190 if (m_type_ptr >= m_type_end)
return 0;
191 if (*m_type_ptr !=
'f')
return 0;
192 if (m_arg_ptr+
sizeof(
float) > m_arg_end)
return 0;
194 float* p=(
float*)m_arg_ptr;
199 m_arg_ptr +=
sizeof(float);
205const char* OscMessageRead::PopStringArg(
bool peek)
207 if (!m_msgok)
return 0;
208 if (m_type_ptr >= m_type_end)
return 0;
209 if (*m_type_ptr !=
's')
return 0;
210 if (m_arg_ptr+strlen(m_arg_ptr) > m_arg_end)
return 0;
212 const char* p=(
const char*)m_arg_ptr;
216 int n=pad4((
int) strlen(p));
223void OscMessageRead::DebugDump(
const char* label,
char* dump,
int dumplen)
226 if (!label) label=
"";
228 strcat(dump, m_msg_ptr);
230 int n=pad4((
int) strlen(m_msg_ptr));
232 const char* t=m_msg_ptr+n;
235 snprintf(dump+strlen(dump), MAX_OSC_MSG_LEN,
" [%s]", t+1);
237 n += pad4((
int) strlen(t));
239 const char* a=m_msg_ptr+n;
244 snprintf(dump+strlen(dump), MAX_OSC_MSG_LEN,
" %d", *(
int*)a);
249 snprintf(dump+strlen(dump), MAX_OSC_MSG_LEN,
" %f", *(
float*)a);
254 snprintf(dump + (
int) strlen(dump), MAX_OSC_MSG_LEN,
" \"%s\"", a);
255 a += pad4((
int) strlen(a));
259 snprintf(dump+strlen(dump), MAX_OSC_MSG_LEN,
" %c:(unknown argument type)", *t);
268OscMessageWrite::OscMessageWrite()
279bool OscMessageWrite::PushWord(
const char* word)
281 int len=(int) strlen(word);
282 if (m_msg_ptr+len+1 >= m_msg+
sizeof(m_msg))
return false;
284 strcpy(m_msg_ptr, word);
289bool OscMessageWrite::PushInt(
int val)
292 sprintf(buf,
"%d", val);
293 return PushWord(buf);
296bool OscMessageWrite::PushIntArg(
int val)
298 if (m_type_ptr+1 > m_types+
sizeof(m_types))
return false;
299 if (m_arg_ptr+
sizeof(
int) > m_args+
sizeof(m_args))
return false;
304 *(
int*)m_arg_ptr=val;
305 OSC_MAKEINTMEM4BE(m_arg_ptr);
306 m_arg_ptr +=
sizeof(int);
311bool OscMessageWrite::PushFloatArg(
float val)
313 if (m_type_ptr+1 > m_types+
sizeof(m_types))
return false;
314 if (m_arg_ptr+
sizeof(
float) > m_args+
sizeof(m_args))
return false;
319 *(
float*)m_arg_ptr=val;
320 OSC_MAKEINTMEM4BE(m_arg_ptr);
321 m_arg_ptr +=
sizeof(float);
326bool OscMessageWrite::PushStringArg(
const char* val)
328 int len=(int) strlen(val);
329 int padlen=pad4(len);
331 if (m_type_ptr+1 > m_types+
sizeof(m_types))
return false;
332 if (m_arg_ptr+padlen > m_args+
sizeof(m_args))
return false;
337 strcpy(m_arg_ptr, val);
338 memset(m_arg_ptr+len, 0, padlen-len);
344const char* OscMessageWrite::GetBuffer(
int* len)
346 int msglen=(int) (m_msg_ptr-m_msg);
347 int msgpadlen=pad4(msglen);
349 int typelen=(int) (m_type_ptr-m_types+1);
350 int typepadlen=pad4(typelen);
352 int arglen=(int) (m_arg_ptr-m_args);
354 if (msgpadlen+typepadlen+arglen >
sizeof(m_msg))
361 memset(p+msglen, 0, msgpadlen-msglen);
365 strcpy(p+1, m_types);
366 memset(p+typelen, 0, typepadlen-typelen);
369 memcpy(p, m_args, arglen);
372 if (len) *len=(int) (p-m_msg);
376void OscMessageWrite::DebugDump(
const char* label,
char* dump,
int dumplen)
379 const char* p=GetBuffer(&len);
380 if (p && len && len <= MAX_OSC_MSG_LEN)
382 char buf[MAX_OSC_MSG_LEN];
385 rmsg.DebugDump(label, dump, dumplen);