Subversion Repositories spk

Rev

Rev 114 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#include "bob_dom.h"
2
 
3
#include "../common/indian.h"
4
 
5
#include <stdio.h>
6
 
7
//---------------------------------------------------------------------------------
8
static char * bob_errors[]= {
9
	"No error.",
10
	"Bad header.",
11
	"Bad ending header.",
12
	"Not enough data.",
13
	"More data than expected.",
114 cycrow 14
	"Unknown Point flags.",
1 cycrow 15
	"General error.",
16
	"No STAT format available.",
17
	"Not enough data to match STAT format.",
18
	"Format marked with warning sign was used.",
19
	"Point not found in section POIN.",
20
	"Invalid version",
21
	"Unsupported bits set in frame flags",
22
	"Unknown material6 value type"
114 cycrow 23
 
1 cycrow 24
	// don forget to increase bob_error_count below!
25
};
26
 
27
#define bob_error_count 14
28
 
29
const char* bob_traslate_error(bob_error_codes code)
30
{
31
	if(code >= 0 && code < bob_error_count)
32
		return bob_errors[code];
33
	else
34
		return bob_errors[e_error];
35
}
36
//---------------------------------------------------------------------------------
37
// STRING - object
114 cycrow 38
bool bob_string::load(ibinaryfilestream& is, int startHeader, int endHeader)
1 cycrow 39
{
40
	int hdr;
41
	is >> hdr;
42
	if(hdr!=startHeader){
43
		error(e_badHeader);
44
		return false;
45
	}
46
	delete m_text;
47
	is >> m_text;
48
	if(m_text==0){
49
		error(e_notEnoughData);
50
		return false;
51
	}
52
	is >> hdr;
53
	if(hdr!=endHeader)
54
		error(e_badEndHeader);
55
	return hdr==endHeader;
56
}
57
//---------------------------------------------------------------------------------
114 cycrow 58
bool bob_string::toFile(obinaryfilestream& os, int begin, int end)
1 cycrow 59
{
60
	if(m_text && *m_text!=0)
61
		os << begin << m_text << end;
114 cycrow 62
 
1 cycrow 63
	return os.good();
64
}
65
//---------------------------------------------------------------------------------
66
// INFO
114 cycrow 67
bool bob_info::toFile(otextfilestream& os)
1 cycrow 68
{
69
	if(m_text && *m_text!=0)
70
		os << noSemicolons << "/# " << m_text << endl;
71
	return os.good();
72
}
73
//---------------------------------------------------------------------------------
74
// BOB_WITH_ERRORS - object
75
void bob_with_errors::verror(bob_error_severity severity, bob_error_codes code, const char *format, va_list ap)
76
{
77
	bob_error *e=new bob_error();
78
	_vsnprintf(e->text, sizeof(e->text), format, ap);
79
	e->code=code;
80
	e->severity=severity;
81
	errors.push_back(e);
82
}
83
//---------------------------------------------------------------------------------
84
void bob_with_errors::error(bob_error_severity severity, bob_error_codes code)
85
{
86
	error(severity, code, "%s", bob_traslate_error(code));
87
}
88
//---------------------------------------------------------------------------------
89
void bob_with_errors::error(bob_error_codes code)
90
{
91
	error(s_error, code);
92
}
93
//---------------------------------------------------------------------------------
94
void bob_with_errors::error(bob_error_severity severity, bob_error_codes code, const char *format, ...)
95
{
96
	va_list ap;
97
	va_start(ap, format);
98
	verror(severity, code, format, ap);
99
	va_end(ap);
100
}
101
//---------------------------------------------------------------------------------
102
void bob_with_errors::error(bob_error_codes code, const char *format, ...)
103
{
104
	va_list ap;
105
	va_start(ap, format);
106
	verror(s_error, code, format, ap);
107
	va_end(ap);
108
}
109
//---------------------------------------------------------------------------------
114 cycrow 110
int peek(ibinaryfilestream& is)
1 cycrow 111
{
112
	int i;
113
	is >> i;
114
	is.advance(-(int)sizeof(int));
115
	return i;
116
}
117
//---------------------------------------------------------------------------------
118
// DOCUMENT
114 cycrow 119
bool bob_dom_document::fromFile(ibinaryfilestream& is)
1 cycrow 120
{
121
	bool bRes=false;
122
	bob_with_errors *e=0;
123
	char *name="";
124
 
125
	clearErrors();
114 cycrow 126
 
1 cycrow 127
	switch(peek(is)){
114 cycrow 128
		case bob_dom_bob::HDR_BEGIN:
1 cycrow 129
			bob=new bob_dom_bob(settings);
130
			e=bob;
131
			name="bob";
132
			bRes=bob->load(is);
133
			break;
114 cycrow 134
		case bob_dom_cut::HDR_BEGIN:
1 cycrow 135
			cut=new bob_dom_cut(settings);
136
			e=cut;
137
			name="cut";
138
			bRes=cut->load(is);
139
			break;
140
		default:
141
			error(F_BOBLoader, S_Error, E_BadHeader, "Bad document header.");
142
	}
143
 
144
	if(e){
145
		for(bob_with_errors::ErrorIterator &it=e->errors.begin(); it!=e->errors.end(); ++it){
146
			bob_error(it->severity, it->code, "%s->%s", name, it->text);
147
		}
148
	}
149
	return bRes;
150
}
151
//---------------------------------------------------------------------------------
152
#include <time.h>
114 cycrow 153
bool bob_dom_document::convert(ibinaryfilestream& is, otextfilestream& os)
1 cycrow 154
{
155
	bool bRes=false;
156
	bob_with_errors *e=0;
157
	char *pszTime;
158
	char *name="";
114 cycrow 159
 
1 cycrow 160
	time_t tm=time(0);
161
	pszTime=ctime(&tm);
162
	pszTime[strlen(pszTime)-1]=0;
114 cycrow 163
 
1 cycrow 164
	clearErrors();
114 cycrow 165
 
1 cycrow 166
	os << "// Converted with x2bc from \"" << is.name() << "\" at " << pszTime << endl;
114 cycrow 167
	if(settings->rawMode())
1 cycrow 168
		os << "// Raw mode - values are not converted" << endl;
169
	os << endl;
114 cycrow 170
 
1 cycrow 171
	switch(peek(is)){
114 cycrow 172
		case bob_dom_bob::HDR_BEGIN:
1 cycrow 173
			bob=new bob_dom_bob(settings);
174
			e=bob;
175
			name="bob";
176
			bRes=bob->load(is);
177
			if(bRes) bRes=bob->toFile(os);
178
			break;
114 cycrow 179
		case bob_dom_cut::HDR_BEGIN:
1 cycrow 180
			cut=new bob_dom_cut(settings);
181
			e=cut;
182
			name="cut";
183
			bRes=cut->convert(is, os);
184
			break;
185
		default:
186
			error(F_BOBLoader, S_Error, E_BadHeader, "Bad document header.");
187
	}
188
 
189
	if(e){
190
		for(bob_with_errors::ErrorIterator &it=e->errors.begin(); it!=e->errors.end(); ++it){
191
			bob_error(it->severity, it->code, "%s->%s", name, it->text);
192
		}
193
	}
194
	return bRes;
195
}
196
//---------------------------------------------------------------------------------
114 cycrow 197
bool bob_dom_document::toFile(obinaryfilestream& os)
1 cycrow 198
{
199
	if(bob)
200
		bob->toFile(os);
114 cycrow 201
 
1 cycrow 202
	else if(cut)
203
		cut->toFile(os);
114 cycrow 204
 
1 cycrow 205
	return os.good();
206
}
207
//---------------------------------------------------------------------------------
114 cycrow 208
bool bob_dom_document::toFile(otextfilestream& os)
1 cycrow 209
{
210
	os << noSemicolons << "// Converted with x2bc" << endl;
114 cycrow 211
	if(settings->rawMode())
1 cycrow 212
		os << "// Raw mode - values are not converted" << endl;
213
	os << endl;
114 cycrow 214
 
1 cycrow 215
	if(bob)
216
		bob->toFile(os);
114 cycrow 217
 
1 cycrow 218
	else if(cut)
219
		cut->toFile(os);
114 cycrow 220
 
1 cycrow 221
	return os.good();
222
}
223
//---------------------------------------------------------------------------------
224
void bob_dom_document::error(ErrorFacility facility, ErrorSeverity severity, ErrorCode code, const char *format, ...)
225
{
226
	va_list ap;
227
	va_start(ap, format);
228
	verror(facility, severity, code, format, ap);
229
	va_end(ap);
230
}
231
//---------------------------------------------------------------------------------
232
void bob_dom_document::verror(ErrorFacility facility, ErrorSeverity severity, ErrorCode code, const char *format, va_list ap)
233
{
234
	Error *e=new Error();
114 cycrow 235
 
1 cycrow 236
	e->makeCode(facility, severity, code);
237
	_vsnprintf(e->text, sizeof(e->text), format, ap);
238
	errors.push_back(e);
239
}
240
//---------------------------------------------------------------------------------
241
void bob_dom_document::bob_error(bob_error_severity severity, bob_error_codes code, const char *format, ...)
242
{
243
	va_list ap;
244
	va_start(ap, format);
245
	vbob_error(severity, code, format, ap);
246
	va_end(ap);
247
}
248
//---------------------------------------------------------------------------------
249
void bob_dom_document::vbob_error(bob_error_severity severity, bob_error_codes code, const char *format, va_list ap)
250
{
251
	ErrorCode c;
252
	ErrorSeverity s;
253
	ErrorFacility f=F_BOBLoader;
254
	switch(code) {
255
		case e_badEndHeader:
256
			c=E_BadEndHeader;
257
			break;
258
		case e_badHeader:
259
			c=E_BadHeader;
260
			break;
261
		case e_moreData:
262
			c=E_MoreData;
263
			break;
264
		case e_noError:
265
			c=E_NoError;
283 cycrow 266
			s=_S_OK;
1 cycrow 267
			break;
268
		case e_format_noStatFormat:
269
			c=E_NoStatFormat;
270
			f=F_StatLoader;
271
			break;
272
		case e_format_notEnoughData:
273
			c=E_NotEnoughData;
274
			f=F_StatLoader;
275
			break;
276
		case e_format_UserWarning:
277
			c=E_FormatUserWarning;
278
			s=S_Warning;
279
			f=F_StatLoader;
280
			break;
281
		case e_notEnoughData:
282
			c=E_NotEnoughData;
283
			break;
114 cycrow 284
		case e_unkPointFlags:
285
			c=E_UnkPointFlags;
1 cycrow 286
			break;
287
		case e_pointNotFound:
288
			c=E_PointNotFound;
289
			break;
290
		case e_badVersion:
291
			c=E_BadVersion;
292
			break;
293
		case e_error: // nobreak
294
		default:
295
			c=E_Error;
296
	}
297
	s=(severity==s_warning ? S_Warning : S_Error);
298
	verror(f, s, c, format, ap);
299
}
300
//---------------------------------------------------------------------------------