/home/enzo/treballs/fib/pfc/nanocomp/src/truthTableDiskManager.cpp

Go to the documentation of this file.
00001 /*
00002  *                                                                         *
00003  *   This program is free software; you can redistribute it and/or modify  *
00004  *   it under the terms of the GNU General Public License as published by  *
00005  *   the Free Software Foundation; either version 2 of the License, or     *
00006  *   (at your option) any later version.                                   *
00007  *                                                                         *
00008  *   This program is distributed in the hope that it will be useful,       *
00009  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00010  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00011  *   GNU General Public License for more details.                          *
00012  *                                                                         *
00013  *   You should have received a copy of the GNU General Public License     *
00014  *   along with this program; if not, write to the                         *
00015  *   Free Software Foundation, Inc.,                                       *
00016  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00017                                                                           */
00018 
00019 // $Revision: 1.6 $
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         //cout << "Error opening the file" << endl;
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             //cout << "Identifier expected, file format error" << endl;
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                 //cout << "Number expected, file format error" << endl;
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                     //cout << "Number expected, file format error" << endl;
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                         //cout << "1 or 0 expected, file format error" << endl;
00250                         delete table;
00251                         return false;
00252                     }
00253                     break;
00254                 }
00255                 default: //Error
00256                 {
00257                     //cout << "1 or 0 expected, file format error" << endl;
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 }

Generated on Fri Sep 1 23:55:14 2006 for NanoComp by  doxygen 1.4.6