Author: leo
Date: Tue Nov 8 08:01:44 2005
New Revision: 9845
Modified:
trunk/imcc/imc.h
trunk/imcc/imcc.l
trunk/imcc/imclexer.c
Log:
[perl #37635] [PATCH] Close imcc .include filehandles
This patch closes filehandles which are being leaked by imcc.
Closing filehandles is obviously a good thing, but particularly
manifests itself on platforms such as HP-UX where the ulimit on file
descriptors is set quite low (typically 50). Compiling tclllib.pbc
currently typically opens >80 file descriptors concurrently (and blows
up on HP-UX).
Courtesy of Nick Glencross <[EMAIL PROTECTED]>
Modified: trunk/imcc/imc.h
==============================================================================
--- trunk/imcc/imc.h (original)
+++ trunk/imcc/imc.h Tue Nov 8 08:01:44 2005
@@ -165,6 +165,7 @@ struct parser_state_t {
struct parser_state_t *next;
Interp *interpreter;
const char *file;
+ FILE *handle;
int line;
int pasm_file; /* pasm_file mode of this frame */
int pragmas; /* n_operators ... */
Modified: trunk/imcc/imcc.l
==============================================================================
--- trunk/imcc/imcc.l (original)
+++ trunk/imcc/imcc.l Tue Nov 8 08:01:44 2005
@@ -611,6 +611,7 @@ new_frame (Interp* interp)
tmp = mem_sys_allocate_zeroed(sizeof(struct macro_frame_t));
tmp->label = ++label;
tmp->s.line = line;
+ tmp->s.handle = NULL;
if (frames) {
tmp->s.pasm_file = frames->s.pasm_file;
tmp->s.file = frames->s.file;
@@ -922,7 +923,9 @@ include_file (Interp* interp, char *file
}
else
IMCC_fataly(interp, E_IOError, strerror(errno));
+
frame->s.file = file_name;
+ frame->s.handle = file;
ext = strrchr(file_name, '.');
if (ext) {
@@ -970,6 +973,7 @@ pop_parser_state(Interp* interp)
struct macro_frame_t *tmp;
tmp = frames;
if (tmp) {
+ if (tmp->s.handle) fclose (tmp->s.handle);
frames = (struct macro_frame_t*) frames->s.next;
destroy_frame(tmp);
}
Modified: trunk/imcc/imclexer.c
==============================================================================
--- trunk/imcc/imclexer.c (original)
+++ trunk/imcc/imclexer.c Tue Nov 8 08:01:44 2005
@@ -1,4 +1,4 @@
-#line 2 "imcc\\imclexer.c"
+#line 2 "imcc/imclexer.c"
/* A lexical scanner generated by flex */
/* Scanner skeleton version:
@@ -2701,9 +2701,9 @@ static char *yy_last_accepting_cpos;
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
-#line 1 "imcc\\imcc.l"
+#line 1 "imcc/imcc.l"
#define INITIAL 0
-#line 2 "imcc\\imcc.l"
+#line 2 "imcc/imcc.l"
/*
* imcc.l
*
@@ -2806,7 +2806,7 @@ static char *heredoc_content;
#define heredoc2 10
-#line 2810 "imcc\\imclexer.c"
+#line 2810 "imcc/imclexer.c"
/* Macros after this point can all be overridden by user definitions in
* section 1.
@@ -2960,7 +2960,7 @@ YY_DECL
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 123 "imcc\\imcc.l"
+#line 123 "imcc/imcc.l"
/* for emacs "*/
if (expect_pasm == 1 && !in_pod) {
@@ -2977,7 +2977,7 @@ YY_DECL
return 0;
}
-#line 2981 "imcc\\imclexer.c"
+#line 2981 "imcc/imclexer.c"
if ( yy_init )
{
@@ -3063,7 +3063,7 @@ do_action: /* This label is used only to
case 1:
YY_RULE_SETUP
-#line 139 "imcc\\imcc.l"
+#line 139 "imcc/imcc.l"
{
frames->heredoc_rest = str_dup(yytext);
BEGIN(heredoc2);
@@ -3071,7 +3071,7 @@ YY_RULE_SETUP
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 144 "imcc\\imcc.l"
+#line 144 "imcc/imcc.l"
{
/* heredocs have highest priority
* arrange them befor all wildcard state matches
@@ -3087,7 +3087,7 @@ YY_RULE_SETUP
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 157 "imcc\\imcc.l"
+#line 157 "imcc/imcc.l"
{
/* Are we at the end of the heredoc? */
if (strcmp(heredoc_end, yytext) == 0)
@@ -3115,7 +3115,7 @@ YY_RULE_SETUP
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 183 "imcc\\imcc.l"
+#line 183 "imcc/imcc.l"
{ prev_state = YYSTATE; BEGIN(cmt2);
valp->t = atoi(yytext+6);
return LINECOMMENT;
@@ -3123,7 +3123,7 @@ YY_RULE_SETUP
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 187 "imcc\\imcc.l"
+#line 187 "imcc/imcc.l"
{ BEGIN(cmt3);
valp->s = str_dup(yytext);
return FILECOMMENT;
@@ -3131,22 +3131,22 @@ YY_RULE_SETUP
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 191 "imcc\\imcc.l"
+#line 191 "imcc/imcc.l"
{ BEGIN(cmt4); }
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 193 "imcc\\imcc.l"
+#line 193 "imcc/imcc.l"
{ prev_state = YYSTATE; BEGIN(cmt2); }
YY_BREAK
case 8:
YY_RULE_SETUP
-#line 194 "imcc\\imcc.l"
+#line 194 "imcc/imcc.l"
{ prev_state = YYSTATE; BEGIN(cmt1); }
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 195 "imcc\\imcc.l"
+#line 195 "imcc/imcc.l"
{
valp->t = atoi(yytext);
BEGIN(cmt4);
@@ -3155,12 +3155,12 @@ YY_RULE_SETUP
YY_BREAK
case 10:
YY_RULE_SETUP
-#line 200 "imcc\\imcc.l"
+#line 200 "imcc/imcc.l"
{ BEGIN(prev_state) ; line++; }
YY_BREAK
case 11:
YY_RULE_SETUP
-#line 202 "imcc\\imcc.l"
+#line 202 "imcc/imcc.l"
{
if (expect_pasm == 2)
BEGIN(INITIAL);
@@ -3171,12 +3171,12 @@ YY_RULE_SETUP
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 210 "imcc\\imcc.l"
+#line 210 "imcc/imcc.l"
{ prev_state = YYSTATE; BEGIN(cmt5); }
YY_BREAK
case 13:
YY_RULE_SETUP
-#line 211 "imcc\\imcc.l"
+#line 211 "imcc/imcc.l"
{
if (expect_pasm == 2)
BEGIN(INITIAL);
@@ -3189,7 +3189,7 @@ YY_RULE_SETUP
YY_BREAK
case 14:
YY_RULE_SETUP
-#line 221 "imcc\\imcc.l"
+#line 221 "imcc/imcc.l"
{
BEGIN(emit);
return(EMIT);
@@ -3197,7 +3197,7 @@ YY_RULE_SETUP
YY_BREAK
case 15:
YY_RULE_SETUP
-#line 226 "imcc\\imcc.l"
+#line 226 "imcc/imcc.l"
{
BEGIN(INITIAL);
return EOM;
@@ -3205,7 +3205,7 @@ YY_RULE_SETUP
YY_BREAK
case 16:
YY_RULE_SETUP
-#line 231 "imcc\\imcc.l"
+#line 231 "imcc/imcc.l"
{
valp->s = str_dup(yytext);
return REG;
@@ -3213,510 +3213,510 @@ YY_RULE_SETUP
YY_BREAK
case 17:
YY_RULE_SETUP
-#line 236 "imcc\\imcc.l"
+#line 236 "imcc/imcc.l"
{ in_pod = 1; yy_push_state(pod); }
YY_BREAK
case 18:
YY_RULE_SETUP
-#line 237 "imcc\\imcc.l"
+#line 237 "imcc/imcc.l"
{ in_pod = 0; yy_pop_state(); ++line; }
YY_BREAK
case 19:
YY_RULE_SETUP
-#line 238 "imcc\\imcc.l"
+#line 238 "imcc/imcc.l"
{ /*ignore*/ }
YY_BREAK
case 20:
YY_RULE_SETUP
-#line 239 "imcc\\imcc.l"
+#line 239 "imcc/imcc.l"
{ ++line; }
YY_BREAK
case 21:
YY_RULE_SETUP
-#line 241 "imcc\\imcc.l"
+#line 241 "imcc/imcc.l"
return(LOCAL);
YY_BREAK
case 22:
YY_RULE_SETUP
-#line 242 "imcc\\imcc.l"
+#line 242 "imcc/imcc.l"
return(ARG);
YY_BREAK
case 23:
YY_RULE_SETUP
-#line 243 "imcc\\imcc.l"
+#line 243 "imcc/imcc.l"
return(SUB);
YY_BREAK
case 24:
YY_RULE_SETUP
-#line 244 "imcc\\imcc.l"
+#line 244 "imcc/imcc.l"
return(ESUB);
YY_BREAK
case 25:
YY_RULE_SETUP
-#line 245 "imcc\\imcc.l"
+#line 245 "imcc/imcc.l"
return(PCC_BEGIN);
YY_BREAK
case 26:
YY_RULE_SETUP
-#line 246 "imcc\\imcc.l"
+#line 246 "imcc/imcc.l"
return(PCC_END);
YY_BREAK
case 27:
YY_RULE_SETUP
-#line 247 "imcc\\imcc.l"
+#line 247 "imcc/imcc.l"
return(PCC_CALL);
YY_BREAK
case 28:
YY_RULE_SETUP
-#line 248 "imcc\\imcc.l"
+#line 248 "imcc/imcc.l"
return(NCI_CALL);
YY_BREAK
case 29:
YY_RULE_SETUP
-#line 249 "imcc\\imcc.l"
+#line 249 "imcc/imcc.l"
return(METH_CALL);
YY_BREAK
case 30:
YY_RULE_SETUP
-#line 250 "imcc\\imcc.l"
+#line 250 "imcc/imcc.l"
return(INVOCANT);
YY_BREAK
case 31:
YY_RULE_SETUP
-#line 251 "imcc\\imcc.l"
+#line 251 "imcc/imcc.l"
return(PCC_SUB);
YY_BREAK
case 32:
YY_RULE_SETUP
-#line 252 "imcc\\imcc.l"
+#line 252 "imcc/imcc.l"
return(PCC_BEGIN_RETURN);
YY_BREAK
case 33:
YY_RULE_SETUP
-#line 253 "imcc\\imcc.l"
+#line 253 "imcc/imcc.l"
return(PCC_END_RETURN);
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 254 "imcc\\imcc.l"
+#line 254 "imcc/imcc.l"
return(PCC_BEGIN_YIELD);
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 255 "imcc\\imcc.l"
+#line 255 "imcc/imcc.l"
return(PCC_END_YIELD);
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 257 "imcc\\imcc.l"
+#line 257 "imcc/imcc.l"
return(METHOD); /* old compat cruft -
the canonical colon names are below */
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 259 "imcc\\imcc.l"
+#line 259 "imcc/imcc.l"
return(MULTI);
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 260 "imcc\\imcc.l"
+#line 260 "imcc/imcc.l"
return(MAIN);
YY_BREAK
case 39:
YY_RULE_SETUP
-#line 261 "imcc\\imcc.l"
+#line 261 "imcc/imcc.l"
return(LOAD);
YY_BREAK
case 40:
YY_RULE_SETUP
-#line 262 "imcc\\imcc.l"
+#line 262 "imcc/imcc.l"
return(IMMEDIATE);
YY_BREAK
case 41:
YY_RULE_SETUP
-#line 263 "imcc\\imcc.l"
+#line 263 "imcc/imcc.l"
return(POSTCOMP);
YY_BREAK
case 42:
YY_RULE_SETUP
-#line 264 "imcc\\imcc.l"
+#line 264 "imcc/imcc.l"
return(ANON);
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 266 "imcc\\imcc.l"
+#line 266 "imcc/imcc.l"
return(METHOD);
YY_BREAK
case 44:
YY_RULE_SETUP
-#line 267 "imcc\\imcc.l"
+#line 267 "imcc/imcc.l"
return(MULTI);
YY_BREAK
case 45:
YY_RULE_SETUP
-#line 268 "imcc\\imcc.l"
+#line 268 "imcc/imcc.l"
return(MAIN);
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 269 "imcc\\imcc.l"
+#line 269 "imcc/imcc.l"
return(LOAD);
YY_BREAK
case 47:
YY_RULE_SETUP
-#line 270 "imcc\\imcc.l"
+#line 270 "imcc/imcc.l"
return(IMMEDIATE);
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 271 "imcc\\imcc.l"
+#line 271 "imcc/imcc.l"
return(POSTCOMP);
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 272 "imcc\\imcc.l"
+#line 272 "imcc/imcc.l"
return(ANON);
YY_BREAK
case 50:
YY_RULE_SETUP
-#line 274 "imcc\\imcc.l"
+#line 274 "imcc/imcc.l"
return(RESULT);
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 275 "imcc\\imcc.l"
+#line 275 "imcc/imcc.l"
return(YIELDT);
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 276 "imcc\\imcc.l"
+#line 276 "imcc/imcc.l"
return(RETURN);
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 278 "imcc\\imcc.l"
+#line 278 "imcc/imcc.l"
return(ADV_FLAT);
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 279 "imcc\\imcc.l"
+#line 279 "imcc/imcc.l"
return(ADV_SLURPY);
YY_BREAK
case 55:
YY_RULE_SETUP
-#line 280 "imcc\\imcc.l"
+#line 280 "imcc/imcc.l"
return(ADV_OPTIONAL);
YY_BREAK
case 56:
YY_RULE_SETUP
-#line 281 "imcc\\imcc.l"
+#line 281 "imcc/imcc.l"
return(ADV_OPT_FLAG);
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 283 "imcc\\imcc.l"
+#line 283 "imcc/imcc.l"
return(CLASS);
YY_BREAK
case 58:
YY_RULE_SETUP
-#line 284 "imcc\\imcc.l"
+#line 284 "imcc/imcc.l"
return(ENDCLASS);
YY_BREAK
case 59:
YY_RULE_SETUP
-#line 285 "imcc\\imcc.l"
+#line 285 "imcc/imcc.l"
return(NAMESPACE);
YY_BREAK
case 60:
YY_RULE_SETUP
-#line 286 "imcc\\imcc.l"
+#line 286 "imcc/imcc.l"
return(HLL);
YY_BREAK
case 61:
YY_RULE_SETUP
-#line 287 "imcc\\imcc.l"
+#line 287 "imcc/imcc.l"
return(ENDNAMESPACE);
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 288 "imcc\\imcc.l"
+#line 288 "imcc/imcc.l"
return(FIELD);
YY_BREAK
case 63:
YY_RULE_SETUP
-#line 289 "imcc\\imcc.l"
+#line 289 "imcc/imcc.l"
return(DOT_METHOD);
YY_BREAK
case 64:
YY_RULE_SETUP
-#line 290 "imcc\\imcc.l"
+#line 290 "imcc/imcc.l"
return(LOCAL);
YY_BREAK
case 65:
YY_RULE_SETUP
-#line 291 "imcc\\imcc.l"
+#line 291 "imcc/imcc.l"
return(GLOBAL);
YY_BREAK
case 66:
YY_RULE_SETUP
-#line 292 "imcc\\imcc.l"
+#line 292 "imcc/imcc.l"
return(CONST);
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 293 "imcc\\imcc.l"
+#line 293 "imcc/imcc.l"
return(GLOBAL_CONST);
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 294 "imcc\\imcc.l"
+#line 294 "imcc/imcc.l"
return(PARAM);
YY_BREAK
case 69:
YY_RULE_SETUP
-#line 295 "imcc\\imcc.l"
+#line 295 "imcc/imcc.l"
return(PRAGMA);
YY_BREAK
case 70:
YY_RULE_SETUP
-#line 296 "imcc\\imcc.l"
+#line 296 "imcc/imcc.l"
return(FASTCALL);
YY_BREAK
case 71:
YY_RULE_SETUP
-#line 297 "imcc\\imcc.l"
+#line 297 "imcc/imcc.l"
return(N_OPERATORS);
YY_BREAK
case 72:
YY_RULE_SETUP
-#line 298 "imcc\\imcc.l"
+#line 298 "imcc/imcc.l"
return(GOTO);
YY_BREAK
case 73:
YY_RULE_SETUP
-#line 299 "imcc\\imcc.l"
+#line 299 "imcc/imcc.l"
return(IF);
YY_BREAK
case 74:
YY_RULE_SETUP
-#line 300 "imcc\\imcc.l"
+#line 300 "imcc/imcc.l"
return(UNLESS);
YY_BREAK
case 75:
YY_RULE_SETUP
-#line 301 "imcc\\imcc.l"
+#line 301 "imcc/imcc.l"
return(PNULL);
YY_BREAK
case 76:
YY_RULE_SETUP
-#line 302 "imcc\\imcc.l"
+#line 302 "imcc/imcc.l"
return(INTV);
YY_BREAK
case 77:
YY_RULE_SETUP
-#line 303 "imcc\\imcc.l"
+#line 303 "imcc/imcc.l"
return(FLOATV);
YY_BREAK
case 78:
YY_RULE_SETUP
-#line 304 "imcc\\imcc.l"
+#line 304 "imcc/imcc.l"
return(FLOATV);
YY_BREAK
case 79:
YY_RULE_SETUP
-#line 305 "imcc\\imcc.l"
+#line 305 "imcc/imcc.l"
return(NEW);
YY_BREAK
case 80:
YY_RULE_SETUP
-#line 306 "imcc\\imcc.l"
+#line 306 "imcc/imcc.l"
return(ADDR);
YY_BREAK
case 81:
YY_RULE_SETUP
-#line 307 "imcc\\imcc.l"
+#line 307 "imcc/imcc.l"
return(GLOBALOP);
YY_BREAK
case 82:
YY_RULE_SETUP
-#line 308 "imcc\\imcc.l"
+#line 308 "imcc/imcc.l"
return(OBJECTV);
YY_BREAK
case 83:
YY_RULE_SETUP
-#line 309 "imcc\\imcc.l"
+#line 309 "imcc/imcc.l"
return(PMCV);
YY_BREAK
case 84:
YY_RULE_SETUP
-#line 310 "imcc\\imcc.l"
+#line 310 "imcc/imcc.l"
return(STRINGV);
YY_BREAK
case 85:
YY_RULE_SETUP
-#line 311 "imcc\\imcc.l"
+#line 311 "imcc/imcc.l"
return(SHIFT_LEFT);
YY_BREAK
case 86:
YY_RULE_SETUP
-#line 312 "imcc\\imcc.l"
+#line 312 "imcc/imcc.l"
return(SHIFT_RIGHT);
YY_BREAK
case 87:
YY_RULE_SETUP
-#line 313 "imcc\\imcc.l"
+#line 313 "imcc/imcc.l"
return(SHIFT_RIGHT_U);
YY_BREAK
case 88:
YY_RULE_SETUP
-#line 314 "imcc\\imcc.l"
+#line 314 "imcc/imcc.l"
return(LOG_AND);
YY_BREAK
case 89:
YY_RULE_SETUP
-#line 315 "imcc\\imcc.l"
+#line 315 "imcc/imcc.l"
return(LOG_OR);
YY_BREAK
case 90:
YY_RULE_SETUP
-#line 316 "imcc\\imcc.l"
+#line 316 "imcc/imcc.l"
return(LOG_XOR);
YY_BREAK
case 91:
YY_RULE_SETUP
-#line 317 "imcc\\imcc.l"
+#line 317 "imcc/imcc.l"
return(RELOP_LT);
YY_BREAK
case 92:
YY_RULE_SETUP
-#line 318 "imcc\\imcc.l"
+#line 318 "imcc/imcc.l"
return(RELOP_LTE);
YY_BREAK
case 93:
YY_RULE_SETUP
-#line 319 "imcc\\imcc.l"
+#line 319 "imcc/imcc.l"
return(RELOP_GT);
YY_BREAK
case 94:
YY_RULE_SETUP
-#line 320 "imcc\\imcc.l"
+#line 320 "imcc/imcc.l"
return(RELOP_GTE);
YY_BREAK
case 95:
YY_RULE_SETUP
-#line 321 "imcc\\imcc.l"
+#line 321 "imcc/imcc.l"
return(RELOP_EQ);
YY_BREAK
case 96:
YY_RULE_SETUP
-#line 322 "imcc\\imcc.l"
+#line 322 "imcc/imcc.l"
return(RELOP_NE);
YY_BREAK
case 97:
YY_RULE_SETUP
-#line 323 "imcc\\imcc.l"
+#line 323 "imcc/imcc.l"
return(POW);
YY_BREAK
case 98:
YY_RULE_SETUP
-#line 324 "imcc\\imcc.l"
+#line 324 "imcc/imcc.l"
return(POINTY);
YY_BREAK
case 99:
YY_RULE_SETUP
-#line 325 "imcc\\imcc.l"
+#line 325 "imcc/imcc.l"
return(CONCAT);
YY_BREAK
case 100:
YY_RULE_SETUP
-#line 326 "imcc\\imcc.l"
+#line 326 "imcc/imcc.l"
return(DOT);
YY_BREAK
case 101:
YY_RULE_SETUP
-#line 327 "imcc\\imcc.l"
+#line 327 "imcc/imcc.l"
return(DOTDOT);
YY_BREAK
case 102:
YY_RULE_SETUP
-#line 328 "imcc\\imcc.l"
+#line 328 "imcc/imcc.l"
return(PLUS_ASSIGN);
YY_BREAK
case 103:
YY_RULE_SETUP
-#line 329 "imcc\\imcc.l"
+#line 329 "imcc/imcc.l"
return(MINUS_ASSIGN);
YY_BREAK
case 104:
YY_RULE_SETUP
-#line 330 "imcc\\imcc.l"
+#line 330 "imcc/imcc.l"
return(MUL_ASSIGN);
YY_BREAK
case 105:
YY_RULE_SETUP
-#line 331 "imcc\\imcc.l"
+#line 331 "imcc/imcc.l"
return(DIV_ASSIGN);
YY_BREAK
case 106:
YY_RULE_SETUP
-#line 332 "imcc\\imcc.l"
+#line 332 "imcc/imcc.l"
return(MOD_ASSIGN);
YY_BREAK
case 107:
YY_RULE_SETUP
-#line 333 "imcc\\imcc.l"
+#line 333 "imcc/imcc.l"
return(FDIV);
YY_BREAK
case 108:
YY_RULE_SETUP
-#line 334 "imcc\\imcc.l"
+#line 334 "imcc/imcc.l"
return(FDIV_ASSIGN);
YY_BREAK
case 109:
YY_RULE_SETUP
-#line 335 "imcc\\imcc.l"
+#line 335 "imcc/imcc.l"
return(BAND_ASSIGN);
YY_BREAK
case 110:
YY_RULE_SETUP
-#line 336 "imcc\\imcc.l"
+#line 336 "imcc/imcc.l"
return(BOR_ASSIGN);
YY_BREAK
case 111:
YY_RULE_SETUP
-#line 337 "imcc\\imcc.l"
+#line 337 "imcc/imcc.l"
return(BXOR_ASSIGN);
YY_BREAK
case 112:
YY_RULE_SETUP
-#line 338 "imcc\\imcc.l"
+#line 338 "imcc/imcc.l"
return(SHR_ASSIGN);
YY_BREAK
case 113:
YY_RULE_SETUP
-#line 339 "imcc\\imcc.l"
+#line 339 "imcc/imcc.l"
return(SHL_ASSIGN);
YY_BREAK
case 114:
YY_RULE_SETUP
-#line 340 "imcc\\imcc.l"
+#line 340 "imcc/imcc.l"
return(SHR_U_ASSIGN);
YY_BREAK
case 115:
YY_RULE_SETUP
-#line 341 "imcc\\imcc.l"
+#line 341 "imcc/imcc.l"
return(CONCAT_ASSIGN);
YY_BREAK
case 116:
YY_RULE_SETUP
-#line 343 "imcc\\imcc.l"
+#line 343 "imcc/imcc.l"
{
return read_macro(valp, interp);
}
YY_BREAK
case 117:
YY_RULE_SETUP
-#line 347 "imcc\\imcc.l"
+#line 347 "imcc/imcc.l"
{
int c;
char *name;
@@ -3747,7 +3747,7 @@ YY_RULE_SETUP
YY_BREAK
case 118:
YY_RULE_SETUP
-#line 375 "imcc\\imcc.l"
+#line 375 "imcc/imcc.l"
{
int c;
@@ -3760,7 +3760,7 @@ YY_RULE_SETUP
YY_BREAK
case 119:
YY_RULE_SETUP
-#line 385 "imcc\\imcc.l"
+#line 385 "imcc/imcc.l"
{
char *label;
@@ -3781,7 +3781,7 @@ YY_RULE_SETUP
YY_BREAK
case 120:
YY_RULE_SETUP
-#line 403 "imcc\\imcc.l"
+#line 403 "imcc/imcc.l"
{
char *label;
@@ -3803,12 +3803,12 @@ YY_RULE_SETUP
YY_BREAK
case 121:
YY_RULE_SETUP
-#line 422 "imcc\\imcc.l"
+#line 422 "imcc/imcc.l"
return(COMMA);
YY_BREAK
case 122:
YY_RULE_SETUP
-#line 424 "imcc\\imcc.l"
+#line 424 "imcc/imcc.l"
{
YYCHOP(); /* trim last ':' */
DUP_AND_RET(valp,LABEL);
@@ -3816,7 +3816,7 @@ YY_RULE_SETUP
YY_BREAK
case 123:
YY_RULE_SETUP
-#line 429 "imcc\\imcc.l"
+#line 429 "imcc/imcc.l"
{
int type = pmc_type(interp, string_from_cstring(interp, yytext+1, 0));
@@ -3834,7 +3834,7 @@ YY_RULE_SETUP
YY_BREAK
case 124:
YY_RULE_SETUP
-#line 444 "imcc\\imcc.l"
+#line 444 "imcc/imcc.l"
{
if (!is_def) {
SymReg *r = find_sym(interp, yytext);
@@ -3859,27 +3859,27 @@ YY_RULE_SETUP
YY_BREAK
case 125:
YY_RULE_SETUP
-#line 466 "imcc\\imcc.l"
+#line 466 "imcc/imcc.l"
DUP_AND_RET(valp, FLOATC);
YY_BREAK
case 126:
YY_RULE_SETUP
-#line 467 "imcc\\imcc.l"
+#line 467 "imcc/imcc.l"
DUP_AND_RET(valp, INTC);
YY_BREAK
case 127:
YY_RULE_SETUP
-#line 468 "imcc\\imcc.l"
+#line 468 "imcc/imcc.l"
DUP_AND_RET(valp, INTC);
YY_BREAK
case 128:
YY_RULE_SETUP
-#line 469 "imcc\\imcc.l"
+#line 469 "imcc/imcc.l"
DUP_AND_RET(valp, INTC);
YY_BREAK
case 129:
YY_RULE_SETUP
-#line 471 "imcc\\imcc.l"
+#line 471 "imcc/imcc.l"
{
valp->s = str_dup(yytext);
valp->s[strlen(valp->s) - 1] = '\0'; /* trailing 'L' */
@@ -3888,7 +3888,7 @@ YY_RULE_SETUP
YY_BREAK
case 130:
YY_RULE_SETUP
-#line 477 "imcc\\imcc.l"
+#line 477 "imcc/imcc.l"
{
valp->s = str_dup(yytext);
return(STRINGC); /* XXX delete quotes, -> emit, pbc */
@@ -3896,7 +3896,7 @@ YY_RULE_SETUP
YY_BREAK
case 131:
YY_RULE_SETUP
-#line 482 "imcc\\imcc.l"
+#line 482 "imcc/imcc.l"
{
struct macro_frame_t *frame;
/* Save the string we want to mark the end of the heredoc and snip
@@ -3921,7 +3921,7 @@ YY_RULE_SETUP
YY_BREAK
case 132:
YY_RULE_SETUP
-#line 504 "imcc\\imcc.l"
+#line 504 "imcc/imcc.l"
{
valp->s = str_dup(yytext); /* charset:"..." */
/* this is actually not unicode but a string with a charset */
@@ -3930,39 +3930,39 @@ YY_RULE_SETUP
YY_BREAK
case 133:
YY_RULE_SETUP
-#line 511 "imcc\\imcc.l"
+#line 511 "imcc/imcc.l"
DUP_AND_RET(valp, IREG);
YY_BREAK
case 134:
YY_RULE_SETUP
-#line 512 "imcc\\imcc.l"
+#line 512 "imcc/imcc.l"
DUP_AND_RET(valp, NREG);
YY_BREAK
case 135:
YY_RULE_SETUP
-#line 513 "imcc\\imcc.l"
+#line 513 "imcc/imcc.l"
DUP_AND_RET(valp, SREG);
YY_BREAK
case 136:
YY_RULE_SETUP
-#line 514 "imcc\\imcc.l"
+#line 514 "imcc/imcc.l"
DUP_AND_RET(valp, PREG);
YY_BREAK
case 137:
YY_RULE_SETUP
-#line 516 "imcc\\imcc.l"
+#line 516 "imcc/imcc.l"
/* skip */;
YY_BREAK
case 138:
YY_RULE_SETUP
-#line 518 "imcc\\imcc.l"
+#line 518 "imcc/imcc.l"
{
/* catch all except for state macro */
return yytext[0];
}
YY_BREAK
case YY_STATE_EOF(emit):
-#line 523 "imcc\\imcc.l"
+#line 523 "imcc/imcc.l"
{
BEGIN (INITIAL);
if (frames->s.pasm_file) {
@@ -3973,17 +3973,17 @@ case YY_STATE_EOF(emit):
}
YY_BREAK
case YY_STATE_EOF(INITIAL):
-#line 532 "imcc\\imcc.l"
+#line 532 "imcc/imcc.l"
yyterminate();
YY_BREAK
case 139:
YY_RULE_SETUP
-#line 534 "imcc\\imcc.l"
+#line 534 "imcc/imcc.l"
DUP_AND_RET(valp, ENDM);
YY_BREAK
case 140:
YY_RULE_SETUP
-#line 536 "imcc\\imcc.l"
+#line 536 "imcc/imcc.l"
{
line++;
DUP_AND_RET(valp, '\n');
@@ -3991,12 +3991,12 @@ YY_RULE_SETUP
YY_BREAK
case 141:
YY_RULE_SETUP
-#line 541 "imcc\\imcc.l"
+#line 541 "imcc/imcc.l"
return LABEL;
YY_BREAK
case 142:
YY_RULE_SETUP
-#line 542 "imcc\\imcc.l"
+#line 542 "imcc/imcc.l"
{
char *label;
char *name = macros[num_macros].name;
@@ -4018,7 +4018,7 @@ YY_RULE_SETUP
YY_BREAK
case 143:
YY_RULE_SETUP
-#line 561 "imcc\\imcc.l"
+#line 561 "imcc/imcc.l"
{
char *label;
char *name = macros[num_macros].name;
@@ -4035,39 +4035,39 @@ YY_RULE_SETUP
YY_BREAK
case 144:
YY_RULE_SETUP
-#line 575 "imcc\\imcc.l"
+#line 575 "imcc/imcc.l"
/* skip leading ws */;
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 576 "imcc\\imcc.l"
+#line 576 "imcc/imcc.l"
DUP_AND_RET(valp, ' ');
YY_BREAK
case 146:
YY_RULE_SETUP
-#line 577 "imcc\\imcc.l"
+#line 577 "imcc/imcc.l"
DUP_AND_RET(valp, IDENTIFIER);
YY_BREAK
case 147:
YY_RULE_SETUP
-#line 578 "imcc\\imcc.l"
+#line 578 "imcc/imcc.l"
DUP_AND_RET(valp, MACRO);
YY_BREAK
case 148:
YY_RULE_SETUP
-#line 579 "imcc\\imcc.l"
+#line 579 "imcc/imcc.l"
DUP_AND_RET(valp, yytext[0]);
YY_BREAK
case YY_STATE_EOF(macro):
-#line 580 "imcc\\imcc.l"
+#line 580 "imcc/imcc.l"
yyterminate();
YY_BREAK
case 149:
YY_RULE_SETUP
-#line 582 "imcc\\imcc.l"
+#line 582 "imcc/imcc.l"
ECHO;
YY_BREAK
-#line 4071 "imcc\\imclexer.c"
+#line 4071 "imcc/imclexer.c"
case YY_STATE_EOF(pod):
case YY_STATE_EOF(cmt1):
case YY_STATE_EOF(cmt2):
@@ -4962,7 +4962,7 @@ int main()
return 0;
}
#endif
-#line 582 "imcc\\imcc.l"
+#line 582 "imcc/imcc.l"
#ifdef yywrap
@@ -4995,6 +4995,7 @@ new_frame (Interp* interp)
tmp = mem_sys_allocate_zeroed(sizeof(struct macro_frame_t));
tmp->label = ++label;
tmp->s.line = line;
+ tmp->s.handle = NULL;
if (frames) {
tmp->s.pasm_file = frames->s.pasm_file;
tmp->s.file = frames->s.file;
@@ -5306,7 +5307,9 @@ include_file (Interp* interp, char *file
}
else
IMCC_fataly(interp, E_IOError, strerror(errno));
+
frame->s.file = file_name;
+ frame->s.handle = file;
ext = strrchr(file_name, '.');
if (ext) {
@@ -5354,6 +5357,7 @@ pop_parser_state(Interp* interp)
struct macro_frame_t *tmp;
tmp = frames;
if (tmp) {
+ if (tmp->s.handle) fclose (tmp->s.handle);
frames = (struct macro_frame_t*) frames->s.next;
destroy_frame(tmp);
}