diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 49b67c0d355cbf8860f44fe8f1bb6c50f6b6a0b2..9a1f02d29b274a320d0187c8a74b4a0d44a7b437 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.167 2003-11-21 08:00:03 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.168 2003-11-26 16:35:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -269,8 +269,9 @@ void yyerror (char *s);
 void yymsg (int type, char *fmt, ...);
 void skip_until (char *skip, char *until);
 int PrintListOfDouble (char *format, List_T *list, char *buffer);
+ void FixRelativePath(char *in, char *out);
 
-#line 84 "Gmsh.y"
+#line 85 "Gmsh.y"
 typedef union {
   char *c;
   int i;
@@ -723,52 +724,52 @@ static const short yyrhs[] = {   206,
 
 #if YYDEBUG != 0
 static const short yyrline[] = { 0,
-   169,   171,   172,   173,   178,   180,   183,   191,   205,   215,
-   217,   220,   222,   223,   226,   232,   237,   238,   239,   242,
-   246,   249,   255,   260,   266,   274,   279,   283,   289,   294,
-   298,   303,   307,   310,   315,   319,   323,   327,   332,   336,
-   339,   343,   347,   351,   355,   359,   363,   366,   370,   373,
-   377,   380,   387,   391,   397,   399,   400,   401,   402,   403,
-   404,   405,   406,   407,   408,   409,   410,   413,   418,   433,
-   438,   444,   449,   450,   451,   452,   453,   454,   455,   456,
-   457,   458,   459,   460,   461,   462,   463,   464,   465,   466,
-   467,   468,   469,   470,   471,   472,   473,   474,   477,   480,
-   484,   490,   496,   499,   503,   509,   515,   518,   522,   528,
-   534,   537,   541,   549,   555,   558,   562,   570,   576,   579,
-   583,   591,   597,   600,   604,   616,   622,   625,   629,   641,
-   647,   650,   654,   666,   672,   675,   679,   692,   698,   701,
-   705,   718,   724,   727,   731,   744,   750,   753,   757,   770,
-   776,   779,   783,   796,   802,   805,   809,   822,   828,   831,
-   835,   858,   864,   867,   871,   894,   900,   903,   907,   930,
-   936,   939,   943,   961,   967,   970,   974,   992,   998,  1001,
-  1005,  1023,  1029,  1032,  1036,  1053,  1059,  1062,  1066,  1083,
-  1089,  1092,  1096,  1113,  1119,  1125,  1132,  1140,  1146,  1152,
-  1159,  1167,  1176,  1178,  1179,  1180,  1181,  1184,  1186,  1189,
-  1220,  1254,  1301,  1316,  1325,  1340,  1352,  1366,  1389,  1413,
-  1425,  1439,  1451,  1465,  1485,  1507,  1519,  1535,  1546,  1552,
-  1571,  1585,  1591,  1597,  1616,  1622,  1628,  1644,  1651,  1657,
-  1663,  1674,  1685,  1710,  1716,  1735,  1757,  1763,  1771,  1777,
-  1783,  1792,  1798,  1804,  1814,  1820,  1825,  1830,  1837,  1839,
-  1840,  1843,  1848,  1852,  1866,  1880,  1898,  1909,  1919,  1927,
-  1931,  1939,  1951,  2025,  2037,  2057,  2062,  2066,  2086,  2098,
-  2108,  2129,  2150,  2171,  2177,  2182,  2187,  2191,  2199,  2212,
-  2222,  2232,  2237,  2247,  2252,  2262,  2267,  2279,  2296,  2313,
-  2330,  2335,  2352,  2357,  2374,  2379,  2399,  2415,  2431,  2447,
-  2452,  2469,  2475,  2492,  2498,  2517,  2521,  2526,  2553,  2577,
-  2585,  2604,  2622,  2640,  2662,  2683,  2704,  2718,  2737,  2742,
-  2751,  2753,  2754,  2755,  2756,  2759,  2761,  2762,  2763,  2764,
-  2765,  2766,  2767,  2768,  2775,  2776,  2777,  2778,  2779,  2780,
-  2781,  2782,  2783,  2784,  2785,  2786,  2787,  2788,  2789,  2790,
-  2791,  2792,  2793,  2794,  2795,  2796,  2797,  2798,  2799,  2800,
-  2801,  2802,  2803,  2804,  2805,  2806,  2808,  2809,  2810,  2811,
-  2812,  2813,  2814,  2815,  2816,  2817,  2818,  2819,  2820,  2821,
-  2822,  2823,  2824,  2825,  2826,  2827,  2828,  2833,  2838,  2839,
-  2840,  2844,  2855,  2872,  2883,  2902,  2918,  2934,  2950,  2967,
-  2972,  2976,  2980,  2984,  2990,  2995,  2999,  3003,  3009,  3013,
-  3018,  3022,  3027,  3031,  3035,  3041,  3047,  3054,  3060,  3064,
-  3068,  3078,  3085,  3096,  3116,  3125,  3134,  3145,  3159,  3175,
-  3195,  3219,  3225,  3229,  3233,  3244,  3249,  3260,  3265,  3283,
-  3288,  3301,  3307,  3313,  3318,  3326,  3339,  3343,  3361,  3375
+   170,   172,   173,   174,   179,   181,   184,   192,   206,   216,
+   218,   221,   223,   224,   227,   233,   238,   239,   240,   243,
+   247,   250,   256,   261,   267,   275,   280,   284,   290,   295,
+   299,   304,   308,   311,   316,   320,   324,   328,   333,   337,
+   340,   344,   348,   352,   356,   360,   364,   367,   371,   374,
+   378,   381,   388,   392,   398,   400,   401,   402,   403,   404,
+   405,   406,   407,   408,   409,   410,   411,   414,   419,   434,
+   439,   445,   450,   451,   452,   453,   454,   455,   456,   457,
+   458,   459,   460,   461,   462,   463,   464,   465,   466,   467,
+   468,   469,   470,   471,   472,   473,   474,   475,   478,   481,
+   485,   491,   497,   500,   504,   510,   516,   519,   523,   529,
+   535,   538,   542,   550,   556,   559,   563,   571,   577,   580,
+   584,   592,   598,   601,   605,   617,   623,   626,   630,   642,
+   648,   651,   655,   667,   673,   676,   680,   693,   699,   702,
+   706,   719,   725,   728,   732,   745,   751,   754,   758,   771,
+   777,   780,   784,   797,   803,   806,   810,   823,   829,   832,
+   836,   859,   865,   868,   872,   895,   901,   904,   908,   931,
+   937,   940,   944,   962,   968,   971,   975,   993,   999,  1002,
+  1006,  1024,  1030,  1033,  1037,  1054,  1060,  1063,  1067,  1084,
+  1090,  1093,  1097,  1114,  1120,  1126,  1133,  1141,  1147,  1153,
+  1160,  1168,  1177,  1179,  1180,  1181,  1182,  1185,  1187,  1190,
+  1221,  1255,  1302,  1317,  1326,  1341,  1353,  1367,  1390,  1414,
+  1426,  1440,  1452,  1466,  1486,  1508,  1520,  1536,  1547,  1553,
+  1572,  1586,  1592,  1598,  1617,  1623,  1629,  1645,  1652,  1658,
+  1664,  1675,  1686,  1711,  1717,  1736,  1758,  1764,  1772,  1778,
+  1784,  1793,  1799,  1805,  1815,  1821,  1826,  1831,  1838,  1840,
+  1841,  1844,  1849,  1853,  1867,  1881,  1899,  1910,  1920,  1928,
+  1932,  1940,  1952,  2019,  2032,  2049,  2054,  2058,  2078,  2090,
+  2100,  2121,  2142,  2163,  2169,  2174,  2179,  2183,  2191,  2204,
+  2214,  2224,  2229,  2239,  2244,  2254,  2259,  2271,  2288,  2305,
+  2322,  2327,  2344,  2349,  2366,  2371,  2391,  2407,  2423,  2439,
+  2444,  2461,  2467,  2484,  2490,  2509,  2513,  2518,  2545,  2569,
+  2577,  2596,  2614,  2632,  2654,  2675,  2696,  2710,  2729,  2734,
+  2743,  2745,  2746,  2747,  2748,  2751,  2753,  2754,  2755,  2756,
+  2757,  2758,  2759,  2760,  2767,  2768,  2769,  2770,  2771,  2772,
+  2773,  2774,  2775,  2776,  2777,  2778,  2779,  2780,  2781,  2782,
+  2783,  2784,  2785,  2786,  2787,  2788,  2789,  2790,  2791,  2792,
+  2793,  2794,  2795,  2796,  2797,  2798,  2800,  2801,  2802,  2803,
+  2804,  2805,  2806,  2807,  2808,  2809,  2810,  2811,  2812,  2813,
+  2814,  2815,  2816,  2817,  2818,  2819,  2820,  2825,  2830,  2831,
+  2832,  2836,  2847,  2864,  2875,  2894,  2910,  2926,  2942,  2959,
+  2964,  2968,  2972,  2976,  2982,  2987,  2991,  2995,  3001,  3005,
+  3010,  3014,  3019,  3023,  3027,  3033,  3039,  3046,  3052,  3056,
+  3060,  3070,  3077,  3088,  3108,  3117,  3126,  3137,  3151,  3167,
+  3187,  3211,  3217,  3221,  3225,  3236,  3241,  3252,  3257,  3275,
+  3280,  3293,  3299,  3305,  3310,  3318,  3331,  3335,  3353,  3367
 };
 #endif
 
@@ -4540,19 +4541,19 @@ yyreduce:
   switch (yyn) {
 
 case 4:
-#line 173 "Gmsh.y"
+#line 174 "Gmsh.y"
 { yyerrok ; return 1; ;
     break;}
 case 5:
-#line 179 "Gmsh.y"
+#line 180 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 6:
-#line 180 "Gmsh.y"
+#line 181 "Gmsh.y"
 { yyval.d = -yyvsp[0].d; ;
     break;}
 case 7:
-#line 185 "Gmsh.y"
+#line 186 "Gmsh.y"
 {
       yymsg(INFO, "STL file format");
       STL_Surf = Create_Surface(1, MSH_SURF_STL);
@@ -4561,7 +4562,7 @@ case 7:
     ;
     break;}
 case 8:
-#line 199 "Gmsh.y"
+#line 200 "Gmsh.y"
 {
       STL_Surf->STL->Add_Facet( yyvsp[-12].d, yyvsp[-11].d, yyvsp[-10].d,
 				yyvsp[-8].d, yyvsp[-7].d, yyvsp[-6].d,
@@ -4570,7 +4571,7 @@ case 8:
     ;
     break;}
 case 9:
-#line 206 "Gmsh.y"
+#line 207 "Gmsh.y"
 {
       yymsg(INFO, "STL file format read");
       Tree_Add(THEM->Surfaces, &STL_Surf);
@@ -4578,79 +4579,79 @@ case 9:
     ;
     break;}
 case 12:
-#line 221 "Gmsh.y"
+#line 222 "Gmsh.y"
 { return 1; ;
     break;}
 case 13:
-#line 222 "Gmsh.y"
+#line 223 "Gmsh.y"
 { return 1; ;
     break;}
 case 14:
-#line 223 "Gmsh.y"
+#line 224 "Gmsh.y"
 { return 1; ;
     break;}
 case 15:
-#line 228 "Gmsh.y"
+#line 229 "Gmsh.y"
 {
       yymsg(INFO, "Step Iso-10303-21 file format");
       Create_Step_Solid_BRep();
     ;
     break;}
 case 16:
-#line 233 "Gmsh.y"
+#line 234 "Gmsh.y"
 {
       yymsg(INFO, "Step Iso-10303-21 file format read");
       Resolve_BREP ();
     ;
     break;}
 case 20:
-#line 244 "Gmsh.y"
+#line 245 "Gmsh.y"
 {
     ;
     break;}
 case 21:
-#line 247 "Gmsh.y"
+#line 248 "Gmsh.y"
 {
     ;
     break;}
 case 22:
-#line 251 "Gmsh.y"
+#line 252 "Gmsh.y"
 {
    ;
     break;}
 case 23:
-#line 257 "Gmsh.y"
+#line 258 "Gmsh.y"
 {
         Add_Cartesian_Point((int)yyvsp[-8].d, yyvsp[-4].c, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2]);
     ;
     break;}
 case 24:
-#line 263 "Gmsh.y"
+#line 264 "Gmsh.y"
 {
        Add_BSpline_Curve_With_Knots ((int)yyvsp[-22].d, yyvsp[-18].c, (int) yyvsp[-16].d, yyvsp[-14].l,	yyvsp[-6].l, yyvsp[-4].l, 0., 1.);
     ;
     break;}
 case 25:
-#line 270 "Gmsh.y"
+#line 271 "Gmsh.y"
 {
       Add_BSpline_Surface_With_Knots ((int)yyvsp[-30].d, yyvsp[-26].c, (int) yyvsp[-24].d, (int) yyvsp[-22].d, yyvsp[-20].l, yyvsp[-10].l,
 				      yyvsp[-8].l, yyvsp[-6].l, yyvsp[-4].l, 0., 1., 0., 1. );
     ;
     break;}
 case 26:
-#line 276 "Gmsh.y"
+#line 277 "Gmsh.y"
 {
       Add_Edge_Curve ((int)yyvsp[-14].d, yyvsp[-10].c , (int)yyvsp[-8].d , (int)yyvsp[-6].d, (int)yyvsp[-4].d);
     ;
     break;}
 case 27:
-#line 280 "Gmsh.y"
+#line 281 "Gmsh.y"
 {
       Add_Face_Outer_Bound((int)yyvsp[-10].d, yyvsp[-6].c, (int)yyvsp[-4].d, yyvsp[-2].i, 1);
     ;
     break;}
 case 28:
-#line 284 "Gmsh.y"
+#line 285 "Gmsh.y"
 {
       // check the norm! Face_Bound : hole outside surface!
       yymsg(INFO, "Found a face bound");
@@ -4658,211 +4659,211 @@ case 28:
     ;
     break;}
 case 29:
-#line 291 "Gmsh.y"
+#line 292 "Gmsh.y"
 {
       Add_Oriented_Edge((int)yyvsp[-14].d, yyvsp[-10].c, (int)yyvsp[-4].d, yyvsp[-2].i);
     ;
     break;}
 case 30:
-#line 295 "Gmsh.y"
+#line 296 "Gmsh.y"
 {
       Add_Edge_Loop((int)yyvsp[-8].d, yyvsp[-4].c, yyvsp[-2].l);
     ;
     break;}
 case 31:
-#line 300 "Gmsh.y"
+#line 301 "Gmsh.y"
 {
       Add_Advanced_Face((int)yyvsp[-12].d, yyvsp[-8].c, yyvsp[-6].l, (int)yyvsp[-4].d, yyvsp[-2].i);
     ;
     break;}
 case 32:
-#line 304 "Gmsh.y"
+#line 305 "Gmsh.y"
 {
       Add_Vertex_Point((int)yyvsp[-8].d, yyvsp[-4].c, (int)yyvsp[-2].d);
     ;
     break;}
 case 33:
-#line 308 "Gmsh.y"
+#line 309 "Gmsh.y"
 {
     ;
     break;}
 case 34:
-#line 312 "Gmsh.y"
+#line 313 "Gmsh.y"
 {
       Add_Axis2_Placement3D  ( (int)yyvsp[-12].d, (int)yyvsp[-4].d, (int)yyvsp[-2].d, (int)yyvsp[-6].d);
     ;
     break;}
 case 35:
-#line 316 "Gmsh.y"
+#line 317 "Gmsh.y"
 {
       Add_Direction((int)yyvsp[-8].d , yyvsp[-4].c, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2]);
     ;
     break;}
 case 36:
-#line 320 "Gmsh.y"
+#line 321 "Gmsh.y"
 {
       Add_Plane((int)yyvsp[-8].d, yyvsp[-4].c, (int)yyvsp[-2].d);
     ;
     break;}
 case 37:
-#line 324 "Gmsh.y"
+#line 325 "Gmsh.y"
 {
       Add_Line ((int)yyvsp[-10].d, yyvsp[-6].c , (int) yyvsp[-4].d, (int)yyvsp[-2].d);
     ;
     break;}
 case 38:
-#line 328 "Gmsh.y"
+#line 329 "Gmsh.y"
 {
       yymsg(INFO, "Found a closed shell");
       Add_Closed_Shell((int)yyvsp[-8].d, yyvsp[-4].c , yyvsp[-2].l);
     ;
     break;}
 case 39:
-#line 334 "Gmsh.y"
+#line 335 "Gmsh.y"
 {
     ;
     break;}
 case 40:
-#line 337 "Gmsh.y"
+#line 338 "Gmsh.y"
 {
     ;
     break;}
 case 41:
-#line 340 "Gmsh.y"
+#line 341 "Gmsh.y"
 {
       Add_Cylinder ((int)yyvsp[-10].d, yyvsp[-6].c , (int)yyvsp[-4].d, yyvsp[-2].d);
     ;
     break;}
 case 42:
-#line 344 "Gmsh.y"
+#line 345 "Gmsh.y"
 {
       Add_Cone ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d, yyvsp[-2].d);
     ;
     break;}
 case 43:
-#line 348 "Gmsh.y"
+#line 349 "Gmsh.y"
 {
       Add_Torus ((int)yyvsp[-12].d, yyvsp[-8].c , (int)yyvsp[-6].d, yyvsp[-4].d, yyvsp[-2].d);
     ;
     break;}
 case 44:
-#line 352 "Gmsh.y"
+#line 353 "Gmsh.y"
 {
       Add_Circle((int) yyvsp[-10].d, yyvsp[-6].c, (int) yyvsp[-4].d, yyvsp[-2].d);
     ;
     break;}
 case 45:
-#line 356 "Gmsh.y"
+#line 357 "Gmsh.y"
 {
       Add_Ellipse((int) yyvsp[-12].d, yyvsp[-8].c, (int) yyvsp[-6].d, yyvsp[-4].d, yyvsp[-2].d);
     ;
     break;}
 case 46:
-#line 361 "Gmsh.y"
+#line 362 "Gmsh.y"
 {
     ;
     break;}
 case 47:
-#line 364 "Gmsh.y"
+#line 365 "Gmsh.y"
 {
     ;
     break;}
 case 48:
-#line 368 "Gmsh.y"
+#line 369 "Gmsh.y"
 {
     ;
     break;}
 case 49:
-#line 371 "Gmsh.y"
+#line 372 "Gmsh.y"
 {
     ;
     break;}
 case 50:
-#line 375 "Gmsh.y"
+#line 376 "Gmsh.y"
 {
     ;
     break;}
 case 51:
-#line 378 "Gmsh.y"
+#line 379 "Gmsh.y"
 {
     ;
     break;}
 case 52:
-#line 381 "Gmsh.y"
+#line 382 "Gmsh.y"
 {
     ;
     break;}
 case 53:
-#line 389 "Gmsh.y"
+#line 390 "Gmsh.y"
 {
   ;
     break;}
 case 54:
-#line 392 "Gmsh.y"
+#line 393 "Gmsh.y"
 {
     yymsg(INFO, "Gmsh file format read");
   ;
     break;}
 case 55:
-#line 398 "Gmsh.y"
+#line 399 "Gmsh.y"
 { return 1; ;
     break;}
 case 56:
-#line 399 "Gmsh.y"
+#line 400 "Gmsh.y"
 { return 1; ;
     break;}
 case 57:
-#line 400 "Gmsh.y"
+#line 401 "Gmsh.y"
 { return 1; ;
     break;}
 case 58:
-#line 401 "Gmsh.y"
+#line 402 "Gmsh.y"
 { return 1; ;
     break;}
 case 59:
-#line 402 "Gmsh.y"
+#line 403 "Gmsh.y"
 { return 1; ;
     break;}
 case 60:
-#line 403 "Gmsh.y"
+#line 404 "Gmsh.y"
 { return 1; ;
     break;}
 case 61:
-#line 404 "Gmsh.y"
+#line 405 "Gmsh.y"
 { return 1; ;
     break;}
 case 62:
-#line 405 "Gmsh.y"
+#line 406 "Gmsh.y"
 { return 1; ;
     break;}
 case 63:
-#line 406 "Gmsh.y"
+#line 407 "Gmsh.y"
 { return 1; ;
     break;}
 case 64:
-#line 407 "Gmsh.y"
+#line 408 "Gmsh.y"
 { return 1; ;
     break;}
 case 65:
-#line 408 "Gmsh.y"
+#line 409 "Gmsh.y"
 { return 1; ;
     break;}
 case 66:
-#line 409 "Gmsh.y"
+#line 410 "Gmsh.y"
 { return 1; ;
     break;}
 case 67:
-#line 410 "Gmsh.y"
+#line 411 "Gmsh.y"
 { return 1; ;
     break;}
 case 68:
-#line 415 "Gmsh.y"
+#line 416 "Gmsh.y"
 {
       Msg(DIRECT, yyvsp[-2].c);
     ;
     break;}
 case 69:
-#line 419 "Gmsh.y"
+#line 420 "Gmsh.y"
 {
       i = PrintListOfDouble(yyvsp[-4].c, yyvsp[-2].l, tmpstring);
       if(i < 0) 
@@ -4875,96 +4876,96 @@ case 69:
     ;
     break;}
 case 70:
-#line 435 "Gmsh.y"
+#line 436 "Gmsh.y"
 { 
       if(!strcmp(yyvsp[-5].c, "View")) EndView(View, 1, yyname, yyvsp[-4].c); 
     ;
     break;}
 case 71:
-#line 439 "Gmsh.y"
+#line 440 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-7].c, "View")) EndView(View, 1, yyname, yyvsp[-6].c);
     ;
     break;}
 case 72:
