diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index e6f9c89d76a9d2bf2bdddd699ec14a83cbf3463d..2f785622e1cc5ed7cad07e5a52d80615262a1d34 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -189,7 +189,7 @@
 #line 1 "Gmsh.y"
  
 
-// $Id: Gmsh.tab.cpp,v 1.156 2003-04-14 17:13:14 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.157 2003-04-19 22:10:28 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -755,25 +755,25 @@ static const short yyrline[] =
     1658,  1664,  1675,  1686,  1711,  1717,  1736,  1758,  1764,  1772,
     1778,  1784,  1793,  1799,  1805,  1815,  1821,  1826,  1831,  1838,
     1840,  1841,  1844,  1849,  1854,  1869,  1884,  1903,  1914,  1923,
-    1931,  1935,  1943,  1955,  2030,  2050,  2055,  2059,  2079,  2091,
-    2101,  2122,  2143,  2164,  2170,  2175,  2180,  2184,  2192,  2203,
-    2210,  2217,  2217,  2229,  2229,  2241,  2241,  2256,  2261,  2266,
-    2271,  2271,  2281,  2281,  2291,  2291,  2304,  2309,  2314,  2319,
-    2319,  2330,  2330,  2342,  2342,  2356,  2360,  2365,  2392,  2416,
-    2424,  2443,  2461,  2479,  2501,  2522,  2543,  2557,  2576,  2581,
-    2590,  2592,  2593,  2594,  2595,  2598,  2600,  2601,  2602,  2603,
-    2604,  2605,  2606,  2607,  2614,  2615,  2616,  2617,  2618,  2619,
-    2620,  2621,  2622,  2623,  2624,  2625,  2626,  2627,  2628,  2629,
-    2630,  2631,  2632,  2633,  2634,  2635,  2636,  2637,  2638,  2639,
-    2640,  2641,  2642,  2643,  2644,  2645,  2647,  2648,  2649,  2650,
-    2651,  2652,  2653,  2654,  2655,  2656,  2657,  2658,  2659,  2660,
-    2661,  2662,  2663,  2664,  2665,  2666,  2667,  2672,  2677,  2678,
-    2679,  2683,  2694,  2711,  2722,  2741,  2757,  2773,  2789,  2806,
-    2811,  2815,  2819,  2823,  2829,  2834,  2838,  2842,  2848,  2852,
-    2857,  2861,  2866,  2870,  2874,  2880,  2886,  2893,  2899,  2903,
-    2907,  2917,  2924,  2935,  2949,  2965,  2985,  3009,  3015,  3019,
-    3023,  3034,  3039,  3050,  3055,  3073,  3078,  3091,  3097,  3103,
-    3108,  3116,  3129,  3133,  3151,  3165
+    1931,  1935,  1943,  1955,  2037,  2057,  2062,  2066,  2086,  2098,
+    2108,  2129,  2150,  2171,  2177,  2182,  2187,  2191,  2199,  2210,
+    2217,  2224,  2224,  2236,  2236,  2248,  2248,  2263,  2268,  2273,
+    2278,  2278,  2288,  2288,  2298,  2298,  2311,  2316,  2321,  2326,
+    2326,  2337,  2337,  2349,  2349,  2363,  2367,  2372,  2399,  2423,
+    2431,  2450,  2468,  2486,  2508,  2529,  2550,  2564,  2583,  2588,
+    2597,  2599,  2600,  2601,  2602,  2605,  2607,  2608,  2609,  2610,
+    2611,  2612,  2613,  2614,  2621,  2622,  2623,  2624,  2625,  2626,
+    2627,  2628,  2629,  2630,  2631,  2632,  2633,  2634,  2635,  2636,
+    2637,  2638,  2639,  2640,  2641,  2642,  2643,  2644,  2645,  2646,
+    2647,  2648,  2649,  2650,  2651,  2652,  2654,  2655,  2656,  2657,
+    2658,  2659,  2660,  2661,  2662,  2663,  2664,  2665,  2666,  2667,
+    2668,  2669,  2670,  2671,  2672,  2673,  2674,  2679,  2684,  2685,
+    2686,  2690,  2701,  2718,  2729,  2748,  2764,  2780,  2796,  2813,
+    2818,  2822,  2826,  2830,  2836,  2841,  2845,  2849,  2855,  2859,
+    2864,  2868,  2873,  2877,  2881,  2887,  2893,  2900,  2906,  2910,
+    2914,  2924,  2931,  2942,  2956,  2972,  2992,  3016,  3022,  3026,
+    3030,  3041,  3046,  3057,  3062,  3080,  3085,  3098,  3104,  3110,
+    3115,  3123,  3136,  3140,  3158,  3172
 };
 #endif
 
