-rw-r--r-- | components/exception_dev | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/components/exception_dev b/components/exception_dev index d8c84e1..d62f462 100644 --- a/components/exception_dev +++ b/components/exception_dev | |||
@@ -1,60 +1,61 @@ | |||
1 | %%decl using namespace std; | 1 | %%decl using namespace std; |
2 | <%impl> | 2 | <%impl> |
3 | #include <iostream> | 3 | #include <iostream> |
4 | #include <fstream> | 4 | #include <fstream> |
5 | #include <sstream> | 5 | #include <sstream> |
6 | #include <cassert> | 6 | #include <cassert> |
7 | #include <cstdarg> | 7 | #include <cstdarg> |
8 | #include <stdexcept> | 8 | #include <stdexcept> |
9 | #include <cxxabi.h> | 9 | #include <cxxabi.h> |
10 | #include <sitecing/sitecing_util.h> | 10 | #include <sitecing/sitecing_util.h> |
11 | #include <sitecing/util.h> | 11 | #include <sitecing/util.h> |
12 | #include <sitecing/magic.h> | 12 | #include <sitecing/magic.h> |
13 | #include <konforka/util.h> | ||
13 | #include <konforka/exception.h> | 14 | #include <konforka/exception.h> |
14 | </%impl> | 15 | </%impl> |
15 | %%var string message; | 16 | %%var string message; |
16 | %%var string root_source; | 17 | %%var string root_source; |
17 | %%var string root_intermediate; | 18 | %%var string root_intermediate; |
18 | %%var string root_so; | 19 | %%var string root_so; |
19 | %%var string component; | 20 | %%var string component; |
20 | %%var int line_number = -1; | 21 | %%var int line_number = -1; |
21 | %%var const exception* exception_caught; | 22 | %%var const exception* exception_caught; |
22 | <%code> | 23 | <%code> |
23 | __SCIF->headers.clear(); | 24 | __SCIF->headers.clear(); |
24 | __SCIF->out->seekp(0); | 25 | __SCIF->out->seekp(0); |
25 | int magic = _magic; | 26 | int magic = _magic; |
26 | va_list va = _args; | 27 | va_list va = _args; |
27 | switch(magic) { | 28 | switch(magic) { |
28 | case sitecing::__magic_compile_error: | 29 | case sitecing::__magic_compile_error: |
29 | message = va_arg(va,const char*); | 30 | message = va_arg(va,const char*); |
30 | root_source = va_arg(va,const char*); | 31 | root_source = va_arg(va,const char*); |
31 | root_intermediate = va_arg(va,const char*); | 32 | root_intermediate = va_arg(va,const char*); |
32 | root_so = va_arg(va,const char*); | 33 | root_so = va_arg(va,const char*); |
33 | component = va_arg(va,const char*); | 34 | component = va_arg(va,const char*); |
34 | break; | 35 | break; |
35 | case sitecing::__magic_preprocess_error: | 36 | case sitecing::__magic_preprocess_error: |
36 | message = va_arg(va,const char*); | 37 | message = va_arg(va,const char*); |
37 | root_source = va_arg(va,const char*); | 38 | root_source = va_arg(va,const char*); |
38 | root_intermediate = va_arg(va,const char*); | 39 | root_intermediate = va_arg(va,const char*); |
39 | root_so = va_arg(va,const char*); | 40 | root_so = va_arg(va,const char*); |
40 | component = va_arg(va,const char*); | 41 | component = va_arg(va,const char*); |
41 | line_number = va_arg(va,int); | 42 | line_number = va_arg(va,int); |
42 | break; | 43 | break; |
43 | case sitecing::__magic_generic_exception: | 44 | case sitecing::__magic_generic_exception: |
44 | message = va_arg(va,const char*); | 45 | message = va_arg(va,const char*); |
45 | root_source = va_arg(va,const char*); | 46 | root_source = va_arg(va,const char*); |
46 | root_intermediate = va_arg(va,const char *); | 47 | root_intermediate = va_arg(va,const char *); |
47 | root_so = va_arg(va,const char *); | 48 | root_so = va_arg(va,const char *); |
48 | component = va_arg(va,const char*); | 49 | component = va_arg(va,const char*); |
49 | exception_caught = va_arg(va,const exception*); | 50 | exception_caught = va_arg(va,const exception*); |
50 | break; | 51 | break; |
51 | default: | 52 | default: |
52 | break; | 53 | break; |
53 | } | 54 | } |
54 | </%code> | 55 | </%code> |
55 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | 56 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
56 | <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> | 57 | <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> |
57 | <head> | 58 | <head> |
58 | <title><% message %></title> | 59 | <title><% message %></title> |
59 | <style type="text/css"> | 60 | <style type="text/css"> |
60 | <!-- | 61 | <!-- |
@@ -209,138 +210,138 @@ | |||
209 | </div> | 210 | </div> |
210 | % } | 211 | % } |
211 | % } | 212 | % } |
212 | </div> | 213 | </div> |
213 | </%method> | 214 | </%method> |
214 | <%method void handle_preprocess_error() %> | 215 | <%method void handle_preprocess_error() %> |
215 | <div class="exception-preprocess"> | 216 | <div class="exception-preprocess"> |
216 | <h1>error preprocessing component '<code><% component %></code>'</h1> | 217 | <h1>error preprocessing component '<code><% component %></code>'</h1> |
217 | % report_error(root_source+component,line_number,message); | 218 | % report_error(root_source+component,line_number,message); |
218 | </div> | 219 | </div> |
219 | </%method> | 220 | </%method> |
220 | <%method void handle_compile_error() %> | 221 | <%method void handle_compile_error() %> |
221 | <div class="exception-compile"> | 222 | <div class="exception-compile"> |
222 | <h1>error compiling component '<code><% component %></code>'</h1> | 223 | <h1>error compiling component '<code><% component %></code>'</h1> |
223 | <%code> | 224 | <%code> |
224 | ifstream err((root_intermediate+component+".stderr").c_str(),ios::in); | 225 | ifstream err((root_intermediate+component+".stderr").c_str(),ios::in); |
225 | if(err.bad()) { | 226 | if(err.bad()) { |
226 | <%output> | 227 | <%output> |
227 | Failed to access compiler output | 228 | Failed to access compiler output |
228 | </%output> | 229 | </%output> |
229 | }else{ | 230 | }else{ |
230 | string cumulative; | 231 | string cumulative; |
231 | string error_file; | 232 | string error_file; |
232 | long error_line = -1; | 233 | long error_line = -1; |
233 | while(!err.eof()) { | 234 | while(!err.eof()) { |
234 | string oef = error_file; | 235 | string oef = error_file; |
235 | long oel = error_line; | 236 | long oel = error_line; |
236 | string line; | 237 | string line; |
237 | getline(err,line); | 238 | getline(err,line); |
238 | if(line[0]!=' ') { | 239 | if(line[0]!=' ') { |
239 | string::size_type c = line.find(':'); | 240 | string::size_type c = line.find(':'); |
240 | if(c!=string::npos) { | 241 | if(c!=string::npos) { |
241 | string fn = line.substr(0,c); | 242 | string fn = line.substr(0,c); |
242 | string::size_type c1 = line.find(':',c+1); | 243 | string::size_type c1 = line.find(':',c+1); |
243 | if(c1!=string::npos) { | 244 | if(c1!=string::npos) { |
244 | string ln = line.substr(c+1,c1-c-1); | 245 | string ln = line.substr(c+1,c1-c-1); |
245 | string::size_type nd = ln.find_first_not_of("0123456789"); | 246 | string::size_type nd = ln.find_first_not_of("0123456789"); |
246 | if(nd==string::npos) { | 247 | if(nd==string::npos) { |
247 | try { | 248 | try { |
248 | error_file = sitecing::strip_prefix(fn,"In file included from "); | 249 | error_file = sitecing::strip_prefix(fn,"In file included from "); |
249 | }catch(sitecing::utility_no_prefix& unp) { | 250 | }catch(sitecing::utility_no_prefix& unp) { |
250 | error_file = fn; | 251 | error_file = fn; |
251 | } | 252 | } |
252 | error_line = strtol(ln.c_str(),0,10); | 253 | error_line = strtol(ln.c_str(),0,10); |
253 | } | 254 | } |
254 | } | 255 | } |
255 | } | 256 | } |
256 | if((oel>0 && !oef.empty()) && (oel!=error_line || oef!=error_file)) { | 257 | if((oel>0 && !oef.empty()) && (oel!=error_line || oef!=error_file)) { |
257 | string ef = "/"+sitecing::combine_path(root_source+component,oef); | 258 | string ef = "/"+konforka::combine_path(root_source+component,oef); |
258 | report_error(ef,oel,remove_roots(cumulative)); | 259 | report_error(ef,oel,remove_roots(cumulative)); |
259 | cumulative.clear(); | 260 | cumulative.clear(); |
260 | } | 261 | } |
261 | } | 262 | } |
262 | if(!cumulative.empty()) | 263 | if(!cumulative.empty()) |
263 | cumulative += '\n'; | 264 | cumulative += '\n'; |
264 | cumulative += line; | 265 | cumulative += line; |
265 | } | 266 | } |
266 | if(!(cumulative.empty() || error_file.empty() || error_line<0)) { | 267 | if(!(cumulative.empty() || error_file.empty() || error_line<0)) { |
267 | error_file = "/"+sitecing::combine_path(root_source+component,error_file); | 268 | error_file = "/"+konforka::combine_path(root_source+component,error_file); |
268 | report_error(error_file,error_line,remove_roots(cumulative)); | 269 | report_error(error_file,error_line,remove_roots(cumulative)); |
269 | } | 270 | } |
270 | } | 271 | } |
271 | </%code> | 272 | </%code> |
272 | </div> | 273 | </div> |
273 | </%method> | 274 | </%method> |
274 | <%method void handle_unknown_error() %> | 275 | <%method void handle_unknown_error() %> |
275 | <div class="exception-unknown"> | 276 | <div class="exception-unknown"> |
276 | <h1>unknown error</h1> | 277 | <h1>unknown error</h1> |
277 | </div> | 278 | </div> |
278 | </%method> | 279 | </%method> |
279 | <%method void report_error(const string& file,long line,const string& message) %> | 280 | <%method void report_error(const string& file,long line,const string& message) %> |
280 | <div class="exception-codepoint-report"> | 281 | <div class="exception-codepoint-report"> |
281 | <h3><% sitecing::html_escape(strip_roots(file)) %></h3> | 282 | <h3><% sitecing::html_escape(strip_roots(file)) %></h3> |
282 | <%code> | 283 | <%code> |
283 | if(line>=0) { | 284 | if(line>=0) { |
284 | int firstline = line-5, lastline = line+5; | 285 | int firstline = line-5, lastline = line+5; |
285 | if(firstline<1) | 286 | if(firstline<1) |
286 | firstline = 1; | 287 | firstline = 1; |
287 | ifstream ifs(file.c_str(),ios::in); | 288 | ifstream ifs(file.c_str(),ios::in); |
288 | if(ifs.bad()) { | 289 | if(ifs.bad()) { |
289 | // TODO: | 290 | // TODO: |
290 | }else{ | 291 | }else{ |
291 | for(int l=1;l<firstline && !ifs.eof();l++) { | 292 | for(int l=1;l<firstline && !ifs.eof();l++) { |
292 | ifs.ignore(65536,'\n'); | 293 | ifs.ignore(65536,'\n'); |
293 | } | 294 | } |
294 | if(ifs.eof()) { | 295 | if(ifs.eof()) { |
295 | // TODO: no such line in file | 296 | // TODO: no such line in file |
296 | }else{ | 297 | }else{ |
297 | <%output><ul></%output> | 298 | <%output><ul></%output> |
298 | for(int l=firstline;l<=lastline && !ifs.eof();l++) { | 299 | for(int l=firstline;l<=lastline && !ifs.eof();l++) { |
299 | string str; | 300 | string str; |
300 | getline(ifs,str); | 301 | getline(ifs,str); |
301 | for(string::size_type t=str.find('\t');t!=string::npos;t=str.find('\t')) { | 302 | for(string::size_type t=str.find('\t');t!=string::npos;t=str.find('\t')) { |
302 | str.replace(t,1,8-(t%8),' '); | 303 | str.replace(t,1,8-(t%8),' '); |
303 | } | 304 | } |
304 | char tln[16]; | 305 | char tln[16]; |
305 | snprintf(tln,sizeof(tln),"%5d",l); | 306 | snprintf(tln,sizeof(tln),"%5d",l); |
306 | <%output> | 307 | <%output> |
307 | <li class="<% l==line?"focused":"unfocused" %>"><span class="lineno"><% sitecing::html_escape(tln,sitecing::html_escape_nbsp) %></span> <span class="line"><% sitecing::html_escape(str,sitecing::html_escape_nbsp) %></span></li> | 308 | <li class="<% l==line?"focused":"unfocused" %>"><span class="lineno"><% sitecing::html_escape(tln,sitecing::html_escape_nbsp) %></span> <span class="line"><% sitecing::html_escape(str,sitecing::html_escape_nbsp) %></span></li> |
308 | </%output> | 309 | </%output> |
309 | } | 310 | } |
310 | <%output></ul></%output> | 311 | <%output></ul></%output> |
311 | } | 312 | } |
312 | } | 313 | } |
313 | } | 314 | } |
314 | </%code> | 315 | </%code> |
315 | <div class="what"> | 316 | <div class="what"> |
316 | <% sitecing::html_escape(message,sitecing::html_escape_br) %> | 317 | <% sitecing::html_escape(message,sitecing::html_escape_br) %> |
317 | </div> | 318 | </div> |
318 | </div> | 319 | </div> |
319 | </%method> | 320 | </%method> |
320 | <%codemethod string strip_roots(const string& filename) %> | 321 | <%codemethod string strip_roots(const string& filename) %> |
321 | string np = sitecing::normalize_path(filename); | 322 | string np = konforka::normalize_path(filename); |
322 | try{ | 323 | try{ |
323 | return sitecing::strip_prefix(np,root_source); | 324 | return sitecing::strip_prefix(np,root_source); |
324 | }catch(sitecing::utility_no_prefix& e){ } | 325 | }catch(sitecing::utility_no_prefix& e){ } |
325 | try{ | 326 | try{ |
326 | return sitecing::strip_prefix(np,root_intermediate); | 327 | return sitecing::strip_prefix(np,root_intermediate); |
327 | }catch(sitecing::utility_no_prefix& e){ } | 328 | }catch(sitecing::utility_no_prefix& e){ } |
328 | </%codemethod> | 329 | </%codemethod> |
329 | <%codemethod string remove_roots(const string& str) %> | 330 | <%codemethod string remove_roots(const string& str) %> |
330 | string rv = str; | 331 | string rv = str; |
331 | string::size_type rp; | 332 | string::size_type rp; |
332 | string::size_type rl = root_source.length(); | 333 | string::size_type rl = root_source.length(); |
333 | while((rp=rv.find(root_source))!=string::npos) { | 334 | while((rp=rv.find(root_source))!=string::npos) { |
334 | rv.erase(rp,rl); | 335 | rv.erase(rp,rl); |
335 | } | 336 | } |
336 | rl = root_intermediate.length(); | 337 | rl = root_intermediate.length(); |
337 | while((rp=rv.find(root_intermediate))!=string::npos) { | 338 | while((rp=rv.find(root_intermediate))!=string::npos) { |
338 | rv.erase(rp,rl); | 339 | rv.erase(rp,rl); |
339 | } | 340 | } |
340 | rl = root_so.length(); | 341 | rl = root_so.length(); |
341 | while((rp=rv.find(root_so))!=string::npos) { | 342 | while((rp=rv.find(root_so))!=string::npos) { |
342 | rv.erase(rp,rl); | 343 | rv.erase(rp,rl); |
343 | } | 344 | } |
344 | return rv; | 345 | return rv; |
345 | </%codemethod> | 346 | </%codemethod> |
346 | % /* vim:set ft=sitecing: */ | 347 | % /* vim:set ft=sitecing: */ |