gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 11 0
merge default
3 files changed with 389 insertions and 523 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -50,5 +50,5 @@
50 50
      node("target", t).             // read 'target' node to t
51 51
      run();
52
  } catch (DataFormatError& error) { // check if there was any error
52
  } catch (Exception& error) { // check if there was any error
53 53
    std::cerr << "Error: " << error.what() << std::endl;
54 54
    return -1;
Ignore white space 6 line context
... ...
@@ -311,6 +311,7 @@
311 311
    ///This is the type of the return value of ArgParser::operator[]().
312 312
    ///It automatically converts to \c int, \c double, \c bool or
313
    ///\c std::string if the type of the option matches, otherwise it
314
    ///throws an exception (i.e. it performs runtime type checking).
313
    ///\c std::string if the type of the option matches, which is checked
314
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
315
    ///type checking).
315 316
    class RefType
316 317
    {
Ignore white space 6 line context
... ...
@@ -109,5 +109,5 @@
109 109
/// \brief Macro for assertion with customizable message
110 110
///
111
/// Macro for assertion with customizable message.  
111
/// Macro for assertion with customizable message.
112 112
/// \param exp An expression that must be convertible to \c bool.  If it is \c
113 113
/// false, then an assertion is raised. The concrete behaviour depends on the
Ignore white space 6 line context
... ...
@@ -136,14 +136,4 @@
136 136
  class Bfs {
137 137
  public:
138
    ///\ref Exception for uninitialized parameters.
139

	
140
    ///This error represents problems in the initialization of the
141
    ///parameters of the algorithm.
142
    class UninitializedParameter : public lemon::UninitializedParameter {
143
    public:
144
      virtual const char* what() const throw() {
145
        return "lemon::Bfs::UninitializedParameter";
146
      }
147
    };
148 138

	
149 139
    ///The type of the digraph the algorithm runs on.
... ...
@@ -233,5 +223,6 @@
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
... ...
@@ -251,5 +242,6 @@
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
... ...
@@ -269,5 +261,6 @@
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
... ...
@@ -287,5 +280,6 @@
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
... ...
@@ -305,4 +299,5 @@
305 299
      {
306 300
        return new ProcessedMap(g);
301
        return 0; // ignore warnings
307 302
      }
308 303
    };
... ...
@@ -1041,5 +1036,4 @@
1041 1036
    bool run(Node s, Node t)
1042 1037
    {
1043
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1044 1038
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1045 1039
      if (Base::_pred)
... ...
@@ -1324,16 +1318,4 @@
1324 1318
  public:
1325 1319

	
1326
    /// \brief \ref Exception for uninitialized parameters.
1327
    ///
1328
    /// This error represents problems in the initialization
1329
    /// of the parameters of the algorithm.
1330
    class UninitializedParameter : public lemon::UninitializedParameter {
1331
    public:
1332
      virtual const char* what() const throw()
1333
      {
1334
        return "lemon::BfsVisit::UninitializedParameter";
1335
      }
1336
    };
1337

	
1338 1320
    ///The traits class.
1339 1321
    typedef _Traits Traits;
... ...
@@ -1390,5 +1372,6 @@
1390 1372
      typedef T ReachedMap;
1391 1373
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1392
        throw UninitializedParameter();
1374
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375
        return 0; // ignore warnings
1393 1376
      }
1394 1377
    };
Ignore white space 6 line context
... ...
@@ -130,5 +130,4 @@
130 130
      /// Otherwise it inserts the given item with the given priority.
131 131
      ///
132
      /// It may throw an \ref UnderflowPriorityException.
133 132
      /// \param i The item.
134 133
      /// \param p The priority.
Ignore white space 6 line context
... ...
@@ -137,14 +137,4 @@
137 137
  class Dfs {
138 138
  public:
139
    ///\ref Exception for uninitialized parameters.
140

	
141
    ///This error represents problems in the initialization of the
142
    ///parameters of the algorithm.
143
    class UninitializedParameter : public lemon::UninitializedParameter {
144
    public:
145
      virtual const char* what() const throw() {
146
        return "lemon::Dfs::UninitializedParameter";
147
      }
148
    };
149 139

	
150 140
    ///The type of the digraph the algorithm runs on.
... ...
@@ -233,5 +223,6 @@
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
... ...
@@ -251,5 +242,6 @@
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
... ...
@@ -269,5 +261,6 @@
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
... ...
@@ -287,5 +280,6 @@
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
... ...
@@ -975,5 +969,4 @@
975 969
    bool run(Node s, Node t)
976 970
    {
977
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
978 971
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
979 972
      if (Base::_pred)
... ...
@@ -1271,16 +1264,4 @@
1271 1264
  public:
1272 1265

	
1273
    /// \brief \ref Exception for uninitialized parameters.
1274
    ///
1275
    /// This error represents problems in the initialization
1276
    /// of the parameters of the algorithm.
1277
    class UninitializedParameter : public lemon::UninitializedParameter {
1278
    public:
1279
      virtual const char* what() const throw()
1280
      {
1281
        return "lemon::DfsVisit::UninitializedParameter";
1282
      }
1283
    };
1284

	
1285 1266
    ///The traits class.
1286 1267
    typedef _Traits Traits;
... ...
@@ -1337,5 +1318,6 @@
1337 1318
      typedef T ReachedMap;
1338 1319
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1339
        throw UninitializedParameter();
1320
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1321
        return 0; // ignore warnings
1340 1322
      }
1341 1323
    };
Ignore white space 6 line context
... ...
@@ -226,14 +226,4 @@
226 226
  class Dijkstra {
227 227
  public:
228
    ///\ref Exception for uninitialized parameters.
229

	
230
    ///This error represents problems in the initialization of the
231
    ///parameters of the algorithm.
232
    class UninitializedParameter : public lemon::UninitializedParameter {
233
    public:
234
      virtual const char* what() const throw() {
235
        return "lemon::Dijkstra::UninitializedParameter";
236
      }
237
    };
238 228

	
239 229
    ///The type of the digraph the algorithm runs on.
... ...
@@ -333,5 +323,6 @@
333 323
      static PredMap *createPredMap(const Digraph &)
334 324
      {
335
        throw UninitializedParameter();
325
        LEMON_ASSERT(false, "PredMap is not initialized");
326
        return 0; // ignore warnings
336 327
      }
337 328
    };
... ...
@@ -352,5 +343,6 @@
352 343
      static DistMap *createDistMap(const Digraph &)
353 344
      {
354
        throw UninitializedParameter();
345
        LEMON_ASSERT(false, "DistMap is not initialized");
346
        return 0; // ignore warnings
355 347
      }
356 348
    };
... ...
@@ -371,5 +363,6 @@
371 363
      static ProcessedMap *createProcessedMap(const Digraph &)
372 364
      {
373
        throw UninitializedParameter();
365
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
366
        return 0; // ignore warnings
374 367
      }
375 368
    };
... ...
@@ -409,9 +402,11 @@
409 402
      typedef H Heap;