@@ -6599,11 +6599,18 @@ case 273:
 
 	yyinTab[RecursionLevel++] = yyin;
 
-	strcpy(tmpstring, yyname);
-	i = strlen(yyname)-1 ;
-	while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
-	tmpstring[i+1] = '\0';
-	strcat(tmpstring,yyvsp[-1].c);
+	if(yyvsp[-1].c[0] == '/' || yyvsp[-1].c[0] == '\\' || (strlen(yyvsp[-1].c)>2 && yyvsp[-1].c[1] == ':')){
+	  // do nothing: $2 is an absolute path
+	  strcpy(tmpstring, yyvsp[-1].c);
+	}
+	else{
+	  // append $2 to the path of the parent file
+	  strcpy(tmpstring, yyname);
+	  i = strlen(yyname)-1 ;
+	  while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
+	  tmpstring[i+1] = '\0';
+	  strcat(tmpstring, yyvsp[-1].c);
+	}
 
 	if((yyin = fopen(tmpstring,"r"))){
 	  Msg(INFO, "Including '%s'", tmpstring); 
@@ -6669,7 +6676,7 @@ case 273:
     ;
     break;}
 case 274:
-#line 2031 "Gmsh.y"
+#line 2038 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-2].c, "Sleep")){
 
@@ -6691,20 +6698,20 @@ case 274:
     ;
     break;}
 case 275:
-#line 2051 "Gmsh.y"
+#line 2058 "Gmsh.y"
 {
     if(CTX.default_plugins)
       GMSH_PluginManager::Instance()->Action(yyvsp[-4].c,yyvsp[-1].c,0); 
    ;
     break;}
 case 276:
-#line 2056 "Gmsh.y"
+#line 2063 "Gmsh.y"
 {
       exit(0);
     ;
     break;}
 case 277:
-#line 2060 "Gmsh.y"
+#line 2067 "Gmsh.y"
 {
 #if defined(HAVE_FLTK)
       if(!CTX.batch){ // we're in interactive mode
@@ -6722,7 +6729,7 @@ case 277:
     ;
     break;}
 case 278:
-#line 2082 "Gmsh.y"
+#line 2089 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-3].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-1].d ;
@@ -6734,7 +6741,7 @@ case 278:
     ;
     break;}
 case 279:
-#line 2092 "Gmsh.y"
+#line 2099 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-5].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-3].d ;
@@ -6746,7 +6753,7 @@ case 279:
     ;
     break;}
 case 280:
-#line 2102 "Gmsh.y"
+#line 2109 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-3].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-1].d ;
@@ -6769,7 +6776,7 @@ case 280:
     ;
     break;}
 case 281:
-#line 2123 "Gmsh.y"
+#line 2130 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-5].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-3].d ;
@@ -6792,7 +6799,7 @@ case 281:
     ;
     break;}
 case 282:
-#line 2144 "Gmsh.y"
+#line 2151 "Gmsh.y"
 {
       if(LoopControlVariablesTab[ImbricatedLoop-1][1] >  
 	 LoopControlVariablesTab[ImbricatedLoop-1][0]){
@@ -6815,7 +6822,7 @@ case 282:
     ;
     break;}
 case 283:
-#line 2165 "Gmsh.y"
+#line 2172 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->createFunction(yyvsp[0].c,yyin,yyname,yylineno))
 	yymsg(GERROR, "Redefinition of function %s",yyvsp[0].c);
@@ -6823,32 +6830,32 @@ case 283:
     ;
     break;}
 case 284:
-#line 2171 "Gmsh.y"
+#line 2178 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->leaveFunction(&yyin,yyname,yylineno))
 	yymsg(GERROR, "Error while exiting function");
     ;
     break;}
 case 285:
-#line 2176 "Gmsh.y"
+#line 2183 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->enterFunction(yyvsp[-1].c,&yyin,yyname,yylineno))
 	yymsg(GERROR, "Unknown function %s",yyvsp[-1].c);
     ;
     break;}
 case 286:
