1 /*
2  *  cDataFile.cc
3  *  Avida
4  *
5  *  Called "data_file.cc" prior to 12/2/05.
6  *  Copyright 1999-2011 Michigan State University. All rights reserved.
7  *  Copyright 1993-2003 California Institute of Technology.
8  *
9  *
10  *  This file is part of Avida.
11  *
12  *  Avida is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
13  *  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
14  *
15  *  Avida is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
17  *
18  *  You should have received a copy of the GNU Lesser General Public License along with Avida.
19  *  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22 
23 #include "cDataFile.h"
24 
25 #include "cStringUtil.h"
26 
27 #include <cstdio>
28 #include <ctime>
29 
30 using namespace std;
31 
32 
cDataFile(cString & name)33 cDataFile::cDataFile(cString& name) : m_name(name), m_descr_written(false), m_num_cols(0)
34 {
35   m_fp.open(name);
36   assert(m_fp.good());
37   m_descr_written = false;
38 }
39 
40 
Write(double x,const char * descr,const char * format)41 void cDataFile::Write(double x, const char* descr, const char* format)
42 {
43   if (!m_descr_written) {
44     m_data << x << " ";
45     WriteColumnDesc(descr, format);
46   } else {
47     m_fp << x << " ";
48   }
49 }
50 
51 
Write(int i,const char * descr,const char * format)52 void cDataFile::Write(int i, const char* descr, const char* format)
53 {
54   if (!m_descr_written) {
55     m_data << i << " ";
56     WriteColumnDesc(descr, format);
57   } else {
58     m_fp << i << " ";
59   }
60 }
61 
62 
Write(long i,const char * descr,const char * format)63 void cDataFile::Write(long i, const char* descr, const char* format)
64 {
65   if (!m_descr_written) {
66     m_data << i << " ";
67     WriteColumnDesc(descr, format);
68   } else {
69     m_fp << i << " ";
70   }
71 }
72 
Write(unsigned int i,const char * descr,const char * format)73 void cDataFile::Write(unsigned int i, const char* descr, const char* format)
74 {
75   if (!m_descr_written) {
76     m_data << i << " ";
77     WriteColumnDesc(descr);
78   } else {
79     m_fp << i << " ";
80   }
81 }
82 
83 
Write(const char * data_str,const char * descr,const char * format)84 void cDataFile::Write(const char* data_str, const char* descr, const char* format)
85 {
86   if (!m_descr_written) {
87     m_data << data_str << " ";
88     WriteColumnDesc(descr, format);
89   } else {
90     m_fp << data_str << " ";
91   }
92 }
93 
Write(tArray<int> list,const char * descr,const char * format)94 void cDataFile::Write(tArray<int> list, const char* descr, const char* format)
95 {
96     //Anya is trying to make a commant to write vectors for Kaboom data
97     if (!m_descr_written) {
98         for (int i=0; i< (int)list.GetSize();i++) {
99             m_data << list[i] << " ";
100         }
101         WriteColumnDesc(descr, format);
102     } else {
103         for (int i =0; i < (int)list.GetSize(); i++) {
104             m_fp << list[i] << " ";
105         }
106     }
107 }
108 
109 
WriteBlockElement(double x,int element,int x_size)110 void cDataFile::WriteBlockElement(double x, int element, int x_size)
111 {
112   m_fp << x << " ";
113   if (((element + 1) % x_size) == 0) m_fp << "\n";
114 }
115 
WriteBlockElement(int i,int element,int x_size)116 void cDataFile::WriteBlockElement(int i, int element, int x_size)
117 {
118   m_fp << i << " ";
119   if (((element + 1) % x_size) == 0) m_fp << "\n";
120 }
121 
WriteColumnDesc(const char * descr,const char * format)122 void cDataFile::WriteColumnDesc(const char* descr, const char* format)
123 {
124   if (!m_descr_written) {
125     m_num_cols++;
126     m_descr += cStringUtil::Stringf("# %2d: %s\n", m_num_cols, descr);
127     cString formatstr(format);
128     if (formatstr != "") m_format += formatstr + " ";
129   }
130 }
131 
WriteComment(const char * comment)132 void cDataFile::WriteComment(const char* comment)
133 {
134   if (!m_descr_written) m_descr += cStringUtil::Stringf("# %s\n", comment);
135 }
136 
137 
WriteRawComment(const char * comment)138 void cDataFile::WriteRawComment(const char* comment)
139 {
140   if (!m_descr_written) m_descr += cStringUtil::Stringf("%s\n", comment);
141 }
142 
WriteRaw(const char * str)143 void cDataFile::WriteRaw(const char* str)
144 {
145   m_fp << cStringUtil::Stringf( "%s\n", str);
146 }
147 
148 
149 
150 
WriteTimeStamp()151 void cDataFile::WriteTimeStamp()
152 {
153   if (!m_descr_written) {
154     time_t time_p = time(0);
155     m_descr += cStringUtil::Stringf("# %s", ctime(&time_p));
156   }
157 }
158 
FlushComments()159 void cDataFile::FlushComments()
160 {
161   if (!m_descr_written) {
162     m_fp << m_descr;
163     m_descr = "";
164 
165     m_descr_written = true;
166     assert(m_data.str().size() == 0);
167   }
168 }
169 
170 
Endl()171 void cDataFile::Endl()
172 {
173   if (!m_descr_written) {
174     // Handle filetype and format first
175     if (m_filetype != "") m_fp << "#filetype " << m_filetype << endl;
176     if (m_format != "") m_fp << "#format " << m_format << endl;
177 
178     // Output column descriptions and comments
179     m_fp << m_descr << endl;
180     m_descr = "";
181 
182     // Print the first row of data
183     m_fp << m_data.str() << endl;
184     m_data.clear();
185     m_data.str("");
186 
187     m_descr_written = true;
188   } else {
189     m_fp << endl;
190   }
191 }
192