author | Michael Krelin <hacker@klever.net> | 2006-12-06 17:16:12 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2006-12-06 17:16:12 (UTC) |
commit | 480c890f78b9fcf46e006ece0eab01f946ef6f59 (patch) (unidiff) | |
tree | 2b80ff7d1f1facce1dfe08983dea95e92e81a9aa | |
parent | a22cf56603ca89efb73429fd3797a775ca908cff (diff) | |
download | sitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.zip sitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.tar.gz sitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.tar.bz2 |
fixes to exception_dev component
-rw-r--r-- | components/exception_dev | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/components/exception_dev b/components/exception_dev index d62f462..49b7f45 100644 --- a/components/exception_dev +++ b/components/exception_dev | |||
@@ -1,155 +1,155 @@ | |||
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/util.h> |
14 | #include <konforka/exception.h> | 14 | #include <konforka/exception.h> |
15 | </%impl> | 15 | </%impl> |
16 | %%var string message; | 16 | %%var string message; |
17 | %%var string root_source; | 17 | %%var string root_source; |
18 | %%var string root_intermediate; | 18 | %%var string root_intermediate; |
19 | %%var string root_so; | 19 | %%var string root_so; |
20 | %%var string component; | 20 | %%var string component; |
21 | %%var int line_number = -1; | 21 | %%var int line_number = -1; |
22 | %%var const exception* exception_caught; | 22 | %%var const exception* exception_caught; |
23 | <%code> | 23 | <%code> |
24 | __SCIF->headers.clear(); | 24 | __SCIF->headers.clear(); |
25 | __SCIF->out->seekp(0); | 25 | __SCIF->out->seekp(0); |
26 | int magic = _magic; | 26 | int magic = _magic; |
27 | va_list va = _args; | 27 | va_list va; va_copy(va,_args); |
28 | switch(magic) { | 28 | switch(magic) { |
29 | case sitecing::__magic_compile_error: | 29 | case sitecing::__magic_compile_error: |
30 | message = va_arg(va,const char*); | 30 | message = va_arg(va,const char*); |
31 | root_source = va_arg(va,const char*); | 31 | root_source = va_arg(va,const char*); |
32 | root_intermediate = va_arg(va,const char*); | 32 | root_intermediate = va_arg(va,const char*); |
33 | root_so = va_arg(va,const char*); | 33 | root_so = va_arg(va,const char*); |
34 | component = va_arg(va,const char*); | 34 | component = va_arg(va,const char*); |
35 | break; | 35 | break; |
36 | case sitecing::__magic_preprocess_error: | 36 | case sitecing::__magic_preprocess_error: |
37 | message = va_arg(va,const char*); | 37 | message = va_arg(va,const char*); |
38 | root_source = va_arg(va,const char*); | 38 | root_source = va_arg(va,const char*); |
39 | root_intermediate = va_arg(va,const char*); | 39 | root_intermediate = va_arg(va,const char*); |
40 | root_so = va_arg(va,const char*); | 40 | root_so = va_arg(va,const char*); |
41 | component = va_arg(va,const char*); | 41 | component = va_arg(va,const char*); |
42 | line_number = va_arg(va,int); | 42 | line_number = va_arg(va,int); |
43 | break; | 43 | break; |
44 | case sitecing::__magic_generic_exception: | 44 | case sitecing::__magic_generic_exception: |
45 | message = va_arg(va,const char*); | 45 | message = va_arg(va,const char*); |
46 | root_source = va_arg(va,const char*); | 46 | root_source = va_arg(va,const char*); |
47 | root_intermediate = va_arg(va,const char *); | 47 | root_intermediate = va_arg(va,const char *); |
48 | root_so = va_arg(va,const char *); | 48 | root_so = va_arg(va,const char *); |
49 | component = va_arg(va,const char*); | 49 | component = va_arg(va,const char*); |
50 | exception_caught = va_arg(va,const exception*); | 50 | exception_caught = va_arg(va,const exception*); |
51 | break; | 51 | break; |
52 | default: | 52 | default: |
53 | break; | 53 | break; |
54 | } | 54 | } |
55 | </%code> | 55 | </%code> |
56 | <!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"> |
57 | <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"> |
58 | <head> | 58 | <head> |
59 | <title><% message %></title> | 59 | <title><% message %></title> |
60 | <style type="text/css"> | 60 | <style type="text/css"> |
61 | <!-- | 61 | <!-- |
62 | body { | 62 | body { |
63 | font-family: sans-serif; | 63 | font-family: sans-serif; |
64 | font-size: 11pt; | 64 | font-size: 11pt; |
65 | } | 65 | } |
66 | 66 | ||
67 | h1 { | 67 | h1 { |
68 | font-family: serif; | 68 | font-family: serif; |
69 | font-size: 130%; | 69 | font-size: 130%; |
70 | font-weight: bold; | 70 | font-weight: bold; |
71 | text-align: center; | 71 | text-align: center; |
72 | } | 72 | } |
73 | p { | 73 | p { |
74 | text-indent: 2em; | 74 | text-indent: 2em; |
75 | text-align: justify; | 75 | text-align: justify; |
76 | } | 76 | } |
77 | 77 | ||
78 | dl.exception-props { | 78 | dl.exception-props { |
79 | margin: 1ex 1em; | 79 | margin: 1ex 1em; |
80 | padding: 0.5ex; | 80 | padding: 0.5ex; |
81 | border: solid 1px gray; | 81 | border: solid 1px gray; |
82 | background-color: #e0e0e0; | 82 | background-color: #e0e0e0; |
83 | } | 83 | } |
84 | dl.exception-props dt { | 84 | dl.exception-props dt { |
85 | font-weight: bold; | 85 | font-weight: bold; |
86 | color: blue; | 86 | color: blue; |
87 | } | 87 | } |
88 | dl.exception-props dd { | 88 | dl.exception-props dd { |
89 | color: gray; | 89 | color: gray; |
90 | } | 90 | } |
91 | 91 | ||
92 | div.exception-codepoint-report { | 92 | div.exception-codepoint-report { |
93 | border: solid 1px black; | 93 | border: solid 1px black; |
94 | margin: 0.5ex 1em 0.ex 3em; | 94 | margin: 0.5ex 1em 0.ex 3em; |
95 | } | 95 | } |
96 | div.exception-codepoint-report h3 { | 96 | div.exception-codepoint-report h3 { |
97 | display: block; | 97 | display: block; |
98 | color: blue; | 98 | color: blue; |
99 | border-bottom: 3px double black; | 99 | border-bottom: 3px double black; |
100 | padding: 0.3ex; margin: 0px; | 100 | padding: 0.3ex; margin: 0px; |
101 | background: #e0e0e0; | 101 | background: #e0e0e0; |
102 | } | 102 | } |
103 | div.exception-codepoint-report ul { | 103 | div.exception-codepoint-report ul { |
104 | padding: 0px; | 104 | padding: 0px; |
105 | margin: 0px; | 105 | margin: 0px; |
106 | background: #87fdff; | 106 | background: #87fdff; |
107 | font-size: 70%; | 107 | font-size: 70%; |
108 | } | 108 | } |
109 | div.exception-codepoint-report li { | 109 | div.exception-codepoint-report li { |
110 | font-family: monospace; | 110 | font-family: monospace; |
111 | list-style-type: none; | 111 | list-style-type: none; |
112 | white-space: nowrap; | 112 | white-space: nowrap; |
113 | overflow: hidden; | 113 | overflow: hidden; |
114 | } | 114 | } |
115 | div.exception-codepoint-report li.focused { | 115 | div.exception-codepoint-report li.focused { |
116 | color: red; | 116 | color: red; |
117 | border-top: solid 1px red; border-bottom: solid 1px red; | 117 | border-top: solid 1px red; border-bottom: solid 1px red; |
118 | } | 118 | } |
119 | div.exception-codepoint-report li .lineno { | 119 | div.exception-codepoint-report li .lineno { |
120 | padding-right: 0.5ex; | 120 | padding-right: 0.5ex; |
121 | border-right: dotted black 1px; | 121 | border-right: dotted black 1px; |
122 | } | 122 | } |
123 | div.exception-codepoint-report div.what { | 123 | div.exception-codepoint-report div.what { |
124 | border-top: double 3px black; | 124 | border-top: double 3px black; |
125 | padding: 0.5ex 2em; | 125 | padding: 0.5ex 2em; |
126 | font-weight: bold; color: #4040c0; | 126 | font-weight: bold; color: #4040c0; |
127 | overflow: auto; | 127 | overflow: auto; |
128 | } | 128 | } |
129 | div.backtrace div.exception-codepoint-report div.what { | 129 | div.backtrace div.exception-codepoint-report div.what { |
130 | color: gray; | 130 | color: gray; |
131 | } | 131 | } |
132 | 132 | ||
133 | div.exception-compile div.what { | 133 | div.exception-compile div.what { |
134 | font-weight: normal; | 134 | font-weight: normal; |
135 | color: red; | 135 | color: red; |
136 | } | 136 | } |
137 | 137 | ||
138 | div.powered { | 138 | div.powered { |
139 | margin: 2em 0px 0px 50%; | 139 | margin: 2em 0px 0px 50%; |
140 | padding: 1ex 2ex; | 140 | padding: 1ex 2ex; |
141 | text-align: right; | 141 | text-align: right; |
142 | font-family: serif; | 142 | font-family: serif; |
143 | font-size: 140%; | 143 | font-size: 140%; |
144 | font-weight: bold; | 144 | font-weight: bold; |
145 | border-top: solid 2px black; | 145 | border-top: solid 2px black; |
146 | border-left: solid 1px gray; border-right: solid 1px gray; border-bottom: solid 1px gray; | 146 | border-left: solid 1px gray; border-right: solid 1px gray; border-bottom: solid 1px gray; |
147 | background: #c0c0f0; | 147 | background: #c0c0f0; |
148 | } | 148 | } |
149 | --> | 149 | --> |
150 | </style> | 150 | </style> |
151 | % __SCIF->headers["Content-Type"]="text/html; charset=utf-8"; | 151 | % __SCIF->headers["Content-Type"]="text/html; charset=utf-8"; |
152 | % __SCIF->headers["Pragma"]="no-cache"; | 152 | % __SCIF->headers["Pragma"]="no-cache"; |
153 | </head> | 153 | </head> |
154 | <body> | 154 | <body> |
155 | <%code> | 155 | <%code> |
@@ -201,147 +201,148 @@ | |||
201 | % } | 201 | % } |
202 | % if(!ke->_seen.empty()) { | 202 | % if(!ke->_seen.empty()) { |
203 | <h2>seen at:</h2> | 203 | <h2>seen at:</h2> |
204 | <div class="backtrace"> | 204 | <div class="backtrace"> |
205 | % for(list<konforka::code_point>::const_iterator i=ke->_seen.begin();i!=ke->_seen.end();++i) { | 205 | % for(list<konforka::code_point>::const_iterator i=ke->_seen.begin();i!=ke->_seen.end();++i) { |
206 | % if(i->line>=0) { | 206 | % if(i->line>=0) { |
207 | % report_error(i->file,i->line,i->function); | 207 | % report_error(i->file,i->line,i->function); |
208 | % } | 208 | % } |
209 | % } | 209 | % } |
210 | </div> | 210 | </div> |
211 | % } | 211 | % } |
212 | % } | 212 | % } |
213 | </div> | 213 | </div> |
214 | </%method> | 214 | </%method> |
215 | <%method void handle_preprocess_error() %> | 215 | <%method void handle_preprocess_error() %> |
216 | <div class="exception-preprocess"> | 216 | <div class="exception-preprocess"> |
217 | <h1>error preprocessing component '<code><% component %></code>'</h1> | 217 | <h1>error preprocessing component '<code><% component %></code>'</h1> |
218 | % report_error(root_source+component,line_number,message); | 218 | % report_error(root_source+component,line_number,message); |
219 | </div> | 219 | </div> |
220 | </%method> | 220 | </%method> |
221 | <%method void handle_compile_error() %> | 221 | <%method void handle_compile_error() %> |
222 | <div class="exception-compile"> | 222 | <div class="exception-compile"> |
223 | <h1>error compiling component '<code><% component %></code>'</h1> | 223 | <h1>error compiling component '<code><% component %></code>'</h1> |
224 | <%code> | 224 | <%code> |
225 | ifstream err((root_intermediate+component+".stderr").c_str(),ios::in); | 225 | ifstream err((root_intermediate+component+".stderr").c_str(),ios::in); |
226 | if(err.bad()) { | 226 | if(err.bad()) { |
227 | <%output> | 227 | <%output> |
228 | Failed to access compiler output | 228 | Failed to access compiler output |
229 | </%output> | 229 | </%output> |
230 | }else{ | 230 | }else{ |
231 | string cumulative; | 231 | string cumulative; |
232 | string error_file; | 232 | string error_file; |
233 | long error_line = -1; | 233 | long error_line = -1; |
234 | while(!err.eof()) { | 234 | while(!err.eof()) { |
235 | string oef = error_file; | 235 | string oef = error_file; |
236 | long oel = error_line; | 236 | long oel = error_line; |
237 | string line; | 237 | string line; |
238 | getline(err,line); | 238 | getline(err,line); |
239 | if(line[0]!=' ') { | 239 | if(line[0]!=' ') { |
240 | string::size_type c = line.find(':'); | 240 | string::size_type c = line.find(':'); |
241 | if(c!=string::npos) { | 241 | if(c!=string::npos) { |
242 | string fn = line.substr(0,c); | 242 | string fn = line.substr(0,c); |
243 | string::size_type c1 = line.find(':',c+1); | 243 | string::size_type c1 = line.find(':',c+1); |
244 | if(c1!=string::npos) { | 244 | if(c1!=string::npos) { |
245 | string ln = line.substr(c+1,c1-c-1); | 245 | string ln = line.substr(c+1,c1-c-1); |
246 | string::size_type nd = ln.find_first_not_of("0123456789"); | 246 | string::size_type nd = ln.find_first_not_of("0123456789"); |
247 | if(nd==string::npos) { | 247 | if(nd==string::npos) { |
248 | try { | 248 | try { |
249 | error_file = sitecing::strip_prefix(fn,"In file included from "); | 249 | error_file = sitecing::strip_prefix(fn,"In file included from "); |
250 | }catch(sitecing::utility_no_prefix& unp) { | 250 | }catch(sitecing::utility_no_prefix& unp) { |
251 | error_file = fn; | 251 | error_file = fn; |
252 | } | 252 | } |
253 | error_line = strtol(ln.c_str(),0,10); | 253 | error_line = strtol(ln.c_str(),0,10); |
254 | } | 254 | } |
255 | } | 255 | } |
256 | } | 256 | } |
257 | if((oel>0 && !oef.empty()) && (oel!=error_line || oef!=error_file)) { | 257 | if((oel>0 && !oef.empty()) && (oel!=error_line || oef!=error_file)) { |
258 | string ef = "/"+konforka::combine_path(root_source+component,oef); | 258 | string ef = "/"+konforka::combine_path(root_source+component,oef); |
259 | report_error(ef,oel,remove_roots(cumulative)); | 259 | report_error(ef,oel,remove_roots(cumulative)); |
260 | cumulative.clear(); | 260 | cumulative.clear(); |
261 | } | 261 | } |
262 | } | 262 | } |
263 | if(!cumulative.empty()) | 263 | if(!cumulative.empty()) |
264 | cumulative += '\n'; | 264 | cumulative += '\n'; |
265 | cumulative += line; | 265 | cumulative += line; |
266 | } | 266 | } |
267 | if(!(cumulative.empty() || error_file.empty() || error_line<0)) { | 267 | if(!(cumulative.empty() || error_file.empty() || error_line<0)) { |
268 | error_file = "/"+konforka::combine_path(root_source+component,error_file); | 268 | error_file = "/"+konforka::combine_path(root_source+component,error_file); |
269 | report_error(error_file,error_line,remove_roots(cumulative)); | 269 | report_error(error_file,error_line,remove_roots(cumulative)); |
270 | } | 270 | } |
271 | } | 271 | } |
272 | </%code> | 272 | </%code> |
273 | </div> | 273 | </div> |
274 | </%method> | 274 | </%method> |
275 | <%method void handle_unknown_error() %> | 275 | <%method void handle_unknown_error() %> |
276 | <div class="exception-unknown"> | 276 | <div class="exception-unknown"> |
277 | <h1>unknown error</h1> | 277 | <h1>unknown error</h1> |
278 | </div> | 278 | </div> |
279 | </%method> | 279 | </%method> |
280 | <%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) %> |
281 | <div class="exception-codepoint-report"> | 281 | <div class="exception-codepoint-report"> |
282 | <h3><% sitecing::html_escape(strip_roots(file)) %></h3> | 282 | <h3><% sitecing::html_escape(strip_roots(file)) %></h3> |
283 | <%code> | 283 | <%code> |
284 | if(line>=0) { | 284 | if(line>=0) { |
285 | int firstline = line-5, lastline = line+5; | 285 | int firstline = line-5, lastline = line+5; |
286 | if(firstline<1) | 286 | if(firstline<1) |
287 | firstline = 1; | 287 | firstline = 1; |
288 | ifstream ifs(file.c_str(),ios::in); | 288 | ifstream ifs(file.c_str(),ios::in); |
289 | if(ifs.bad()) { | 289 | if(ifs.bad()) { |
290 | // TODO: | 290 | // TODO: |
291 | }else{ | 291 | }else{ |
292 | for(int l=1;l<firstline && !ifs.eof();l++) { | 292 | for(int l=1;l<firstline && !ifs.eof();l++) { |
293 | ifs.ignore(65536,'\n'); | 293 | ifs.ignore(65536,'\n'); |
294 | } | 294 | } |
295 | if(ifs.eof()) { | 295 | if(ifs.eof()) { |
296 | // TODO: no such line in file | 296 | // TODO: no such line in file |
297 | }else{ | 297 | }else{ |
298 | <%output><ul></%output> | 298 | <%output><ul></%output> |
299 | for(int l=firstline;l<=lastline && !ifs.eof();l++) { | 299 | for(int l=firstline;l<=lastline && !ifs.eof();l++) { |
300 | string str; | 300 | string str; |
301 | getline(ifs,str); | 301 | getline(ifs,str); |
302 | 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')) { |
303 | str.replace(t,1,8-(t%8),' '); | 303 | str.replace(t,1,8-(t%8),' '); |
304 | } | 304 | } |
305 | char tln[16]; | 305 | char tln[16]; |
306 | snprintf(tln,sizeof(tln),"%5d",l); | 306 | snprintf(tln,sizeof(tln),"%5d",l); |
307 | <%output> | 307 | <%output> |
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 | <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> |
309 | </%output> | 309 | </%output> |
310 | } | 310 | } |
311 | <%output></ul></%output> | 311 | <%output></ul></%output> |
312 | } | 312 | } |
313 | } | 313 | } |
314 | } | 314 | } |
315 | </%code> | 315 | </%code> |
316 | <div class="what"> | 316 | <div class="what"> |
317 | <% sitecing::html_escape(message,sitecing::html_escape_br) %> | 317 | <% sitecing::html_escape(message,sitecing::html_escape_br) %> |
318 | </div> | 318 | </div> |
319 | </div> | 319 | </div> |
320 | </%method> | 320 | </%method> |
321 | <%codemethod string strip_roots(const string& filename) %> | 321 | <%codemethod string strip_roots(const string& filename) %> |
322 | string np = konforka::normalize_path(filename); | 322 | string np = konforka::normalize_path(filename); |
323 | try{ | 323 | try{ |
324 | return sitecing::strip_prefix(np,root_source); | 324 | return sitecing::strip_prefix(np,root_source); |
325 | }catch(sitecing::utility_no_prefix& e){ } | 325 | }catch(sitecing::utility_no_prefix& e){ } |
326 | try{ | 326 | try{ |
327 | return sitecing::strip_prefix(np,root_intermediate); | 327 | return sitecing::strip_prefix(np,root_intermediate); |
328 | }catch(sitecing::utility_no_prefix& e){ } | 328 | }catch(sitecing::utility_no_prefix& e){ } |
329 | return np; | ||
329 | </%codemethod> | 330 | </%codemethod> |
330 | <%codemethod string remove_roots(const string& str) %> | 331 | <%codemethod string remove_roots(const string& str) %> |
331 | string rv = str; | 332 | string rv = str; |
332 | string::size_type rp; | 333 | string::size_type rp; |
333 | string::size_type rl = root_source.length(); | 334 | string::size_type rl = root_source.length(); |
334 | while((rp=rv.find(root_source))!=string::npos) { | 335 | while((rp=rv.find(root_source))!=string::npos) { |
335 | rv.erase(rp,rl); | 336 | rv.erase(rp,rl); |
336 | } | 337 | } |
337 | rl = root_intermediate.length(); | 338 | rl = root_intermediate.length(); |
338 | while((rp=rv.find(root_intermediate))!=string::npos) { | 339 | while((rp=rv.find(root_intermediate))!=string::npos) { |
339 | rv.erase(rp,rl); | 340 | rv.erase(rp,rl); |
340 | } | 341 | } |
341 | rl = root_so.length(); | 342 | rl = root_so.length(); |
342 | while((rp=rv.find(root_so))!=string::npos) { | 343 | while((rp=rv.find(root_so))!=string::npos) { |
343 | rv.erase(rp,rl); | 344 | rv.erase(rp,rl); |
344 | } | 345 | } |
345 | return rv; | 346 | return rv; |
346 | </%codemethod> | 347 | </%codemethod> |
347 | % /* vim:set ft=sitecing: */ | 348 | % /* vim:set ft=sitecing: */ |