Subversion Repositories spk

Rev

Rev 114 | Go to most recent revision | Details | 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.",
14
	"Unknown Point header (tag).",
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"
23
 
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
38
bool bob_dom_string::load(bob_dom_ibinaryfilestream& is, int startHeader, int endHeader)
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
 
58
bool bob_dom_string::load(unsigned char *data, size_t size, int startHeader, int endHeader)
59
{
60
	if ( data[0] != startHeader )
61
		return false;
62
 
63
	size_t pos = 0;
64
	while ( pos < size && data[pos] != '\n' );
65
	m_text = new char[pos];
66
	memcpy(m_text, data, pos);
67
 
68
	if ( data[pos] != endHeader )
69
		return false;
70
 
71
	return true;
72
}
73
 
74
//---------------------------------------------------------------------------------
75
bool bob_dom_string::toFile(bob_dom_obinaryfilestream& os, int begin, int end)
76
{
77
	if(m_text && *m_text!=0)
78
		os << begin << m_text << end;
79
 
80
	return os.good();
81
}
82
//---------------------------------------------------------------------------------
83
// INFO
84
bool bob_dom_info::toFile(bob_dom_otextfilestream& os)
85
{
86
	if(m_text && *m_text!=0)
87
		os << noSemicolons << "/# " << m_text << endl;
88
	return os.good();
89
}
90
//---------------------------------------------------------------------------------
91
// BOB_WITH_ERRORS - object
92
void bob_with_errors::verror(bob_error_severity severity, bob_error_codes code, const char *format, va_list ap)
93
{
94
	bob_error *e=new bob_error();
95
	_vsnprintf(e->text, sizeof(e->text), format, ap);
96
	e->code=code;
97
	e->severity=severity;
98
	errors.push_back(e);
99
}
100
//---------------------------------------------------------------------------------
101
void bob_with_errors::error(bob_error_severity severity, bob_error_codes code)
102
{
103
	error(severity, code, "%s", bob_traslate_error(code));
104
}
105
//---------------------------------------------------------------------------------
106
void bob_with_errors::error(bob_error_codes code)
107
{
108
	error(s_error, code);
109
}
110
//---------------------------------------------------------------------------------
111
void bob_with_errors::error(bob_error_severity severity, bob_error_codes code, const char *format, ...)
112
{
113
	va_list ap;
114
	va_start(ap, format);
115
	verror(severity, code, format, ap);
116
	va_end(ap);
117
}
118
//---------------------------------------------------------------------------------
119
void bob_with_errors::error(bob_error_codes code, const char *format, ...)
120
{
121
	va_list ap;
122
	va_start(ap, format);
123
	verror(s_error, code, format, ap);
124
	va_end(ap);
125
}
126
//---------------------------------------------------------------------------------
127
int peek(bob_dom_ibinaryfilestream& is)
128
{
129
	int i;
130
	is >> i;
131
	is.advance(-(int)sizeof(int));
132
	return i;
133
}
134
//---------------------------------------------------------------------------------
135
// DOCUMENT
136
bool bob_dom_document::fromFile(bob_dom_ibinaryfilestream& is)
137
{
138
	bool bRes=false;
139
	bob_with_errors *e=0;
140
	char *name="";
141
 
142
	clearErrors();
143
 
144
	switch(peek(is)){
145
		case bob_dom_bob::hdr_begin:
146
			bob=new bob_dom_bob(settings);
147
			e=bob;
148
			name="bob";
149
			bRes=bob->load(is);
150
			break;
151
		case bob_dom_cut::hdr_begin:
152
			cut=new bob_dom_cut(settings);
153
			e=cut;
154
			name="cut";
155
			bRes=cut->load(is);
156
			break;
157
		default:
158
			error(F_BOBLoader, S_Error, E_BadHeader, "Bad document header.");
159
	}
160
 
161
	if(e){
162
		for(bob_with_errors::ErrorIterator &it=e->errors.begin(); it!=e->errors.end(); ++it){
163
			bob_error(it->severity, it->code, "%s->%s", name, it->text);
164
		}
165
	}
166
	return bRes;
167
}
168
//---------------------------------------------------------------------------------
169
#include <time.h>
170
bool bob_dom_document::convert(bob_dom_ibinaryfilestream& is, bob_dom_otextfilestream& os)
171
{
172
	bool bRes=false;
173
	bob_with_errors *e=0;
174
	char *pszTime;
175
	char *name="";
176
 
177
	time_t tm=time(0);
178
	pszTime=ctime(&tm);
179
	pszTime[strlen(pszTime)-1]=0;
180
 
181
	clearErrors();
182
 
183
	os << "// Converted with x2bc from \"" << is.name() << "\" at " << pszTime << endl;
184
	if(settings->convert()==false)
185
		os << "// Raw mode - values are not converted" << endl;
186
	os << endl;
187
 
188
	switch(peek(is)){
189
		case bob_dom_bob::hdr_begin:
190
			bob=new bob_dom_bob(settings);
191
			e=bob;
192
			name="bob";
193
			bRes=bob->load(is);
194
			if(bRes) bRes=bob->toFile(os);
195
			break;
196
		case bob_dom_cut::hdr_begin:
197
			cut=new bob_dom_cut(settings);
198
			e=cut;
199
			name="cut";
200
			bRes=cut->convert(is, os);
201
			break;
202
		default:
203
			error(F_BOBLoader, S_Error, E_BadHeader, "Bad document header.");
204
	}
205
 
206
	if(e){
207
		for(bob_with_errors::ErrorIterator &it=e->errors.begin(); it!=e->errors.end(); ++it){
208
			bob_error(it->severity, it->code, "%s->%s", name, it->text);
209
		}
210
	}
211
	return bRes;
212
}
213
//---------------------------------------------------------------------------------
214
bool bob_dom_document::toFile(bob_dom_obinaryfilestream& os)
215
{
216
	if(bob)
217
		bob->toFile(os);
218
 
219
	else if(cut)
220
		cut->toFile(os);
221
 
222
	return os.good();
223
}
224
//---------------------------------------------------------------------------------
225
bool bob_dom_document::toFile(bob_dom_otextfilestream& os)
226
{
227
	os << noSemicolons << "// Converted with x2bc" << endl;
228
	if(settings->convert()==false)
229
		os << "// Raw mode - values are not converted" << endl;
230
	os << endl;
231
 
232
	if(bob)
233
		bob->toFile(os);
234
 
235
	else if(cut)
236
		cut->toFile(os);
237
 
238
	return os.good();
239
}
240
//---------------------------------------------------------------------------------
241
void bob_dom_document::error(ErrorFacility facility, ErrorSeverity severity, ErrorCode code, const char *format, ...)
242
{
243
	va_list ap;
244
	va_start(ap, format);
245
	verror(facility, severity, code, format, ap);
246
	va_end(ap);
247
}
248
//---------------------------------------------------------------------------------
249
void bob_dom_document::verror(ErrorFacility facility, ErrorSeverity severity, ErrorCode code, const char *format, va_list ap)
250
{
251
	Error *e=new Error();
252
 
253
	e->makeCode(facility, severity, code);
254
	_vsnprintf(e->text, sizeof(e->text), format, ap);
255
	errors.push_back(e);
256
}
257
//---------------------------------------------------------------------------------
258
void bob_dom_document::bob_error(bob_error_severity severity, bob_error_codes code, const char *format, ...)
259
{
260
	va_list ap;
261
	va_start(ap, format);
262
	vbob_error(severity, code, format, ap);
263
	va_end(ap);
264
}
265
//---------------------------------------------------------------------------------
266
void bob_dom_document::vbob_error(bob_error_severity severity, bob_error_codes code, const char *format, va_list ap)
267
{
268
	ErrorCode c;
269
	ErrorSeverity s;
270
	ErrorFacility f=F_BOBLoader;
271
	switch(code) {
272
		case e_badEndHeader:
273
			c=E_BadEndHeader;
274
			break;
275
		case e_badHeader:
276
			c=E_BadHeader;
277
			break;
278
		case e_moreData:
279
			c=E_MoreData;
280
			break;
281
		case e_noError:
282
			c=E_NoError;
283
			s=BOB_OK;
284
			break;
285
		case e_format_noStatFormat:
286
			c=E_NoStatFormat;
287
			f=F_StatLoader;
288
			break;
289
		case e_format_notEnoughData:
290
			c=E_NotEnoughData;
291
			f=F_StatLoader;
292
			break;
293
		case e_format_UserWarning:
294
			c=E_FormatUserWarning;
295
			s=S_Warning;
296
			f=F_StatLoader;
297
			break;
298
		case e_notEnoughData:
299
			c=E_NotEnoughData;
300
			break;
301
		case e_unkPointHeader:
302
			c=E_UnkPointHeader;
303
			break;
304
		case e_pointNotFound:
305
			c=E_PointNotFound;
306
			break;
307
		case e_badVersion:
308
			c=E_BadVersion;
309
			break;
310
		case e_error: // nobreak
311
		default:
312
			c=E_Error;
313
	}
314
	s=(severity==s_warning ? S_Warning : S_Error);
315
	verror(f, s, c, format, ap);
316
}
317
//---------------------------------------------------------------------------------