410 403
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
411
        throw UninitializedParameter();
404
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
405
        return 0; // ignore warnings
412 406
      }
413 407
      static Heap *createHeap(HeapCrossRef &)
414 408
      {
415
        throw UninitializedParameter();
409
        LEMON_ASSERT(false, "Heap is not initialized");
410
        return 0; // ignore warnings
416 411
      }
417 412
    };
... ...
@@ -1159,5 +1154,4 @@
1159 1154
    void run(Node s)
1160 1155
    {
1161
      if (s==INVALID) throw UninitializedParameter();
1162 1156
      Dijkstra<Digraph,LengthMap,TR>
1163 1157
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
... ...
@@ -1181,5 +1175,4 @@
1181 1175
    bool run(Node s, Node t)
1182 1176
    {
1183
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1184 1177
      Dijkstra<Digraph,LengthMap,TR>
1185 1178
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
Ignore white space 6 line context
... ...
@@ -36,142 +36,15 @@
36 36
  /// @{
37 37

	
38
  /// \brief Exception safe wrapper class.
38
  /// \brief Generic exception class.
39 39
  ///
40
  /// Exception safe wrapper class to implement the members of exceptions.
41
  template <typename _Type>
42
  class ExceptionMember {
43
  public:
44
    typedef _Type Type;
45

	
46
    ExceptionMember() throw() {
47
      try {
48
        ptr.reset(new Type());
49
      } catch (...) {}
50
    }
51

	
52
    ExceptionMember(const Type& type) throw() {
53
      try {
54
        ptr.reset(new Type());
55
        if (ptr.get() == 0) return;
56
        *ptr = type;
57
      } catch (...) {}
58
    }
59

	
60
    ExceptionMember(const ExceptionMember& copy) throw() {
61
      try {
62
        if (!copy.valid()) return;
63
        ptr.reset(new Type());
64
        if (ptr.get() == 0) return;
65
        *ptr = copy.get();
66
      } catch (...) {}
67
    }
68

	
69
    ExceptionMember& operator=(const ExceptionMember& copy) throw() {
70
      if (ptr.get() == 0) return;
71
      try {
72
        if (!copy.valid()) return;
73
        *ptr = copy.get();
74
      } catch (...) {}
75
    }
76

	
77
    void set(const Type& type) throw() {
78
      if (ptr.get() == 0) return;
79
      try {
80
        *ptr = type;
81
      } catch (...) {}
82
    }
83

	
84
    const Type& get() const {
85
      return *ptr;
86
    }
87

	
88
    bool valid() const throw() {
89
      return ptr.get() != 0;
90
    }
91

	
92
  private:
93
    std::auto_ptr<_Type> ptr;
94
  };
95

	
96
  /// Exception-safe convenient error message builder class.
97

	
98
  /// Helper class which provides a convenient ostream-like (operator <<
99
  /// based) interface to create a string message. Mostly useful in
100
  /// exception classes (therefore the name).
101
  class ErrorMessage {
102
  protected:
103
    ///\e
104

	
105
    mutable std::auto_ptr<std::ostringstream> buf;
106

	
107
    ///\e
108
    bool init() throw() {
109
      try {
110
        buf.reset(new std::ostringstream);
111
      }
112
      catch(...) {
113
        buf.reset();
114
      }
115
      return buf.get();
116
    }
117

	
118
  public:
119

	
120
    ///\e
121
    ErrorMessage() throw() { init(); }
122

	
123
    ErrorMessage(const ErrorMessage& em) throw() : buf(em.buf) { }
124

	
125
    ///\e
126
    ErrorMessage(const char *msg) throw() {
127
      init();
128
      *this << msg;
129
    }
130

	
131
    ///\e
132
    ErrorMessage(const std::string &msg) throw() {
133
      init();
134
      *this << msg;
135
    }
136

	
137
    ///\e
138
    template <typename T>
139
    ErrorMessage& operator<<(const T &t) throw() {
140
      if( ! buf.get() ) return *this;
141

	
142
      try {
143
        *buf << t;
144
      }
145
      catch(...) {
146
        buf.reset();
147
      }
148
      return *this;
149
    }
150

	
151
    ///\e
152
    const char* message() throw() {
153
      if( ! buf.get() ) return 0;
154

	
155
      const char* mes = 0;
156
      try {
157
        mes = buf->str().c_str();
158
      }
159
      catch(...) {}
160
      return mes;
161
    }
162

	
163
  };
164

	
165
  /// Generic exception class.
166

	
167 40
  /// Base class for exceptions used in LEMON.
168 41
  ///
169 42
  class Exception : public std::exception {
170 43
  public:
171
    ///\e
172
    Exception() {}
173
    ///\e
44
    ///Constructor
45
    Exception() throw() {}
46
    ///Virtual destructor
174 47
    virtual ~Exception() throw() {}
175
    ///\e
48
    ///A short description of the exception
176 49
    virtual const char* what() const throw() {
177 50
      return "lemon::Exception";
... ...
@@ -179,235 +52,220 @@
179 52
  };
180 53

	
181
  /// One of the two main subclasses of \ref Exception.
54
  /// \brief Input-Output error
55
  ///
56
  /// This exception is thrown when a file operation cannot be
57
  /// succeeded.
58
  class IoError : public Exception {
59
  protected:
60
    std::string _message;
61
    std::string _file;
182 62

	
183
  /// Logic errors represent problems in the internal logic of a program;
184
  /// in theory, these are preventable, and even detectable before the
185
  /// program runs (e.g. violations of class invariants).
186
  ///
187
  /// A typical example for this is \ref UninitializedParameter.
188
  class LogicError : public Exception {
63
    mutable std::string _what;
189 64
  public:
65

	
66
    /// Copy constructor
67
    IoError(const IoError &error) throw() : Exception() {
68
      message(error._message);
69
      file(error._file);
70
    }
71

	
72
    /// Constructor
73
    explicit IoError(const char *message) throw() {
74
      IoError::message(message);
75
    }
76

	
77
    /// Constructor
78
    explicit IoError(const std::string &message) throw() {
79
      IoError::message(message);
80
    }
81

	
82
    /// Constructor
83
    explicit IoError(const char *message,
84
                     const std::string &file) throw() {
85
      IoError::message(message);
86
      IoError::file(file);
87
    }
88

	
89
    /// Constructor
90
    explicit IoError(const std::string &message,
91
                     const std::string &file) throw() {
92
      IoError::message(message);
93
      IoError::file(file);
94
    }
95

	
96
    /// Virtual destructor
97
    virtual ~IoError() throw() {}
98

	
99
    /// Set the error message
100
    void message(const char *message) throw() {
101
      try {
102
        _message = message;
103
      } catch (...) {}
104
    }
105

	
106
    /// Set the error message
107
    void message(const std::string& message) throw() {
108
      try {
109
        _message = message;
110
      } catch (...) {}
111
    }
112

	
113
    /// Set the file name
114
    void file(const std::string &file) throw() {
115
      try {
116
        _file = file;
117
      } catch (...) {}
118
    }
119

	
120
    /// Returns the error message
121
    const std::string& message() const throw() {
122
      return _message;
123
    }
124

	
125
    /// \brief Returns the filename
126
    ///
127
    /// Returns the filename or an empty string if it was not specified.
128
    const std::string& file() const throw() {
129
      return _file;
130
    }
131

	
132
    /// \brief Returns a short error message
133
    ///
134
    /// Returns a short error message which contains the message and the
135
    /// file name.
190 136
    virtual const char* what() const throw() {
191
      return "lemon::LogicError";
137
      try {
138
        _what.clear();
139
        std::ostringstream oss;
140
        oss << "lemon:IoError" << ": ";
141
        oss << _message;
142
        if (!_file.empty()) {
143
          oss << " ('" << _file << "')";
144
        }
145
        _what = oss.str();
146
      }
147
      catch (...) {}
148
      if (!_what.empty()) return _what.c_str();
149
      else return "lemon:IoError";
192 150
    }
151

	
193 152
  };
194 153

	
195
  /// \ref Exception for uninitialized parameters.
196

	
197
  /// This error represents problems in the initialization
198
  /// of the parameters of the algorithms.
199
  class UninitializedParameter : public LogicError {
200
  public:
201
    virtual const char* what() const throw() {
202
      return "lemon::UninitializedParameter";
203
    }
204
  };
205

	
206

	
207
  /// One of the two main subclasses of \ref Exception.
208

	
209
  /// Runtime errors represent problems outside the scope of a program;
210
  /// they cannot be easily predicted and can generally only be caught
211
  /// as the program executes.
212
  class RuntimeError : public Exception {
213
  public:
214
    virtual const char* what() const throw() {
215
      return "lemon::RuntimeError";
216
    }
217
  };
218

	
219
  ///\e
220
  class RangeError : public RuntimeError {
221
  public:
222
    virtual const char* what() const throw() {
223
      return "lemon::RangeError";
224
    }
225
  };
226

	
227
  ///\e
228
  class IoError : public RuntimeError {
229
  public:
230
    virtual const char* what() const throw() {
231
      return "lemon::IoError";
232
    }
233
  };
234

	
235
  ///\e
236
  class DataFormatError : public IoError {
154
  /// \brief Format error
155
  ///
156
  /// This exception is thrown when an input file has wrong
157
  /// format or a data representation is not legal.
158
  class FormatError : public Exception {
237 159
  protected:
238
    ExceptionMember<std::string> _message;
239
    ExceptionMember<std::string> _file;
160
    std::string _message;
161
    std::string _file;
240 162
    int _line;
241 163

	
242
    mutable ExceptionMember<std::string> _message_holder;
164
    mutable std::string _what;
243 165
  public:
244 166

	
245
    DataFormatError(const DataFormatError &dfe) :
246
      IoError(dfe), _message(dfe._message), _file(dfe._file),
247
      _line(dfe._line) {}
248

	
249
    ///\e
250
    explicit DataFormatError(const char *the_message)
251
      : _message(the_message), _line(0) {}
252

	
253
    ///\e
254
    DataFormatError(const std::string &file_name, int line_num,
255
                    const char *the_message)
256
      : _message(the_message), _line(line_num) { file(file_name); }
257

	
258
    ///\e
259
    void line(int ln) { _line = ln; }
260
    ///\e
261
    void message(const std::string& msg) { _message.set(msg); }
262
    ///\e
263
    void file(const std::string &fl) { _file.set(fl); }
264

	
265
    ///\e
266
    int line() const { return _line; }
267
    ///\e
268
    const char* message() const {
269
      if (_message.valid() && !_message.get().empty()) {
270
        return _message.get().c_str();
271
      } else {
272
        return 0;
273
      }
167
    /// Copy constructor
168
    FormatError(const FormatError &error) throw() : Exception() {
169
      message(error._message);
170
      file(error._file);
171
      line(error._line);
274 172
    }
275 173

	
276
    /// \brief Returns the filename.
277
    ///
278
    /// Returns \e null if the filename was not specified.
279
    const char* file() const {
280
      if (_file.valid() && !_file.get().empty()) {
281
        return _file.get().c_str();
282
      } else {
283
        return 0;
284
      }
174
    /// Constructor
175
    explicit FormatError(const char *message) throw() {
176
      FormatError::message(message);
177
      _line = 0;
285 178
    }
286 179

	
287
    ///\e
180
    /// Constructor
181
    explicit FormatError(const std::string &message) throw() {
182
      FormatError::message(message);
183
      _line = 0;
184
    }
185

	
186
    /// Constructor
187
    explicit FormatError(const char *message,
188
                         const std::string &file, int line = 0) throw() {
189
      FormatError::message(message);
190
      FormatError::file(file);
191
      FormatError::line(line);
192
    }
193

	
194
    /// Constructor
195
    explicit FormatError(const std::string &message,
196
                         const std::string &file, int line = 0) throw() {
197
      FormatError::message(message);
198
      FormatError::file(file);
199
      FormatError::line(line);
200
    }
201

	
202
    /// Virtual destructor
203
    virtual ~FormatError() throw() {}
204

	
205
    /// Set the line number
206
    void line(int line) throw() { _line = line; }
207

	
208
    /// Set the error message
209
    void message(const char *message) throw() {
210
      try {
211
        _message = message;
212
      } catch (...) {}
213
    }
214

	
215
    /// Set the error message
216
    void message(const std::string& message) throw() {
217
      try {
218
        _message = message;
219
      } catch (...) {}
220
    }
221

	
222
    /// Set the file name
223
    void file(const std::string &file) throw() {
224
      try {
225
        _file = file;
226
      } catch (...) {}
227
    }
228

	
229
    /// \brief Returns the line number
230
    ///
231
    /// Returns the line number or zero if it was not specified.
232
    int line() const throw() { return _line; }
233

	
234
    /// Returns the error message
235
    const std::string& message() const throw() {
236
      return _message;
237
    }
238

	
239
    /// \brief Returns the filename
240
    ///
241
    /// Returns the filename or an empty string if it was not specified.
242
    const std::string& file() const throw() {
243
      return _file;
244
    }
245

	
246
    /// \brief Returns a short error message
247
    ///
248
    /// Returns a short error message which contains the message, the
249
    /// file name and the line number.
288 250
    virtual const char* what() const throw() {
289 251
      try {
290
        std::ostringstream ostr;
291
        ostr << "lemon:DataFormatError" << ": ";
292
        if (message()) ostr << message();
293
        if( file() || line() != 0 ) {
294
          ostr << " (";
295
          if( file() ) ostr << "in file '" << file() << "'";
296
          if( file() && line() != 0 ) ostr << " ";
297
          if( line() != 0 ) ostr << "at line " << line();
298
          ostr << ")";
252
        _what.clear();
253
        std::ostringstream oss;
254
        oss << "lemon:FormatError" << ": ";
255
        oss << _message;
256
        if (!_file.empty() || _line != 0) {
257
          oss << " (";
258
          if (!_file.empty()) oss << "in file '" << _file << "'";
259
          if (!_file.empty() && _line != 0) oss << " ";
260
          if (_line != 0) oss << "at line " << _line;
261
          oss << ")";
299 262
        }
300
        _message_holder.set(ostr.str());
263
        _what = oss.str();
301 264
      }
302 265
      catch (...) {}
303
      if( _message_holder.valid()) return _message_holder.get().c_str();
304
      return "lemon:DataFormatError";
266
      if (!_what.empty()) return _what.c_str();
267
      else return "lemon:FormatError";
305 268
    }
306 269

	
307
    virtual ~DataFormatError() throw() {}
308
  };
309

	
310
  ///\e
311
  class FileOpenError : public IoError {
312
  protected:
313
    ExceptionMember<std::string> _file;
314

	
315
    mutable ExceptionMember<std::string> _message_holder;
316
  public:
317

	
318
    FileOpenError(const FileOpenError &foe) :
319
      IoError(foe), _file(foe._file) {}
320

	
321
    ///\e
322
    explicit FileOpenError(const std::string& fl)
323
      : _file(fl) {}
324

	
325

	
326
    ///\e
327
    void file(const std::string &fl) { _file.set(fl); }
328

	
329
    /// \brief Returns the filename.
330
    ///
331
    /// Returns \e null if the filename was not specified.
332
    const char* file() const {
333
      if (_file.valid() && !_file.get().empty()) {
334
        return _file.get().c_str();
335
      } else {
336
        return 0;
337
      }
338
    }
339

	
340
    ///\e
341
    virtual const char* what() const throw() {
342
      try {
343
        std::ostringstream ostr;
344
        ostr << "lemon::FileOpenError" << ": ";
345
        ostr << "Cannot open file - " << file();
346
        _message_holder.set(ostr.str());
347
      }
348
      catch (...) {}
349
      if( _message_holder.valid()) return _message_holder.get().c_str();
350
      return "lemon::FileOpenError";
351
    }
352
    virtual ~FileOpenError() throw() {}
353
  };
354

	
355
  class IoParameterError : public IoError {
356
  protected:
357
    ExceptionMember<std::string> _message;
358
    ExceptionMember<std::string> _file;
359

	
360
    mutable ExceptionMember<std::string> _message_holder;
361
  public:
362

	
363
    IoParameterError(const IoParameterError &ile) :
364
      IoError(ile), _message(ile._message), _file(ile._file) {}
365

	
366
    ///\e
367
    explicit IoParameterError(const char *the_message)
368
      : _message(the_message) {}
369

	
370
    ///\e
371
    IoParameterError(const char *file_name, const char *the_message)
372
      : _message(the_message), _file(file_name) {}
373

	
374
     ///\e
375
    void message(const std::string& msg) { _message.set(msg); }
376
    ///\e
377
    void file(const std::string &fl) { _file.set(fl); }
378

	
379
     ///\e
380
    const char* message() const {
381
      if (_message.valid()) {
382
        return _message.get().c_str();
383
      } else {
384
        return 0;
385
      }
386
    }
387

	
388
    /// \brief Returns the filename.
389
    ///
390
    /// Returns \c 0 if the filename was not specified.
391
    const char* file() const {
392
      if (_file.valid()) {
393
        return _file.get().c_str();
394
      } else {
395
        return 0;
396
      }
397
    }
398

	
399
    ///\e
400
    virtual const char* what() const throw() {
401
      try {
402
        std::ostringstream ostr;
403
        if (message()) ostr << message();
404
        if (file()) ostr << "(when reading file '" << file() << "')";
405
        _message_holder.set(ostr.str());
406
      }
407
      catch (...) {}
408
      if( _message_holder.valid() ) return _message_holder.get().c_str();
409
      return "lemon:IoParameterError";
410
    }
411
    virtual ~IoParameterError() throw() {}
412 270
  };
413 271

	
Ignore white space 6 line context
... ...
@@ -41,4 +41,5 @@
41 41
#include<lemon/color.h>
42 42
#include<lemon/bits/bezier.h>
43
#include<lemon/error.h>
43 44

	
44 45

	
... ...
@@ -1167,6 +1168,11 @@
1167 1168
graphToEps(G &g,const char *file_name)
1168 1169
{
1170
  std::ostream* os = new std::ofstream(file_name);
1171
  if (!(*os)) {
1172
    delete os;
1173
    throw IoError("Cannot write file", file_name);
1174
  }
1169 1175
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1170
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name),true));
1176
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1171 1177
}
1172 1178

	
... ...
@@ -1183,6 +1189,11 @@
1183 1189
graphToEps(G &g,const std::string& file_name)
1184 1190
{
1191
  std::ostream* os = new std::ofstream(file_name.c_str());
1192
  if (!(*os)) {
1193
    delete os;
1194
    throw IoError("Cannot write file", file_name);
1195
  }
1185 1196
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1186
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name.c_str()),true));
1197
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1187 1198
}
1188 1199

	
Ignore white space 4 line context
... ...
@@ -49,9 +49,11 @@
49 49
        std::istringstream is(str);
50 50
        Value value;
51
        is >> value;
51
        if (!(is >> value)) {
52
          throw FormatError("Cannot read token");
53
        }
52 54

	
53 55
        char c;
54 56
        if (is >> std::ws >> c) {
55
          throw DataFormatError("Remaining characters in token");
57
          throw FormatError("Remaining characters in token");
56 58
        }
57 59
        return value;
... ...
@@ -167,5 +169,5 @@
167 169
          std::ostringstream msg;
168 170
          msg << "Item not found: " << str;
169
          throw DataFormatError(msg.str().c_str());
171
          throw FormatError(msg.str());
170 172
        }
171 173
        return it->second;
... ...
@@ -185,10 +187,10 @@
185 187
      typename Graph::Arc operator()(const std::string& str) {
186 188
        if (str.empty() || (str[0] != '+' && str[0] != '-')) {
187
          throw DataFormatError("Item must start with '+' or '-'");
189
          throw FormatError("Item must start with '+' or '-'");
188 190
        }
189 191
        typename std::map<std::string, typename Graph::Edge>
190 192
          ::const_iterator it = _map.find(str.substr(1));
191 193
        if (it == _map.end()) {
192
          throw DataFormatError("Item not found");
194
          throw FormatError("Item not found");
193 195
        }
194 196
        return _graph.direct(it->second, str[0] == '+');
... ...
@@ -236,5 +238,5 @@
236 238
      char c;
237 239
      if (!is.get(c))
238
        throw DataFormatError("Escape format error");
240
        throw FormatError("Escape format error");
239 241

	
240 242
      switch (c) {
... ...
@@ -265,5 +267,5 @@
265 267
          int code;
266 268
          if (!is.get(c) || !isHex(c))
267
            throw DataFormatError("Escape format error");
269
            throw FormatError("Escape format error");
268 270
          else if (code = valueHex(c), !is.get(c) || !isHex(c)) is.putback(c);
269 271
          else code = code * 16 + valueHex(c);
... ...
@@ -274,5 +276,5 @@
274 276
          int code;
275 277
          if (!isOct(c))
276
            throw DataFormatError("Escape format error");
278
            throw FormatError("Escape format error");
277 279
          else if (code = valueOct(c), !is.get(c) || !isOct(c))
278 280
            is.putback(c);
... ...
@@ -301,5 +303,5 @@
301 303
        }
302 304
        if (!is)
303
          throw DataFormatError("Quoted format error");
305
          throw FormatError("Quoted format error");
304 306
      } else {
305 307
        is.putback(c);
... ...
@@ -462,4 +464,5 @@
462 464
    std::istream* _is;
463 465
    bool local_is;
466
    std::string _filename;
464 467

	
465 468
    Digraph& _digraph;
... ...
@@ -511,7 +514,10 @@
511 514
    /// file.
512 515
    DigraphReader(Digraph& digraph, const std::string& fn)
513
      : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph),
516
      : _is(new std::ifstream(fn.c_str())), local_is(true),
517
        _filename(fn), _digraph(digraph),
514 518
        _use_nodes(false), _use_arcs(false),
515
        _skip_nodes(false), _skip_arcs(false) {}
519
        _skip_nodes(false), _skip_arcs(false) {
520
      if (!(*_is)) throw IoError("Cannot open file", fn);
521
    }
516 522

	
517 523
    /// \brief Constructor
... ...
@@ -520,7 +526,10 @@
520 526
    /// file.
521 527
    DigraphReader(Digraph& digraph, const char* fn)
522
      : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph),