-#line 2181 "Gmsh.y"
+#line 2188 "Gmsh.y"
 {
       if(!yyvsp[-1].d) skip_until("If", "EndIf");
     ;
     break;}
 case 287:
-#line 2185 "Gmsh.y"
+#line 2192 "Gmsh.y"
 {
     ;
     break;}
 case 288:
-#line 2197 "Gmsh.y"
+#line 2204 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(TRANSLATE,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],
@@ -6857,7 +6864,7 @@ case 288:
     ;
     break;}
 case 289:
-#line 2204 "Gmsh.y"
+#line 2211 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(ROTATE,(int)yyvsp[-8].d,0.,0.,0.,
@@ -6866,7 +6873,7 @@ case 289:
     ;
     break;}
 case 290:
-#line 2211 "Gmsh.y"
+#line 2218 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(TRANSLATE_ROTATE,(int)yyvsp[-10].d,yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],
@@ -6875,14 +6882,14 @@ case 290:
     ;
     break;}
 case 291:
-#line 2218 "Gmsh.y"
+#line 2225 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 292:
-#line 2223 "Gmsh.y"
+#line 2230 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(TRANSLATE,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],
@@ -6891,14 +6898,14 @@ case 292:
     ;
     break;}
 case 293:
-#line 2230 "Gmsh.y"
+#line 2237 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 294:
-#line 2235 "Gmsh.y"
+#line 2242 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(ROTATE,(int)yyvsp[-12].d,0.,0.,0.,
@@ -6907,14 +6914,14 @@ case 294:
     ;
     break;}
 case 295:
-#line 2242 "Gmsh.y"
+#line 2249 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 296:
-#line 2247 "Gmsh.y"
+#line 2254 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(TRANSLATE_ROTATE,(int)yyvsp[-14].d,yyvsp[-12].v[0],yyvsp[-12].v[1],yyvsp[-12].v[2],
@@ -6923,98 +6930,98 @@ case 296:
     ;
     break;}
 case 297:
-#line 2257 "Gmsh.y"
+#line 2264 "Gmsh.y"
 {
       Extrude_ProtudeCurve(TRANSLATE,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],
 			   0.,0.,0.,0.,0.,0.,0.,1,NULL);
     ;
     break;}
 case 298:
-#line 2262 "Gmsh.y"
+#line 2269 "Gmsh.y"
 {
       Extrude_ProtudeCurve(ROTATE,(int)yyvsp[-8].d,0.,0.,0.,
 			   yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,1,NULL);
     ;
     break;}
 case 299:
-#line 2267 "Gmsh.y"
+#line 2274 "Gmsh.y"
 {
       Extrude_ProtudeCurve(TRANSLATE_ROTATE,(int)yyvsp[-10].d,yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],
 			   yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,1,NULL);
     ;
     break;}
 case 300:
-#line 2272 "Gmsh.y"
+#line 2279 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 301:
-#line 2277 "Gmsh.y"
+#line 2284 "Gmsh.y"
 {
       Extrude_ProtudeCurve(TRANSLATE,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],
 			   0.,0.,0.,0.,0.,0.,0.,1,&extr);
     ;
     break;}
 case 302:
-#line 2282 "Gmsh.y"
+#line 2289 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 303:
-#line 2287 "Gmsh.y"
+#line 2294 "Gmsh.y"
 {
       Extrude_ProtudeCurve(ROTATE,(int)yyvsp[-12].d,0.,0.,0.,
 			   yyvsp[-10].v[0],yyvsp[-10].v[1],yyvsp[-10].v[2],yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],yyvsp[-6].d,1,&extr);
     ;
     break;}
 case 304:
-#line 2292 "Gmsh.y"
+#line 2299 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 305:
-#line 2297 "Gmsh.y"
+#line 2304 "Gmsh.y"
 {
       Extrude_ProtudeCurve(TRANSLATE_ROTATE,(int)yyvsp[-14].d,yyvsp[-12].v[0],yyvsp[-12].v[1],yyvsp[-12].v[2],
 			   yyvsp[-10].v[0],yyvsp[-10].v[1],yyvsp[-10].v[2],yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],yyvsp[-6].d,1,&extr);
     ;
     break;}
 case 306:
-#line 2305 "Gmsh.y"
+#line 2312 "Gmsh.y"
 {
       Extrude_ProtudeSurface(TRANSLATE,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],
 			     0.,0.,0.,0.,0.,0.,0.,0,NULL);
     ;
     break;}
 case 307:
-#line 2310 "Gmsh.y"
+#line 2317 "Gmsh.y"
 {
       Extrude_ProtudeSurface(ROTATE,(int)yyvsp[-8].d,0.,0.,0.,
 			     yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL);
     ;
     break;}
 case 308:
-#line 2315 "Gmsh.y"
+#line 2322 "Gmsh.y"
 {
       Extrude_ProtudeSurface(TRANSLATE_ROTATE,(int)yyvsp[-10].d,yyvsp[-8].v[0],yyvsp[-8].v[1],yyvsp[-8].v[2],
 			     yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL);
     ;
     break;}
 case 309:
-#line 2320 "Gmsh.y"
+#line 2327 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 310:
-#line 2325 "Gmsh.y"
+#line 2332 "Gmsh.y"
 {
       int vol = NEWREG();
       Extrude_ProtudeSurface(TRANSLATE,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],
@@ -7022,14 +7029,14 @@ case 310:
     ;
     break;}
 case 311:
-#line 2331 "Gmsh.y"
+#line 2338 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 312:
-#line 2337 "Gmsh.y"
+#line 2344 "Gmsh.y"
 {
       int vol = NEWREG();
       Extrude_ProtudeSurface(ROTATE,(int)yyvsp[-12].d,0.,0.,0.,
@@ -7037,14 +7044,14 @@ case 312:
     ;
     break;}
 case 313:
-#line 2343 "Gmsh.y"
+#line 2350 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 314:
-#line 2349 "Gmsh.y"
+#line 2356 "Gmsh.y"
 {
       int vol = NEWREG();
       Extrude_ProtudeSurface(TRANSLATE_ROTATE,(int)yyvsp[-14].d,yyvsp[-12].v[0],yyvsp[-12].v[1],yyvsp[-12].v[2],
@@ -7052,17 +7059,17 @@ case 314:
     ;
     break;}
 case 315:
-#line 2358 "Gmsh.y"
+#line 2365 "Gmsh.y"
 {
     ;
     break;}
 case 316:
-#line 2361 "Gmsh.y"
+#line 2368 "Gmsh.y"
 {
     ;
     break;}
 case 317:
-#line 2367 "Gmsh.y"
+#line 2374 "Gmsh.y"
 {
       double d;
       extr.mesh.ExtrudeMesh = true;
@@ -7090,7 +7097,7 @@ case 317:
     ;
     break;}
 case 318:
-#line 2393 "Gmsh.y"
+#line 2400 "Gmsh.y"
 {
       double d;
       extr.mesh.ExtrudeMesh = true;
@@ -7116,13 +7123,13 @@ case 318:
     ;
     break;}
 case 319:
-#line 2417 "Gmsh.y"
+#line 2424 "Gmsh.y"
 {
       extr.mesh.Recombine = true;
     ;
     break;}
 case 320:
-#line 2426 "Gmsh.y"
+#line 2433 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -7142,7 +7149,7 @@ case 320:
     ;
     break;}
 case 321:
-#line 2444 "Gmsh.y"
+#line 2451 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -7162,7 +7169,7 @@ case 321:
     ;
     break;}
 case 322:
-#line 2462 "Gmsh.y"
+#line 2469 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -7182,7 +7189,7 @@ case 322:
     ;
     break;}
 case 323:
-#line 2480 "Gmsh.y"
+#line 2487 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -7206,7 +7213,7 @@ case 323:
     ;
     break;}
 case 324:
-#line 2502 "Gmsh.y"
+#line 2509 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -7229,7 +7236,7 @@ case 324:
     ;
     break;}
 case 325:
-#line 2523 "Gmsh.y"
+#line 2530 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d,THEM);
       if(!v)
@@ -7252,7 +7259,7 @@ case 325:
     ;
     break;}
 case 326:
-#line 2544 "Gmsh.y"
+#line 2551 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -7268,7 +7275,7 @@ case 326:
     ;
     break;}
 case 327:
-#line 2558 "Gmsh.y"
+#line 2565 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
@@ -7284,71 +7291,71 @@ case 327:
     ;
     break;}
 case 328:
-#line 2578 "Gmsh.y"
+#line 2585 "Gmsh.y"
 { 
       ReplaceAllDuplicates(THEM);
     ;
     break;}
 case 329:
-#line 2582 "Gmsh.y"
+#line 2589 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 330:
-#line 2591 "Gmsh.y"
+#line 2598 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 331:
-#line 2592 "Gmsh.y"
+#line 2599 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 332:
-#line 2593 "Gmsh.y"
+#line 2600 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 333:
-#line 2594 "Gmsh.y"
+#line 2601 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 334:
-#line 2595 "Gmsh.y"
+#line 2602 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 335:
-#line 2599 "Gmsh.y"
+#line 2606 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 336:
-#line 2600 "Gmsh.y"
+#line 2607 "Gmsh.y"
 { yyval.d = yyvsp[-1].d ;          ;
     break;}
 case 337:
-#line 2601 "Gmsh.y"
+#line 2608 "Gmsh.y"
 { yyval.d = -yyvsp[0].d ;         ;
     break;}
 case 338:
-#line 2602 "Gmsh.y"
+#line 2609 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 339:
-#line 2603 "Gmsh.y"
+#line 2610 "Gmsh.y"
 { yyval.d = !yyvsp[0].d ;         ;
     break;}
 case 340:
-#line 2604 "Gmsh.y"
+#line 2611 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d ;     ;
     break;}
 case 341:
-#line 2605 "Gmsh.y"
+#line 2612 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d ;     ;
     break;}
 case 342:
-#line 2606 "Gmsh.y"
+#line 2613 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d ;     ;
     break;}
 case 343:
-#line 2608 "Gmsh.y"
+#line 2615 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	yymsg(GERROR, "Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -7357,235 +7364,235 @@ case 343:
     ;
     break;}
 case 344:
-#line 2614 "Gmsh.y"
+#line 2621 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d ;  ;
     break;}
 case 345:
-#line 2615 "Gmsh.y"
+#line 2622 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d,yyvsp[0].d) ;  ;
     break;}
 case 346:
-#line 2616 "Gmsh.y"
+#line 2623 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d ;     ;
     break;}
 case 347:
-#line 2617 "Gmsh.y"
+#line 2624 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d ;     ;
     break;}
 case 348:
-#line 2618 "Gmsh.y"
+#line 2625 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d ;    ;
     break;}
 case 349:
-#line 2619 "Gmsh.y"
+#line 2626 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d ;    ;
     break;}
 case 350:
-#line 2620 "Gmsh.y"
+#line 2627 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d ;    ;
     break;}
 case 351:
-#line 2621 "Gmsh.y"
+#line 2628 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d ;    ;
     break;}
 case 352:
-#line 2622 "Gmsh.y"
+#line 2629 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d ;    ;
     break;}
 case 353:
-#line 2623 "Gmsh.y"
+#line 2630 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d ;    ;
     break;}
 case 354:
-#line 2624 "Gmsh.y"
+#line 2631 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d ; ;
     break;}
 case 355:
-#line 2625 "Gmsh.y"
+#line 2632 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 356:
-#line 2626 "Gmsh.y"
+#line 2633 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 357:
-#line 2627 "Gmsh.y"
+#line 2634 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 358:
-#line 2628 "Gmsh.y"
+#line 2635 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 359:
-#line 2629 "Gmsh.y"
+#line 2636 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 360:
-#line 2630 "Gmsh.y"
+#line 2637 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 361:
-#line 2631 "Gmsh.y"
+#line 2638 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 362:
-#line 2632 "Gmsh.y"
+#line 2639 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 363:
-#line 2633 "Gmsh.y"
+#line 2640 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 364:
-#line 2634 "Gmsh.y"
+#line 2641 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 365:
-#line 2635 "Gmsh.y"
+#line 2642 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
     break;}
 case 366:
-#line 2636 "Gmsh.y"
+#line 2643 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 367:
-#line 2637 "Gmsh.y"
+#line 2644 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 368:
-#line 2638 "Gmsh.y"
+#line 2645 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 369:
-#line 2639 "Gmsh.y"
+#line 2646 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 370:
-#line 2640 "Gmsh.y"
+#line 2647 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 371:
-#line 2641 "Gmsh.y"
+#line 2648 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 372:
-#line 2642 "Gmsh.y"
+#line 2649 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 373:
-#line 2643 "Gmsh.y"
+#line 2650 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 374:
-#line 2644 "Gmsh.y"
+#line 2651 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 375:
-#line 2645 "Gmsh.y"
+#line 2652 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 376:
-#line 2647 "Gmsh.y"
+#line 2654 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 377:
-#line 2648 "Gmsh.y"
+#line 2655 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 378:
-#line 2649 "Gmsh.y"
+#line 2656 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 379:
-#line 2650 "Gmsh.y"
+#line 2657 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 380:
-#line 2651 "Gmsh.y"
+#line 2658 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 381:
-#line 2652 "Gmsh.y"
+#line 2659 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 382:
-#line 2653 "Gmsh.y"
+#line 2660 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 383:
-#line 2654 "Gmsh.y"
+#line 2661 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 384:
-#line 2655 "Gmsh.y"
+#line 2662 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 385:
-#line 2656 "Gmsh.y"
+#line 2663 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 386:
-#line 2657 "Gmsh.y"
+#line 2664 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
     break;}
 case 387:
-#line 2658 "Gmsh.y"
+#line 2665 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 388:
-#line 2659 "Gmsh.y"
+#line 2666 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 389:
-#line 2660 "Gmsh.y"
+#line 2667 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 390:
-#line 2661 "Gmsh.y"
+#line 2668 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 391:
-#line 2662 "Gmsh.y"
+#line 2669 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 392:
-#line 2663 "Gmsh.y"
+#line 2670 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 393:
-#line 2664 "Gmsh.y"
+#line 2671 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 394:
-#line 2665 "Gmsh.y"
+#line 2672 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 395:
-#line 2666 "Gmsh.y"
+#line 2673 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 396:
-#line 2667 "Gmsh.y"
+#line 2674 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 397:
-#line 2676 "Gmsh.y"
+#line 2683 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 398:
-#line 2677 "Gmsh.y"
+#line 2684 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 399:
-#line 2678 "Gmsh.y"
+#line 2685 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->rank(); ;
     break;}
 case 400:
-#line 2679 "Gmsh.y"
+#line 2686 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->size(); ;
     break;}
 case 401:
-#line 2684 "Gmsh.y"
+#line 2691 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -7597,7 +7604,7 @@ case 401:
     ;
     break;}
 case 402:
-#line 2695 "Gmsh.y"
+#line 2702 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -7615,7 +7622,7 @@ case 402:
     ;
     break;}
 case 403:
-#line 2712 "Gmsh.y"
+#line 2719 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -7627,7 +7634,7 @@ case 403:
     ;
     break;}
 case 404:
-#line 2723 "Gmsh.y"
+#line 2730 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -7645,7 +7652,7 @@ case 404:
     ;
     break;}
 case 405:
-#line 2742 "Gmsh.y"
+#line 2749 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-2].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-2].c);
@@ -7662,7 +7669,7 @@ case 405:
     ;
     break;}
 case 406:
-#line 2758 "Gmsh.y"
+#line 2765 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-5].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-5].c);
@@ -7679,7 +7686,7 @@ case 406:
     ;
     break;}
 case 407:
-#line 2774 "Gmsh.y"
+#line 2781 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-3].c);
@@ -7696,7 +7703,7 @@ case 407:
     ;
     break;}
 case 408:
-#line 2790 "Gmsh.y"
+#line 2797 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-6].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-6].c);
@@ -7713,130 +7720,130 @@ case 408:
     ;
     break;}
 case 409:
-#line 2808 "Gmsh.y"
+#line 2815 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double)) ;
     ;
     break;}
 case 410:
-#line 2812 "Gmsh.y"
+#line 2819 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = -yyvsp[0].v[i] ;
     ;
     break;}
 case 411:
-#line 2816 "Gmsh.y"
+#line 2823 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 412:
-#line 2820 "Gmsh.y"
+#line 2827 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i] ;
     ;
     break;}
 case 413:
-#line 2824 "Gmsh.y"
+#line 2831 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i] ;
     ;
     break;}
 case 414:
-#line 2831 "Gmsh.y"
+#line 2838 "Gmsh.y"
 { 
       yyval.v[0]=yyvsp[-9].d;  yyval.v[1]=yyvsp[-7].d;  yyval.v[2]=yyvsp[-5].d;  yyval.v[3]=yyvsp[-3].d; yyval.v[4]=yyvsp[-1].d;
     ;
     break;}
 case 415:
