Rename interpretor to interpreter.
[Faustine.git] / interpreter / preprocessor / faust-0.9.47mr3 / compiler / signals / sigprint.cpp
diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/signals/sigprint.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/signals/sigprint.cpp
new file mode 100644 (file)
index 0000000..69e7d00
--- /dev/null
@@ -0,0 +1,149 @@
+/************************************************************************
+ ************************************************************************
+    FAUST compiler
+       Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
+    ---------------------------------------------------------------------
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************
+ ************************************************************************/
+#include <stdio.h>
+
+#include "signals.hh"
+#include "sigtype.hh"
+#include "sigtyperules.hh"
+
+// imprime le type d'un signal en clair
+#if 0
+void printSigType (Tree tp)
+{
+       Tree t0;
+       int     n, v, c;
+       
+       if (isTableType(tp, t0)) {
+               printf("table-of "); 
+               printSigType(t0);
+       } else if (isSigType(tp, &n, &v, &c)) {
+               putchar("NR"[n]);
+               putchar("KB S"[v]);
+               putchar("CI X"[c]);
+               //printf(" {%d,%d,%d} ", n, v, c);
+       } else {
+               printf("unknown");
+       }
+}
+
+void printSigTypeList (Tree l)
+{
+       char sep = '(';
+
+       do {
+               putchar(sep); sep = ',';
+               printSigType(hd(l));
+               l = tl(l);
+       } while (isList(l));
+
+       putchar(')');
+}
+#endif 
+
+void printSigType (int n, int v, int c)
+{
+       putchar("NR"[n]);
+       putchar("KB S"[v]);
+       putchar("CI X"[c]);
+}
+
+const char* binopname[]= {
+               "+", "-", "*", "/", "%", 
+               "<<", ">>",
+               ">", "<", ">=", "<=", "==", "!=",
+               "&", "|", "^" 
+};
+
+int binopprec[]= {
+               2, 2, 3, 3, 3,
+               1, 1,
+               1, 1, 1, 1, 1, 1,
+               1, 1, 1
+};             
+
+void printSignal(Tree sig, FILE* out, int prec)
+{
+       int     i;
+       double  r;
+    Tree        x, y, z, u, le, id;
+           
+                if ( isSigInt(sig, &i) )                       { fprintf(out, "%d", i);        }
+       else if ( isSigReal(sig, &r) )                  { fprintf(out, "%f", r);        }
+       else if ( isSigInput(sig, &i) )                 { fprintf(out, "IN%d", i);      }
+       else if ( isSigOutput(sig, &i, x) )     { fprintf(out, "OUT%d := ", i); printSignal(x, out, 0); }
+       
+       else if ( isSigBinOp(sig, &i, x, y) )   { 
+               if (prec > binopprec[i]) fputs("(", out); 
+               printSignal(x,out,binopprec[i]); fputs(binopname[i], out); printSignal(y, out, binopprec[i]); 
+               if (prec > binopprec[i]) fputs(")", out);       
+       }
+       else if ( isSigDelay1(sig, x) )                 { fputs("mem(", out); printSignal(x,out,0); fputs(")", out);            }
+       else if ( isSigPrefix(sig, x, y) )              { fputs("prefix(", out); printSignal(x,out,0); fputs(",", out);  printSignal(y,out,0); fputs(")", out);         }
+       else if ( isSigAttach(sig, x, y) )              { fputs("attach(", out); printSignal(x,out,0); fputs(",", out);  printSignal(y,out,0); fputs(")", out);         }
+       else if ( isSigFixDelay(sig, x, y) )    { 
+               if (prec > 4) fputs("(", out); 
+               printSignal(x,out,4); fputs("@", out); printSignal(y, out, 4); 
+               if (prec > 4) fputs(")", out);  
+       }
+
+       else if ( isProj(sig, &i, x) )                  { printSignal(x,out,prec); fprintf(out, "#%d", i);              }
+    else if ( isRef(sig, i) )                          { fprintf(out, "$%d", i);       }
+       else if ( isRef(sig, x) )                               { print(x, out);                        }
+       else if ( isRec(sig, le))                               { fputs("\\_.", out); printSignal(le, out, prec);       }
+       else if ( isRec(sig, x, le))                    { fputs("\\", out); print(x,out); fputs(".", out); printSignal(le, out, prec);  }
+       
+       else if ( isSigTable(sig, id, x, y) )   { fputs("table(", out); printSignal(x,out,0); fputc(',', out); printSignal(y,out,0); fputc(')', out);   }
+       else if ( isSigWRTbl(sig, id, x, y, z) ){ printSignal(x,out,0); fputc('[',out); printSignal(y,out,0); fputs("] := (", out); printSignal(z,out,0); fputc(')', out);   }
+       else if ( isSigRDTbl(sig, x, y) )               { printSignal(x,out,0); fputc('[', out); printSignal(y,out,0); fputc(']', out);   }
+
+    else if (isSigDocConstantTbl(sig,x,y))     { fputs("sigDocConstantTbl(", out); printSignal(x,out,0); fputc(',', out);
+                                                                                printSignal(y,out,0); fputc(')', out);   }
+
+    else if (isSigDocWriteTbl(sig,x,y,z,u)) { fputs("sigDocWriteTbl(", out);    printSignal(x,out,0); fputc(',', out);
+                                                                                printSignal(y,out,0); fputc(',', out);
+                                                                                printSignal(z,out,0); fputc(',', out);
+                                                                                printSignal(u,out,0); fputc(')', out);   }
+
+    else if (isSigDocAccessTbl(sig,x,y))       { fputs("sigDocAccessTbl(", out);   printSignal(x,out,0); fputc(',', out);
+                                                                                printSignal(y,out,0); fputc(')', out);   }
+
+
+       else if ( isSigGen(sig, x) )                    { printSignal(x,out,prec);                              }
+       else if ( isSigIntCast(sig, x) )                { fputs("int(", out); printSignal(x,out,0); fputs(")", out);            }
+       else if ( isSigFloatCast(sig, x) )              { fputs("float(", out); printSignal(x,out,0); fputs(")", out);          }
+
+       else if (isList(sig)) {
+               char sep = '{';
+               do { 
+                       fputc(sep, out);
+                       printSignal(hd(sig), out, 0);
+                       sep=',';
+                       sig = tl(sig);
+               } while (isList(sig));
+               fputc('}', out);
+       }
+       else
+               print(sig, out);
+}