528
      : _is(new std::ifstream(fn)), local_is(true),
529
        _filename(fn), _digraph(digraph),
523 530
        _use_nodes(false), _use_arcs(false),
524
        _skip_nodes(false), _skip_arcs(false) {}
531
        _skip_nodes(false), _skip_arcs(false) {
532
      if (!(*_is)) throw IoError("Cannot open file", fn);
533
    }
525 534

	
526 535
    /// \brief Destructor
... ...
@@ -847,5 +856,5 @@
847 856
        if (readSuccess() && line) line.putback(c);
848 857
        if (!_node_maps.empty())
849
          throw DataFormatError("Cannot find map names");
858
          throw FormatError("Cannot find map names");
850 859
        return;
851 860
      }
... ...
@@ -861,5 +870,5 @@
861 870
            std::ostringstream msg;
862 871
            msg << "Multiple occurence of node map: " << map;
863
            throw DataFormatError(msg.str().c_str());
872
            throw FormatError(msg.str());
864 873
          }
865 874
          maps.insert(std::make_pair(map, index));
... ...
@@ -872,6 +881,6 @@
872 881
          if (jt == maps.end()) {
873 882
            std::ostringstream msg;
874
            msg << "Map not found in file: " << _node_maps[i].first;
875
            throw DataFormatError(msg.str().c_str());
883
            msg << "Map not found: " << _node_maps[i].first;
884
            throw FormatError(msg.str());
876 885
          }
