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 |
//---------------------------------------------------------------------------------
|