aboutsummaryrefslogtreecommitdiff
path: root/pdoctave_command.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdoctave_command.c')
-rw-r--r--pdoctave_command.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/pdoctave_command.c b/pdoctave_command.c
new file mode 100644
index 0000000..b1f1d6b
--- /dev/null
+++ b/pdoctave_command.c
@@ -0,0 +1,114 @@
+#include <string.h>
+#ifndef __pdoctave_command_c_
+#define __pdoctave_command_c_
+#include "pdoctave.h" /* writing a command to octave */
+#include "pdoctave_dataframe.h"
+#include "m_pd.h"
+
+static t_class *pdoctave_command_class;
+
+typedef struct _PDOctaveCommand_ PDOctaveCommand;
+struct _PDOctaveCommand_
+{
+ t_object x_obj;
+ char oct_command[1024];
+ int pos;
+};
+
+static void clearStringCommand (PDOctaveCommand *pdoctcmd_obj)
+{
+ pdoctcmd_obj->pos=0;
+ pdoctcmd_obj->oct_command[0] = '\0';
+}
+
+static void addStringToCommand (PDOctaveCommand *pdoctcmd_obj, char *str)
+{
+ int n = strlen (str);
+ strcpy(pdoctcmd_obj->oct_command+pdoctcmd_obj->pos, str);
+ pdoctcmd_obj->pos += n;
+}
+
+static void addAtomToCommand (PDOctaveCommand *pdoctcmd_obj, t_atom *a)
+{
+ const unsigned int bufsize = 50;
+ char str[bufsize];
+
+ atom_string (a, str, bufsize);
+
+ if (strcmp(str,"\\\\,") == 0) {
+ strcpy(str,",\0");
+ }
+ else if (strcmp(str,"\\\\;") == 0) {
+ strcpy(str,";\0");
+ }
+
+ addStringToCommand (pdoctcmd_obj, str);
+}
+
+static void removeEscapeSlashes (char *c)
+{
+ int pos = strlen(c);
+ c = c+pos-1;
+
+ while (--pos) {
+ if (*--c == '\\') {
+ strcpy(c,c+1);
+ }
+ }
+}
+static void pDOctaveCommandBang (PDOctaveCommand *pdoctcmd_obj)
+{
+ post("command: %s sent", pdoctcmd_obj->oct_command);
+ writeToOctaveStdIN (pdoctcmd_obj->oct_command);
+}
+
+
+static void pDOctaveCommandAny (PDOctaveCommand *pdoctcmd_obj, t_symbol *s, int argc, t_atom *argv)
+{
+ clearStringCommand (pdoctcmd_obj);
+ if (argc>0)
+ while (argc--) {
+ addAtomToCommand (pdoctcmd_obj, argv++);
+ addStringToCommand (pdoctcmd_obj, " \0");
+ }
+
+ addStringToCommand (pdoctcmd_obj, "\n");
+ removeEscapeSlashes (pdoctcmd_obj->oct_command);
+ pDOctaveCommandBang (pdoctcmd_obj);
+}
+
+static void *newPDOctaveCommand (t_symbol *s, int argc, t_atom *argv)
+{
+ PDOctaveCommand *pdoctcmd_obj = (PDOctaveCommand *)
+ pd_new (pdoctave_command_class);
+
+ post("getpdoctaveinstances returned %d", getPDOctaveInstances());
+ if (getPDOctaveInstances()<1) {
+ post("Octave not running, insert a 'pdoctave' object!!");
+ }
+ pdoctcmd_obj->pos = 0;
+ if (argc>0)
+ while (argc--) {
+ addAtomToCommand (pdoctcmd_obj, argv++);
+ addStringToCommand (pdoctcmd_obj, " \0");
+ }
+
+ addStringToCommand (pdoctcmd_obj, "\n");
+ removeEscapeSlashes(pdoctcmd_obj->oct_command);
+
+ return ((void *) pdoctcmd_obj);
+}
+void pdoctave_command_setup (void)
+{
+ pdoctave_command_class = class_new
+ (gensym("pdoctave_command"),
+ (t_newmethod) newPDOctaveCommand,
+ 0,
+ sizeof (PDOctaveCommand),
+ CLASS_DEFAULT, A_GIMME, 0);
+ class_addbang (pdoctave_command_class, (t_method) pDOctaveCommandBang);
+ class_addanything (pdoctave_command_class, (t_method) pDOctaveCommandAny);
+ post("pdoctave_command successfully loaded");
+}
+#endif
+