877 886
          map_index[i] = jt->second;
... ...
@@ -897,9 +906,9 @@
897 906
            std::ostringstream msg;
898 907
            msg << "Column not found (" << i + 1 << ")";
899
            throw DataFormatError(msg.str().c_str());
908
            throw FormatError(msg.str());
900 909
          }
901 910
        }
902 911
        if (line >> std::ws >> c)
903
          throw DataFormatError("Extra character on the end of line");
912
          throw FormatError("Extra character at the end of line");
904 913

	
905 914
        Node n;
... ...
@@ -910,5 +919,5 @@
910 919
        } else {
911 920
          if (label_index == -1)
912
            throw DataFormatError("Label map not found in file");
921
            throw FormatError("Label map not found");
913 922
          typename std::map<std::string, Node>::iterator it =
914 923
            _node_index.find(tokens[label_index]);
... ...
@@ -916,5 +925,5 @@
916 925
            std::ostringstream msg;
917 926
            msg << "Node with label not found: " << tokens[label_index];
918
            throw DataFormatError(msg.str().c_str());
927
            throw FormatError(msg.str());
919 928
          }
920 929
          n = it->second;
... ...
@@ -940,5 +949,5 @@
940 949
        if (readSuccess() && line) line.putback(c);
941 950
        if (!_arc_maps.empty())
