00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "truthTableDiskManager.hpp"
00022 #include "flexDefines.hpp"
00023 #include <fstream>
00024 #include <math.h>
00025
00027
00030 TruthTableDiskManager::TruthTableDiskManager(TruthTableManager *controller)
00031 {
00032 this->controller = controller;
00033 }
00034
00035
00037 TruthTableDiskManager::~TruthTableDiskManager()
00038 {
00039 }
00040
00041
00043
00048 bool TruthTableDiskManager::saveTables(list<TruthTable*> tables, wxString fileName)
00049 {
00050 if (wxFile::Exists(fileName))
00051 {
00052 file.Open(fileName);
00053 }
00054 else
00055 {
00056 file.Create(fileName);
00057 }
00058 file.Clear();
00059 if (!saveTableList(tables))
00060 {
00061 file.Close();
00062 return false;
00063 }
00064 if (!file.Write(wxTextFileType_Unix))
00065 {
00066 file.Close();
00067 return false;
00068 }
00069 return (file.Close());
00070 }
00071
00072
00074
00078 bool TruthTableDiskManager::saveTableList(list<TruthTable*> tables)
00079 {
00080 bool result = true;
00081 file.AddLine(_("#Truth Table file created by Nanocomp."));
00082 file.AddLine(_("#Do not edit this file if you don't know what are you doing."));
00083 file.AddLine(wxEmptyString);
00084 for(list<TruthTable*>::iterator i = tables.begin(); i != tables.end(); i++)
00085 {
00086 result = result && saveTable((*i));
00087 }
00088 file.AddLine(_("#End of file"));
00089 return result;
00090 }
00091
00092
00094
00098 bool TruthTableDiskManager::saveTable(TruthTable *table)
00099 {
00100 file.AddLine(table->getName());
00101 file.AddLine(wxString::Format(_("%d %d"), table->getInputs(), table->getOutputs()));
00102 saveVector(table->getTable());
00103 file.AddLine(wxEmptyString);
00104 return true;
00105 }
00106
00107
00109
00113 bool TruthTableDiskManager::saveVector(vector< vector<bool> > booleans)
00114 {
00115 for(unsigned int i = 0; i < booleans.size(); i++)
00116 {
00117 for (unsigned int j = 0; j < booleans[i].size(); j++)
00118 {
00119 if (booleans[i][j])
00120 {
00121 file.AddLine(_("1"));
00122 }
00123 else
00124 {
00125 file.AddLine(_("0"));
00126 }
00127 }
00128 }
00129 return true;
00130 }
00131
00132
00134
00138 bool TruthTableDiskManager::openTables(wxString fileName)
00139 {
00140 list<TruthTable *> *tableList = new list<TruthTable *>();
00141 filebuf fb;
00142 if (!fb.open (fileName.mb_str(), ios::in))
00143 {
00144
00145 return false;
00146 }
00147 istream *is = new istream(&fb);
00148 int result;
00149 int inputs;
00150 int outputs;
00151 wxString name;
00152 FlexLexer* lexer = new yyFlexLexer();
00153 lexer->switch_streams(is, NULL);
00154 result = lexer->yylex();
00155
00156 while (result != 0)
00157 {
00158 if (!((result == IDENTIFIER) || (result == UPPER) || (result == LOWER)))
00159 {
00160
00161 delete tableList;
00162 delete is;
00163 delete lexer;
00164 fb.close();
00165 return false;
00166 }
00167 else
00168 {
00169 name = wxString(lexer->YYText(), wxConvUTF8);
00170 if (lexer->yylex() != NUMBER)
00171 {
00172
00173 delete tableList;
00174 delete is;
00175 delete lexer;
00176 fb.close();
00177 return false;
00178 }
00179 else
00180 {
00181 inputs = atoi(lexer->YYText());
00182 if (lexer->yylex() != NUMBER)
00183 {
00184
00185 delete tableList;
00186 delete is;
00187 delete lexer;
00188 fb.close();
00189 return false;
00190 }
00191 else
00192 {
00193 outputs = atoi(lexer->YYText());
00194 if (!readTable(name, inputs, outputs, tableList, lexer))
00195 {
00196 delete tableList;
00197 delete is;
00198 delete lexer;
00199 fb.close();
00200 return false;
00201 }
00202 }
00203 }
00204 }
00205
00206 result = lexer->yylex();
00207 }
00208
00209 fb.close();
00210 returnTables(tableList);
00211 delete tableList;
00212 return true;
00213 }
00214
00215
00217
00225 bool TruthTableDiskManager::readTable(wxString name, int inputs, int outputs, list<TruthTable *> *tableList, FlexLexer *lexer)
00226 {
00227 TruthTable *table = new TruthTable(name ,inputs, outputs);
00228 vector< vector<bool> > booleans;
00229 booleans.resize((int)(pow(2, inputs)));
00230 for (unsigned int i = 0; i < booleans.size(); i++)
00231 {
00232 booleans[i].resize(outputs);
00233 for (unsigned int j = 0; j < booleans[i].size(); j++)
00234 {
00235 switch (lexer->yylex())
00236 {
00237 case NUMBER:
00238 {
00239 if (atoi(lexer->YYText()) == 0)
00240 {
00241 booleans[i][j] = false;
00242 }
00243 else if (atoi(lexer->YYText()) == 1)
00244 {
00245 booleans[i][j] = true;
00246 }
00247 else
00248 {
00249
00250 delete table;
00251 return false;
00252 }
00253 break;
00254 }
00255 default:
00256 {
00257
00258 delete table;
00259 return false;
00260 }
00261 }
00262 }
00263 }
00264 table->setTable(booleans);
00265 tableList->push_back(table);
00266 return true;
00267 }
00268
00269
00271
00274 void TruthTableDiskManager::returnTables(list<TruthTable *> *tableList)
00275 {
00276 for(list<TruthTable *>::iterator i = tableList->begin(); i != tableList->end(); i++)
00277 {
00278 controller->newTable((*i));
00279 }
00280 }