summaryrefslogtreecommitdiffabout
path: root/lib/sitecing_enflesher.ll
Unidiff
Diffstat (limited to 'lib/sitecing_enflesher.ll') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/sitecing_enflesher.ll1
1 files changed, 0 insertions, 1 deletions
diff --git a/lib/sitecing_enflesher.ll b/lib/sitecing_enflesher.ll
index bb667be..f833af2 100644
--- a/lib/sitecing_enflesher.ll
+++ b/lib/sitecing_enflesher.ll
@@ -147,114 +147,113 @@ ID [A-Za-z_][A-Za-z0-9_]*
147 outs << ", virtual public " << parser.factory.get_classname(i->path); 147 outs << ", virtual public " << parser.factory.get_classname(i->path);
148 } 148 }
149} 149}
150 \<\%ancestors:typedefs\%\> { 150 \<\%ancestors:typedefs\%\> {
151 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 151 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
152 outs << "typedef class " << parser.factory.get_classname(i->path) << " " << i->name << ";\n"; 152 outs << "typedef class " << parser.factory.get_classname(i->path) << " " << i->name << ";\n";
153 } 153 }
154 anchor_time = true; 154 anchor_time = true;
155} 155}
156 \<\%ancestors:import\%\> { 156 \<\%ancestors:import\%\> {
157 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) { 157 for(sitecing_parser::ancestor_classes_t::const_iterator i=parser.ancestor_classes.begin();i!=parser.ancestor_classes.end();++i) {
158 outs << i->name << "::__do_imports();\n"; 158 outs << i->name << "::__do_imports();\n";
159 } 159 }
160 anchor_time = true; 160 anchor_time = true;
161} 161}
162 162
163 \n { 163 \n {
164 if(anchor_time) 164 if(anchor_time)
165 anchor(); 165 anchor();
166 ECHO; 166 ECHO;
167} 167}
168 . ECHO; 168 . ECHO;
169 169
170%% 170%%
171 171
172void sitecing_enflesher::LexerOutput(const char *buf,int size) { 172void sitecing_enflesher::LexerOutput(const char *buf,int size) {
173 outs.write(buf,size); 173 outs.write(buf,size);
174} 174}
175 175
176void sitecing_enflesher::enflesh() { 176void sitecing_enflesher::enflesh() {
177 ifstream ifs(parser.skeleton.c_str()); 177 ifstream ifs(parser.skeleton.c_str());
178 if(!ifs.good()) 178 if(!ifs.good())
179 throw preprocessor_error(CODEPOINT,"failed to open skeleton file"); 179 throw preprocessor_error(CODEPOINT,"failed to open skeleton file");
180 switch_streams(&ifs,NULL); 180 switch_streams(&ifs,NULL);
181 yylex(); 181 yylex();
182 outs_close(); 182 outs_close();
183} 183}
184 184
185void sitecing_enflesher::anchor() { 185void sitecing_enflesher::anchor() {
186 if(!anchoraged) 186 if(!anchoraged)
187 return; 187 return;
188 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n"; 188 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n";
189 anchor_time = false; 189 anchor_time = false;
190} 190}
191 191
192void sitecing_enflesher::outs_close() { 192void sitecing_enflesher::outs_close() {
193 if(!outs_filename.empty()) { 193 if(!outs_filename.empty()) {
194 outs.flush(); 194 outs.flush();
195 outs.close(); 195 outs.close();
196 outs.clear(); 196 outs.clear();
197 /* 197 /*
198 * compare source and destination files. 198 * compare source and destination files.
199 * 199 *
200 * one can also keep a hash for the old one and compute one for the 200 * one can also keep a hash for the old one and compute one for the
201 * output while writing, but I'm not sure if it's any better. Surely a 201 * output while writing, but I'm not sure if it's any better. Surely a
202 * bit less accurate, unless we're going to compare it in case of 202 * bit less accurate, unless we're going to compare it in case of
203 * difference, anyway. 203 * difference, anyway.
204 */ 204 */
205 bool overwrite = false; 205 bool overwrite = false;
206 struct stat st_s, st_d; 206 struct stat st_s, st_d;
207 string fn_s = outs_filename+".new"; 207 string fn_s = outs_filename+".new";
208 string fn_d = outs_filename; 208 string fn_d = outs_filename;
209 if(stat(fn_d.c_str(),&st_d)) { 209 if(stat(fn_d.c_str(),&st_d)) {
210 overwrite = true; 210 overwrite = true;
211 }else{ 211 }else{
212 if(stat(fn_s.c_str(),&st_s)) 212 if(stat(fn_s.c_str(),&st_s))
213 throw preprocessor_error(CODEPOINT,"failed to stat() supposedly created file"); 213 throw preprocessor_error(CODEPOINT,"failed to stat() supposedly created file");
214 if(st_s.st_size!=st_d.st_size) { 214 if(st_s.st_size!=st_d.st_size) {
215 overwrite = true; 215 overwrite = true;
216 }else{ 216 }else{
217 ifstream i_s(fn_s.c_str(),ios::in); 217 ifstream i_s(fn_s.c_str(),ios::in);
218 if(!i_s) 218 if(!i_s)
219 throw preprocessor_error(CODEPOINT,"failed to open supposedly created file"); 219 throw preprocessor_error(CODEPOINT,"failed to open supposedly created file");
220 ifstream i_d(fn_d.c_str(),ios::in); 220 ifstream i_d(fn_d.c_str(),ios::in);
221 if(!i_d) 221 if(!i_d)
222 throw preprocessor_error(CODEPOINT,"failed to open the old preprocessed source"); 222 throw preprocessor_error(CODEPOINT,"failed to open the old preprocessed source");
223 off_t remaining = st_s.st_size; 223 off_t remaining = st_s.st_size;
224 char t1[2048]; 224 char t1[2048];
225 char t2[sizeof(t1)]; 225 char t2[sizeof(t1)];
226 while(remaining) { 226 while(remaining) {
227 int rb = remaining; 227 int rb = remaining;
228 if(rb>sizeof(t1)) 228 if(rb>sizeof(t1))
229 rb = sizeof(t1); 229 rb = sizeof(t1);
230 if(i_s.read(t1,rb).gcount()!=rb) 230 if(i_s.read(t1,rb).gcount()!=rb)
231 throw preprocessor_error(CODEPOINT,"error reading just created file"); 231 throw preprocessor_error(CODEPOINT,"error reading just created file");
232 if(i_d.read(t2,rb).gcount()!=rb) 232 if(i_d.read(t2,rb).gcount()!=rb)
233 throw preprocessor_error(CODEPOINT,"error reading the old preprocessed source"); 233 throw preprocessor_error(CODEPOINT,"error reading the old preprocessed source");
234 if(memcmp(t1,t2,rb)) { 234 if(memcmp(t1,t2,rb)) {
235 overwrite = true; 235 overwrite = true;
236 break; 236 break;
237 } 237 }
238 remaining -= rb; 238 remaining -= rb;
239 } 239 }
240 } 240 }
241 } 241 }
242 if(overwrite) { 242 if(overwrite) {
243 cerr << "renaming '" << fn_s << "'" << endl;
244 if(rename(fn_s.c_str(),fn_d.c_str())) 243 if(rename(fn_s.c_str(),fn_d.c_str()))
245 throw preprocessor_error(CODEPOINT,"failed to rename() generated output"); 244 throw preprocessor_error(CODEPOINT,"failed to rename() generated output");
246 } 245 }
247 } 246 }
248 outs_filename.erase(); 247 outs_filename.erase();
249} 248}
250 249
251void sitecing_enflesher::outs_open(const string& nfile) { 250void sitecing_enflesher::outs_open(const string& nfile) {
252 outs_close(); 251 outs_close();
253 outs_filename = nfile; 252 outs_filename = nfile;
254 outs.open((nfile+".new").c_str(),ios::trunc); 253 outs.open((nfile+".new").c_str(),ios::trunc);
255 if(!outs.good()) 254 if(!outs.good())
256 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output"); 255 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output");
257} 256}
258/* 257/*
259 * vim:set ft=lex: 258 * vim:set ft=lex:
260 */ 259 */