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);
     }

Reply via email to