942
          throw DataFormatError("Cannot find map names");
951
          throw FormatError("Cannot find map names");
943 952
        return;
944 953
      }
... ...
@@ -954,5 +963,5 @@
954 963
            std::ostringstream msg;
955 964
            msg << "Multiple occurence of arc map: " << map;
956
            throw DataFormatError(msg.str().c_str());
965
            throw FormatError(msg.str());
957 966
          }
958 967
          maps.insert(std::make_pair(map, index));
... ...
@@ -965,6 +974,6 @@
965 974
          if (jt == maps.end()) {
966 975
            std::ostringstream msg;
967
            msg << "Map not found in file: " << _arc_maps[i].first;
968
            throw DataFormatError(msg.str().c_str());
976
            msg << "Map not found: " << _arc_maps[i].first;
977
            throw FormatError(msg.str());
969 978
          }
970 979
          map_index[i] = jt->second;
... ...
@@ -989,8 +998,8 @@
989 998

	
990 999
        if (!_reader_bits::readToken(line, source_token))
991
          throw DataFormatError("Source not found");
1000
          throw FormatError("Source not found");
992 1001

	
993 1002
        if (!_reader_bits::readToken(line, target_token))
994
          throw DataFormatError("Target not found");
1003
          throw FormatError("Target not found");
995 1004

	
996 1005
        std::vector<std::string> tokens(map_num);
... ...
@@ -999,9 +1008,9 @@
999 1008
            std::ostringstream msg;
1000 1009
            msg << "Column not found (" << i + 1 << ")";
1001
            throw DataFormatError(msg.str().c_str());
1010
            throw FormatError(msg.str());
1002 1011
          }
1003 1012
        }
1004 1013
        if (line >> std::ws >> c)
1005
          throw DataFormatError("Extra character on the end of line");
1014
          throw FormatError("Extra character at the end of line");
1006 1015

	
1007 1016
        Arc a;
... ...
@@ -1014,5 +1023,5 @@
1014 1023
            std::ostringstream msg;
1015 1024
            msg << "Item not found: " << source_token;
1016
            throw DataFormatError(msg.str().c_str());
1025
            throw FormatError(msg.str());
1017 1026
          }
1018 1027
          Node source = it->second;
... ...
@@ -1022,5 +1031,5 @@
1022 1031
            std::ostringstream msg;
1023 1032
            msg << "Item not found: " << target_token;
1024
            throw DataFormatError(msg.str().c_str());
1033
            throw FormatError(msg.str());
1025 1034
          }
1026 1035
          Node target = it->second;
