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.ll8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/sitecing_enflesher.ll b/lib/sitecing_enflesher.ll
index 46489c7..bb667be 100644
--- a/lib/sitecing_enflesher.ll
+++ b/lib/sitecing_enflesher.ll
@@ -170,34 +170,35 @@ ID [A-Za-z_][A-Za-z0-9_]*
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} 183}
183 184
184void sitecing_enflesher::anchor() { 185void sitecing_enflesher::anchor() {
185 if(!anchoraged) 186 if(!anchoraged)
186 return; 187 return;
187 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n"; 188 outs << "\n#line " << lineno() << " \"" << parser.skeleton << "\"\n";
188 anchor_time = false; 189 anchor_time = false;
189} 190}
190 191
191void sitecing_enflesher::outs_open(const string& nfile) { 192void sitecing_enflesher::outs_close() {
192 if(!outs_filename.empty()) { 193 if(!outs_filename.empty()) {
193 outs.flush(); 194 outs.flush();
194 outs.close(); 195 outs.close();
195 outs.clear(); 196 outs.clear();
196 /* 197 /*
197 * compare source and destination files. 198 * compare source and destination files.
198 * 199 *
199 * 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
200 * 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
201 * 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
202 * difference, anyway. 203 * difference, anyway.
203 */ 204 */
@@ -235,20 +236,25 @@ void sitecing_enflesher::outs_open(const string& nfile) {
235 break; 236 break;
236 } 237 }
237 remaining -= rb; 238 remaining -= rb;
238 } 239 }
239 } 240 }
240 } 241 }
241 if(overwrite) { 242 if(overwrite) {
242 cerr << "renaming '" << fn_s << "'" << endl; 243 cerr << "renaming '" << fn_s << "'" << endl;
243 if(rename(fn_s.c_str(),fn_d.c_str())) 244 if(rename(fn_s.c_str(),fn_d.c_str()))
244 throw preprocessor_error(CODEPOINT,"failed to rename() generated output"); 245 throw preprocessor_error(CODEPOINT,"failed to rename() generated output");
245 } 246 }
246 } 247 }
248 outs_filename.erase();
249}
250
251void sitecing_enflesher::outs_open(const string& nfile) {
252 outs_close();
247 outs_filename = nfile; 253 outs_filename = nfile;
248 outs.open((nfile+".new").c_str(),ios::trunc); 254 outs.open((nfile+".new").c_str(),ios::trunc);
249 if(!outs.good()) 255 if(!outs.good())
250 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output"); 256 throw preprocessor_error(CODEPOINT,"failed to write preprocessor output");
251} 257}
252/* 258/*
253 * vim:set ft=lex: 259 * vim:set ft=lex:
254 */ 260 */