--- /dev/null
+/************************************************************************
+ ************************************************************************
+ 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 <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "Text.hh"
+#include "compatibility.hh"
+#include <string>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <assert.h>
+
+#include "floats.hh"
+
+extern bool gInternDoubleSwitch;
+
+static string substitution (const string& model, const vector<string>& args);
+
+/**
+ * Text substitution. Creates a string by replacing all the $n
+ * occurences in the model string, with the corresponding arguments.
+ * Example :
+ * subst("float $0 = $1;", "var", T(10.2))
+ */
+string subst (const string& model, const vector<string>& args)
+{
+ return substitution(model, args);
+}
+
+string subst (const string& model, const string& a0)
+{
+ vector<string> args(10);
+ args[0] = a0;
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1)
+{
+ vector<string> args(10);
+ args[0] = a0;
+ args[1] = a1;
+
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1, const string& a2)
+{
+ vector<string> args(10);
+
+ args[0] = a0;
+ args[1] = a1;
+ args[2] = a2;
+
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3)
+{
+ vector<string> args(10);
+
+ args[0] = a0;
+ args[1] = a1;
+ args[2] = a2;
+ args[3] = a3;
+
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4)
+{
+ vector<string> args(10);
+
+ args[0] = a0;
+ args[1] = a1;
+ args[2] = a2;
+ args[3] = a3;
+ args[4] = a4;
+
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4, const string& a5)
+{
+ vector<string> args(10);
+
+ args[0] = a0;
+ args[1] = a1;
+ args[2] = a2;
+ args[3] = a3;
+ args[4] = a4;
+ args[5] = a5;
+
+ return substitution (model, args);
+}
+
+string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4, const string& a5, const string& a6)
+{
+ vector<string> args(10);
+
+ args[0] = a0;
+ args[1] = a1;
+ args[2] = a2;
+ args[3] = a3;
+ args[4] = a4;
+ args[5] = a5;
+ args[6] = a6;
+
+ return substitution (model, args);
+}
+
+
+static string substitution (const string& model, const vector<string>& args)
+{
+ char c;
+ int i=0, ilast = model.length()-1;
+ string result;
+
+ while (i < ilast) {
+ c = model[i++];
+ if (c != '$') {
+ result += c;
+ } else {
+ c = model[i++];
+ if (c >= '0' && c <= '9') {
+ result += args[c - '0'];
+ } else {
+ result += c;
+ }
+ }
+ }
+ if (i == ilast) result += model[i];
+ return result;
+}
+
+
+string T (char* c) { return string(c); }
+string T (int n) { char c[64]; snprintf(c, 63, "%d",n); return string(c); }
+string T (long n) { char c[64]; snprintf(c, 63, "%ld",n); return string(c); }
+
+
+/**
+ * If needed add a trailing '.0' to the
+ * the textual representation of a floating point number
+ * to avoid confusions with an int.
+ */
+static void ensureFloat(char* c)
+{
+ bool isInt = true;
+ while (*c != 0) {
+ if ((*c == '.') | (*c == 'e')) isInt = false;
+ c++;
+ }
+
+ if (isInt) {
+ *c++ = '.';
+ *c++ = '0';
+ *c = 0;
+ }
+}
+
+/**
+ * Convert a double-precision float into a string.
+ * Adjusts the precision p to the needs. Add a trailing
+ * f if single-precision is required.
+ */
+string T(double n)
+{
+ char c[64];
+ int p = 1;
+ if (isfinite(n)) {
+ do { snprintf(c, 32, "%.*g", p++, n); } while (atof(c) != n);
+ ensureFloat(c);
+ return string(c)+inumix();
+ } else {
+ snprintf(c, 32, "%g", n);
+ return string(c);
+ }
+}
+
+
+/**
+ * remove quotes from a string
+ */
+string unquote(const string& s)
+{
+ assert(s.size() >= 2);
+ assert(s[0] == '"');
+ assert(s[s.size()-1] == '"');
+ return s.substr(1, s.size()-2);
+}
+
+
+/**
+ * add quotes to a string
+ */
+string quote(const string& s)
+{
+ string q("\"");
+ q += s;
+ q += "\"";
+ return q;
+}
+
+string rmWhiteSpaces(const string& s)
+{
+ size_t i = s.find_first_not_of(" \t");
+ size_t j = s.find_last_not_of(" \t");
+
+ if ( (i != string::npos) & (j != string::npos) ) {
+ return s.substr(i, 1+j-i);
+ } else {
+ return "";
+ }
+}