... ...
@@ -1031,5 +1040,5 @@
1031 1040
        } else {
1032 1041
          if (label_index == -1)
1033
            throw DataFormatError("Label map not found in file");
1042
            throw FormatError("Label map not found");
1034 1043
          typename std::map<std::string, Arc>::iterator it =
1035 1044
            _arc_index.find(tokens[label_index]);
... ...
@@ -1037,5 +1046,5 @@
1037 1046
            std::ostringstream msg;
1038 1047
            msg << "Arc with label not found: " << tokens[label_index];
1039
            throw DataFormatError(msg.str().c_str());
1048
            throw FormatError(msg.str());
1040 1049
          }
1041 1050
          a = it->second;
... ...
@@ -1062,9 +1071,9 @@
1062 1071
        std::string attr, token;
1063 1072
        if (!_reader_bits::readToken(line, attr))
1064
          throw DataFormatError("Attribute name not found");
1073
          throw FormatError("Attribute name not found");
1065 1074
        if (!_reader_bits::readToken(line, token))
1066
          throw DataFormatError("Attribute value not found");
1075
          throw FormatError("Attribute value not found");
1067 1076
        if (line >> c)
1068
          throw DataFormatError("Extra character on the end of line");
1077
          throw FormatError("Extra character at the end of line");
1069 1078

	
1070 1079
        {
... ...
@@ -1072,6 +1081,6 @@
1072 1081
          if (it != read_attr.end()) {
1073 1082
            std::ostringstream msg;
1074
            msg << "Multiple occurence of attribute " << attr;
1075
            throw DataFormatError(msg.str().c_str());
1083
            msg << "Multiple occurence of attribute: " << attr;
1084
            throw FormatError(msg.str());
1076 1085
          }
1077 1086
          read_attr.insert(attr);
... ...
@@ -1094,6 +1103,6 @@
1094 1103
        if (read_attr.find(it->first) == read_attr.end()) {
1095 1104
          std::ostringstream msg;
1096
          msg << "Attribute not found in file: " << it->first;
1097
          throw DataFormatError(msg.str().c_str());
1105
          msg << "Attribute not found: " << it->first;
1106
          throw FormatError(msg.str());
1098 1107
        }
1099 1108
      }
... ...
@@ -1110,7 +1119,4 @@
1110 1119
    void run() {
1111 1120
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1112
      if (!*_is) {
1113
        throw DataFormatError("Cannot find file");
1114
      }
1115 1121

	
1116 1122
      bool nodes_done = _skip_nodes;
... ...
@@ -1131,5 +1137,5 @@
1131 1137

	
1132 1138
          if (line >> c)
1133
            throw DataFormatError("Extra character on the end of line");
1139
            throw FormatError("Extra character at the end of line");
1134 1140

	
1135 1141
          if (section == "nodes" && !nodes_done) {
... ...
@@ -1153,6 +1159,7 @@
1153 1159
            skipSection();
1154 1160
          }
1155
        } catch (DataFormatError& error) {
1161
        } catch (FormatError& error) {
1156 1162
          error.line(line_num);
1163
          error.file(_filename);
1157 1164
          throw;
1158 1165
        }
... ...
@@ -1160,13 +1167,13 @@
1160 1167

	
1161 1168
      if (!nodes_done) {
1162
        throw DataFormatError("Section @nodes not found");
1169
        throw FormatError("Section @nodes not found");
1163 1170
      }
1164 1171

	
1165 1172
      if (!arcs_done) {
1166
        throw DataFormatError("Section @arcs not found");
1173
        throw FormatError("Section @arcs not found");
1167 1174
      }
1168 1175

	
1169 1176
      if (!attributes_done && !_attributes.empty()) {
1170
        throw DataFormatError("Section @attributes not found");
1177
        throw FormatError("Section @attributes not found");
1171 1178
      }
1172 1179

	
... ...
@@ -1248,4 +1255,5 @@
1248 1255
    std::istream* _is;
1249 1256
    bool local_is;
1257
    std::string _filename;
1250 1258

	
1251 1259
    Graph& _graph;
... ...
@@ -1297,7 +1305,10 @@
1297 1305
    /// file.
1298 1306
    GraphReader(Graph& graph, const std::string& fn)
1299
      : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph),
1307
      : _is(new std::ifstream(fn.c_str())), local_is(true),
1308
        _filename(fn), _graph(graph),
1300 1309
        _use_nodes(false), _use_edges(false),
1301
        _skip_nodes(false), _skip_edges(false) {}
1310
        _skip_nodes(false), _skip_edges(false) {
1311
      if (!(*_is)) throw IoError("Cannot open file", fn);
1312
    }
1302 1313

	
1303 1314
    /// \brief Constructor
... ...
@@ -1306,7 +1317,10 @@
1306 1317
    /// file.
1307 1318
    GraphReader(Graph& graph, const char* fn)
1308
      : _is(new std::ifstream(fn)), local_is(true), _graph(graph),
1319
      : _is(new std::ifstream(fn)), local_is(true),
1320
        _filename(fn), _graph(graph),
1309 1321
        _use_nodes(false), _use_edges(false),
1310
        _skip_nodes(false), _skip_edges(false) {}
1322
        _skip_nodes(false), _skip_edges(false) {
1323
      if (!(*_is)) throw IoError("Cannot open file", fn);
1324
    }
1311 1325

	
1312 1326
    /// \brief Destructor
... ...
@@ -1677,5 +1691,5 @@
1677 1691
        if (readSuccess() && line) line.putback(c);
1678 1692
        if (!_node_maps.empty())
1679
          throw DataFormatError("Cannot find map names");
1693
          throw FormatError("Cannot find map names");
1680 1694
        return;
1681 1695
      }
... ...
@@ -1691,5 +1705,5 @@
1691 1705
            std::ostringstream msg;
1692 1706
            msg << "Multiple occurence of node map: " << map;
1693
            throw DataFormatError(msg.str().c_str());
1707
            throw FormatError(msg.str());
1694 1708
          }
1695 1709
          maps.insert(std::make_pair(map, index));
... ...
@@ -1702,6 +1716,6 @@
1702 1716
          if (jt == maps.end()) {
1703 1717
            std::ostringstream msg;
1704
            msg << "Map not found in file: " << _node_maps[i].first;
1705
            throw DataFormatError(msg.str().c_str());
1718
            msg << "Map not found: " << _node_maps[i].first;
1719
            throw FormatError(msg.str());
1706 1720
          }
1707 1721
          map_index[i] = jt->second;
... ...
@@ -1727,9 +1741,9 @@
1727 1741
            std::ostringstream msg;
1728 1742
            msg << "Column not found (" << i + 1 << ")";
1729
            throw DataFormatError(msg.str().c_str());
1743
            throw FormatError(msg.str());
1730 1744
          }
1731 1745
        }
1732 1746
        if (line >> std::ws >> c)
1733
          throw DataFormatError("Extra character on the end of line");
1747
          throw FormatError("Extra character at the end of line");
1734 1748

	
1735 1749
        Node n;