-#line 446 "Gmsh.y"
+#line 447 "Gmsh.y"
 {
       View = BeginView(1); 
     ;
     break;}
 case 99:
-#line 479 "Gmsh.y"
+#line 480 "Gmsh.y"
 { List_Add(View->SP, &yyvsp[0].d) ; ;
     break;}
 case 100:
-#line 481 "Gmsh.y"
+#line 482 "Gmsh.y"
 { List_Add(View->SP, &yyvsp[0].d) ; ;
     break;}
 case 101:
-#line 486 "Gmsh.y"
+#line 487 "Gmsh.y"
 { 
       List_Add(View->SP, &yyvsp[-5].d); List_Add(View->SP, &yyvsp[-3].d);
       List_Add(View->SP, &yyvsp[-1].d);
     ;
     break;}
 case 102:
-#line 491 "Gmsh.y"
+#line 492 "Gmsh.y"
 {
       View->NbSP++ ;
     ;
     break;}
 case 103:
-#line 498 "Gmsh.y"
+#line 499 "Gmsh.y"
 { List_Add(View->VP, &yyvsp[0].d) ; ;
     break;}
 case 104:
-#line 500 "Gmsh.y"
+#line 501 "Gmsh.y"
 { List_Add(View->VP, &yyvsp[0].d) ; ;
     break;}
 case 105:
-#line 505 "Gmsh.y"
+#line 506 "Gmsh.y"
 { 
       List_Add(View->VP, &yyvsp[-5].d); List_Add(View->VP, &yyvsp[-3].d);
       List_Add(View->VP, &yyvsp[-1].d); 
     ;
     break;}
 case 106:
-#line 510 "Gmsh.y"
+#line 511 "Gmsh.y"
 {
       View->NbVP++ ;
     ;
     break;}
 case 107:
-#line 517 "Gmsh.y"
+#line 518 "Gmsh.y"
 { List_Add(View->TP, &yyvsp[0].d) ; ;
     break;}
 case 108:
-#line 519 "Gmsh.y"
+#line 520 "Gmsh.y"
 { List_Add(View->TP, &yyvsp[0].d) ; ;
     break;}
 case 109:
-#line 524 "Gmsh.y"
+#line 525 "Gmsh.y"
 { 
       List_Add(View->TP, &yyvsp[-5].d); List_Add(View->TP, &yyvsp[-3].d);
       List_Add(View->TP, &yyvsp[-1].d);
     ;
     break;}
 case 110:
-#line 529 "Gmsh.y"
+#line 530 "Gmsh.y"
 {
       View->NbTP++ ;
     ;
     break;}
 case 111:
-#line 536 "Gmsh.y"
+#line 537 "Gmsh.y"
 { List_Add(View->SL, &yyvsp[0].d) ; ;
     break;}
 case 112:
-#line 538 "Gmsh.y"
+#line 539 "Gmsh.y"
 { List_Add(View->SL, &yyvsp[0].d) ; ;
     break;}
 case 113:
-#line 544 "Gmsh.y"
+#line 545 "Gmsh.y"
 { 
       List_Add(View->SL, &yyvsp[-11].d); List_Add(View->SL, &yyvsp[-5].d);
       List_Add(View->SL, &yyvsp[-9].d); List_Add(View->SL, &yyvsp[-3].d);
@@ -4972,21 +4973,21 @@ case 113:
     ;
     break;}
 case 114:
-#line 550 "Gmsh.y"
+#line 551 "Gmsh.y"
 {
       View->NbSL++ ;
     ;
     break;}
 case 115:
-#line 557 "Gmsh.y"
+#line 558 "Gmsh.y"
 { List_Add(View->VL, &yyvsp[0].d) ; ;
     break;}
 case 116:
-#line 559 "Gmsh.y"
+#line 560 "Gmsh.y"
 { List_Add(View->VL, &yyvsp[0].d) ; ;
     break;}
 case 117:
-#line 565 "Gmsh.y"
+#line 566 "Gmsh.y"
 { 
       List_Add(View->VL, &yyvsp[-11].d); List_Add(View->VL, &yyvsp[-5].d);
       List_Add(View->VL, &yyvsp[-9].d); List_Add(View->VL, &yyvsp[-3].d);
@@ -4994,21 +4995,21 @@ case 117:
     ;
     break;}
 case 118:
-#line 571 "Gmsh.y"
+#line 572 "Gmsh.y"
 {
       View->NbVL++ ;
     ;
     break;}
 case 119:
-#line 578 "Gmsh.y"
+#line 579 "Gmsh.y"
 { List_Add(View->TL, &yyvsp[0].d) ; ;
     break;}
 case 120:
-#line 580 "Gmsh.y"
+#line 581 "Gmsh.y"
 { List_Add(View->TL, &yyvsp[0].d) ; ;
     break;}
 case 121:
-#line 586 "Gmsh.y"
+#line 587 "Gmsh.y"
 { 
       List_Add(View->TL, &yyvsp[-11].d); List_Add(View->TL, &yyvsp[-5].d);
       List_Add(View->TL, &yyvsp[-9].d); List_Add(View->TL, &yyvsp[-3].d);
@@ -5016,21 +5017,21 @@ case 121:
     ;
     break;}
 case 122:
-#line 592 "Gmsh.y"
+#line 593 "Gmsh.y"
 {
       View->NbTL++ ;
     ;
     break;}
 case 123:
-#line 599 "Gmsh.y"
+#line 600 "Gmsh.y"
 { List_Add(View->ST, &yyvsp[0].d) ; ;
     break;}
 case 124:
-#line 601 "Gmsh.y"
+#line 602 "Gmsh.y"
 { List_Add(View->ST, &yyvsp[0].d) ; ;
     break;}
 case 125:
-#line 608 "Gmsh.y"
+#line 609 "Gmsh.y"
 { 
       List_Add(View->ST, &yyvsp[-17].d); List_Add(View->ST, &yyvsp[-11].d);
       List_Add(View->ST, &yyvsp[-5].d);
@@ -5041,21 +5042,21 @@ case 125:
     ;
     break;}
 case 126:
-#line 617 "Gmsh.y"
+#line 618 "Gmsh.y"
 {
       View->NbST++ ;
     ;
     break;}
 case 127:
-#line 624 "Gmsh.y"
+#line 625 "Gmsh.y"
 { List_Add(View->VT, &yyvsp[0].d) ; ;
     break;}
 case 128:
-#line 626 "Gmsh.y"
+#line 627 "Gmsh.y"
 { List_Add(View->VT, &yyvsp[0].d) ; ;
     break;}
 case 129:
-#line 633 "Gmsh.y"
+#line 634 "Gmsh.y"
 { 
       List_Add(View->VT, &yyvsp[-17].d); List_Add(View->VT, &yyvsp[-11].d);
       List_Add(View->VT, &yyvsp[-5].d);
@@ -5066,21 +5067,21 @@ case 129:
     ;
     break;}
 case 130:
-#line 642 "Gmsh.y"
+#line 643 "Gmsh.y"
 {
       View->NbVT++ ;
     ;
     break;}
 case 131:
-#line 649 "Gmsh.y"
+#line 650 "Gmsh.y"
 { List_Add(View->TT, &yyvsp[0].d) ; ;
     break;}
 case 132:
-#line 651 "Gmsh.y"
+#line 652 "Gmsh.y"
 { List_Add(View->TT, &yyvsp[0].d) ; ;
     break;}
 case 133:
-#line 658 "Gmsh.y"
+#line 659 "Gmsh.y"
 { 
       List_Add(View->TT, &yyvsp[-17].d); List_Add(View->TT, &yyvsp[-11].d);
       List_Add(View->TT, &yyvsp[-5].d);
@@ -5091,21 +5092,21 @@ case 133:
     ;
     break;}
 case 134:
-#line 667 "Gmsh.y"
+#line 668 "Gmsh.y"
 {
       View->NbTT++ ;
     ;
     break;}
 case 135:
-#line 674 "Gmsh.y"
+#line 675 "Gmsh.y"
 { List_Add(View->SQ, &yyvsp[0].d) ; ;
     break;}
 case 136:
-#line 676 "Gmsh.y"
+#line 677 "Gmsh.y"
 { List_Add(View->SQ, &yyvsp[0].d) ; ;
     break;}
 case 137:
-#line 684 "Gmsh.y"
+#line 685 "Gmsh.y"
 { 
       List_Add(View->SQ, &yyvsp[-23].d);  List_Add(View->SQ, &yyvsp[-17].d);
       List_Add(View->SQ, &yyvsp[-11].d); List_Add(View->SQ, &yyvsp[-5].d);
@@ -5116,21 +5117,21 @@ case 137:
     ;
     break;}
 case 138:
-#line 693 "Gmsh.y"
+#line 694 "Gmsh.y"
 {
       View->NbSQ++ ;
     ;
     break;}
 case 139:
-#line 700 "Gmsh.y"
+#line 701 "Gmsh.y"
 { List_Add(View->VQ, &yyvsp[0].d) ; ;
     break;}
 case 140:
-#line 702 "Gmsh.y"
+#line 703 "Gmsh.y"
 { List_Add(View->VQ, &yyvsp[0].d) ; ;
     break;}
 case 141:
-#line 710 "Gmsh.y"
+#line 711 "Gmsh.y"
 { 
       List_Add(View->VQ, &yyvsp[-23].d);  List_Add(View->VQ, &yyvsp[-17].d);
       List_Add(View->VQ, &yyvsp[-11].d); List_Add(View->VQ, &yyvsp[-5].d);
@@ -5141,21 +5142,21 @@ case 141:
     ;
     break;}
 case 142:
-#line 719 "Gmsh.y"
+#line 720 "Gmsh.y"
 {
       View->NbVQ++ ;
     ;
     break;}
 case 143:
-#line 726 "Gmsh.y"
+#line 727 "Gmsh.y"
 { List_Add(View->TQ, &yyvsp[0].d) ; ;
     break;}
 case 144:
-#line 728 "Gmsh.y"
+#line 729 "Gmsh.y"
 { List_Add(View->TQ, &yyvsp[0].d) ; ;
     break;}
 case 145:
-#line 736 "Gmsh.y"
+#line 737 "Gmsh.y"
 { 
       List_Add(View->TQ, &yyvsp[-23].d);  List_Add(View->TQ, &yyvsp[-17].d);
       List_Add(View->TQ, &yyvsp[-11].d); List_Add(View->TQ, &yyvsp[-5].d);
@@ -5166,21 +5167,21 @@ case 145:
     ;
     break;}
 case 146:
-#line 745 "Gmsh.y"
+#line 746 "Gmsh.y"
 {
       View->NbTQ++ ;
     ;
     break;}
 case 147:
-#line 752 "Gmsh.y"
+#line 753 "Gmsh.y"
 { List_Add(View->SS, &yyvsp[0].d) ; ;
     break;}
 case 148:
-#line 754 "Gmsh.y"
+#line 755 "Gmsh.y"
 { List_Add(View->SS, &yyvsp[0].d) ; ;
     break;}
 case 149:
-#line 762 "Gmsh.y"
+#line 763 "Gmsh.y"
 { 
       List_Add(View->SS, &yyvsp[-23].d);  List_Add(View->SS, &yyvsp[-17].d);
       List_Add(View->SS, &yyvsp[-11].d); List_Add(View->SS, &yyvsp[-5].d);
@@ -5191,21 +5192,21 @@ case 149:
     ;
     break;}
 case 150:
-#line 771 "Gmsh.y"
+#line 772 "Gmsh.y"
 {
       View->NbSS++ ;
     ;
     break;}
 case 151:
-#line 778 "Gmsh.y"
+#line 779 "Gmsh.y"
 { List_Add(View->VS, &yyvsp[0].d) ; ;
     break;}
 case 152:
-#line 780 "Gmsh.y"
+#line 781 "Gmsh.y"
 { List_Add(View->VS, &yyvsp[0].d) ; ;
     break;}
 case 153:
-#line 788 "Gmsh.y"
+#line 789 "Gmsh.y"
 { 
       List_Add(View->VS, &yyvsp[-23].d);  List_Add(View->VS, &yyvsp[-17].d);
       List_Add(View->VS, &yyvsp[-11].d); List_Add(View->VS, &yyvsp[-5].d);
@@ -5216,21 +5217,21 @@ case 153:
     ;
     break;}
 case 154:
-#line 797 "Gmsh.y"
+#line 798 "Gmsh.y"
 {
       View->NbVS++ ;
     ;
     break;}
 case 155:
-#line 804 "Gmsh.y"
+#line 805 "Gmsh.y"
 { List_Add(View->TS, &yyvsp[0].d) ; ;
     break;}
 case 156:
-#line 806 "Gmsh.y"
+#line 807 "Gmsh.y"
 { List_Add(View->TS, &yyvsp[0].d) ; ;
     break;}
 case 157:
-#line 814 "Gmsh.y"
+#line 815 "Gmsh.y"
 { 
       List_Add(View->TS, &yyvsp[-23].d);  List_Add(View->TS, &yyvsp[-17].d);
       List_Add(View->TS, &yyvsp[-11].d); List_Add(View->TS, &yyvsp[-5].d);
@@ -5241,21 +5242,21 @@ case 157:
     ;
     break;}
 case 158:
-#line 823 "Gmsh.y"
+#line 824 "Gmsh.y"
 {
       View->NbTS++ ;
     ;
     break;}
 case 159:
-#line 830 "Gmsh.y"
+#line 831 "Gmsh.y"
 { List_Add(View->SH, &yyvsp[0].d) ; ;
     break;}
 case 160:
-#line 832 "Gmsh.y"
+#line 833 "Gmsh.y"
 { List_Add(View->SH, &yyvsp[0].d) ; ;
     break;}
 case 161:
-#line 844 "Gmsh.y"
+#line 845 "Gmsh.y"
 { 
       List_Add(View->SH, &yyvsp[-47].d);  List_Add(View->SH, &yyvsp[-41].d);
       List_Add(View->SH, &yyvsp[-35].d); List_Add(View->SH, &yyvsp[-29].d);
@@ -5272,21 +5273,21 @@ case 161:
     ;
     break;}
 case 162:
-#line 859 "Gmsh.y"
+#line 860 "Gmsh.y"
 {
       View->NbSH++ ;
     ;
     break;}
 case 163:
-#line 866 "Gmsh.y"
+#line 867 "Gmsh.y"
 { List_Add(View->VH, &yyvsp[0].d) ; ;
     break;}
 case 164:
-#line 868 "Gmsh.y"
+#line 869 "Gmsh.y"
 { List_Add(View->VH, &yyvsp[0].d) ; ;
     break;}
 case 165:
-#line 880 "Gmsh.y"
+#line 881 "Gmsh.y"
 { 
       List_Add(View->VH, &yyvsp[-47].d);  List_Add(View->VH, &yyvsp[-41].d);
       List_Add(View->VH, &yyvsp[-35].d); List_Add(View->VH, &yyvsp[-29].d);
@@ -5303,21 +5304,21 @@ case 165:
     ;
     break;}
 case 166:
-#line 895 "Gmsh.y"
+#line 896 "Gmsh.y"
 {
       View->NbVH++ ;
     ;
     break;}
 case 167:
-#line 902 "Gmsh.y"
+#line 903 "Gmsh.y"
 { List_Add(View->TH, &yyvsp[0].d) ; ;
     break;}
 case 168:
-#line 904 "Gmsh.y"
+#line 905 "Gmsh.y"
 { List_Add(View->TH, &yyvsp[0].d) ; ;
     break;}
 case 169:
-#line 916 "Gmsh.y"
+#line 917 "Gmsh.y"
 { 
       List_Add(View->TH, &yyvsp[-47].d);  List_Add(View->TH, &yyvsp[-41].d);
       List_Add(View->TH, &yyvsp[-35].d); List_Add(View->TH, &yyvsp[-29].d);
@@ -5334,21 +5335,21 @@ case 169:
     ;
     break;}
 case 170:
-#line 931 "Gmsh.y"
+#line 932 "Gmsh.y"
 {
       View->NbTH++ ;
     ;
     break;}
 case 171:
-#line 938 "Gmsh.y"
+#line 939 "Gmsh.y"
 { List_Add(View->SI, &yyvsp[0].d) ; ;
     break;}
 case 172:
-#line 940 "Gmsh.y"
+#line 941 "Gmsh.y"
 { List_Add(View->SI, &yyvsp[0].d) ; ;
     break;}
 case 173:
-#line 950 "Gmsh.y"
+#line 951 "Gmsh.y"
 { 
       List_Add(View->SI, &yyvsp[-35].d);  List_Add(View->SI, &yyvsp[-29].d);
       List_Add(View->SI, &yyvsp[-23].d); List_Add(View->SI, &yyvsp[-17].d);
@@ -5362,21 +5363,21 @@ case 173:
     ;
     break;}
 case 174:
-#line 962 "Gmsh.y"
+#line 963 "Gmsh.y"
 {
       View->NbSI++ ;
     ;
     break;}
 case 175:
-#line 969 "Gmsh.y"
+#line 970 "Gmsh.y"
 { List_Add(View->VI, &yyvsp[0].d) ; ;
     break;}
 case 176:
-#line 971 "Gmsh.y"
+#line 972 "Gmsh.y"
 { List_Add(View->VI, &yyvsp[0].d) ; ;
     break;}
 case 177:
-#line 981 "Gmsh.y"
+#line 982 "Gmsh.y"
 { 
       List_Add(View->VI, &yyvsp[-35].d);  List_Add(View->VI, &yyvsp[-29].d);
       List_Add(View->VI, &yyvsp[-23].d); List_Add(View->VI, &yyvsp[-17].d);
@@ -5390,21 +5391,21 @@ case 177:
     ;
     break;}
 case 178:
-#line 993 "Gmsh.y"
+#line 994 "Gmsh.y"
 {
       View->NbVI++ ;
     ;
     break;}
 case 179:
-#line 1000 "Gmsh.y"
+#line 1001 "Gmsh.y"
 { List_Add(View->TI, &yyvsp[0].d) ; ;
     break;}
 case 180:
-#line 1002 "Gmsh.y"
+#line 1003 "Gmsh.y"
 { List_Add(View->TI, &yyvsp[0].d) ; ;
     break;}
 case 181:
-#line 1012 "Gmsh.y"
+#line 1013 "Gmsh.y"
 { 
       List_Add(View->TI, &yyvsp[-35].d);  List_Add(View->TI, &yyvsp[-29].d);
       List_Add(View->TI, &yyvsp[-23].d); List_Add(View->TI, &yyvsp[-17].d);
@@ -5418,21 +5419,21 @@ case 181:
     ;
     break;}
 case 182:
-#line 1024 "Gmsh.y"
+#line 1025 "Gmsh.y"
 {
       View->NbTI++ ;
     ;
     break;}
 case 183:
-#line 1031 "Gmsh.y"
+#line 1032 "Gmsh.y"
 { List_Add(View->SY, &yyvsp[0].d) ; ;
     break;}
 case 184:
-#line 1033 "Gmsh.y"
+#line 1034 "Gmsh.y"
 { List_Add(View->SY, &yyvsp[0].d) ; ;
     break;}
 case 185:
-#line 1042 "Gmsh.y"
+#line 1043 "Gmsh.y"
 { 
       List_Add(View->SY, &yyvsp[-29].d);  List_Add(View->SY, &yyvsp[-23].d);
       List_Add(View->SY, &yyvsp[-17].d); List_Add(View->SY, &yyvsp[-11].d);
@@ -5446,21 +5447,21 @@ case 185:
     ;
     break;}
 case 186:
-#line 1054 "Gmsh.y"
+#line 1055 "Gmsh.y"
 {
       View->NbSY++ ;
     ;
     break;}
 case 187:
-#line 1061 "Gmsh.y"
+#line 1062 "Gmsh.y"
 { List_Add(View->VY, &yyvsp[0].d) ; ;
     break;}
 case 188:
-#line 1063 "Gmsh.y"
+#line 1064 "Gmsh.y"
 { List_Add(View->VY, &yyvsp[0].d) ; ;
     break;}
 case 189:
-#line 1072 "Gmsh.y"
+#line 1073 "Gmsh.y"
 { 
       List_Add(View->VY, &yyvsp[-29].d);  List_Add(View->VY, &yyvsp[-23].d);
       List_Add(View->VY, &yyvsp[-17].d); List_Add(View->VY, &yyvsp[-11].d);
@@ -5474,21 +5475,21 @@ case 189:
     ;
     break;}
 case 190:
-#line 1084 "Gmsh.y"
+#line 1085 "Gmsh.y"
 {
       View->NbVY++ ;
     ;
     break;}
 case 191:
-#line 1091 "Gmsh.y"
+#line 1092 "Gmsh.y"
 { List_Add(View->TY, &yyvsp[0].d) ; ;
     break;}
 case 192:
-#line 1093 "Gmsh.y"
+#line 1094 "Gmsh.y"
 { List_Add(View->TY, &yyvsp[0].d) ; ;
     break;}
 case 193:
-#line 1102 "Gmsh.y"
+#line 1103 "Gmsh.y"
 { 
       List_Add(View->TY, &yyvsp[-29].d);  List_Add(View->TY, &yyvsp[-23].d);
       List_Add(View->TY, &yyvsp[-17].d); List_Add(View->TY, &yyvsp[-11].d);
@@ -5502,27 +5503,27 @@ case 193:
     ;
     break;}
 case 194:
-#line 1114 "Gmsh.y"
+#line 1115 "Gmsh.y"
 {
       View->NbTY++ ;
     ;
     break;}
 case 195:
-#line 1121 "Gmsh.y"
+#line 1122 "Gmsh.y"
 { 
       for(i = 0; i < (int)strlen(yyvsp[0].c)+1; i++) List_Add(View->T2C, &yyvsp[0].c[i]) ; 
       Free(yyvsp[0].c);
     ;
     break;}
 case 196:
-#line 1126 "Gmsh.y"
+#line 1127 "Gmsh.y"
 { 
       for(i = 0; i < (int)strlen(yyvsp[0].c)+1; i++) List_Add(View->T2C, &yyvsp[0].c[i]) ; 
       Free(yyvsp[0].c);
     ;
     break;}
 case 197:
-#line 1134 "Gmsh.y"
+#line 1135 "Gmsh.y"
 { 
       List_Add(View->T2D, &yyvsp[-5].d); List_Add(View->T2D, &yyvsp[-3].d);
       List_Add(View->T2D, &yyvsp[-1].d); 
@@ -5531,27 +5532,27 @@ case 197:
     ;
     break;}
 case 198:
-#line 1141 "Gmsh.y"
+#line 1142 "Gmsh.y"
 {
       View->NbT2++ ;
     ;
     break;}
 case 199:
-#line 1148 "Gmsh.y"
+#line 1149 "Gmsh.y"
 { 
       for(i = 0; i < (int)strlen(yyvsp[0].c)+1; i++) List_Add(View->T3C, &yyvsp[0].c[i]) ; 
       Free(yyvsp[0].c);
     ;
     break;}
 case 200:
-#line 1153 "Gmsh.y"
+#line 1154 "Gmsh.y"
 { 
       for(i = 0; i < (int)strlen(yyvsp[0].c)+1; i++) List_Add(View->T3C, &yyvsp[0].c[i]) ; 
       Free(yyvsp[0].c);
     ;
     break;}
 case 201:
-#line 1161 "Gmsh.y"
+#line 1162 "Gmsh.y"
 { 
       List_Add(View->T3D, &yyvsp[-7].d); List_Add(View->T3D, &yyvsp[-5].d);
       List_Add(View->T3D, &yyvsp[-3].d); List_Add(View->T3D, &yyvsp[-1].d); 
@@ -5560,41 +5561,41 @@ case 201:
     ;
     break;}
 case 202:
-#line 1168 "Gmsh.y"
+#line 1169 "Gmsh.y"
 {
       View->NbT3++ ;
     ;
     break;}
 case 203:
-#line 1177 "Gmsh.y"
+#line 1178 "Gmsh.y"
 { yyval.i = 0 ; ;
     break;}
 case 204:
-#line 1178 "Gmsh.y"
+#line 1179 "Gmsh.y"
 { yyval.i = 1 ; ;
     break;}
 case 205:
-#line 1179 "Gmsh.y"
+#line 1180 "Gmsh.y"
 { yyval.i = 2 ; ;
     break;}
 case 206:
-#line 1180 "Gmsh.y"
+#line 1181 "Gmsh.y"
 { yyval.i = 3 ; ;
     break;}
 case 207:
-#line 1181 "Gmsh.y"
+#line 1182 "Gmsh.y"
 { yyval.i = 4 ; ;
     break;}
 case 208:
-#line 1185 "Gmsh.y"
+#line 1186 "Gmsh.y"
 { yyval.i = 1 ; ;
     break;}
 case 209:
-#line 1186 "Gmsh.y"
+#line 1187 "Gmsh.y"
 { yyval.i = -1 ; ;
     break;}
 case 210:
-#line 1194 "Gmsh.y"
+#line 1195 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
@@ -5622,7 +5623,7 @@ case 210:
     ;
     break;}
 case 211:
-#line 1221 "Gmsh.y"
+#line 1222 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-6].c;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
@@ -5657,7 +5658,7 @@ case 211:
     ;
     break;}
 case 212:
-#line 1255 "Gmsh.y"
+#line 1256 "Gmsh.y"
 {
       if(List_Nbr(yyvsp[-5].l) != List_Nbr(yyvsp[-1].l))
 	yymsg(GERROR, "Incompatible array dimensions in affectation");
@@ -5705,7 +5706,7 @@ case 212:
     ;
     break;}
 case 213:
-#line 1302 "Gmsh.y"
+#line 1303 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
@@ -5721,7 +5722,7 @@ case 213:
     ;
     break;}
 case 214:
-#line 1317 "Gmsh.y"
+#line 1318 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-2].c;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
@@ -5731,7 +5732,7 @@ case 214:
     ;
     break;}
 case 215:
-#line 1326 "Gmsh.y"
+#line 1327 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c ;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
@@ -5745,7 +5746,7 @@ case 215:
     ;
     break;}
 case 216:
-#line 1341 "Gmsh.y"
+#line 1342 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-5].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-5].c);
@@ -5758,7 +5759,7 @@ case 216:
     ;
     break;}
 case 217:
-#line 1353 "Gmsh.y"
+#line 1354 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-8].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-8].c);
@@ -5771,7 +5772,7 @@ case 217:
     ;
     break;}
 case 218:
-#line 1367 "Gmsh.y"
+#line 1368 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-5].c)))
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-5].c);
@@ -5795,7 +5796,7 @@ case 218:
     ;
     break;}
 case 219:
-#line 1390 "Gmsh.y"
+#line 1391 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-8].c)))
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-8].c);
@@ -5820,7 +5821,7 @@ case 219:
     ;
     break;}
 case 220:
-#line 1414 "Gmsh.y"
+#line 1415 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-4].c)))
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-4].c);
@@ -5833,7 +5834,7 @@ case 220:
     ;
     break;}
 case 221:
-#line 1426 "Gmsh.y"
+#line 1427 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-7].c)))
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-7].c);
@@ -5846,7 +5847,7 @@ case 221:
     ;
     break;}
 case 222:
-#line 1440 "Gmsh.y"
+#line 1441 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-7].c)))
 	yymsg(GERROR, "Unknown color option class '%s'", yyvsp[-7].c);
@@ -5859,7 +5860,7 @@ case 222:
     ;
     break;}
 case 223:
-#line 1452 "Gmsh.y"
+#line 1453 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-10].c)))
 	yymsg(GERROR, "Unknown color option class '%s'", yyvsp[-10].c);
@@ -5872,7 +5873,7 @@ case 223:
     ;
     break;}
 case 224:
-#line 1466 "Gmsh.y"
+#line 1467 "Gmsh.y"
 {
       GmshColorTable *ct = Get_ColorTable(0);
       if(!ct)
@@ -5893,7 +5894,7 @@ case 224:
     ;
     break;}
 case 225:
-#line 1486 "Gmsh.y"
+#line 1487 "Gmsh.y"
 {
       GmshColorTable *ct = Get_ColorTable((int)yyvsp[-6].d);
       if(!ct)
@@ -5914,7 +5915,7 @@ case 225:
     ;
     break;}
 case 226:
-#line 1508 "Gmsh.y"
+#line 1509 "Gmsh.y"
 {
       if(CTX.default_plugins){
 	try {
@@ -5927,7 +5928,7 @@ case 226:
     ;
     break;}
 case 227:
-#line 1520 "Gmsh.y"
+#line 1521 "Gmsh.y"
 {
       if(CTX.default_plugins){
 	try {
@@ -5940,7 +5941,7 @@ case 227:
     ;
     break;}
 case 228:
-#line 1540 "Gmsh.y"
+#line 1541 "Gmsh.y"
 {
       Cdbpts101((int)yyvsp[-4].d, yyvsp[-1].v[0], yyvsp[-1].v[1], yyvsp[-1].v[2], yyvsp[-1].v[3], yyvsp[-1].v[4]);
       yyval.s.Type = MSH_POINT;
@@ -5948,7 +5949,7 @@ case 228:
     ;
     break;}
 case 229:
-#line 1547 "Gmsh.y"
+#line 1548 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_PHYSICAL_POINT, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_PHYSICAL_POINT;
@@ -5956,7 +5957,7 @@ case 229:
     ;
     break;}
 case 230:
-#line 1553 "Gmsh.y"
+#line 1554 "Gmsh.y"
 {
       Vertex *v;
       Attractor *a;
@@ -5977,7 +5978,7 @@ case 230:
     ;
     break;}
 case 231:
-#line 1572 "Gmsh.y"
+#line 1573 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-3].l); i++){
 	List_Read(yyvsp[-3].l, i, &d);
@@ -5990,7 +5991,7 @@ case 231:
     ;
     break;}
 case 232:
-#line 1586 "Gmsh.y"
+#line 1587 "Gmsh.y"
 {
       Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_LINE, 1, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
       yyval.s.Type = MSH_SEGM_LINE;
@@ -5998,7 +5999,7 @@ case 232:
     ;
     break;}
 case 233:
-#line 1592 "Gmsh.y"
+#line 1593 "Gmsh.y"
 {
       Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_SPLN, 3, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
       yyval.s.Type = MSH_SEGM_SPLN;
@@ -6006,7 +6007,7 @@ case 233:
     ;
     break;}
 case 234:
-#line 1598 "Gmsh.y"
+#line 1599 "Gmsh.y"
 {
       Curve *c;
       Attractor *a;
@@ -6027,7 +6028,7 @@ case 234:
     ;
     break;}
 case 235:
-#line 1617 "Gmsh.y"
+#line 1618 "Gmsh.y"
 {
       Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_CIRC, 2, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
       yyval.s.Type = MSH_SEGM_CIRC ;
@@ -6035,7 +6036,7 @@ case 235:
     ;
     break;}
 case 236:
-#line 1623 "Gmsh.y"
+#line 1624 "Gmsh.y"
 {
       Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_ELLI, 2, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
       yyval.s.Type = MSH_SEGM_ELLI ;
@@ -6043,7 +6044,7 @@ case 236:
     ;
     break;}
 case 237:
-#line 1629 "Gmsh.y"
+#line 1630 "Gmsh.y"
 {
       List_T *temp;
       int i, j;
@@ -6061,7 +6062,7 @@ case 237:
     ;
     break;}
 case 238:
-#line 1646 "Gmsh.y"
+#line 1647 "Gmsh.y"
 {
       Cdbseg101((int)yyvsp[-14].d, MSH_SEGM_PARAMETRIC, 2, NULL, NULL, -1, -1, yyvsp[-10].d, yyvsp[-8].d, yyvsp[-6].c, yyvsp[-4].c, yyvsp[-2].c);
       yyval.s.Type = MSH_SEGM_PARAMETRIC ;
@@ -6069,7 +6070,7 @@ case 238:
     ;
     break;}
 case 239:
-#line 1652 "Gmsh.y"
+#line 1653 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_PHYSICAL_LINE, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_PHYSICAL_LINE;
@@ -6077,7 +6078,7 @@ case 239:
     ;
     break;}
 case 240:
-#line 1658 "Gmsh.y"
+#line 1659 "Gmsh.y"
 {
       yyval.s.Type = MSH_SEGM_LOOP;
       Cdbz101((int)yyvsp[-4].d, yyval.s.Type, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
@@ -6085,7 +6086,7 @@ case 240:
     ;
     break;}
 case 241:
-#line 1664 "Gmsh.y"
+#line 1665 "Gmsh.y"
 {
       if(List_Nbr(yyvsp[-1].l) > 3){
 	Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_BSPLN, 2, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
@@ -6098,7 +6099,7 @@ case 241:
     ;
     break;}
 case 242:
-#line 1675 "Gmsh.y"
+#line 1676 "Gmsh.y"
 {
       if(List_Nbr(yyvsp[-1].l) > 3){
 	Cdbseg101((int)yyvsp[-4].d, MSH_SEGM_BEZIER, 2, yyvsp[-1].l, NULL, -1, -1, 0., 1., NULL, NULL, NULL);
@@ -6111,7 +6112,7 @@ case 242:
     ;
     break;}
 case 243:
-#line 1686 "Gmsh.y"
+#line 1687 "Gmsh.y"
 {
       List_T *Temp;
       int i;
@@ -6135,7 +6136,7 @@ case 243:
     ;
     break;}
 case 244:
-#line 1711 "Gmsh.y"
+#line 1712 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_SURF_PLAN, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_SURF_PLAN;
@@ -6143,7 +6144,7 @@ case 244:
     ;
     break;}
 case 245:
-#line 1717 "Gmsh.y"
+#line 1718 "Gmsh.y"
 {
       Surface *s,*support;
       support = FindSurface((int)yyvsp[-4].d, THEM);
@@ -6164,7 +6165,7 @@ case 245:
     ;
     break;}
 case 246:
-#line 1736 "Gmsh.y"
+#line 1737 "Gmsh.y"
 {
       List_Read(yyvsp[-1].l, 0, &d);
       i = (int)d;
@@ -6187,14 +6188,14 @@ case 246:
     ;
     break;}
 case 247:
-#line 1758 "Gmsh.y"
+#line 1759 "Gmsh.y"
 {
     AddTriangulationToSurface ((int) yyvsp[-10].d, (int) yyvsp[-6].d, (int) yyvsp[-4].d, yyvsp[-2].l, yyvsp[-1].l);
     yyval.s.Num = (int)yyvsp[-10].d;
   ;
     break;}
 case 248:
-#line 1766 "Gmsh.y"
+#line 1767 "Gmsh.y"
 {
       CreateNurbsSurface ( (int) yyvsp[-16].d , (int)yyvsp[-4].d , (int)yyvsp[-2].d  , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l);
       yyval.s.Type = MSH_SURF_NURBS;
@@ -6202,13 +6203,13 @@ case 248:
     ;
     break;}
 case 249:
-#line 1774 "Gmsh.y"
+#line 1775 "Gmsh.y"
 {
       CreateNurbsSurfaceSupport ((int)yyvsp[-16].d, (int) yyvsp[-4].d , (int) yyvsp[-2].d , yyvsp[-13].l, yyvsp[-10].l, yyvsp[-8].l);
     ;
     break;}
 case 250:
-#line 1778 "Gmsh.y"
+#line 1779 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_PHYSICAL_SURFACE, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_PHYSICAL_SURFACE;
@@ -6216,7 +6217,7 @@ case 250:
     ;
     break;}
 case 251:
-#line 1784 "Gmsh.y"
+#line 1785 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_SURF_LOOP, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_SURF_LOOP;
@@ -6224,7 +6225,7 @@ case 251:
     ;
     break;}
 case 252:
-#line 1793 "Gmsh.y"
+#line 1794 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_VOLUME, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_VOLUME;
@@ -6232,7 +6233,7 @@ case 252:
     ;
     break;}
 case 253:
-#line 1799 "Gmsh.y"
+#line 1800 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_VOLUME, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_VOLUME;
@@ -6240,7 +6241,7 @@ case 253:
     ;
     break;}
 case 254:
-#line 1805 "Gmsh.y"
+#line 1806 "Gmsh.y"
 {
       Cdbz101((int)yyvsp[-4].d, MSH_PHYSICAL_VOLUME, 0, 0, 0, 0, 0, NULL, yyvsp[-1].l, NULL);
       yyval.s.Type = MSH_PHYSICAL_VOLUME;
@@ -6248,59 +6249,59 @@ case 254:
     ;
     break;}
 case 255:
-#line 1816 "Gmsh.y"
+#line 1817 "Gmsh.y"
 {
       TranslateShapes (yyvsp[-3].v[0], yyvsp[-3].v[1], yyvsp[-3].v[2], yyvsp[-1].l, 1);
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 256:
-#line 1821 "Gmsh.y"
+#line 1822 "Gmsh.y"
 {
       RotateShapes(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].d, yyvsp[-1].l, 1);
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 257:
-#line 1826 "Gmsh.y"
+#line 1827 "Gmsh.y"
 {
       SymmetryShapes(yyvsp[-3].v[0], yyvsp[-3].v[1], yyvsp[-3].v[2], yyvsp[-3].v[3], yyvsp[-1].l, 1);
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 258:
-#line 1831 "Gmsh.y"
+#line 1832 "Gmsh.y"
 {
       DilatShapes(yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2], yyvsp[-4].d, yyvsp[-1].l, 1);
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 259:
-#line 1838 "Gmsh.y"
+#line 1839 "Gmsh.y"
 { yyval.l = yyvsp[0].l; ;
     break;}
 case 260:
-#line 1839 "Gmsh.y"
+#line 1840 "Gmsh.y"
 { yyval.l = yyvsp[0].l; ;
     break;}
 case 261:
-#line 1840 "Gmsh.y"
+#line 1841 "Gmsh.y"
 { yyval.l = yyvsp[0].l; ;
     break;}
 case 262:
-#line 1845 "Gmsh.y"
+#line 1846 "Gmsh.y"
 {
       yyval.l = List_Create(3, 3, sizeof(Shape));
     ;
     break;}
 case 263:
-#line 1849 "Gmsh.y"
+#line 1850 "Gmsh.y"
 {
       List_Add(yyval.l, &yyvsp[0].s);
     ;
     break;}
 case 264:
-#line 1853 "Gmsh.y"
+#line 1854 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-2].l); i++){
 	List_Read(yyvsp[-2].l, i, &d);
@@ -6316,7 +6317,7 @@ case 264:
     ;
     break;}
 case 265:
-#line 1867 "Gmsh.y"
+#line 1868 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-2].l); i++){
 	List_Read(yyvsp[-2].l, i, &d);
@@ -6332,7 +6333,7 @@ case 265:
     ;
     break;}
 case 266:
-#line 1881 "Gmsh.y"
+#line 1882 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-2].l); i++){
 	List_Read(yyvsp[-2].l, i, &d);
@@ -6348,7 +6349,7 @@ case 266:
     ;
     break;}
 case 267:
-#line 1900 "Gmsh.y"
+#line 1901 "Gmsh.y"
 {
       yyval.l = List_Create(3, 3, sizeof(Shape));
       for(i = 0; i < List_Nbr(yyvsp[-1].l); i++){
@@ -6360,14 +6361,14 @@ case 267:
     ;
     break;}
 case 268:
-#line 1910 "Gmsh.y"
+#line 1911 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-4].c, "View")) DuplicateView((int)yyvsp[-2].d, 0);
       yyval.l = NULL;
     ;
     break;}
 case 269:
-#line 1921 "Gmsh.y"
+#line 1922 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-1].l); i++){
 	List_Read (yyvsp[-1].l, i, &TheShape);
@@ -6376,19 +6377,19 @@ case 269:
     ;
     break;}
 case 270:
-#line 1928 "Gmsh.y"
+#line 1929 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-4].c, "View")) RemoveViewByIndex((int)yyvsp[-2].d);
     ;
     break;}
 case 271:
-#line 1932 "Gmsh.y"
+#line 1933 "Gmsh.y"
 {
       Init_Mesh(THEM, 1);
     ;
     break;}
 case 272:
-#line 1941 "Gmsh.y"
+#line 1942 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[-1].l); i++){
 	List_Read (yyvsp[-1].l, i, &TheShape);
@@ -6397,24 +6398,11 @@ case 272:
     ;
     break;}
 case 273:
-#line 1953 "Gmsh.y"
+#line 1954 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-2].c, "Include")){
+	FixRelativePath(yyvsp[-1].c, tmpstring);
 	yyinTab[RecursionLevel++] = yyin;
-
-	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); 
 	  strcpy(yynameTab[RecursionLevel-1], yyname);
@@ -6436,31 +6424,37 @@ case 273:
 	  yymsg(GERROR, "Unknown file '%s'", tmpstring) ;  
 	  yyin = yyinTab[--RecursionLevel];
 	}
-
       }
       else if(!strcmp(yyvsp[-2].c, "Print")){
 #if defined(HAVE_FLTK)
-	if(!CTX.batch) CreateOutputFile(yyvsp[-1].c, CTX.print.format);
+	if(!CTX.batch){
+	  FixRelativePath(yyvsp[-1].c, tmpstring);
+	  CreateOutputFile(tmpstring, CTX.print.format);
+	}
 #endif
       }
       else if(!strcmp(yyvsp[-2].c, "Save")){
 #if defined(HAVE_FLTK)
-	CreateOutputFile(yyvsp[-1].c, CTX.mesh.format);
+	FixRelativePath(yyvsp[-1].c, tmpstring);
+	CreateOutputFile(tmpstring, CTX.mesh.format);
 #endif
       }
       else if(!strcmp(yyvsp[-2].c, "Merge")){
 	FILE *ff = yyin;
-	MergeProblem(yyvsp[-1].c);
+	FixRelativePath(yyvsp[-1].c, tmpstring);
+	MergeProblem(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp(yyvsp[-2].c, "MergeWithBoundingBox")){
 	FILE *ff = yyin;
-	MergeProblemWithBoundingBox(yyvsp[-1].c);
+	FixRelativePath(yyvsp[-1].c, tmpstring);
+	MergeProblemWithBoundingBox(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp(yyvsp[-2].c, "Open")){
 	FILE *ff = yyin;
-	OpenProblem(yyvsp[-1].c);
+	FixRelativePath(yyvsp[-1].c, tmpstring);
+	OpenProblem(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp(yyvsp[-2].c, "System")){
@@ -6472,12 +6466,13 @@ case 273:
     ;
     break;}
 case 274:
-#line 2026 "Gmsh.y"
+#line 2020 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-6].c, "Save") && !strcmp(yyvsp[-5].c, "View")){
 	Post_View *v = (Post_View *)List_Pointer_Test(CTX.post.list, (int)yyvsp[-3].d);
 	if(v){
-	  WriteView(0, v, yyvsp[-1].c);
+	  FixRelativePath(yyvsp[-1].c, tmpstring);
+	  WriteView(0, v, tmpstring);
 	}
       }
       else{
@@ -6486,42 +6481,39 @@ case 274:
     ;
     break;}
 case 275:
-#line 2038 "Gmsh.y"
+#line 2033 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-2].c, "Sleep")){
-
 	long sleep_time = GetTime();
 	while(1){
 	  if(GetTime() - sleep_time > (long)(yyvsp[-1].d*1.e6)) break;
 	}
-      
       }
       else if(!strcmp(yyvsp[-2].c, "Mesh")){
-
 	//Maillage_Dimension_0(THEM);
 	//mai3d(THEM, (int)$2);
 	yymsg(GERROR, "Mesh directives are not (yet) allowed in scripts");
-
       }
-      else
+      else{
 	yymsg(GERROR, "Unknown command '%s'", yyvsp[-2].c);
+      }
     ;
     break;}
 case 276:
-#line 2058 "Gmsh.y"
+#line 2050 "Gmsh.y"
 {
     if(CTX.default_plugins)
       GMSH_PluginManager::instance()->action(yyvsp[-4].c, yyvsp[-1].c, 0); 
    ;
     break;}
 case 277:
-#line 2063 "Gmsh.y"
+#line 2055 "Gmsh.y"
 {
       exit(0);
     ;
     break;}
 case 278:
-#line 2067 "Gmsh.y"
+#line 2059 "Gmsh.y"
 {
 #if defined(HAVE_FLTK)
       if(!CTX.batch){ // we're in interactive mode
@@ -6539,7 +6531,7 @@ case 278:
     ;
     break;}
 case 279:
-#line 2089 "Gmsh.y"
+#line 2081 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-3].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-1].d ;
@@ -6551,7 +6543,7 @@ case 279:
     ;
     break;}
 case 280:
-#line 2099 "Gmsh.y"
+#line 2091 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-5].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-3].d ;
@@ -6563,7 +6555,7 @@ case 280:
     ;
     break;}
 case 281:
-#line 2109 "Gmsh.y"
+#line 2101 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-3].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-1].d ;
@@ -6586,7 +6578,7 @@ case 281:
     ;
     break;}
 case 282:
-#line 2130 "Gmsh.y"
+#line 2122 "Gmsh.y"
 {
       LoopControlVariablesTab[ImbricatedLoop][0] = yyvsp[-5].d ;
       LoopControlVariablesTab[ImbricatedLoop][1] = yyvsp[-3].d ;
@@ -6609,7 +6601,7 @@ case 282:
     ;
     break;}
 case 283:
-#line 2151 "Gmsh.y"
+#line 2143 "Gmsh.y"
 {
       if(LoopControlVariablesTab[ImbricatedLoop-1][1] >  
 	 LoopControlVariablesTab[ImbricatedLoop-1][0]){
@@ -6632,7 +6624,7 @@ case 283:
     ;
     break;}
 case 284:
-#line 2172 "Gmsh.y"
+#line 2164 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->createFunction(yyvsp[0].c, yyin, yyname, yylineno))
 	yymsg(GERROR, "Redefinition of function %s", yyvsp[0].c);
@@ -6640,32 +6632,32 @@ case 284:
     ;
     break;}
 case 285:
-#line 2178 "Gmsh.y"
+#line 2170 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->leaveFunction(&yyin, yyname, yylineno))
 	yymsg(GERROR, "Error while exiting function");
     ;
     break;}
 case 286:
-#line 2183 "Gmsh.y"
+#line 2175 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->enterFunction(yyvsp[-1].c, &yyin, yyname, yylineno))
 	yymsg(GERROR, "Unknown function %s", yyvsp[-1].c);
     ;
     break;}
 case 287:
-#line 2188 "Gmsh.y"
+#line 2180 "Gmsh.y"
 {
       if(!yyvsp[-1].d) skip_until("If", "EndIf");
     ;
     break;}
 case 288:
-#line 2192 "Gmsh.y"
+#line 2184 "Gmsh.y"
 {
     ;
     break;}
 case 289:
-#line 2203 "Gmsh.y"
+#line 2195 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(TRANSLATE, (int)yyvsp[-4].d, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2],
@@ -6677,7 +6669,7 @@ case 289:
     ;
     break;}
 case 290:
-#line 2213 "Gmsh.y"
+#line 2205 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(ROTATE, (int)yyvsp[-8].d, 0., 0., 0.,
@@ -6689,7 +6681,7 @@ case 290:
     ;
     break;}
 case 291:
-#line 2223 "Gmsh.y"
+#line 2215 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(TRANSLATE_ROTATE, (int)yyvsp[-10].d, yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2],
@@ -6701,14 +6693,14 @@ case 291:
     ;
     break;}
 case 292:
-#line 2233 "Gmsh.y"
+#line 2225 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 293:
-#line 2238 "Gmsh.y"
+#line 2230 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(TRANSLATE, (int)yyvsp[-8].d, yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2],
@@ -6720,14 +6712,14 @@ case 293:
     ;
     break;}
 case 294:
-#line 2248 "Gmsh.y"
+#line 2240 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 295:
-#line 2253 "Gmsh.y"
+#line 2245 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(ROTATE, (int)yyvsp[-12].d, 0., 0., 0.,
@@ -6739,14 +6731,14 @@ case 295:
     ;
     break;}
 case 296:
-#line 2263 "Gmsh.y"
+#line 2255 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 297:
-#line 2268 "Gmsh.y"
+#line 2260 "Gmsh.y"
 {
       Curve *pc, *prc;
       TheShape.Num = Extrude_ProtudePoint(TRANSLATE_ROTATE, (int)yyvsp[-14].d, yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2],
@@ -6758,7 +6750,7 @@ case 297:
     ;
     break;}
 case 298:
-#line 2280 "Gmsh.y"
+#line 2272 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(TRANSLATE, (int)yyvsp[-4].d, yyvsp[-2].v[0], yyvsp[-2].v[1], yyvsp[-2].v[2],
@@ -6777,7 +6769,7 @@ case 298:
     ;
     break;}
 case 299:
-#line 2297 "Gmsh.y"
+#line 2289 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(ROTATE, (int)yyvsp[-8].d, 0., 0., 0.,
@@ -6796,7 +6788,7 @@ case 299:
     ;
     break;}
 case 300:
-#line 2314 "Gmsh.y"
+#line 2306 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(TRANSLATE_ROTATE, (int)yyvsp[-10].d, yyvsp[-8].v[0], yyvsp[-8].v[1], yyvsp[-8].v[2],
@@ -6815,14 +6807,14 @@ case 300:
     ;
     break;}
 case 301:
-#line 2331 "Gmsh.y"
+#line 2323 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 302:
-#line 2336 "Gmsh.y"
+#line 2328 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(TRANSLATE, (int)yyvsp[-8].d, yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2],
@@ -6841,14 +6833,14 @@ case 302:
     ;
     break;}
 case 303:
-#line 2353 "Gmsh.y"
+#line 2345 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 304:
-#line 2358 "Gmsh.y"
+#line 2350 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(ROTATE, (int)yyvsp[-12].d, 0., 0., 0.,
@@ -6867,14 +6859,14 @@ case 304:
     ;
     break;}
 case 305:
-#line 2375 "Gmsh.y"
+#line 2367 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 306:
-#line 2380 "Gmsh.y"
+#line 2372 "Gmsh.y"
 {
       Surface *ps;
       TheShape.Num = Extrude_ProtudeCurve(TRANSLATE_ROTATE, (int)yyvsp[-14].d, yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2],
@@ -6893,7 +6885,7 @@ case 306:
     ;
     break;}
 case 307:
-#line 2400 "Gmsh.y"
+#line 2392 "Gmsh.y"
 {
       TheShape.Num = 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., 
@@ -6911,7 +6903,7 @@ case 307:
     ;
     break;}
 case 308:
-#line 2416 "Gmsh.y"
+#line 2408 "Gmsh.y"
 {
       TheShape.Num = 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,
@@ -6929,7 +6921,7 @@ case 308:
     ;
     break;}
 case 309:
-#line 2432 "Gmsh.y"
+#line 2424 "Gmsh.y"
 {
       TheShape.Num = 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,
@@ -6947,14 +6939,14 @@ case 309:
     ;
     break;}
 case 310:
-#line 2448 "Gmsh.y"
+#line 2440 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 311:
-#line 2453 "Gmsh.y"
+#line 2445 "Gmsh.y"
 {
       int vol = NEWREG();
       TheShape.Num = Extrude_ProtudeSurface(TRANSLATE, (int)yyvsp[-8].d, yyvsp[-6].v[0], yyvsp[-6].v[1], yyvsp[-6].v[2],
@@ -6973,14 +6965,14 @@ case 311:
     ;
     break;}
 case 312:
-#line 2470 "Gmsh.y"
+#line 2462 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 313:
-#line 2476 "Gmsh.y"
+#line 2468 "Gmsh.y"
 {
       int vol = NEWREG();
       TheShape.Num = Extrude_ProtudeSurface(ROTATE, (int)yyvsp[-12].d, 0., 0., 0.,
@@ -6999,14 +6991,14 @@ case 313:
     ;
     break;}
 case 314:
-#line 2493 "Gmsh.y"
+#line 2485 "Gmsh.y"
 {
       extr.mesh.ExtrudeMesh = false;
       extr.mesh.Recombine = false;
     ;
     break;}
 case 315:
-#line 2499 "Gmsh.y"
+#line 2491 "Gmsh.y"
 {
       int vol = NEWREG();
       TheShape.Num = Extrude_ProtudeSurface(TRANSLATE_ROTATE, (int)yyvsp[-14].d, yyvsp[-12].v[0], yyvsp[-12].v[1], yyvsp[-12].v[2],
@@ -7025,17 +7017,17 @@ case 315:
     ;
     break;}
 case 316:
-#line 2519 "Gmsh.y"
+#line 2511 "Gmsh.y"
 {
     ;
     break;}
 case 317:
-#line 2522 "Gmsh.y"
+#line 2514 "Gmsh.y"
 {
     ;
     break;}
 case 318:
-#line 2528 "Gmsh.y"
+#line 2520 "Gmsh.y"
 {
       double d;
       extr.mesh.ExtrudeMesh = true;
@@ -7063,7 +7055,7 @@ case 318:
     ;
     break;}
 case 319:
-#line 2554 "Gmsh.y"
+#line 2546 "Gmsh.y"
 {
       double d;
       extr.mesh.ExtrudeMesh = true;
@@ -7089,13 +7081,13 @@ case 319:
     ;
     break;}
 case 320:
-#line 2578 "Gmsh.y"
+#line 2570 "Gmsh.y"
 {
       extr.mesh.Recombine = true;
     ;
     break;}
 case 321:
-#line 2587 "Gmsh.y"
+#line 2579 "Gmsh.y"
 {
       Curve *c;
       for(i = 0; i < List_Nbr(yyvsp[-3].l); i++){
@@ -7115,7 +7107,7 @@ case 321:
     ;
     break;}
 case 322:
-#line 2605 "Gmsh.y"
+#line 2597 "Gmsh.y"
 {
       Curve *c;
       for(i = 0; i < List_Nbr(yyvsp[-6].l); i++){
@@ -7135,7 +7127,7 @@ case 322:
     ;
     break;}
 case 323:
-#line 2623 "Gmsh.y"
+#line 2615 "Gmsh.y"
 {
       Curve *c;
       for(i = 0; i < List_Nbr(yyvsp[-6].l); i++){
@@ -7155,7 +7147,7 @@ case 323:
     ;
     break;}
 case 324:
-#line 2641 "Gmsh.y"
+#line 2633 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d, THEM);
       if(!s)
@@ -7179,7 +7171,7 @@ case 324:
     ;
     break;}
 case 325:
-#line 2663 "Gmsh.y"
+#line 2655 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d, THEM);
       if(!s)
@@ -7202,7 +7194,7 @@ case 325:
     ;
     break;}
 case 326:
-#line 2684 "Gmsh.y"
+#line 2676 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d, THEM);
       if(!v)
@@ -7225,7 +7217,7 @@ case 326:
     ;
     break;}
 case 327:
-#line 2705 "Gmsh.y"
+#line 2697 "Gmsh.y"
 {
       Surface *s;
       for(i = 0; i < List_Nbr(yyvsp[-3].l); i++){
@@ -7241,7 +7233,7 @@ case 327:
     ;
     break;}
 case 328:
-#line 2719 "Gmsh.y"
+#line 2711 "Gmsh.y"
 {
       Surface *s;
       for(i = 0; i < List_Nbr(yyvsp[-1].l); i++){
@@ -7257,71 +7249,71 @@ case 328:
     ;
     break;}
 case 329:
-#line 2739 "Gmsh.y"
+#line 2731 "Gmsh.y"
 { 
       ReplaceAllDuplicates(THEM);
     ;
     break;}
 case 330:
-#line 2743 "Gmsh.y"
+#line 2735 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 331:
-#line 2752 "Gmsh.y"
+#line 2744 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 332:
-#line 2753 "Gmsh.y"
+#line 2745 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 333:
-#line 2754 "Gmsh.y"
+#line 2746 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 334:
-#line 2755 "Gmsh.y"
+#line 2747 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 335:
-#line 2756 "Gmsh.y"
+#line 2748 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 336:
-#line 2760 "Gmsh.y"
+#line 2752 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 337:
-#line 2761 "Gmsh.y"
+#line 2753 "Gmsh.y"
 { yyval.d = yyvsp[-1].d ;          ;
     break;}
 case 338:
-#line 2762 "Gmsh.y"
+#line 2754 "Gmsh.y"
 { yyval.d = -yyvsp[0].d ;         ;
     break;}
 case 339:
-#line 2763 "Gmsh.y"
+#line 2755 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 340:
-#line 2764 "Gmsh.y"
+#line 2756 "Gmsh.y"
 { yyval.d = !yyvsp[0].d ;         ;
     break;}
 case 341:
-#line 2765 "Gmsh.y"
+#line 2757 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d ;     ;
     break;}
 case 342:
-#line 2766 "Gmsh.y"
+#line 2758 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d ;     ;
     break;}
 case 343:
-#line 2767 "Gmsh.y"
+#line 2759 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d ;     ;
     break;}
 case 344:
-#line 2769 "Gmsh.y"
+#line 2761 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	yymsg(GERROR, "Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -7330,235 +7322,235 @@ case 344:
     ;
     break;}
 case 345:
-#line 2775 "Gmsh.y"
+#line 2767 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d ;  ;
     break;}
 case 346:
-#line 2776 "Gmsh.y"
+#line 2768 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d, yyvsp[0].d) ;  ;
     break;}
 case 347:
-#line 2777 "Gmsh.y"
+#line 2769 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d ;     ;
     break;}
 case 348:
-#line 2778 "Gmsh.y"
+#line 2770 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d ;     ;
     break;}
 case 349:
-#line 2779 "Gmsh.y"
+#line 2771 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d ;    ;
     break;}
 case 350:
-#line 2780 "Gmsh.y"
+#line 2772 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d ;    ;
     break;}
 case 351:
-#line 2781 "Gmsh.y"
+#line 2773 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d ;    ;
     break;}
 case 352:
-#line 2782 "Gmsh.y"
+#line 2774 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d ;    ;
     break;}
 case 353:
-#line 2783 "Gmsh.y"
+#line 2775 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d ;    ;
     break;}
 case 354:
-#line 2784 "Gmsh.y"
+#line 2776 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d ;    ;
     break;}
 case 355:
-#line 2785 "Gmsh.y"
+#line 2777 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d ; ;
     break;}
 case 356:
-#line 2786 "Gmsh.y"
+#line 2778 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 357:
-#line 2787 "Gmsh.y"
+#line 2779 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 358:
-#line 2788 "Gmsh.y"
+#line 2780 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 359:
-#line 2789 "Gmsh.y"
+#line 2781 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 360:
-#line 2790 "Gmsh.y"
+#line 2782 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 361:
-#line 2791 "Gmsh.y"
+#line 2783 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 362:
-#line 2792 "Gmsh.y"
+#line 2784 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 363:
-#line 2793 "Gmsh.y"
+#line 2785 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 364:
-#line 2794 "Gmsh.y"
+#line 2786 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 365:
-#line 2795 "Gmsh.y"
+#line 2787 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 366:
-#line 2796 "Gmsh.y"
+#line 2788 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 367:
-#line 2797 "Gmsh.y"
+#line 2789 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 368:
-#line 2798 "Gmsh.y"
+#line 2790 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 369:
-#line 2799 "Gmsh.y"
+#line 2791 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 370:
-#line 2800 "Gmsh.y"
+#line 2792 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 371:
-#line 2801 "Gmsh.y"
+#line 2793 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 372:
-#line 2802 "Gmsh.y"
+#line 2794 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 373:
-#line 2803 "Gmsh.y"
+#line 2795 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d);  ;
     break;}
 case 374:
-#line 2804 "Gmsh.y"
+#line 2796 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d);  ;
     break;}
 case 375:
-#line 2805 "Gmsh.y"
+#line 2797 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 376:
-#line 2806 "Gmsh.y"
+#line 2798 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 377:
-#line 2808 "Gmsh.y"
+#line 2800 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 378:
-#line 2809 "Gmsh.y"
+#line 2801 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 379:
-#line 2810 "Gmsh.y"
+#line 2802 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 380:
-#line 2811 "Gmsh.y"
+#line 2803 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 381:
-#line 2812 "Gmsh.y"
+#line 2804 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 382:
-#line 2813 "Gmsh.y"
+#line 2805 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 383:
-#line 2814 "Gmsh.y"
+#line 2806 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 384:
-#line 2815 "Gmsh.y"
+#line 2807 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 385:
-#line 2816 "Gmsh.y"
+#line 2808 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 386:
-#line 2817 "Gmsh.y"
+#line 2809 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 387:
-#line 2818 "Gmsh.y"
+#line 2810 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d, yyvsp[-1].d); ;
     break;}
 case 388:
-#line 2819 "Gmsh.y"
+#line 2811 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 389:
-#line 2820 "Gmsh.y"
+#line 2812 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 390:
-#line 2821 "Gmsh.y"
+#line 2813 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 391:
-#line 2822 "Gmsh.y"
+#line 2814 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 392:
-#line 2823 "Gmsh.y"
+#line 2815 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 393:
-#line 2824 "Gmsh.y"
+#line 2816 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 394:
-#line 2825 "Gmsh.y"
+#line 2817 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d);  ;
     break;}
 case 395:
-#line 2826 "Gmsh.y"
+#line 2818 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d, yyvsp[-1].d);  ;
     break;}
 case 396:
-#line 2827 "Gmsh.y"
+#line 2819 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 397:
-#line 2828 "Gmsh.y"
+#line 2820 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 398:
-#line 2837 "Gmsh.y"
+#line 2829 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 399:
-#line 2838 "Gmsh.y"
+#line 2830 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 400:
-#line 2839 "Gmsh.y"
+#line 2831 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->rank(); ;
     break;}
 case 401:
-#line 2840 "Gmsh.y"
+#line 2832 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->size(); ;
     break;}
 case 402:
-#line 2845 "Gmsh.y"
+#line 2837 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
@@ -7570,7 +7562,7 @@ case 402:
     ;
     break;}
 case 403:
-#line 2856 "Gmsh.y"
+#line 2848 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
@@ -7588,7 +7580,7 @@ case 403:
     ;
     break;}
 case 404:
-#line 2873 "Gmsh.y"
+#line 2865 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
@@ -7600,7 +7592,7 @@ case 404:
     ;
     break;}
 case 405:
-#line 2884 "Gmsh.y"
+#line 2876 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if(!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
@@ -7618,7 +7610,7 @@ case 405:
     ;
     break;}
 case 406:
-#line 2903 "Gmsh.y"
+#line 2895 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-2].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-2].c);
@@ -7635,7 +7627,7 @@ case 406:
     ;
     break;}
 case 407:
-#line 2919 "Gmsh.y"
+#line 2911 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-5].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-5].c);
@@ -7652,7 +7644,7 @@ case 407:
     ;
     break;}
 case 408:
-#line 2935 "Gmsh.y"
+#line 2927 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-3].c);
@@ -7669,7 +7661,7 @@ case 408:
     ;
     break;}
 case 409:
-#line 2951 "Gmsh.y"
+#line 2943 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-6].c))){
 	yymsg(GERROR, "Unknown numeric option class '%s'", yyvsp[-6].c);
@@ -7686,130 +7678,130 @@ case 409:
     ;
     break;}
 case 410:
-#line 2969 "Gmsh.y"
+#line 2961 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double)) ;
     ;
     break;}
 case 411:
-#line 2973 "Gmsh.y"
+#line 2965 "Gmsh.y"
 {
       for(i = 0; i < 5; i++) yyval.v[i] = -yyvsp[0].v[i] ;
     ;
     break;}
 case 412:
-#line 2977 "Gmsh.y"
+#line 2969 "Gmsh.y"
 { 
       for(i = 0; i < 5; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 413:
-#line 2981 "Gmsh.y"
+#line 2973 "Gmsh.y"
 { 
       for(i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i] ;
     ;
     break;}
 case 414:
-#line 2985 "Gmsh.y"
+#line 2977 "Gmsh.y"
 {
       for(i = 0; i < 5; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i] ;
     ;
     break;}
 case 415:
-#line 2992 "Gmsh.y"
+#line 2984 "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 416:
-#line 2996 "Gmsh.y"
+#line 2988 "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 417:
-#line 3000 "Gmsh.y"
+#line 2992 "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 3004 "Gmsh.y"
+#line 2996 "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 419:
-#line 3011 "Gmsh.y"
+#line 3003 "Gmsh.y"
 {
     ;
     break;}
 case 420:
-#line 3014 "Gmsh.y"
+#line 3006 "Gmsh.y"
 {
     ;
     break;}
 case 421:
-#line 3020 "Gmsh.y"
+#line 3012 "Gmsh.y"
 {
     ;
     break;}
 case 422:
-#line 3023 "Gmsh.y"
+#line 3015 "Gmsh.y"
 {
     ;
     break;}
 case 423:
-#line 3029 "Gmsh.y"
+#line 3021 "Gmsh.y"
 {
     ;
     break;}
 case 424:
-#line 3032 "Gmsh.y"
+#line 3024 "Gmsh.y"
 {
        yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 425:
-#line 3036 "Gmsh.y"
+#line 3028 "Gmsh.y"
 {
        yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 426:
-#line 3043 "Gmsh.y"
+#line 3035 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(List_T*)) ;
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 427:
-#line 3048 "Gmsh.y"
+#line 3040 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 428:
-#line 3056 "Gmsh.y"
+#line 3048 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 429:
-#line 3061 "Gmsh.y"
+#line 3053 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 430:
-#line 3065 "Gmsh.y"
+#line 3057 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 431:
-#line 3069 "Gmsh.y"
+#line 3061 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
       for(i = 0; i < List_Nbr(yyval.l); i++){
@@ -7819,7 +7811,7 @@ case 431:
     ;
     break;}
 case 432:
-#line 3080 "Gmsh.y"
+#line 3072 "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.)) 
@@ -7827,7 +7819,7 @@ case 432:
     ;
     break;}
 case 433:
-#line 3086 "Gmsh.y"
+#line 3078 "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)){
@@ -7840,7 +7832,7 @@ case 433:
    ;
     break;}
 case 434:
-#line 3097 "Gmsh.y"
+#line 3089 "Gmsh.y"
 {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -7862,7 +7854,7 @@ case 434:
     ;
     break;}
 case 435:
-#line 3117 "Gmsh.y"
+#line 3109 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double)) ;
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -7873,7 +7865,7 @@ case 435:
     ;
     break;}
 case 436:
-#line 3126 "Gmsh.y"
+#line 3118 "Gmsh.y"
 {
       yyval.l = List_Create(List_Nbr(yyvsp[0].l), 1, sizeof(double)) ;
       for(int i = 0; i < List_Nbr(yyvsp[0].l); i++){
@@ -7884,7 +7876,7 @@ case 436:
     ;
     break;}
 case 437:
-#line 3135 "Gmsh.y"
+#line 3127 "Gmsh.y"
 {
       // FIXME: The syntax for this is ugly: we get double semi-colons
       // at the end of the line
@@ -7897,7 +7889,7 @@ case 437:
     ;
     break;}
 case 438:
-#line 3146 "Gmsh.y"
+#line 3138 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -7913,7 +7905,7 @@ case 438:
     ;
     break;}
 case 439:
-#line 3160 "Gmsh.y"
+#line 3152 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -7931,7 +7923,7 @@ case 439:
     ;
     break;}
 case 440:
-#line 3176 "Gmsh.y"
+#line 3168 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -7953,7 +7945,7 @@ case 440:
     ;
     break;}
 case 441:
-#line 3196 "Gmsh.y"
+#line 3188 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -7977,26 +7969,26 @@ case 441:
     ;
     break;}
 case 442:
-#line 3221 "Gmsh.y"
+#line 3213 "Gmsh.y"
 {
       yyval.l = List_Create(2, 1, sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 443:
-#line 3226 "Gmsh.y"
+#line 3218 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 444:
-#line 3230 "Gmsh.y"
+#line 3222 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 445:
-#line 3234 "Gmsh.y"
+#line 3226 "Gmsh.y"
 {
       for(i = 0; i < List_Nbr(yyvsp[0].l); i++){
 	List_Read(yyvsp[0].l, i, &d) ;
@@ -8006,26 +7998,26 @@ case 445:
     ;
     break;}
 case 446:
-#line 3246 "Gmsh.y"
+#line 3238 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 447:
-#line 3250 "Gmsh.y"
+#line 3242 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 448:
-#line 3261 "Gmsh.y"
+#line 3253 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
       if(flag) yymsg(GERROR, "Unknown color '%s'", yyvsp[0].c);
     ;
     break;}
 case 449:
-#line 3266 "Gmsh.y"
+#line 3258 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-4].c))){
 	yymsg(GERROR, "Unknown color option class '%s'", yyvsp[-4].c);
@@ -8043,13 +8035,13 @@ case 449:
     ;
     break;}
 case 450:
-#line 3285 "Gmsh.y"
+#line 3277 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 451:
-#line 3289 "Gmsh.y"
+#line 3281 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int)) ;
       GmshColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -8062,26 +8054,26 @@ case 451:
     ;
     break;}
 case 452:
-#line 3303 "Gmsh.y"
+#line 3295 "Gmsh.y"
 {
       yyval.l = List_Create(256, 10, sizeof(unsigned int)) ;
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 453:
-#line 3308 "Gmsh.y"
+#line 3300 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 454:
-#line 3315 "Gmsh.y"
+#line 3307 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 455:
-#line 3319 "Gmsh.y"
+#line 3311 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-3].c)+strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       strcpy(yyval.c, yyvsp[-3].c) ;  
@@ -8091,7 +8083,7 @@ case 455:
     ;
     break;}
 case 456:
-#line 3327 "Gmsh.y"
+#line 3319 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       for(i = strlen(yyvsp[-1].c)-1; i >= 0; i--){
@@ -8106,13 +8098,13 @@ case 456:
     ;
     break;}
 case 457:
-#line 3340 "Gmsh.y"
+#line 3332 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 458:
-#line 3344 "Gmsh.y"
+#line 3336 "Gmsh.y"
 {
       i = PrintListOfDouble(yyvsp[-3].c, yyvsp[-1].l, tmpstring);
       if(i < 0){
@@ -8132,7 +8124,7 @@ case 458:
     ;
     break;}
 case 459:
-#line 3362 "Gmsh.y"
+#line 3354 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-3].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-3].c);
@@ -8148,7 +8140,7 @@ case 459:
     ;
     break;}
 case 460:
-#line 3376 "Gmsh.y"
+#line 3368 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-6].c)))
 	yymsg(GERROR, "Unknown string option class '%s'", yyvsp[-6].c);
@@ -8385,7 +8377,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 3391 "Gmsh.y"
+#line 3383 "Gmsh.y"
 
 
 void DeleteSymbol(void *a, void *b){
@@ -8439,6 +8431,21 @@ int PrintListOfDouble(char *format, List_T *list, char *buffer){
   return 0;
 }
 
+void FixRelativePath(char *in, char *out){
+  if(in[0] == '/' || in[0] == '\\' || (strlen(in)>2 && in[1] == ':')){
+    // do nothing: "in" is an absolute path
+    strcpy(out, in);
+  }
+  else{
+    // append "in" to the path of the parent file
+    strcpy(out, yyname);
+    int i = strlen(out)-1 ;
+    while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
+    out[i+1] = '\0';
+    strcat(out, in);
+  }
+}
+
 void yyerror(char *s){
   Msg(GERROR, "'%s', line %d : %s (%s)", yyname, yylineno-1, s, yytext);
   yyerrorstate=1;
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index e56577f3d762f930ec91a7e63262d9e84302cc1b..c3ac9e9c48836ab62ca587dab16e53b57d7d46ee 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,5 +1,5 @@
 %{ 
-// $Id: Gmsh.y,v 1.146 2003-11-21 07:56:30 geuzaine Exp $
+// $Id: Gmsh.y,v 1.147 2003-11-26 16:35:48 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -79,6 +79,7 @@ void yyerror (char *s);
 void yymsg (int type, char *fmt, ...);
 void skip_until (char *skip, char *until);
 int PrintListOfDouble (char *format, List_T *list, char *buffer);
+ void FixRelativePath(char *in, char *out);
 %}
 
 %union {
@@ -1952,21 +1953,8 @@ Command :
     tSTRING StringExpr tEND
     {
       if(!strcmp($1, "Include")){
+	FixRelativePath($2, tmpstring);
 	yyinTab[RecursionLevel++] = yyin;
-
-	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); 
 	  strcpy(yynameTab[RecursionLevel-1], yyname);
@@ -1988,31 +1976,37 @@ Command :
 	  yymsg(GERROR, "Unknown file '%s'", tmpstring) ;  
 	  yyin = yyinTab[--RecursionLevel];
 	}
-
       }
       else if(!strcmp($1, "Print")){
 #if defined(HAVE_FLTK)
-	if(!CTX.batch) CreateOutputFile($2, CTX.print.format);
+	if(!CTX.batch){
+	  FixRelativePath($2, tmpstring);
+	  CreateOutputFile(tmpstring, CTX.print.format);
+	}
 #endif
       }
       else if(!strcmp($1, "Save")){
 #if defined(HAVE_FLTK)
-	CreateOutputFile($2, CTX.mesh.format);
+	FixRelativePath($2, tmpstring);
+	CreateOutputFile(tmpstring, CTX.mesh.format);
 #endif
       }
       else if(!strcmp($1, "Merge")){
 	FILE *ff = yyin;
-	MergeProblem($2);
+	FixRelativePath($2, tmpstring);
+	MergeProblem(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp($1, "MergeWithBoundingBox")){
 	FILE *ff = yyin;
-	MergeProblemWithBoundingBox($2);
+	FixRelativePath($2, tmpstring);
+	MergeProblemWithBoundingBox(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp($1, "Open")){
 	FILE *ff = yyin;
-	OpenProblem($2);
+	FixRelativePath($2, tmpstring);
+	OpenProblem(tmpstring);
 	yyin = ff;
       }
       else if(!strcmp($1, "System")){
@@ -2027,7 +2021,8 @@ Command :
       if(!strcmp($1, "Save") && !strcmp($2, "View")){
 	Post_View *v = (Post_View *)List_Pointer_Test(CTX.post.list, (int)$4);
 	if(v){
-	  WriteView(0, v, $6);
+	  FixRelativePath($6, tmpstring);
+	  WriteView(0, v, tmpstring);
 	}
       }
       else{
@@ -2037,22 +2032,19 @@ Command :
   | tSTRING FExpr tEND
     {
       if(!strcmp($1, "Sleep")){
-
 	long sleep_time = GetTime();
 	while(1){
 	  if(GetTime() - sleep_time > (long)($2*1.e6)) break;
 	}
-      
       }
       else if(!strcmp($1, "Mesh")){
-
 	//Maillage_Dimension_0(THEM);
 	//mai3d(THEM, (int)$2);
 	yymsg(GERROR, "Mesh directives are not (yet) allowed in scripts");
-
       }
-      else
+      else{
 	yymsg(GERROR, "Unknown command '%s'", $1);
+      }
     }
    | tPlugin '(' tSTRING ')' '.' tSTRING tEND
    {
@@ -3441,6 +3433,21 @@ int PrintListOfDouble(char *format, List_T *list, char *buffer){
   return 0;
 }
 
+void FixRelativePath(char *in, char *out){
+  if(in[0] == '/' || in[0] == '\\' || (strlen(in)>2 && in[1] == ':')){
+    // do nothing: 'in' is an absolute path
+    strcpy(out, in);
+  }
+  else{
+    // append 'in' to the path of the parent file
+    strcpy(out, yyname);
+    int i = strlen(out)-1 ;
+    while(i >= 0 && yyname[i] != '/' && yyname[i] != '\\') i-- ;
+    out[i+1] = '\0';
+    strcat(out, in);
+  }
+}
+
 void yyerror(char *s){
   Msg(GERROR, "'%s', line %d : %s (%s)", yyname, yylineno-1, s, yytext);
   yyerrorstate=1;
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 566e739305b1d30368a0e8c4cbc9411f474c6888..78523fe792baf36ac9ab02fb0d801537950c7ef2 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.166 2003-11-21 08:00:04 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.167 2003-11-26 16:35:48 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -1013,7 +1013,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "Gmsh.l"
 
-// $Id: Gmsh.yy.cpp,v 1.166 2003-11-21 08:00:04 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.167 2003-11-26 16:35:48 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 05aec0f8077528ac166bca507adc871e15553d5c..e60dd05cac915e3482d40d57c300e9644ef33aec 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,4 +1,8 @@
-$Id: VERSIONS,v 1.163 2003-11-23 04:40:23 geuzaine Exp $
+$Id: VERSIONS,v 1.164 2003-11-26 16:35:48 geuzaine Exp $
+
+New in 1.49: made Merge, Save and Print behave like Include (i.e.,
+open files in the same directory as the main project file if the path
+is relative);
 
 New in 1.48: new DisplacementRaise plugin to plot arbitrary fields on
 deformed meshes; generalized CutMap, CutPlane, CutSphere and Skin