X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/Text.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/Text.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/Text.cpp new file mode 100644 index 0000000..c89c7f5 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/Text.cpp @@ -0,0 +1,237 @@ +/************************************************************************ + ************************************************************************ + 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 +#include +#include +#include +#include "Text.hh" +#include "compatibility.hh" +#include +#include +#include +#include +#include + +#include "floats.hh" + +extern bool gInternDoubleSwitch; + +static string substitution (const string& model, const vector& 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& args) +{ + return substitution(model, args); +} + +string subst (const string& model, const string& a0) +{ + vector args(10); + args[0] = a0; + return substitution (model, args); +} + +string subst (const string& model, const string& a0, const string& a1) +{ + vector 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 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 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 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 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 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& 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 ""; + } +}