-#line 2835 "Gmsh.y"
+#line 2842 "Gmsh.y"
 { 
       yyval.v[0]=yyvsp[-7].d;  yyval.v[1]=yyvsp[-5].d;  yyval.v[2]=yyvsp[-3].d;  yyval.v[3]=yyvsp[-1].d; yyval.v[4]=1.0;
     ;
     break;}
 case 416:
-#line 2839 "Gmsh.y"
+#line 2846 "Gmsh.y"
 {
       yyval.v[0]=yyvsp[-5].d;  yyval.v[1]=yyvsp[-3].d;  yyval.v[2]=yyvsp[-1].d;  yyval.v[3]=0.0; yyval.v[4]=1.0;
     ;
     break;}
 case 417:
-#line 2843 "Gmsh.y"
+#line 2850 "Gmsh.y"
 {
       yyval.v[0]=yyvsp[-5].d;  yyval.v[1]=yyvsp[-3].d;  yyval.v[2]=yyvsp[-1].d;  yyval.v[3]=0.0; yyval.v[4]=1.0;
     ;
     break;}
 case 418:
-#line 2850 "Gmsh.y"
+#line 2857 "Gmsh.y"
 {
     ;
     break;}
 case 419:
-#line 2853 "Gmsh.y"
+#line 2860 "Gmsh.y"
 {
     ;
     break;}
 case 420:
-#line 2859 "Gmsh.y"
+#line 2866 "Gmsh.y"
 {
     ;
     break;}
 case 421:
-#line 2862 "Gmsh.y"
+#line 2869 "Gmsh.y"
 {
     ;
     break;}
 case 422:
-#line 2868 "Gmsh.y"
+#line 2875 "Gmsh.y"
 {
     ;
     break;}
 case 423:
-#line 2871 "Gmsh.y"
+#line 2878 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 424:
-#line 2875 "Gmsh.y"
+#line 2882 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 425:
-#line 2882 "Gmsh.y"
+#line 2889 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(List_T*)) ;
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 426:
-#line 2887 "Gmsh.y"
+#line 2894 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 427:
-#line 2895 "Gmsh.y"
+#line 2902 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 428:
-#line 2900 "Gmsh.y"
+#line 2907 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 429:
-#line 2904 "Gmsh.y"
+#line 2911 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 430:
-#line 2908 "Gmsh.y"
+#line 2915 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
       for(i=0 ; i<List_Nbr(yyval.l) ; i++){
@@ -7846,7 +7853,7 @@ case 430:
     ;
     break;}
 case 431:
-#line 2919 "Gmsh.y"
+#line 2926 "Gmsh.y"
 { 
       yyval.l = List_Create(2,1,sizeof(double)) ; 
       for(d=yyvsp[-2].d ; (yyvsp[-2].d<yyvsp[0].d)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; (yyvsp[-2].d<yyvsp[0].d)?(d+=1.):(d-=1.)) 
@@ -7854,7 +7861,7 @@ case 431:
     ;
     break;}
 case 432:
-#line 2925 "Gmsh.y"
+#line 2932 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ; 
       if(!yyvsp[0].d || (yyvsp[-4].d<yyvsp[-2].d && yyvsp[0].d<0) || (yyvsp[-4].d>yyvsp[-2].d && yyvsp[0].d>0)){
@@ -7867,7 +7874,7 @@ case 432:
    ;
     break;}
 case 433:
-#line 2936 "Gmsh.y"
+#line 2943 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -7883,7 +7890,7 @@ case 433:
     ;
     break;}
 case 434:
-#line 2950 "Gmsh.y"
+#line 2957 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -7901,7 +7908,7 @@ case 434:
     ;
     break;}
 case 435:
-#line 2966 "Gmsh.y"
+#line 2973 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -7923,7 +7930,7 @@ case 435:
     ;
     break;}
 case 436:
-#line 2986 "Gmsh.y"
+#line 2993 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -7947,26 +7954,26 @@ case 436:
     ;
     break;}
 case 437:
