X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/compiler/generator/description.cpp diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/generator/description.cpp b/interpretor/preprocessor/faust-0.9.47mr3/compiler/generator/description.cpp new file mode 100644 index 0000000..eacd9a0 --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/compiler/generator/description.cpp @@ -0,0 +1,339 @@ +//------------------------------------ +// generation of an xml description +//------------------------------------ +#include +#include +#include + +#include "description.hh" +#include "Text.hh" + +/** + * Extracts metdata from a label : 'vol [unit: dB]' -> 'vol' + metadata + */ +void extractMetadata(const string& fulllabel, string& label, map >& metadata) +{ + enum {kLabel, kEscape1, kEscape2, kEscape3, kKey, kValue}; + int state = kLabel; int deep = 0; + string key, value; + + for (size_t i=0; i < fulllabel.size(); i++) { + char c = fulllabel[i]; + switch (state) { + case kLabel : + assert (deep == 0); + switch (c) { + case '\\' : state = kEscape1; break; + case '[' : state = kKey; deep++; break; + default : label += c; + } + break; + + case kEscape1 : + label += c; + state = kLabel; + break; + + case kEscape2 : + key += c; + state = kKey; + break; + + case kEscape3 : + value += c; + state = kValue; + break; + + case kKey : + assert (deep > 0); + switch (c) { + case '\\' : state = kEscape2; + break; + + case '[' : deep++; + key += c; + break; + + case ':' : if (deep == 1) { + state = kValue; + } else { + key += c; + } + break; + case ']' : deep--; + if (deep < 1) { + metadata[rmWhiteSpaces(key)].insert(""); + state = kLabel; + key=""; + value=""; + } else { + key += c; + } + break; + default : key += c; + } + break; + + case kValue : + assert (deep > 0); + switch (c) { + case '\\' : state = kEscape3; + break; + + case '[' : deep++; + value += c; + break; + + case ']' : deep--; + if (deep < 1) { + metadata[rmWhiteSpaces(key)].insert(rmWhiteSpaces(value)); + state = kLabel; + key=""; + value=""; + } else { + value += c; + } + break; + default : value += c; + } + break; + + default : + cerr << "ERROR unrecognized state " << state << endl; + } + } + label = rmWhiteSpaces(label); +} + +//------------------------ specific schema ------------------------- + +string extractName(Tree fulllabel) +{ + string name; + map > metadata; + + extractMetadata(tree2str(fulllabel), name, metadata); + return name; +} + + +/** + * removes enclosing quotes and transforms '<', '>' and '&' characters + */ +static string xmlize(const string& fullsrc) +{ + map > metadata; + string dst; + string src; + + extractMetadata(fullsrc, src, metadata); + + for (size_t i=0; i' : dst += ">"; break; + case '&' : dst += "&"; break; + default : dst += src[i]; + } + } + } + return dst; +} + +void Description::print(int n, ostream& fout) +{ + list::iterator s; + list::iterator t; + + tab(n,fout); fout << ""; + + tab(n+1,fout); fout << "" << xmlize(fName) << ""; + tab(n+1,fout); fout << "" << xmlize(fAuthor) << ""; + tab(n+1,fout); fout << "" << xmlize(fCopyright) << ""; + tab(n+1,fout); fout << "" << xmlize(fLicense) << ""; + tab(n+1,fout); fout << "" << xmlize(fVersion) << ""; + tab(n+1,fout); fout << "" << fInputs << ""; + tab(n+1,fout); fout << "" << fOutputs << ""; + + tab(n+1,fout); fout << ""; + + // active widget list + tab(n+2,fout); fout << ""; + tab(n+3,fout); fout << "" << fActiveWidgetCount << ""; + for (s = fActiveLines.begin(); s != fActiveLines.end(); s++) { + tab(n+3, fout); fout << *s; + } + tab(n+2,fout); fout << ""; + + tab(n+2,fout); + + // passive widget list + tab(n+2,fout); fout << ""; + tab(n+3,fout); fout << "" << fPassiveWidgetCount << ""; + for (s = fPassiveLines.begin(); s != fPassiveLines.end(); s++) { + tab(n+3, fout); fout << *s; + } + tab(n+2,fout); fout << ""; + + + tab(n+2,fout); + + // widget layout + tab(n+2,fout); fout << ""; + for ( t = fLayoutTabs.begin(), s = fLayoutLines.begin(); + s != fLayoutLines.end(); t++, s++) { + tab(n+3+*t, fout); fout << *s; + } + tab(n+2,fout); fout << ""; + + tab(n+1,fout); fout << ""; + + + tab(n,fout); fout << "" << endl; + +} + +void Description::ui(Tree t) +{ + addGroup(0,t); +} + + +void Description::addGroup(int level, Tree t) +{ + Tree label, elements, varname, sig; + const char* groupnames[] = {"vgroup", "hgroup", "tgroup"}; + + if (isUiFolder(t, label, elements)) { + + const int orient = tree2int(left(label)); + const char * str = tree2str(right(label)); + + addLayoutLine(level, subst("", groupnames[orient])); + addLayoutLine(level+1, subst("", xmlize(str))); + while (!isNil(elements)) { + addGroup(level+1, right(hd(elements))); + elements = tl(elements); + } + addLayoutLine(level, ""); + + } else if (isUiWidget(t, label, varname, sig)) { + + int w = addWidget(label, varname, sig); + addLayoutLine(level, subst("", T(w))); + + } else { + + fprintf(stderr, "error in user interface generation 2\n"); + exit(1); + + } +} + +void Description::tab (int n, ostream& fout) +{ + fout << '\n'; + while (n--) fout << '\t'; +} + +int Description::addWidget(Tree label, Tree varname, Tree sig) +{ + Tree path, c, x, y, z; + + // add an active widget description + + if ( isSigButton(sig, path) ) { + + fWidgetID++; + fActiveWidgetCount++; + addActiveLine(subst("", T(fWidgetID))); + addActiveLine(subst("\t", xmlize(tree2str(label)))); + addActiveLine(subst("\t$0", tree2str(varname))); + addActiveLine(""); + + } else if ( isSigCheckbox(sig, path) ) { + + fWidgetID++; + fActiveWidgetCount++; + addActiveLine(subst("", T(fWidgetID))); + addActiveLine(subst("\t", xmlize(tree2str(label)))); + addActiveLine(subst("\t$0", tree2str(varname))); + addActiveLine(""); + + } else if ( isSigVSlider(sig, path,c,x,y,z) ) { + + fWidgetID++; + fActiveWidgetCount++; + addActiveLine(subst("", T(fWidgetID))); + addActiveLine(subst("\t", xmlize(tree2str(label)))); + addActiveLine(subst("\t$0", tree2str(varname))); + addActiveLine(subst("\t$0", T(tree2double(c)))); + addActiveLine(subst("\t$0", T(tree2double(x)))); + addActiveLine(subst("\t$0", T(tree2double(y)))); + addActiveLine(subst("\t$0", T(tree2double(z)))); + addActiveLine(""); + + } else if ( isSigHSlider(sig, path,c,x,y,z) ) { + + fWidgetID++; + fActiveWidgetCount++; + addActiveLine(subst("", T(fWidgetID))); + addActiveLine(subst("\t", xmlize(tree2str(label)))); + addActiveLine(subst("\t$0", tree2str(varname))); + addActiveLine(subst("\t$0", T(tree2double(c)))); + addActiveLine(subst("\t$0", T(tree2double(x)))); + addActiveLine(subst("\t$0", T(tree2double(y)))); + addActiveLine(subst("\t$0", T(tree2double(z)))); + addActiveLine(""); + + } else if ( isSigNumEntry(sig, path,c,x,y,z) ) { + + fWidgetID++; + fActiveWidgetCount++; + addActiveLine(subst("", T(fWidgetID))); + addActiveLine(subst("\t", xmlize(tree2str(label)))); + addActiveLine(subst("\t$0", tree2str(varname))); + addActiveLine(subst("\t$0", T(tree2double(c)))); + addActiveLine(subst("\t$0", T(tree2double(x)))); + addActiveLine(subst("\t$0", T(tree2double(y)))); + addActiveLine(subst("\t$0", T(tree2double(z)))); + addActiveLine(""); + + + // add a passive widget description + + } else if ( isSigVBargraph(sig,path,x,y,z) ) { + + fWidgetID++; + fPassiveWidgetCount++; + addPassiveLine(subst("", T(fWidgetID))); + addPassiveLine(subst("\t", xmlize(tree2str(label)))); + addPassiveLine(subst("\t$0", tree2str(varname))); + addPassiveLine(subst("\t$0", T(tree2double(x)))); + addPassiveLine(subst("\t$0", T(tree2double(y)))); + addPassiveLine(""); + + } else if ( isSigHBargraph(sig,path,x,y,z) ) { + + fWidgetID++; + fPassiveWidgetCount++; + addPassiveLine(subst("", T(fWidgetID))); + addPassiveLine(subst("\t", xmlize(tree2str(label)))); + addPassiveLine(subst("\t$0", tree2str(varname))); + addPassiveLine(subst("\t$0", T(tree2double(x)))); + addPassiveLine(subst("\t$0", T(tree2double(y)))); + addPassiveLine(""); + + } else { + fprintf(stderr, "Error describing widget : unrecognized expression\n"); + exit(1); + } + + return fWidgetID; +} + + +