MicroModelicaCCompiler  4.5.3
writer.cpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #include <iostream>
21 #include <sstream>
22 
23 #include "writer.hpp"
24 
25 #include <util/util.hpp>
26 
27 namespace MicroModelica {
28 using namespace Util;
29 namespace Generator {
30 
31 /* MemoryWriter class. */
32 
33 MemoryWriter::MemoryWriter() : _indentStr(), _block(), _indent(0), _blockIndent(0)
34 {
35  for (int i = 0; i < SECTIONS; i++) {
36  _sections[i] = list<string>();
37  }
38 }
39 
40 void MemoryWriter::setFile(string fname)
41 {
42  _file.open(fname.c_str());
43  if (!_file.good()) {
44  cout << "Memory Writer: Can not open file " << fname << endl;
45  }
46 }
47 
48 void MemoryWriter::removeFromSection(string str, WRITER::Section section)
49 {
50  list<string>::iterator it;
51  list<string> rmv;
52  _removeIt = _sections[section].end();
53  for (it = _sections[section].begin(); it != _sections[section].end(); it++) {
54  string fi = Utils::instance().trimString(*it);
55  string cmp = Utils::instance().trimString(str);
56  if (fi.compare("{") == 0) {
57  _removeIt = it;
58  }
59  if (fi.compare(cmp) == 0) {
60  rmv.push_back(*it);
61  break;
62  }
63  }
64  for (it = rmv.begin(); it != rmv.end(); it++) {
65  _sections[section].remove(*it);
66  }
67 }
68 
69 void MemoryWriter::clear(WRITER::Section section) { _sections[section].clear(); }
70 
71 void MemoryWriter::clearFile() { _file.close(); }
72 
74 
75 void MemoryWriter::newLine(WRITER::Section section) { _sections[section].push_back(""); }
76 
77 void MemoryWriter::write(string str, WRITER::Section section, WRITER::Insert it)
78 {
79  if (!str.empty()) {
80  if (it == WRITER::Prepend) {
81  _sections[section].push_back(str);
82  } else if (it == WRITER::Append_Simple) {
83  _sections[section].push_front(str);
84  } else {
85  _sections[section].insert(++_removeIt, str);
86  }
87  }
88 }
89 
90 void MemoryWriter::write(stringstream& s, WRITER::Section section, bool clean, WRITER::Insert it)
91 {
92  if (!s.str().empty()) {
93  if (it == WRITER::Prepend) {
94  _sections[section].push_back(s.str());
95  } else if (it == WRITER::Append_Simple) {
96  _sections[section].push_front(s.str());
97  } else {
98  _sections[section].insert(++_removeIt, s.str());
99  }
100  if (clean) {
101  s.str("");
102  }
103  }
104 }
105 
106 void MemoryWriter::writeBlock(list<string> block, WRITER::Section section)
107 {
108  list<string>::iterator it;
109  for (it = block.begin(); it != block.end(); it++) {
110  _sections[section].push_back(*it);
111  }
112 }
113 
115 {
116  list<string>::iterator it;
117  for (it = _sections[section].begin(); it != _sections[section].end(); it++) {
118  istringstream stream(*it);
119  string line;
120  while (getline(stream, line)) {
121  _file << _block << line << endl;
122  }
123  }
124 }
125 
126 void MemoryWriter::print(stringstream& s)
127 {
128  _file << _block << s.str() << endl;
129  s.str("");
130 }
131 
132 void MemoryWriter::print(string s) { _file << _block << s << endl; }
133 
134 bool MemoryWriter::isEmpty(WRITER::Section section) { return _sections[section].empty(); }
135 
136 void MemoryWriter::printBlock(list<string> block)
137 {
138  list<string>::iterator it;
139  for (it = block.begin(); it != block.end(); it++) {
140  _file << _block << _indentStr << *it << endl;
141  }
142 }
143 
144 void MemoryWriter::setIndent(int n)
145 {
146  stringstream s;
147  _indent = n;
148  for (int i = 0; i < _indent; i++) {
149  s << TAB;
150  }
151  _indentStr = s.str();
152 }
153 
154 string MemoryWriter::indent() { return _indentStr; }
155 
156 string MemoryWriter::indent(int n)
157 {
158  stringstream s;
159  for (int i = 0; i < n; i++) {
160  s << TAB;
161  }
162  return s.str();
163 }
164 
166 {
167  _file << "{" << endl;
169 }
170 
172 {
173  write("{", s);
175 }
176 
178 {
179  write("}", s);
181 }
182 
184 {
185  _file << "}" << endl << endl;
187 }
188 
189 string MemoryWriter::block() { return _block; }
190 
192 {
194  for (string i = symbols.begin(it); !symbols.end(it); i = symbols.next(it)) {
195  write(i, s);
196  }
197 }
198 
199 /* FileWriter class. */
200 
201 FileWriter::FileWriter() : _indentStr(), _indent(0), _blockIndent(0)
202 {
203  for (int i = 0; i < SECTIONS; i++) {
204  stringstream name;
205  name << "/tmp/temp" << i;
206  _sections[i].open(name.str().c_str());
207  }
208 }
209 
211 {
212  for (int i = 0; i < SECTIONS; i++) {
213  stringstream name;
214  name << "/tmp/temp" << i;
215  _sections[i].close();
216  remove(name.str().c_str());
217  }
218 }
219 
220 void FileWriter::removeFromSection(string str, WRITER::Section section) { return; }
221 
222 void FileWriter::clear(WRITER::Section section) { return; }
223 
224 void FileWriter::setFile(string fname) { _file.open(fname.c_str()); }
225 
226 void FileWriter::clearFile() { _file.close(); }
227 
228 void FileWriter::newLine(WRITER::Section section) { _sections[section] << endl; }
229 
230 void FileWriter::write(string str, WRITER::Section section, WRITER::Insert it) { _sections[section] << str << endl; }
231 
232 void FileWriter::write(stringstream& s, WRITER::Section section, bool clean, WRITER::Insert it)
233 {
234  _sections[section] << s.str() << endl;
235  if (clean) {
236  s.str("");
237  }
238 }
239 
240 void FileWriter::writeBlock(list<string> block, WRITER::Section section)
241 {
242  list<string>::iterator it;
243  for (it = block.begin(); it != block.end(); it++) {
244  _sections[section] << *it << endl;
245  }
246 }
247 
248 void FileWriter::print(WRITER::Section section) { _file << _sections[section].rdbuf(); }
249 
250 void FileWriter::print(stringstream& s)
251 {
252  _file << s.str() << endl;
253  s.str("");
254 }
255 
256 void FileWriter::print(string s) { _file << s << endl; }
257 
258 bool FileWriter::isEmpty(WRITER::Section section) { return false; }
259 
260 void FileWriter::printBlock(list<string> block)
261 {
262  list<string>::iterator it;
263  for (it = block.begin(); it != block.end(); it++) {
264  _file << *it << endl << endl;
265  }
266 }
267 
268 void FileWriter::setIndent(int n)
269 {
270  stringstream s;
271  _indent = n;
272  for (int i = 0; i < _indent; i++) {
273  s << TAB;
274  }
275  _indentStr = s.str();
276 }
277 
278 string FileWriter::indent() { return _indentStr; }
279 
280 string FileWriter::indent(int n)
281 {
282  stringstream s;
283  for (int i = 0; i < n; i++) {
284  s << TAB;
285  }
286  return s.str();
287 }
288 
290 
292 
294 
296 
297 string FileWriter::block() { return _block; }
298 
300 {
302  for (string i = symbols.begin(it); !symbols.end(it); i = symbols.next(it)) {
303  write(i, s);
304  }
305 }
306 } // namespace Generator
307 } // namespace MicroModelica
MicroModelica::Generator::FileWriter::newLine
void newLine(WRITER::Section section)
Definition: writer.cpp:245
ModelTable< std::string, std::string >
MicroModelica::Generator::MemoryWriter::_indent
int _indent
Definition: writer.hpp:180
ModelTable::begin
iterator begin()
Definition: table.hpp:68
MicroModelica::Generator::MemoryWriter::setIndent
void setIndent(int n)
Definition: writer.cpp:161
MicroModelica::Generator::FileWriter::_file
std::ofstream _file
Definition: writer.hpp:214
MicroModelica::Generator::MemoryWriter::isEmpty
bool isEmpty(WRITER::Section section)
Definition: writer.cpp:151
MicroModelica::Generator::MemoryWriter::_block
std::string _block
Definition: writer.hpp:179
MicroModelica::Generator::FileWriter::_indent
int _indent
Definition: writer.hpp:217
MicroModelica::Generator::MemoryWriter::block
std::string block()
Definition: writer.cpp:206
MicroModelica::Generator::FileWriter::clear
void clear(WRITER::Section section)
Definition: writer.cpp:239
MicroModelica::Generator::MemoryWriter::write
void write(std::string str, WRITER::Section section, WRITER::Insert it=WRITER::Prepend)
writer.hpp
MicroModelica::Generator::FileWriter::~FileWriter
~FileWriter()
Definition: writer.cpp:227
MicroModelica::Util::Utils::trimString
std::string trimString(std::string str)
Definition: util.cpp:91
MicroModelica::Generator::MemoryWriter::removeFromSection
void removeFromSection(std::string str, WRITER::Section section)
Definition: writer.cpp:65
MicroModelica::Generator::FileWriter::block
std::string block()
Definition: writer.cpp:314
MicroModelica::Generator::FileWriter::indent
std::string indent()
Definition: writer.cpp:295
MicroModelica::Generator::MemoryWriter::_indentStr
std::string _indentStr
Definition: writer.hpp:178
MicroModelica::Generator::FileWriter::setIndent
void setIndent(int n)
Definition: writer.cpp:285
MicroModelica::Generator::WRITER::Append_Simple
@ Append_Simple
Definition: writer.hpp:107
MicroModelica::Generator::FileWriter::beginBlock
void beginBlock()
Definition: writer.cpp:306
MicroModelica::Generator::MemoryWriter::~MemoryWriter
~MemoryWriter()
Definition: writer.cpp:90
MicroModelica::Generator::MemoryWriter::MemoryWriter
MemoryWriter()
Definition: writer.cpp:50
MicroModelica::Generator::MemoryWriter::_file
std::ofstream _file
Definition: writer.hpp:177
MicroModelica::Generator::MemoryWriter::indent
std::string indent()
Definition: writer.cpp:171
ModelTable::end
iterator end()
Definition: table.hpp:70
MicroModelica::Generator::WRITER::Prepend
@ Prepend
Definition: writer.hpp:107
MicroModelica::Generator::FileWriter::write
void write(std::string str, WRITER::Section section, WRITER::Insert it=WRITER::Prepend)
MicroModelica::Generator::MemoryWriter::print
void print(WRITER::Section section)
Definition: writer.cpp:131
MicroModelica::Generator::FileWriter::_indentStr
std::string _indentStr
Definition: writer.hpp:215
MicroModelica::Generator::MemoryWriter::_blockIndent
int _blockIndent
Definition: writer.hpp:181
MicroModelica::Generator::FileWriter::FileWriter
FileWriter()
Definition: writer.cpp:218
MicroModelica::Generator::MemoryWriter::_sections
std::list< std::string > _sections[SECTIONS]
Definition: writer.hpp:176
MicroModelica::Generator::FileWriter::removeFromSection
void removeFromSection(std::string str, WRITER::Section section)
Definition: writer.cpp:237
MicroModelica::Generator::FileWriter::clearFile
void clearFile()
Definition: writer.cpp:243
SECTIONS
#define SECTIONS
Definition: writer.hpp:67
MicroModelica::Generator::MemoryWriter::endBlock
void endBlock()
Definition: writer.cpp:200
TAB
#define TAB
Definition: util.hpp:79
ModelTable< std::string, std::string >::iterator
std::map< std::string, std::string >::iterator iterator
Definition: table.hpp:61
MicroModelica::Generator::FileWriter::_blockIndent
int _blockIndent
Definition: writer.hpp:218
MicroModelica::Generator::FileWriter::isEmpty
bool isEmpty(WRITER::Section section)
Definition: writer.cpp:275
MicroModelica::Generator::FileWriter::print
void print(WRITER::Section section)
Definition: writer.cpp:265
MicroModelica::Generator::MemoryWriter::newLine
void newLine(WRITER::Section section)
Definition: writer.cpp:92
MicroModelica::Generator::MemoryWriter::printBlock
void printBlock(std::list< std::string > block)
Definition: writer.cpp:153
MicroModelica::Generator::MemoryWriter::_removeIt
std::list< std::string >::iterator _removeIt
Definition: writer.hpp:182
MicroModelica::Generator::FileWriter::printBlock
void printBlock(std::list< std::string > block)
Definition: writer.cpp:277
MicroModelica::Generator::MemoryWriter::writeBlock
void writeBlock(std::list< std::string > block, WRITER::Section section)
Definition: writer.cpp:123
block
int block
Definition: ast_builder.cpp:41
MicroModelica
Definition: files.cpp:45
MicroModelica::Generator::FileWriter::writeBlock
void writeBlock(std::list< std::string > block, WRITER::Section section)
Definition: writer.cpp:257
MicroModelica::Util::Utils::instance
static Utils & instance()
Definition: util.hpp:83
MicroModelica::Generator::WRITER::Insert
Insert
Definition: writer.hpp:107
MicroModelica::Generator::MemoryWriter::clear
void clear(WRITER::Section section)
Definition: writer.cpp:86
MicroModelica::Generator::MemoryWriter::setFile
void setFile(std::string fname)
Definition: writer.cpp:57
MicroModelica::Generator::FileWriter::setFile
void setFile(std::string fname)
Definition: writer.cpp:241
MicroModelica::Generator::FileWriter::endBlock
void endBlock()
Definition: writer.cpp:310
MicroModelica::Generator::MemoryWriter::beginBlock
void beginBlock()
Definition: writer.cpp:182
MicroModelica::Generator::MemoryWriter::clearFile
void clearFile()
Definition: writer.cpp:88
util.hpp
MicroModelica::Generator::FileWriter::_sections
std::ofstream _sections[SECTIONS]
Definition: writer.hpp:213
MicroModelica::Generator::WRITER::Section
Section
Definition: writer.hpp:69
ModelTable::next
Value next(iterator &it)
Definition: table.hpp:78
MicroModelica::Generator::FileWriter::_block
std::string _block
Definition: writer.hpp:216