-#line 3011 "Gmsh.y"
+#line 3018 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 438:
-#line 3016 "Gmsh.y"
+#line 3023 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 439:
-#line 3020 "Gmsh.y"
+#line 3027 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 440:
-#line 3024 "Gmsh.y"
+#line 3031 "Gmsh.y"
 {
       for(i=0 ; i<List_Nbr(yyvsp[0].l) ; i++){
 	List_Read(yyvsp[0].l, i, &d) ;
@@ -7976,26 +7983,26 @@ case 440:
     ;
     break;}
 case 441:
-#line 3036 "Gmsh.y"
+#line 3043 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 442:
-#line 3040 "Gmsh.y"
+#line 3047 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 443:
-#line 3051 "Gmsh.y"
+#line 3058 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
       if(flag) yymsg(GERROR, "Unknown color '%s'", yyvsp[0].c);
     ;
     break;}
 case 444:
-#line 3056 "Gmsh.y"
+#line 3063 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-4].c))){
 	yymsg(GERROR, "Unknown color option class '%s'", yyvsp[-4].c);
@@ -8013,13 +8020,13 @@ case 444:
     ;
     break;}
 case 445:
-#line 3075 "Gmsh.y"
+#line 3082 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 446:
-#line 3079 "Gmsh.y"
+#line 3086 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       GmshColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -8032,26 +8039,26 @@ case 446:
     ;
     break;}
 case 447:
-#line 3093 "Gmsh.y"
+#line 3100 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 448:
-#line 3098 "Gmsh.y"
+#line 3105 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 449:
-#line 3105 "Gmsh.y"
+#line 3112 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 450:
-#line 3109 "Gmsh.y"
+#line 3116 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-3].c)+strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       strcpy(yyval.c, yyvsp[-3].c) ;  
@@ -8061,7 +8068,7 @@ case 450:
     ;
     break;}
 case 451:
-#line 3117 "Gmsh.y"
+#line 3124 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       for(i=strlen(yyvsp[-1].c)-1; i>=0; i--){
@@ -8076,13 +8083,13 @@ case 451:
     ;
     break;}
 case 452:
-#line 3130 "Gmsh.y"
+#line 3137 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 453:
-#line 3134 "Gmsh.y"
+#line 3141 "Gmsh.y"
 {
       i = PrintListOfDouble(yyvsp[-3].c,yyvsp[-1].l,tmpstring);
       if(i<0){
@@ -8102,7 +8109,7 @@ case 453:
     ;
     break;}
 case 454:
-#line 3152 "Gmsh.y"
+#line 3159 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-3].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-3].c);
@@ -8118,7 +8125,7 @@ case 454:
     ;
     break;}
 case 455:
-#line 3166 "Gmsh.y"
+#line 3173 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-6].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-6].c);
@@ -8366,7 +8373,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 3181 "Gmsh.y"
+#line 3188 "Gmsh.y"
 
 
 void InitSymbols(void){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index db9782cc75d42c1c485844ee54355c7fa195efa2..61089192a619854bc90b95609488d11b44353802 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,6 +1,6 @@
 %{ 
 
-// $Id: Gmsh.y,v 1.137 2003-04-14 17:13:15 geuzaine Exp $
+// $Id: Gmsh.y,v 1.138 2003-04-19 22:10:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -1959,11 +1959,18 @@ Command :
 
 	yyinTab[RecursionLevel++] = yyin;
 
-	strcpy(tmpstring, yyname);
-	i = strlen(yyname)-1 ;
-	while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
-	tmpstring[i+1] = '\0';
-	strcat(tmpstring,$2);
+	if($2[0] == '/' || $2[0] == '\\' || (strlen($2)>2 && $2[1] == ':')){
+	  // do nothing: $2 is an absolute path
+	  strcpy(tmpstring, $2);
+	}
+	else{
+	  // append $2 to the path of the parent file
+	  strcpy(tmpstring, yyname);
+	  i = strlen(yyname)-1 ;
+	  while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
+	  tmpstring[i+1] = '\0';
+	  strcat(tmpstring, $2);
+	}
 
 	if((yyin = fopen(tmpstring,"r"))){
 	  Msg(INFO, "Including '%s'", tmpstring); 
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index e28ad656e34f99d218764751d6f0be8d8d38fda3..3a62c3452560c06d5658e4250e34bde3ca3623cf 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.155 2003-04-14 17:13:16 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.156 2003-04-19 22:10:29 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -1012,7 +1012,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "Gmsh.l"
 
-// $Id: Gmsh.yy.cpp,v 1.155 2003-04-14 17:13:16 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.156 2003-04-19 22:10:29 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //