aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xosc/packOSC.c63
1 files changed, 42 insertions, 21 deletions
diff --git a/osc/packOSC.c b/osc/packOSC.c
index 6f37cdb..3278e34 100755
--- a/osc/packOSC.c
+++ b/osc/packOSC.c
@@ -30,7 +30,6 @@ MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
The OSC webpage is http://cnmat.cnmat.berkeley.edu/OpenSoundControl
*/
-#define MAX_ARGS 2000
#define SC_BUFFER_SIZE 64000
#include "m_pd.h"
@@ -322,38 +321,55 @@ static void packOSC_settypetags(t_packOSC *x, t_float *f)
static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
{
- char messageName[MAXPDSTRING];
- char typeStr[MAX_ARGS];
- typedArg args[MAX_ARGS];
- int i, j, k, nTags, nArgs;
- char c;
-
- messageName[0] = '\0'; // empty
-
- if(argc>MAX_ARGS)
+ char messageName[MAXPDSTRING];
+ unsigned int nTypeTags = 0, typeStrTotalSize;
+ unsigned int argsSize = sizeof(typedArg)*argc;
+ char* typeStr = NULL; /* might not be used */
+ typedArg* args = (typedArg*)getbytes(argsSize);
+ int i, nTags, nArgs;
+ unsigned int m, j, k;
+ char c;
+
+ if (args == NULL)
{
- post ("packOSC: too many arguments! (max: %d)", MAX_ARGS);
+ post("packOSC: unable to allocate %lu bytes for args", argsSize);
return;
}
+ messageName[0] = '\0'; // empty
atom_string(&argv[0], messageName, MAXPDSTRING); /* the OSC address string */
if (x->x_typetags & 2)
- { /* first arg is typestring */
+ { /* second arg is typestring */
+ /* we need to find out how long the type string is before we copy it*/
+ nTypeTags = strlen(atom_getsymbol(&argv[1])->s_name);
+ typeStrTotalSize = nTypeTags + 2;
+ typeStr = (char*)getzbytes(typeStrTotalSize);
+ if (typeStr == NULL)
+ {
+ post("packOSC: unable to allocate %lu bytes for typeStr", nTypeTags);
+ return;
+ }
typeStr[0] = ',';
- atom_string(&argv[1], &typeStr[1], MAXPDSTRING);
+ atom_string(&argv[1], &typeStr[1], typeStrTotalSize);
+#ifdef DEBUG
+ post("typeStr: %s, nTypeTags %lu", typeStr, nTypeTags);
+#endif
nArgs = argc-2;
- for (i = nTags = 0; i < MAX_ARGS; ++i)
+ for (m = nTags = 0; m < nTypeTags; ++m)
{
- if (typeStr[i+1] == 0) break;
- if (!(typeStr[i+1] == 'T' || typeStr[i+1] == 'F' || typeStr[i+1] == 'N' || typeStr[i+1] == 'I'))
+#ifdef DEBUG
+ post("typeStr[%d] %c", m+1, typeStr[m+1]);
+#endif
+ if ((c = typeStr[m+1]) == 0) break;
+ if (!(c == 'T' || c == 'F' || c == 'N' || c == 'I'))
++nTags; /* these tags have data */
}
if (nTags != nArgs)
{
post("packOSC: Tags count %d doesn't match argument count %d", nTags, nArgs);
- return;
+ goto cleanup;
}
- for (j = k = 0; j < i; ++j) /* i is the number of tags */
+ for (j = k = 0; j < m; ++j) /* m is the number of tags */
{
c = typeStr[j+1];
if (!(c == 'T' || c == 'F' || c == 'N' || c == 'I')) /* not no data */
@@ -365,7 +381,7 @@ static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
if(packOSC_writetypedmessage(x, x->x_oscbuf, messageName, nArgs, args, typeStr))
{
post("packOSC: usage error, write-msg failed.");
- return;
+ goto cleanup;
}
}
else
@@ -395,7 +411,7 @@ static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
if(packOSC_writemessage(x, x->x_oscbuf, messageName, i, args))
{
post("packOSC: usage error, write-msg failed.");
- return;
+ goto cleanup;
}
}
@@ -404,6 +420,10 @@ static void packOSC_sendtyped(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
packOSC_sendbuffer(x);
OSC_initBuffer(x->x_oscbuf, SC_BUFFER_SIZE, bufferForOSCbuf);
}
+
+cleanup:
+ if (typeStr != NULL) freebytes(typeStr, typeStrTotalSize);
+ if (args != NULL) freebytes(args, argsSize);
}
static void packOSC_send_type_forced(t_packOSC *x, t_symbol *s, int argc, t_atom *argv)
@@ -645,7 +665,7 @@ static int packOSC_writemessage(t_packOSC *x, OSCbuf *buf, char *messageName, in
else
{
/* First figure out the type tags */
- char typeTags[MAX_ARGS+2];
+ char *typeTags=(char*)getbytes(sizeof(char)*(numArgs+2));
typeTags[0] = ',';
for (j = 0; j < numArgs; ++j)
@@ -672,6 +692,7 @@ static int packOSC_writemessage(t_packOSC *x, OSCbuf *buf, char *messageName, in
{
post("packOSC: Problem writing address.");
}
+ freebytes(typeTags, sizeof(char)*(numArgs+2));
}
for (j = 0; j < numArgs; j++)
{