... ...
@@ -1740,5 +1754,5 @@
1740 1754
        } else {
1741 1755
          if (label_index == -1)
1742
            throw DataFormatError("Label map not found in file");
1756
            throw FormatError("Label map not found");
1743 1757
          typename std::map<std::string, Node>::iterator it =
1744 1758
            _node_index.find(tokens[label_index]);
... ...
@@ -1746,5 +1760,5 @@
1746 1760
            std::ostringstream msg;
1747 1761
            msg << "Node with label not found: " << tokens[label_index];
1748
            throw DataFormatError(msg.str().c_str());
1762
            throw FormatError(msg.str());
1749 1763
          }
1750 1764
          n = it->second;
... ...
@@ -1770,5 +1784,5 @@
1770 1784
        if (readSuccess() && line) line.putback(c);
1771 1785
        if (!_edge_maps.empty())
1772
          throw DataFormatError("Cannot find map names");
1786
          throw FormatError("Cannot find map names");
1773 1787
        return;
1774 1788
      }
... ...
@@ -1784,5 +1798,5 @@
1784 1798
            std::ostringstream msg;
1785 1799
            msg << "Multiple occurence of edge map: " << map;
1786
            throw DataFormatError(msg.str().c_str());
1800
            throw FormatError(msg.str());
1787 1801
          }
1788 1802
          maps.insert(std::make_pair(map, index));
... ...
@@ -1795,6 +1809,6 @@
1795 1809
          if (jt == maps.end()) {
1796 1810
            std::ostringstream msg;
1797
            msg << "Map not found in file: " << _edge_maps[i].first;
1798
            throw DataFormatError(msg.str().c_str());
1811
            msg << "Map not found: " << _edge_maps[i].first;
1812
            throw FormatError(msg.str());
1799 1813
          }
1800 1814
          map_index[i] = jt->second;
... ...
@@ -1819,8 +1833,8 @@
1819 1833

	
1820 1834
        if (!_reader_bits::readToken(line, source_token))
1821
          throw DataFormatError("Node u not found");
1835
          throw FormatError("Node u not found");
1822 1836

	
1823 1837
        if (!_reader_bits::readToken(line, target_token))
1824
          throw DataFormatError("Node v not found");
1838
          throw FormatError("Node v not found");
1825 1839

	
1826 1840
        std::vector<std::string> tokens(map_num);
... ...
@@ -1829,9 +1843,9 @@
1829 1843
            std::ostringstream msg;
1830 1844
            msg << "Column not found (" << i + 1 << ")";
1831
            throw DataFormatError(msg.str().c_str());
1845
            throw FormatError(msg.str());
1832 1846
          }
1833 1847
        }
1834 1848
        if (line >> std::ws >> c)
1835
          throw DataFormatError("Extra character on the end of line");
1849
          throw FormatError("Extra character at the end of line");
1836 1850

	
1837 1851
        Edge e;
... ...
@@ -1844,5 +1858,5 @@
1844 1858
            std::ostringstream msg;
1845 1859
            msg << "Item not found: " << source_token;
1846
            throw DataFormatError(msg.str().c_str());
1860
            throw FormatError(msg.str());
1847 1861
          }
1848 1862
          Node source = it->second;
... ...
@@ -1852,5 +1866,5 @@
1852 1866
            std::ostringstream msg;
1853 1867
            msg << "Item not found: " << target_token;
1854
            throw DataFormatError(msg.str().c_str());
1868
            throw FormatError(msg.str());
1855 1869
          }
1856 1870
          Node target = it->second;
... ...
@@ -1861,5 +1875,5 @@
1861 1875
        } else {
1862 1876
          if (label_index == -1)
1863
            throw DataFormatError("Label map not found in file");
1877
            throw FormatError("Label map not found");
1864 1878
          typename std::map<std::string, Edge>::iterator it =
1865 1879
            _edge_index.find(tokens[label_index]);
... ...
@@ -1867,5 +1881,5 @@
1867 1881
            std::ostringstream msg;
1868 1882
            msg << "Edge with label not found: " << tokens[label_index];
1869
            throw DataFormatError(msg.str().c_str());
1883
            throw FormatError(msg.str());
1870 1884
          }
1871 1885
          e = it->second;
... ...
@@ -1892,9 +1906,9 @@
1892 1906
        std::string attr, token;
1893 1907
        if (!_reader_bits::readToken(line, attr))
1894
          throw DataFormatError("Attribute name not found");
1908
          throw FormatError("Attribute name not found");
1895 1909
        if (!_reader_bits::readToken(line, token))
1896
          throw DataFormatError("Attribute value not found");
1910
          throw FormatError("Attribute value not found");
1897 1911
        if (line >> c)
1898
          throw DataFormatError("Extra character on the end of line");
1912
          throw FormatError("Extra character at the end of line");
1899 1913

	
1900 1914
        {
... ...
@@ -1902,6 +1916,6 @@
1902 1916
          if (it != read_attr.end()) {
1903 1917
            std::ostringstream msg;
1904
            msg << "Multiple occurence of attribute " << attr;
1905
            throw DataFormatError(msg.str().c_str());
1918
            msg << "Multiple occurence of attribute: " << attr;
1919
            throw FormatError(msg.str());
1906 1920
          }
1907 1921
          read_attr.insert(attr);
... ...
@@ -1924,6 +1938,6 @@
1924 1938
        if (read_attr.find(it->first) == read_attr.end()) {
1925 1939
          std::ostringstream msg;
1926
          msg << "Attribute not found in file: " << it->first;
1927
          throw DataFormatError(msg.str().c_str());
1940
          msg << "Attribute not found: " << it->first;
1941
          throw FormatError(msg.str());
1928 1942
        }
1929 1943
      }
... ...
@@ -1959,5 +1973,5 @@
1959 1973

	
1960 1974
          if (line >> c)
1961
            throw DataFormatError("Extra character on the end of line");
1975
            throw FormatError("Extra character at the end of line");
1962 1976

	
1963 1977
          if (section == "nodes" && !nodes_done) {
... ...
@@ -1981,6 +1995,7 @@
1981 1995
            skipSection();
1982 1996
          }
1983
        } catch (DataFormatError& error) {
1997
        } catch (FormatError& error) {
1984 1998
          error.line(line_num);
1999
          error.file(_filename);
1985 2000
          throw;
1986 2001
        }
... ...
@@ -1988,13 +2003,13 @@
1988 2003

	
1989 2004
      if (!nodes_done) {
1990
        throw DataFormatError("Section @nodes not found");
2005
        throw FormatError("Section @nodes not found");
1991 2006
      }
1992 2007

	
1993 2008
      if (!edges_done) {
1994
        throw DataFormatError("Section @edges not found");
2009
        throw FormatError("Section @edges not found");
1995 2010
      }
1996 2011

	
1997 2012
      if (!attributes_done && !_attributes.empty()) {
1998
        throw DataFormatError("Section @attributes not found");
2013
        throw FormatError("Section @attributes not found");
1999 2014
      }
