aboutsummaryrefslogtreecommitdiff
path: root/pd/src/m_atom.c
diff options
context:
space:
mode:
authorGuenter Geiger <ggeiger@users.sourceforge.net>2002-07-29 17:06:19 +0000
committerGuenter Geiger <ggeiger@users.sourceforge.net>2002-07-29 17:06:19 +0000
commit57045df5fe3ec557e57dc7434ac1a07b5521bffc (patch)
tree7174058b41b73c808107c7090d9a4e93ee202341 /pd/src/m_atom.c
parentda38b3424229e59f956252c3d89895e43e84e278 (diff)
This commit was generated by cvs2svn to compensate for changes in r58,
which included commits to RCS files with non-trunk default branches. svn path=/trunk/; revision=59
Diffstat (limited to 'pd/src/m_atom.c')
-rw-r--r--pd/src/m_atom.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/pd/src/m_atom.c b/pd/src/m_atom.c
new file mode 100644
index 00000000..c9c4c284
--- /dev/null
+++ b/pd/src/m_atom.c
@@ -0,0 +1,129 @@
+/* Copyright (c) 1997-1999 Miller Puckette.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+#include "m_imp.h"
+#include <stdio.h>
+#include <string.h>
+
+ /* convenience routines for checking and getting values of
+ atoms. There's no "pointer" version since there's nothing
+ safe to return if there's an error. */
+
+t_float atom_getfloat(t_atom *a)
+{
+ if (a->a_type == A_FLOAT) return (a->a_w.w_float);
+ else return (0);
+}
+
+t_int atom_getint(t_atom *a)
+{
+ return (atom_getfloat(a));
+}
+
+t_symbol *atom_getsymbol(t_atom *a) /* LATER think about this more carefully */
+{
+ char buf[30];
+ if (a->a_type == A_SYMBOL) return (a->a_w.w_symbol);
+ else return (&s_float);
+}
+
+t_symbol *atom_gensym(t_atom *a) /* this works better for graph labels */
+{
+ char buf[30];
+ if (a->a_type == A_SYMBOL) return (a->a_w.w_symbol);
+ else if (a->a_type == A_FLOAT)
+ sprintf(buf, "%g", a->a_w.w_float);
+ else strcpy(buf, "???");
+ return (gensym(buf));
+}
+
+t_float atom_getfloatarg(int which, int argc, t_atom *argv)
+{
+ if (argc <= which) return (0);
+ argv += which;
+ if (argv->a_type == A_FLOAT) return (argv->a_w.w_float);
+ else return (0);
+}
+
+t_int atom_getintarg(int which, int argc, t_atom *argv)
+{
+ return (atom_getfloatarg(which, argc, argv));
+}
+
+t_symbol *atom_getsymbolarg(int which, int argc, t_atom *argv)
+{
+ if (argc <= which) return (&s_);
+ argv += which;
+ if (argv->a_type == A_SYMBOL) return (argv->a_w.w_symbol);
+ else return (&s_);
+}
+
+/* convert an atom into a string, in the reverse sense of binbuf_text (q.v.)
+* special attention is paid to symbols containing the special characters
+* ';', ',', '$', and '\'; these are quoted with a preceding '\', except that
+* the '$' only gets quoted at the beginning of the string.
+*/
+
+void atom_string(t_atom *a, char *buf, unsigned int bufsize)
+{
+ char tbuf[30];
+ switch(a->a_type)
+ {
+ case A_SEMI: strcpy(buf, ";"); break;
+ case A_COMMA: strcpy(buf, ","); break;
+ case A_POINTER:
+ strcpy(buf, "(pointer)");
+ break;
+ case A_FLOAT:
+ sprintf(tbuf, "%g", a->a_w.w_float);
+ if (strlen(tbuf) < bufsize-1) strcpy(buf, tbuf);
+ else if (a->a_w.w_float < 0) strcpy(buf, "-");
+ else strcat(buf, "+");
+ break;
+ case A_SYMBOL:
+ {
+ char *sp;
+ unsigned int len;
+ int quote;
+ for (sp = a->a_w.w_symbol->s_name, len = 0, quote = 0; *sp; sp++, len++)
+ if (*sp == ';' || *sp == ',' || *sp == '\\' ||
+ (*sp == '$' && sp == a->a_w.w_symbol->s_name && sp[1] >= '0'
+ && sp[1] <= '9'))
+ quote = 1;
+ if (quote)
+ {
+ char *bp = buf, *ep = buf + (bufsize-2);
+ sp = a->a_w.w_symbol->s_name;
+ while (bp < ep && *sp)
+ {
+ if (*sp == ';' || *sp == ',' || *sp == '\\' ||
+ (*sp == '$' && bp == buf && sp[1] >= '0' && sp[1] <= '9'))
+ *bp++ = '\\';
+ *bp++ = *sp++;
+ }
+ if (*sp) *bp++ = '*';
+ *bp = 0;
+ /* post("quote %s -> %s", a->a_w.w_symbol->s_name, buf); */
+ }
+ else
+ {
+ if (len < bufsize-1) strcpy(buf, a->a_w.w_symbol->s_name);
+ else
+ {
+ strncpy(buf, a->a_w.w_symbol->s_name, bufsize - 2);
+ strcpy(buf + (bufsize - 2), "*");
+ }
+ }
+ }
+ break;
+ case A_DOLLAR:
+ sprintf(buf, "$%d", a->a_w.w_index);
+ break;
+ case A_DOLLSYM:
+ sprintf(buf, "$%s", a->a_w.w_symbol->s_name);
+ break;
+ default:
+ bug("atom_string");
+ }
+}