00001 /************************************************************************ 00002 ************************************************************************ 00003 FAUST compiler 00004 Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale 00005 --------------------------------------------------------------------- 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program; if not, write to the Free Software 00018 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 ************************************************************************ 00020 ************************************************************************/ 00021 00022 00023 #include <iostream> 00024 #include <fstream> 00025 #include <set> 00026 #include <time.h> 00027 #include <cstdlib> 00028 #include <errno.h> 00029 00030 #include "doc_notice.hh" 00031 #include "doc_lang.hh" 00032 #include "enrobage.hh" 00033 #include "compatibility.hh" 00034 00035 00036 map<string, bool> gDocNoticeFlagMap; 00037 00038 map<string, string> gDocNoticeStringMap; 00039 set<string> gDocNoticeKeySet; 00040 00041 static void initDocNoticeKeySet(); 00042 static void initDocNoticeFlagMap(); 00043 static void initCompilationDate(); 00044 static void printDocNoticeStringMapContent(); 00045 00046 static struct tm* getCompilationDate(); 00047 static struct tm gCompilationDate; 00048 00049 00050 00051 00052 /***************************************************************************** 00053 Public functions 00054 *****************************************************************************/ 00055 00068 void printDocNotice(const string& faustversion, ostream& docout) { 00069 00070 if (! gDocNoticeStringMap.empty() ) { 00071 00072 //cerr << "Documentator : printDocNotice : printing..." << endl; 00073 00074 docout << endl << "\\begin{itemize}" << endl; 00075 00076 /* Faust "compilation stamp" : version and date. */ 00077 if(gDocNoticeFlagMap["compilstamp1"] && gDocNoticeFlagMap["compilstamp2"] && gDocNoticeFlagMap["compilstamp3"]) { 00078 char datebuf [150]; 00079 strftime (datebuf, 150, "%B %d, %Y", getCompilationDate()); 00080 docout << "\t\\item " << gDocNoticeStringMap["compilstamp1"] << faustversion; 00081 docout << gDocNoticeStringMap["compilstamp2"] << datebuf; 00082 docout << gDocNoticeStringMap["compilstamp3"] << endl; 00083 } 00084 00085 /* Various warnings and remarks. */ 00086 if(gDocNoticeFlagMap["svgdir"]) docout << "\t\\item " << gDocNoticeStringMap["svgdir"] << endl; 00087 if(gDocNoticeFlagMap["nameconflicts"]) docout << "\t\\item " << gDocNoticeStringMap["nameconflicts"] << endl; 00088 if(gDocNoticeFlagMap["causality"]) docout << "\t\\item " << gDocNoticeStringMap["causality"] << endl; 00089 00090 /* Naming conventions of variables and functions. */ 00091 if(gDocNoticeFlagMap["fsamp"]) docout << "\t\\item " << gDocNoticeStringMap["fsamp"] << endl; 00092 if(gDocNoticeFlagMap["foreignfun"]) docout << "\t\\item " << gDocNoticeStringMap["foreignfun"] << endl; 00093 if(gDocNoticeFlagMap["intcast"]) docout << "\t\\item " << gDocNoticeStringMap["intcast"] << endl; 00094 if(gDocNoticeFlagMap["cdot"]) docout << "\t\\item " << gDocNoticeStringMap["cdot"] << endl; 00095 00096 /* Integer arithmetic. */ 00097 if(gDocNoticeFlagMap["intplus"] || 00098 gDocNoticeFlagMap["intminus"] || 00099 gDocNoticeFlagMap["intmult"] || 00100 gDocNoticeFlagMap["intdiv"]) 00101 { 00102 if(gDocNoticeFlagMap["intplus"]) docout << "\t\\item " << gDocNoticeStringMap["intplus"] << endl; 00103 if(gDocNoticeFlagMap["intminus"]) docout << "\t\\item " << gDocNoticeStringMap["intminus"] << endl; 00104 if(gDocNoticeFlagMap["intmult"]) docout << "\t\\item " << gDocNoticeStringMap["intmult"] << endl; 00105 if(gDocNoticeFlagMap["intdiv"]) docout << "\t\\item " << gDocNoticeStringMap["intdiv"] << endl; 00106 } 00107 00108 /* Signals naming conventions. */ 00109 if(gDocNoticeFlagMap["inputsig"]) docout << "\t\\item " << gDocNoticeStringMap["inputsig"] << endl; 00110 if(gDocNoticeFlagMap["inputsigs"]) docout << "\t\\item " << gDocNoticeStringMap["inputsigs"] << endl; 00111 if(gDocNoticeFlagMap["outputsig"]) docout << "\t\\item " << gDocNoticeStringMap["outputsig"] << endl; 00112 if(gDocNoticeFlagMap["outputsigs"]) docout << "\t\\item " << gDocNoticeStringMap["outputsigs"] << endl; 00113 if(gDocNoticeFlagMap["constsigs"]) docout << "\t\\item " << gDocNoticeStringMap["constsigs"] << endl; 00114 if(gDocNoticeFlagMap["paramsigs"]) docout << "\t\\item " << gDocNoticeStringMap["paramsigs"] << endl; 00115 if(gDocNoticeFlagMap["storedsigs"]) docout << "\t\\item " << gDocNoticeStringMap["storedsigs"] << endl; 00116 if(gDocNoticeFlagMap["buttonsigs"]) docout << "\t\\item " << gDocNoticeStringMap["buttonsigs"] << endl; 00117 if(gDocNoticeFlagMap["checkboxsigs"]) docout << "\t\\item " << gDocNoticeStringMap["checkboxsigs"] << endl; 00118 if(gDocNoticeFlagMap["slidersigs"]) docout << "\t\\item " << gDocNoticeStringMap["slidersigs"] << endl; 00119 if(gDocNoticeFlagMap["nentrysigs"]) docout << "\t\\item " << gDocNoticeStringMap["nentrysigs"] << endl; 00120 if(gDocNoticeFlagMap["tablesigs"]) docout << "\t\\item " << gDocNoticeStringMap["tablesigs"] << endl; 00121 if(gDocNoticeFlagMap["recursigs"]) docout << "\t\\item " << gDocNoticeStringMap["recursigs"] << endl; 00122 if(gDocNoticeFlagMap["prefixsigs"]) docout << "\t\\item " << gDocNoticeStringMap["prefixsigs"] << endl; 00123 if(gDocNoticeFlagMap["selectionsig"]) docout << "\t\\item " << gDocNoticeStringMap["selectionsig"] << endl; 00124 if(gDocNoticeFlagMap["selectionsigs"]) docout << "\t\\item " << gDocNoticeStringMap["selectionsigs"] << endl; 00125 00126 docout << "\\end{itemize}" << endl << endl; 00127 } 00128 //cerr << " ... Documentator : printDocNotice : end of printing." << endl; 00129 } 00130 00131 00140 void initDocNotice() 00141 { 00142 initDocNoticeKeySet(); 00143 initDocNoticeFlagMap(); 00144 } 00145 00146 00147 00148 00149 /***************************************************************************** 00150 Static functions 00151 *****************************************************************************/ 00152 00153 00157 static void initDocNoticeKeySet() { 00158 00159 gDocNoticeKeySet.insert("causality"); 00160 gDocNoticeKeySet.insert("compilstamp1"); 00161 gDocNoticeKeySet.insert("compilstamp2"); 00162 gDocNoticeKeySet.insert("compilstamp3"); 00163 gDocNoticeKeySet.insert("nameconflicts"); 00164 gDocNoticeKeySet.insert("svgdir"); 00165 00166 gDocNoticeKeySet.insert("fsamp"); 00167 gDocNoticeKeySet.insert("foreignfun"); 00168 gDocNoticeKeySet.insert("cdot"); 00169 gDocNoticeKeySet.insert("intcast"); 00170 00171 gDocNoticeKeySet.insert("intplus"); 00172 gDocNoticeKeySet.insert("intminus"); 00173 gDocNoticeKeySet.insert("intmult"); 00174 gDocNoticeKeySet.insert("intdiv"); 00175 00176 gDocNoticeKeySet.insert("inputsig"); 00177 gDocNoticeKeySet.insert("inputsigs"); 00178 gDocNoticeKeySet.insert("outputsig"); 00179 gDocNoticeKeySet.insert("outputsigs"); 00180 gDocNoticeKeySet.insert("constsigs"); 00181 gDocNoticeKeySet.insert("paramsigs"); 00182 gDocNoticeKeySet.insert("storedsigs"); 00183 gDocNoticeKeySet.insert("recursigs"); 00184 gDocNoticeKeySet.insert("prefixsigs"); 00185 gDocNoticeKeySet.insert("selectionsig"); 00186 gDocNoticeKeySet.insert("selectionsigs"); 00187 00188 gDocNoticeKeySet.insert("buttonsigs"); 00189 gDocNoticeKeySet.insert("checkboxsigs"); 00190 gDocNoticeKeySet.insert("slidersigs"); 00191 gDocNoticeKeySet.insert("nentrysigs"); 00192 gDocNoticeKeySet.insert("tablesigs"); 00193 } 00194 00195 00199 static void initDocNoticeFlagMap() { 00200 00201 for (set<string>::iterator it=gDocNoticeKeySet.begin(); it != gDocNoticeKeySet.end() ; ++it ) { 00202 gDocNoticeFlagMap[*it] = false; 00203 } 00204 00205 gDocNoticeFlagMap["compilstamp1"] = true; 00206 gDocNoticeFlagMap["compilstamp2"] = true; 00207 gDocNoticeFlagMap["compilstamp3"] = true; 00208 gDocNoticeFlagMap["causality"] = true; 00209 } 00210 00211 00215 static void printDocNoticeStringMapContent() { 00216 bool trace = false; 00217 if(trace) { 00218 cout << "gDocNoticeStringMap.size() = " << gDocNoticeStringMap.size() << endl; 00219 map<string,string>::iterator it; 00220 int i = 1; 00221 for(it = gDocNoticeStringMap.begin(); it!=gDocNoticeStringMap.end(); ++it) 00222 cout << i++ << ".\tgDocNoticeStringMap[" << it->first << "] \t= '" << it->second << "'" << endl; 00223 } 00224 } 00225 00226 00227 00228 //------------------------ date managment ------------------------- 00229 00230 00231 static struct tm* getCompilationDate() 00232 { 00233 initCompilationDate(); 00234 return &gCompilationDate; 00235 } 00236 00237 00238 static void initCompilationDate() 00239 { 00240 time_t now; 00241 00242 time(&now); 00243 gCompilationDate = *localtime(&now); 00244 } 00245