2000 2015

	
... ...
@@ -2057,4 +2072,5 @@
2057 2072
    std::istream* _is;
2058 2073
    bool local_is;
2074
    std::string _filename;
2059 2075

	
2060 2076
    typedef std::map<std::string, _reader_bits::Section*> Sections;
... ...
@@ -2077,5 +2093,8 @@
2077 2093
    /// Construct a section reader, which reads from the given file.
2078 2094
    SectionReader(const std::string& fn)
2079
      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
2095
      : _is(new std::ifstream(fn.c_str())), local_is(true),
2096
        _filename(fn) {
2097
      if (!(*_is)) throw IoError("Cannot open file", fn);
2098
    }
2080 2099

	
2081 2100
    /// \brief Constructor
... ...
@@ -2083,5 +2102,8 @@
2083 2102
    /// Construct a section reader, which reads from the given file.
2084 2103
    SectionReader(const char* fn)
2085
      : _is(new std::ifstream(fn)), local_is(true) {}
2104
      : _is(new std::ifstream(fn)), local_is(true),
2105
        _filename(fn) {
2106
      if (!(*_is)) throw IoError("Cannot open file", fn);
2107
    }
2086 2108

	
2087 2109
    /// \brief Destructor
... ...
@@ -2239,10 +2261,10 @@
2239 2261

	
2240 2262
          if (line >> c)
2241
            throw DataFormatError("Extra character on the end of line");
2263
            throw FormatError("Extra character at the end of line");
2242 2264

	
2243 2265
          if (extra_sections.find(section) != extra_sections.end()) {
2244 2266
            std::ostringstream msg;
2245
            msg << "Multiple occurence of section " << section;
2246
            throw DataFormatError(msg.str().c_str());
2267
            msg << "Multiple occurence of section: " << section;
2268
            throw FormatError(msg.str());
2247 2269
          }
2248 2270
          Sections::iterator it = _sections.find(section);
... ...
@@ -2253,6 +2275,7 @@
2253 2275
          readLine();
2254 2276
          skipSection();
2255
        } catch (DataFormatError& error) {
2277
        } catch (FormatError& error) {
2256 2278
          error.line(line_num);
2279
          error.file(_filename);
2257 2280
          throw;
2258 2281
        }
... ...
@@ -2263,5 +2286,5 @@
2263 2286
          std::ostringstream os;
2264 2287
          os << "Cannot find section: " << it->first;
2265
          throw DataFormatError(os.str().c_str());
2288
          throw FormatError(os.str());
2266 2289
        }
2267 2290
      }
... ...
@@ -2363,5 +2386,7 @@
2363 2386
    /// file.
2364 2387
    LgfContents(const std::string& fn)
2365
      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
2388
      : _is(new std::ifstream(fn.c_str())), local_is(true) {
2389
      if (!(*_is)) throw IoError("Cannot open file", fn);
2390
    }
2366 2391

	
2367 2392
    /// \brief Constructor
... ...
@@ -2370,5 +2395,7 @@
2370 2395
    /// file.
2371 2396
    LgfContents(const char* fn)
2372
      : _is(new std::ifstream(fn)), local_is(true) {}
2397
      : _is(new std::ifstream(fn)), local_is(true) {
2398
      if (!(*_is)) throw IoError("Cannot open file", fn);
2399
    }
2373 2400

	
2374 2401
    /// \brief Destructor
Ignore white space 6 line context
... ...
@@ -56,5 +56,5 @@
56 56
    template <typename T>
57 57
    bool operator<(const T&, const T&) {
58
      throw DataFormatError("Label map is not comparable");
58
      throw FormatError("Label map is not comparable");
59 59
    }
60 60

	
... ...
@@ -204,5 +204,5 @@
204 204
          _map.find(str);
205 205
        if (it == _map.end()) {
206
          throw DataFormatError("Item not found");
206
          throw FormatError("Item not found");
207 207
        }
208 208
        return it->second;
... ...
@@ -224,5 +224,5 @@
224 224
          ::const_iterator it = _map.find(val);
225 225
        if (it == _map.end()) {
226
          throw DataFormatError("Item not found");
226
          throw FormatError("Item not found");
227 227
        }
228 228
        return (_graph.direction(val) ? '+' : '-') + it->second;
... ...
@@ -463,5 +463,7 @@
463 463
    DigraphWriter(const Digraph& digraph, const std::string& fn)
464 464
      : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
465
        _skip_nodes(false), _skip_arcs(false) {}
465
        _skip_nodes(false), _skip_arcs(false) {
466
      if (!(*_os)) throw IoError("Cannot write file", fn);
467
    }
466 468

	
467 469
    /// \brief Constructor
... ...
@@ -471,5 +473,7 @@
471 473
    DigraphWriter(const Digraph& digraph, const char* fn)
472 474
      : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
473
        _skip_nodes(false), _skip_arcs(false) {}
475
        _skip_nodes(false), _skip_arcs(false) {
476
      if (!(*_os)) throw IoError("Cannot write file", fn);
477
    }
474 478

	
475 479
    /// \brief Destructor
... ...
@@ -1020,5 +1024,7 @@
1020 1024
    GraphWriter(const Graph& graph, const std::string& fn)
1021 1025
      : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph),
1022
        _skip_nodes(false), _skip_edges(false) {}
1026
        _skip_nodes(false), _skip_edges(false) {
1027
      if (!(*_os)) throw IoError("Cannot write file", fn);
1028
    }
1023 1029

	
1024 1030
    /// \brief Constructor
... ...
@@ -1028,5 +1034,7 @@
1028 1034
    GraphWriter(const Graph& graph, const char* fn)
1029 1035
      : _os(new std::ofstream(fn)), local_os(true), _graph(graph),
1030
        _skip_nodes(false), _skip_edges(false) {}
1036
        _skip_nodes(false), _skip_edges(false) {
1037
      if (!(*_os)) throw IoError("Cannot write file", fn);
1038
    }
1031 1039

	
1032 1040
    /// \brief Destructor
... ...
@@ -1579,5 +1587,7 @@
1579 1587
    /// Construct a section writer, which writes into the given file.
1580 1588
    SectionWriter(const std::string& fn)
1581
      : _os(new std::ofstream(fn.c_str())), local_os(true) {}
1589
      : _os(new std::ofstream(fn.c_str())), local_os(true) {
1590
      if (!(*_os)) throw IoError("Cannot write file", fn);
1591
    }
1582 1592

	
1583 1593
    /// \brief Constructor
... ...
@@ -1585,5 +1595,7 @@
1585 1595
    /// Construct a section writer, which writes into the given file.
1586 1596
    SectionWriter(const char* fn)
1587
      : _os(new std::ofstream(fn)), local_os(true) {}
1597
      : _os(new std::ofstream(fn)), local_os(true) {
1598
      if (!(*_os)) throw IoError("Cannot write file", fn);
1599
    }
1588 1600

	
1589 1601
    /// \brief Destructor
0 comments (0 inline)