summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2006-12-06 17:16:12 (UTC)
committer Michael Krelin <hacker@klever.net>2006-12-06 17:16:12 (UTC)
commit480c890f78b9fcf46e006ece0eab01f946ef6f59 (patch) (unidiff)
tree2b80ff7d1f1facce1dfe08983dea95e92e81a9aa
parenta22cf56603ca89efb73429fd3797a775ca908cff (diff)
downloadsitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.zip
sitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.tar.gz
sitecing-480c890f78b9fcf46e006ece0eab01f946ef6f59.tar.bz2
fixes to exception_dev component
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--components/exception_dev3
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>&nbsp;<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>&nbsp;<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: */