From 994aa8a2908503d1345c467b827c21bc012168b8 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 30 Jan 2009 16:43:48 +0000
Subject: [PATCH] get string option would NEVER work! Ugly fix until will
 replace all const char* with std::strings in the options

---
 Common/Gmsh.cpp     |   3 +-
 Common/Options.cpp  |   4 +-
 Common/Options.h    |   3 +-
 Parser/Gmsh.tab.cpp | 662 ++++++++++++++++++++++----------------------
 Parser/Gmsh.y       |  22 +-
 5 files changed, 350 insertions(+), 344 deletions(-)

diff --git a/Common/Gmsh.cpp b/Common/Gmsh.cpp
index 4868a115d1..eecd0c5b40 100644
--- a/Common/Gmsh.cpp
+++ b/Common/Gmsh.cpp
@@ -65,7 +65,8 @@ int GmshSetMessageHandler(GmshMessage *callback)
 
 int GmshSetOption(std::string category, std::string name, std::string value, int index)
 {
-  if(StringOption(GMSH_SET, category.c_str(), index, name.c_str(), value.c_str()))
+  std::string dummy;
+  if(StringOption(GMSH_SET, category.c_str(), index, name.c_str(), value.c_str(), dummy))
     return 1;
   return 0;
 }
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 5c18e1456a..facb1518ef 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -51,7 +51,7 @@ Context_T CTX;
 // General routines for string options
 
 bool StringOption(int action, const char *category, int num, 
-		  const char *name, const char *val)
+		  const char *name, const char *val, std::string &out)
 {
   StringXString *s = 0;
   if(!strcmp(category, "General"))
@@ -80,7 +80,7 @@ bool StringOption(int action, const char *category, int num,
     return false;
   }
 
-  s[i].function(num, action, val);
+  out = s[i].function(num, action, val);
   return true;
 }
 
diff --git a/Common/Options.h b/Common/Options.h
index 3e9d961dfc..0659b552c5 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -6,6 +6,7 @@
 #ifndef _OPTIONS_H_
 #define _OPTIONS_H_
 
+#include <string>
 #include "ColorTable.h"
 
 #define GMSH_SET       (1<<0)
@@ -803,7 +804,7 @@ void Print_Options(int num, int level, int diff, int help, const char *filename)
 void Print_OptionsDoc();
 
 bool StringOption(int action, const char *category, int num, 
-		  const char *name, const char *val);
+		  const char *name, const char *val, std::string &out);
 bool NumberOption(int action, const char *category, int num, 
 		  const char *name, double &val);
 bool ColorOption(int action, const char *category, int num, 
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index d1554999ca..9e1b843065 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -975,35 +975,35 @@ static const yytype_uint16 yyrline[] =
      458,   311,   476,   483,   494,   493,   512,   519,   530,   529,
      547,   563,   586,   585,   599,   600,   601,   602,   603,   607,
      608,   615,   637,   664,   704,   714,   722,   730,   742,   751,
-     756,   764,   782,   800,   809,   821,   826,   834,   854,   877,
-     884,   890,   910,   931,   957,   969,   986,   990,  1000,  1003,
-    1016,  1019,  1029,  1052,  1068,  1090,  1108,  1126,  1156,  1186,
-    1206,  1224,  1242,  1268,  1285,  1304,  1322,  1361,  1367,  1373,
-    1380,  1405,  1430,  1446,  1462,  1493,  1511,  1528,  1549,  1554,
-    1559,  1564,  1569,  1589,  1595,  1606,  1607,  1612,  1615,  1619,
-    1642,  1665,  1688,  1716,  1725,  1729,  1744,  1771,  1788,  1802,
-    1808,  1814,  1823,  1837,  1885,  1903,  1918,  1937,  1949,  1973,
-    1977,  1982,  1987,  1998,  2015,  2032,  2051,  2070,  2098,  2106,
-    2112,  2119,  2123,  2132,  2140,  2148,  2157,  2156,  2169,  2168,
-    2181,  2180,  2193,  2192,  2205,  2212,  2219,  2226,  2233,  2240,
-    2247,  2254,  2261,  2269,  2268,  2280,  2279,  2291,  2290,  2302,
-    2301,  2313,  2312,  2324,  2323,  2335,  2334,  2346,  2345,  2357,
-    2356,  2371,  2374,  2380,  2389,  2409,  2432,  2436,  2460,  2463,
-    2479,  2482,  2495,  2498,  2504,  2507,  2514,  2568,  2638,  2643,
-    2710,  2753,  2779,  2802,  2825,  2828,  2837,  2841,  2857,  2858,
-    2859,  2860,  2861,  2862,  2863,  2864,  2865,  2872,  2873,  2874,
-    2875,  2876,  2877,  2878,  2879,  2880,  2881,  2882,  2883,  2884,
-    2885,  2886,  2887,  2888,  2889,  2890,  2891,  2892,  2893,  2894,
-    2895,  2896,  2897,  2898,  2899,  2900,  2901,  2902,  2903,  2905,
-    2906,  2907,  2908,  2909,  2910,  2911,  2912,  2913,  2914,  2915,
-    2916,  2917,  2918,  2919,  2920,  2921,  2922,  2923,  2924,  2925,
-    2934,  2935,  2936,  2937,  2938,  2939,  2940,  2944,  2957,  2969,
-    2984,  2994,  3004,  3022,  3027,  3032,  3042,  3052,  3060,  3064,
-    3068,  3072,  3076,  3083,  3087,  3091,  3095,  3102,  3107,  3114,
-    3119,  3123,  3128,  3132,  3140,  3151,  3155,  3167,  3175,  3183,
-    3190,  3201,  3221,  3231,  3241,  3251,  3271,  3276,  3280,  3284,
-    3296,  3300,  3312,  3319,  3329,  3333,  3348,  3353,  3360,  3364,
-    3377,  3385,  3396,  3400,  3408,  3416,  3430,  3444,  3448
+     757,   766,   784,   802,   811,   823,   828,   836,   856,   879,
+     886,   892,   912,   933,   959,   971,   988,   992,  1002,  1005,
+    1018,  1021,  1031,  1054,  1070,  1092,  1110,  1128,  1158,  1188,
+    1208,  1226,  1244,  1270,  1287,  1306,  1324,  1363,  1369,  1375,
+    1382,  1407,  1432,  1448,  1464,  1495,  1513,  1530,  1551,  1556,
+    1561,  1566,  1571,  1591,  1597,  1608,  1609,  1614,  1617,  1621,
+    1644,  1667,  1690,  1718,  1727,  1731,  1746,  1773,  1790,  1804,
+    1810,  1816,  1825,  1839,  1887,  1905,  1920,  1939,  1951,  1975,
+    1979,  1984,  1989,  2000,  2017,  2034,  2053,  2072,  2100,  2108,
+    2114,  2121,  2125,  2134,  2142,  2150,  2159,  2158,  2171,  2170,
+    2183,  2182,  2195,  2194,  2207,  2214,  2221,  2228,  2235,  2242,
+    2249,  2256,  2263,  2271,  2270,  2282,  2281,  2293,  2292,  2304,
+    2303,  2315,  2314,  2326,  2325,  2337,  2336,  2348,  2347,  2359,
+    2358,  2373,  2376,  2382,  2391,  2411,  2434,  2438,  2462,  2465,
+    2481,  2484,  2497,  2500,  2506,  2509,  2516,  2570,  2640,  2645,
+    2712,  2755,  2781,  2804,  2827,  2830,  2839,  2843,  2859,  2860,
+    2861,  2862,  2863,  2864,  2865,  2866,  2867,  2874,  2875,  2876,
+    2877,  2878,  2879,  2880,  2881,  2882,  2883,  2884,  2885,  2886,
+    2887,  2888,  2889,  2890,  2891,  2892,  2893,  2894,  2895,  2896,
+    2897,  2898,  2899,  2900,  2901,  2902,  2903,  2904,  2905,  2907,
+    2908,  2909,  2910,  2911,  2912,  2913,  2914,  2915,  2916,  2917,
+    2918,  2919,  2920,  2921,  2922,  2923,  2924,  2925,  2926,  2927,
+    2936,  2937,  2938,  2939,  2940,  2941,  2942,  2946,  2959,  2971,
+    2986,  2996,  3006,  3024,  3029,  3034,  3044,  3054,  3062,  3066,
+    3070,  3074,  3078,  3085,  3089,  3093,  3097,  3104,  3109,  3116,
+    3121,  3125,  3130,  3134,  3142,  3153,  3157,  3169,  3177,  3185,
+    3192,  3203,  3223,  3233,  3243,  3253,  3273,  3278,  3282,  3286,
+    3298,  3302,  3314,  3321,  3331,  3335,  3350,  3355,  3362,  3366,
+    3379,  3387,  3398,  3402,  3410,  3418,  3432,  3446,  3450
 };
 #endif
 
@@ -4375,21 +4375,23 @@ yyreduce:
   case 69:
 #line 752 "Gmsh.y"
     { 
-      StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
+      std::string dummy;
+      StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c), dummy);
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(3) - (6)].c));
     ;}
     break;
 
   case 70:
-#line 757 "Gmsh.y"
+#line 758 "Gmsh.y"
     { 
-      StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), (yyvsp[(8) - (9)].c));
+      std::string dummy;
+      StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), (yyvsp[(8) - (9)].c), dummy);
       Free((yyvsp[(1) - (9)].c)); Free((yyvsp[(6) - (9)].c));
     ;}
     break;
 
   case 71:
-#line 765 "Gmsh.y"
+#line 767 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), d)){
@@ -4410,7 +4412,7 @@ yyreduce:
     break;
 
   case 72:
-#line 783 "Gmsh.y"
+#line 785 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), d)){
@@ -4431,7 +4433,7 @@ yyreduce:
     break;
 
   case 73:
-#line 801 "Gmsh.y"
+#line 803 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(3) - (5)].c), d)){
@@ -4443,7 +4445,7 @@ yyreduce:
     break;
 
   case 74:
-#line 810 "Gmsh.y"
+#line 812 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (8)].c), (int)(yyvsp[(3) - (8)].d), (yyvsp[(6) - (8)].c), d)){
@@ -4455,7 +4457,7 @@ yyreduce:
     break;
 
   case 75:
-#line 822 "Gmsh.y"
+#line 824 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (8)].c), 0, (yyvsp[(5) - (8)].c), (yyvsp[(7) - (8)].u));
       Free((yyvsp[(1) - (8)].c)); Free((yyvsp[(5) - (8)].c));
@@ -4463,7 +4465,7 @@ yyreduce:
     break;
 
   case 76:
-#line 827 "Gmsh.y"
+#line 829 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (11)].c), (int)(yyvsp[(3) - (11)].d), (yyvsp[(8) - (11)].c), (yyvsp[(10) - (11)].u));
       Free((yyvsp[(1) - (11)].c)); Free((yyvsp[(8) - (11)].c));
@@ -4471,7 +4473,7 @@ yyreduce:
     break;
 
   case 77:
-#line 835 "Gmsh.y"
+#line 837 "Gmsh.y"
     {
       GmshColorTable *ct = Get_ColorTable(0);
       if(!ct)
@@ -4494,7 +4496,7 @@ yyreduce:
     break;
 
   case 78:
-#line 855 "Gmsh.y"
+#line 857 "Gmsh.y"
     {
       GmshColorTable *ct = Get_ColorTable((int)(yyvsp[(3) - (9)].d));
       if(!ct)
@@ -4517,7 +4519,7 @@ yyreduce:
     break;
 
   case 79:
-#line 878 "Gmsh.y"
+#line 880 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (5)].c),"Background"))
 	GModel::current()->getFields()->background_field = (int)(yyvsp[(4) - (5)].d);
@@ -4527,7 +4529,7 @@ yyreduce:
     break;
 
   case 80:
-#line 885 "Gmsh.y"
+#line 887 "Gmsh.y"
     {
       if(!GModel::current()->getFields()->new_field((int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c)))
 	yymsg(0, "Cannot create field %i of type '%s'", (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c));
@@ -4536,7 +4538,7 @@ yyreduce:
     break;
 
   case 81:
-#line 891 "Gmsh.y"
+#line 893 "Gmsh.y"
     {
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (9)].d));
       if(field){
@@ -4559,7 +4561,7 @@ yyreduce:
     break;
 
   case 82:
-#line 911 "Gmsh.y"
+#line 913 "Gmsh.y"
     {
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (9)].d));
       if(field){
@@ -4583,7 +4585,7 @@ yyreduce:
     break;
 
   case 83:
-#line 932 "Gmsh.y"
+#line 934 "Gmsh.y"
     {
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (11)].d));
       if(field){
@@ -4609,7 +4611,7 @@ yyreduce:
     break;
 
   case 84:
-#line 958 "Gmsh.y"
+#line 960 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       try {
@@ -4624,7 +4626,7 @@ yyreduce:
     break;
 
   case 85:
-#line 970 "Gmsh.y"
+#line 972 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       try {
@@ -4639,14 +4641,14 @@ yyreduce:
     break;
 
   case 86:
-#line 987 "Gmsh.y"
+#line 989 "Gmsh.y"
     { 
       (yyval.i) = (int)(yyvsp[(1) - (1)].d); 
     ;}
     break;
 
   case 87:
-#line 991 "Gmsh.y"
+#line 993 "Gmsh.y"
     { 
       (yyval.i) = GModel::current()->setPhysicalName
 	(std::string((yyvsp[(1) - (1)].c)), ++GModel::current()->getGEOInternals()->MaxPhysicalNum);
@@ -4655,14 +4657,14 @@ yyreduce:
     break;
 
   case 88:
-#line 1000 "Gmsh.y"
+#line 1002 "Gmsh.y"
     {
       (yyval.l) = 0;
     ;}
     break;
 
   case 89:
-#line 1004 "Gmsh.y"
+#line 1006 "Gmsh.y"
     {
       (yyval.l) = List_Create(1, 1, sizeof(Vertex*));
       Vertex *v = FindPoint((int)(yyvsp[(4) - (5)].d));
@@ -4675,21 +4677,21 @@ yyreduce:
     break;
 
   case 90:
-#line 1016 "Gmsh.y"
+#line 1018 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = 0.;
     ;}
     break;
 
   case 91:
-#line 1020 "Gmsh.y"
+#line 1022 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 92:
-#line 1030 "Gmsh.y"
+#line 1032 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindPoint(num)){
@@ -4715,7 +4717,7 @@ yyreduce:
     break;
 
   case 93:
-#line 1053 "Gmsh.y"
+#line 1055 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       if(FindPhysicalGroup(num, MSH_PHYSICAL_POINT)){
@@ -4734,7 +4736,7 @@ yyreduce:
     break;
 
   case 94:
-#line 1069 "Gmsh.y"
+#line 1071 "Gmsh.y"
     {      
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -4756,7 +4758,7 @@ yyreduce:
     break;
 
   case 95:
-#line 1091 "Gmsh.y"
+#line 1093 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindCurve(num)){
@@ -4777,7 +4779,7 @@ yyreduce:
     break;
 
   case 96:
-#line 1109 "Gmsh.y"
+#line 1111 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindCurve(num)){
@@ -4798,7 +4800,7 @@ yyreduce:
     break;
 
   case 97:
-#line 1127 "Gmsh.y"
+#line 1129 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
       if(FindCurve(num)){
@@ -4831,7 +4833,7 @@ yyreduce:
     break;
 
   case 98:
-#line 1157 "Gmsh.y"
+#line 1159 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
       if(FindCurve(num)){
@@ -4864,7 +4866,7 @@ yyreduce:
     break;
 
   case 99:
-#line 1188 "Gmsh.y"
+#line 1190 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (17)].d);
       if(FindCurve(num)){
@@ -4886,7 +4888,7 @@ yyreduce:
     break;
 
   case 100:
-#line 1207 "Gmsh.y"
+#line 1209 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindCurve(num)){
@@ -4907,7 +4909,7 @@ yyreduce:
     break;
 
   case 101:
-#line 1225 "Gmsh.y"
+#line 1227 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindCurve(num)){
@@ -4928,7 +4930,7 @@ yyreduce:
     break;
 
   case 102:
-#line 1243 "Gmsh.y"
+#line 1245 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (11)].d);
       if(List_Nbr((yyvsp[(6) - (11)].l)) + (int)(yyvsp[(10) - (11)].d) + 1 != List_Nbr((yyvsp[(8) - (11)].l))){
@@ -4957,7 +4959,7 @@ yyreduce:
     break;
 
   case 103:
-#line 1269 "Gmsh.y"
+#line 1271 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       if(FindEdgeLoop(num)){
@@ -4977,7 +4979,7 @@ yyreduce:
     break;
 
   case 104:
-#line 1286 "Gmsh.y"
+#line 1288 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       if(FindPhysicalGroup(num, MSH_PHYSICAL_LINE)){
@@ -4996,7 +4998,7 @@ yyreduce:
     break;
 
   case 105:
-#line 1305 "Gmsh.y"
+#line 1307 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       if(FindSurface(num)){
@@ -5017,7 +5019,7 @@ yyreduce:
     break;
 
   case 106:
-#line 1323 "Gmsh.y"
+#line 1325 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (9)].d), type = 0;
       if(FindSurface(num)){
@@ -5059,7 +5061,7 @@ yyreduce:
     break;
 
   case 107:
-#line 1362 "Gmsh.y"
+#line 1364 "Gmsh.y"
     {
       myGmshSurface = 0;
       (yyval.s).Type = 0;
@@ -5068,7 +5070,7 @@ yyreduce:
     break;
 
   case 108:
-#line 1368 "Gmsh.y"
+#line 1370 "Gmsh.y"
     {
       myGmshSurface = gmshSurface::getSurface((int)(yyvsp[(3) - (4)].d));
       (yyval.s).Type = 0;
@@ -5077,7 +5079,7 @@ yyreduce:
     break;
 
   case 109:
-#line 1374 "Gmsh.y"
+#line 1376 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (10)].d);
       myGmshSurface = gmshParametricSurface::NewParametricSurface(num, (yyvsp[(7) - (10)].c), (yyvsp[(8) - (10)].c), (yyvsp[(9) - (10)].c));
@@ -5087,7 +5089,7 @@ yyreduce:
     break;
 
   case 110:
-#line 1381 "Gmsh.y"
+#line 1383 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if (List_Nbr((yyvsp[(6) - (7)].l)) != 2){
@@ -5115,7 +5117,7 @@ yyreduce:
     break;
 
   case 111:
-#line 1406 "Gmsh.y"
+#line 1408 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if (List_Nbr((yyvsp[(6) - (7)].l)) != 2){
@@ -5143,7 +5145,7 @@ yyreduce:
     break;
 
   case 112:
-#line 1431 "Gmsh.y"
+#line 1433 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       if(FindSurfaceLoop(num)){
@@ -5162,7 +5164,7 @@ yyreduce:
     break;
 
   case 113:
-#line 1447 "Gmsh.y"
+#line 1449 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       if(FindPhysicalGroup(num, MSH_PHYSICAL_SURFACE)){
@@ -5181,7 +5183,7 @@ yyreduce:
     break;
 
   case 114:
-#line 1463 "Gmsh.y"
+#line 1465 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (12)].d);
       if(FindPhysicalGroup(num, MSH_PHYSICAL_SURFACE)){
@@ -5211,7 +5213,7 @@ yyreduce:
     break;
 
   case 115:
-#line 1494 "Gmsh.y"
+#line 1496 "Gmsh.y"
     {
       yymsg(0, "'Complex Volume' command is deprecated: use 'Volume' instead");
       int num = (int)(yyvsp[(4) - (8)].d);
@@ -5232,7 +5234,7 @@ yyreduce:
     break;
 
   case 116:
-#line 1512 "Gmsh.y"
+#line 1514 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       if(FindVolume(num)){
@@ -5252,7 +5254,7 @@ yyreduce:
     break;
 
   case 117:
-#line 1529 "Gmsh.y"
+#line 1531 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       if(FindPhysicalGroup(num, MSH_PHYSICAL_VOLUME)){
@@ -5271,7 +5273,7 @@ yyreduce:
     break;
 
   case 118:
-#line 1550 "Gmsh.y"
+#line 1552 "Gmsh.y"
     {
       TranslateShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(4) - (5)].l));
       (yyval.l) = (yyvsp[(4) - (5)].l);
@@ -5279,7 +5281,7 @@ yyreduce:
     break;
 
   case 119:
-#line 1555 "Gmsh.y"
+#line 1557 "Gmsh.y"
     {
       RotateShapes((yyvsp[(3) - (11)].v)[0], (yyvsp[(3) - (11)].v)[1], (yyvsp[(3) - (11)].v)[2], (yyvsp[(5) - (11)].v)[0], (yyvsp[(5) - (11)].v)[1], (yyvsp[(5) - (11)].v)[2], (yyvsp[(7) - (11)].d), (yyvsp[(10) - (11)].l));
       (yyval.l) = (yyvsp[(10) - (11)].l);
@@ -5287,7 +5289,7 @@ yyreduce:
     break;
 
   case 120:
-#line 1560 "Gmsh.y"
+#line 1562 "Gmsh.y"
     {
       SymmetryShapes((yyvsp[(2) - (5)].v)[0], (yyvsp[(2) - (5)].v)[1], (yyvsp[(2) - (5)].v)[2], (yyvsp[(2) - (5)].v)[3], (yyvsp[(4) - (5)].l));
       (yyval.l) = (yyvsp[(4) - (5)].l);
@@ -5295,7 +5297,7 @@ yyreduce:
     break;
 
   case 121:
-#line 1565 "Gmsh.y"
+#line 1567 "Gmsh.y"
     {
       DilatShapes((yyvsp[(3) - (9)].v)[0], (yyvsp[(3) - (9)].v)[1], (yyvsp[(3) - (9)].v)[2], (yyvsp[(5) - (9)].d), (yyvsp[(8) - (9)].l));
       (yyval.l) = (yyvsp[(8) - (9)].l);
@@ -5303,7 +5305,7 @@ yyreduce:
     break;
 
   case 122:
-#line 1570 "Gmsh.y"
+#line 1572 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 3, sizeof(Shape));
       if(!strcmp((yyvsp[(1) - (4)].c), "Duplicata")){
@@ -5326,7 +5328,7 @@ yyreduce:
     break;
 
   case 123:
-#line 1590 "Gmsh.y"
+#line 1592 "Gmsh.y"
     { 
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       IntersectCurvesWithSurface((yyvsp[(4) - (9)].l), (int)(yyvsp[(8) - (9)].d), (yyval.l));
@@ -5335,7 +5337,7 @@ yyreduce:
     break;
 
   case 124:
-#line 1596 "Gmsh.y"
+#line 1598 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape*));
       List_T *tmp = ListOfDouble2ListOfInt((yyvsp[(7) - (9)].l));
@@ -5346,31 +5348,31 @@ yyreduce:
     break;
 
   case 125:
-#line 1606 "Gmsh.y"
+#line 1608 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
   case 126:
-#line 1607 "Gmsh.y"
+#line 1609 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
   case 127:
-#line 1612 "Gmsh.y"
+#line 1614 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 3, sizeof(Shape));
     ;}
     break;
 
   case 128:
-#line 1616 "Gmsh.y"
+#line 1618 "Gmsh.y"
     {
       List_Add((yyval.l), &(yyvsp[(2) - (2)].s));
     ;}
     break;
 
   case 129:
-#line 1620 "Gmsh.y"
+#line 1622 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -5396,7 +5398,7 @@ yyreduce:
     break;
 
   case 130:
-#line 1643 "Gmsh.y"
+#line 1645 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -5422,7 +5424,7 @@ yyreduce:
     break;
 
   case 131:
-#line 1666 "Gmsh.y"
+#line 1668 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -5448,7 +5450,7 @@ yyreduce:
     break;
 
   case 132:
-#line 1689 "Gmsh.y"
+#line 1691 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -5474,7 +5476,7 @@ yyreduce:
     break;
 
   case 133:
-#line 1717 "Gmsh.y"
+#line 1719 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	Shape TheShape;
@@ -5486,14 +5488,14 @@ yyreduce:
     break;
 
   case 134:
-#line 1726 "Gmsh.y"
+#line 1728 "Gmsh.y"
     {
       GModel::current()->getFields()->delete_field((int)(yyvsp[(4) - (6)].d));
     ;}
     break;
 
   case 135:
-#line 1730 "Gmsh.y"
+#line 1732 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(2) - (6)].c), "View")){
@@ -5511,7 +5513,7 @@ yyreduce:
     break;
 
   case 136:
-#line 1745 "Gmsh.y"
+#line 1747 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
         for(unsigned int i = 0; i < GModel::list.size(); i++){
@@ -5541,7 +5543,7 @@ yyreduce:
     break;
 
   case 137:
-#line 1772 "Gmsh.y"
+#line 1774 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){
@@ -5556,7 +5558,7 @@ yyreduce:
     break;
 
   case 138:
-#line 1789 "Gmsh.y"
+#line 1791 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
 	Shape TheShape;
@@ -5568,7 +5570,7 @@ yyreduce:
     break;
 
   case 139:
-#line 1803 "Gmsh.y"
+#line 1805 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 1);
@@ -5577,7 +5579,7 @@ yyreduce:
     break;
 
   case 140:
-#line 1809 "Gmsh.y"
+#line 1811 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 0);
@@ -5586,7 +5588,7 @@ yyreduce:
     break;
 
   case 141:
-#line 1815 "Gmsh.y"
+#line 1817 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	Shape TheShape;
@@ -5598,7 +5600,7 @@ yyreduce:
     break;
 
   case 142:
-#line 1824 "Gmsh.y"
+#line 1826 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	Shape TheShape;
@@ -5610,7 +5612,7 @@ yyreduce:
     break;
 
   case 143:
-#line 1838 "Gmsh.y"
+#line 1840 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Include")){
 	char tmpstring[1024];
@@ -5661,7 +5663,7 @@ yyreduce:
     break;
 
   case 144:
-#line 1886 "Gmsh.y"
+#line 1888 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){
@@ -5682,7 +5684,7 @@ yyreduce:
     break;
 
   case 145:
-#line 1904 "Gmsh.y"
+#line 1906 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh")  && !strcmp((yyvsp[(3) - (7)].c), "View")){
@@ -5700,7 +5702,7 @@ yyreduce:
     break;
 
   case 146:
-#line 1919 "Gmsh.y"
+#line 1921 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
 	SleepInSeconds((yyvsp[(2) - (3)].d));
@@ -5722,7 +5724,7 @@ yyreduce:
     break;
 
   case 147:
-#line 1938 "Gmsh.y"
+#line 1940 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
        try {
@@ -5737,7 +5739,7 @@ yyreduce:
     break;
 
   case 148:
-#line 1950 "Gmsh.y"
+#line 1952 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews"))
@@ -5764,14 +5766,14 @@ yyreduce:
     break;
 
   case 149:
-#line 1974 "Gmsh.y"
+#line 1976 "Gmsh.y"
     {
       exit(0);
     ;}
     break;
 
   case 150:
-#line 1978 "Gmsh.y"
+#line 1980 "Gmsh.y"
     {
       CTX.forced_bbox = 0;
       SetBoundingBox();
@@ -5779,7 +5781,7 @@ yyreduce:
     break;
 
   case 151:
-#line 1983 "Gmsh.y"
+#line 1985 "Gmsh.y"
     {
       CTX.forced_bbox = 1;
       SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d));
@@ -5787,7 +5789,7 @@ yyreduce:
     break;
 
   case 152:
-#line 1988 "Gmsh.y"
+#line 1990 "Gmsh.y"
     {
 #if defined(HAVE_FLTK)
       Draw();
@@ -5796,7 +5798,7 @@ yyreduce:
     break;
 
   case 153:
-#line 1999 "Gmsh.y"
+#line 2001 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d);
@@ -5816,7 +5818,7 @@ yyreduce:
     break;
 
   case 154:
-#line 2016 "Gmsh.y"
+#line 2018 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d);
@@ -5836,7 +5838,7 @@ yyreduce:
     break;
 
   case 155:
-#line 2033 "Gmsh.y"
+#line 2035 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d);
@@ -5858,7 +5860,7 @@ yyreduce:
     break;
 
   case 156:
-#line 2052 "Gmsh.y"
+#line 2054 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d);
@@ -5880,7 +5882,7 @@ yyreduce:
     break;
 
   case 157:
-#line 2071 "Gmsh.y"
+#line 2073 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
 	yymsg(0, "Invalid For/EndFor loop");
@@ -5911,7 +5913,7 @@ yyreduce:
     break;
 
   case 158:
-#line 2099 "Gmsh.y"
+#line 2101 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          ((yyvsp[(2) - (2)].c), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -5922,7 +5924,7 @@ yyreduce:
     break;
 
   case 159:
-#line 2107 "Gmsh.y"
+#line 2109 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction
          (&gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -5931,7 +5933,7 @@ yyreduce:
     break;
 
   case 160:
-#line 2113 "Gmsh.y"
+#line 2115 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          ((yyvsp[(2) - (3)].c), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -5941,20 +5943,20 @@ yyreduce:
     break;
 
   case 161:
-#line 2120 "Gmsh.y"
+#line 2122 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].d)) skip_until("If", "EndIf");
     ;}
     break;
 
   case 162:
-#line 2124 "Gmsh.y"
+#line 2126 "Gmsh.y"
     {
     ;}
     break;
 
   case 163:
-#line 2133 "Gmsh.y"
+#line 2135 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (5)].l), 
@@ -5965,7 +5967,7 @@ yyreduce:
     break;
 
   case 164:
-#line 2141 "Gmsh.y"
+#line 2143 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (11)].l), 
@@ -5976,7 +5978,7 @@ yyreduce:
     break;
 
   case 165:
-#line 2149 "Gmsh.y"
+#line 2151 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (13)].l), 
@@ -5987,14 +5989,14 @@ yyreduce:
     break;
 
   case 166:
-#line 2157 "Gmsh.y"
+#line 2159 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 167:
-#line 2161 "Gmsh.y"
+#line 2163 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (7)].l), 
@@ -6005,14 +6007,14 @@ yyreduce:
     break;
 
   case 168:
-#line 2169 "Gmsh.y"
+#line 2171 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 169:
-#line 2173 "Gmsh.y"
+#line 2175 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (13)].l), 
@@ -6023,14 +6025,14 @@ yyreduce:
     break;
 
   case 170:
-#line 2181 "Gmsh.y"
+#line 2183 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 171:
-#line 2185 "Gmsh.y"
+#line 2187 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (15)].l), 
@@ -6041,14 +6043,14 @@ yyreduce:
     break;
 
   case 172:
-#line 2193 "Gmsh.y"
+#line 2195 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 173:
-#line 2197 "Gmsh.y"
+#line 2199 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(BOUNDARY_LAYER, (yyvsp[(3) - (6)].l), 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
@@ -6058,7 +6060,7 @@ yyreduce:
     break;
 
   case 174:
-#line 2206 "Gmsh.y"
+#line 2208 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (8)].d), 
@@ -6068,7 +6070,7 @@ yyreduce:
     break;
 
   case 175:
-#line 2213 "Gmsh.y"
+#line 2215 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (8)].d), 
@@ -6078,7 +6080,7 @@ yyreduce:
     break;
 
   case 176:
-#line 2220 "Gmsh.y"
+#line 2222 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (8)].d), 
@@ -6088,7 +6090,7 @@ yyreduce:
     break;
 
   case 177:
-#line 2227 "Gmsh.y"
+#line 2229 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), 
@@ -6098,7 +6100,7 @@ yyreduce:
     break;
 
   case 178:
-#line 2234 "Gmsh.y"
+#line 2236 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), 
@@ -6108,7 +6110,7 @@ yyreduce:
     break;
 
   case 179:
-#line 2241 "Gmsh.y"
+#line 2243 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), 
@@ -6118,7 +6120,7 @@ yyreduce:
     break;
 
   case 180:
-#line 2248 "Gmsh.y"
+#line 2250 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (14)].d), 
@@ -6128,7 +6130,7 @@ yyreduce:
     break;
 
   case 181:
-#line 2255 "Gmsh.y"
+#line 2257 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (14)].d), 
@@ -6138,7 +6140,7 @@ yyreduce:
     break;
 
   case 182:
-#line 2262 "Gmsh.y"
+#line 2264 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (14)].d), 
@@ -6148,14 +6150,14 @@ yyreduce:
     break;
 
   case 183:
-#line 2269 "Gmsh.y"
+#line 2271 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 184:
-#line 2273 "Gmsh.y"
+#line 2275 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), 
@@ -6165,14 +6167,14 @@ yyreduce:
     break;
 
   case 185:
-#line 2280 "Gmsh.y"
+#line 2282 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 186:
-#line 2284 "Gmsh.y"
+#line 2286 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), 
@@ -6182,14 +6184,14 @@ yyreduce:
     break;
 
   case 187:
-#line 2291 "Gmsh.y"
+#line 2293 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 188:
-#line 2295 "Gmsh.y"
+#line 2297 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), 
@@ -6199,14 +6201,14 @@ yyreduce:
     break;
 
   case 189:
-#line 2302 "Gmsh.y"
+#line 2304 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 190:
-#line 2306 "Gmsh.y"
+#line 2308 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (16)].d), 
@@ -6216,14 +6218,14 @@ yyreduce:
     break;
 
   case 191:
-#line 2313 "Gmsh.y"
+#line 2315 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 192:
-#line 2317 "Gmsh.y"
+#line 2319 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (16)].d), 
@@ -6233,14 +6235,14 @@ yyreduce:
     break;
 
   case 193:
-#line 2324 "Gmsh.y"
+#line 2326 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 194:
-#line 2328 "Gmsh.y"
+#line 2330 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (16)].d), 
@@ -6250,14 +6252,14 @@ yyreduce:
     break;
 
   case 195:
-#line 2335 "Gmsh.y"
+#line 2337 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 196:
-#line 2339 "Gmsh.y"
+#line 2341 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (18)].d), 
@@ -6267,14 +6269,14 @@ yyreduce:
     break;
 
   case 197:
-#line 2346 "Gmsh.y"
+#line 2348 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 198:
-#line 2350 "Gmsh.y"
+#line 2352 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (18)].d), 
@@ -6284,14 +6286,14 @@ yyreduce:
     break;
 
   case 199:
-#line 2357 "Gmsh.y"
+#line 2359 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 200:
-#line 2361 "Gmsh.y"
+#line 2363 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (18)].d), 
@@ -6301,19 +6303,19 @@ yyreduce:
     break;
 
   case 201:
-#line 2372 "Gmsh.y"
+#line 2374 "Gmsh.y"
     {
     ;}
     break;
 
   case 202:
-#line 2375 "Gmsh.y"
+#line 2377 "Gmsh.y"
     {
     ;}
     break;
 
   case 203:
-#line 2381 "Gmsh.y"
+#line 2383 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = 1;
@@ -6325,7 +6327,7 @@ yyreduce:
     break;
 
   case 204:
-#line 2390 "Gmsh.y"
+#line 2392 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -6348,7 +6350,7 @@ yyreduce:
     break;
 
   case 205:
-#line 2410 "Gmsh.y"
+#line 2412 "Gmsh.y"
     {
       yymsg(0, "Explicit region numbers in layers are deprecated");
       extr.mesh.ExtrudeMesh = true;
@@ -6374,14 +6376,14 @@ yyreduce:
     break;
 
   case 206:
-#line 2433 "Gmsh.y"
+#line 2435 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
     break;
 
   case 207:
-#line 2437 "Gmsh.y"
+#line 2439 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (9)].d);
       if(FindSurface(num)){
@@ -6403,14 +6405,14 @@ yyreduce:
     break;
 
   case 208:
-#line 2460 "Gmsh.y"
+#line 2462 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
     break;
 
   case 209:
-#line 2464 "Gmsh.y"
+#line 2466 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -6426,14 +6428,14 @@ yyreduce:
     break;
 
   case 210:
-#line 2479 "Gmsh.y"
+#line 2481 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
     break;
 
   case 211:
-#line 2483 "Gmsh.y"
+#line 2485 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -6446,35 +6448,35 @@ yyreduce:
     break;
 
   case 212:
-#line 2495 "Gmsh.y"
+#line 2497 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
     break;
 
   case 213:
-#line 2499 "Gmsh.y"
+#line 2501 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
     break;
 
   case 214:
-#line 2504 "Gmsh.y"
+#line 2506 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
     break;
 
   case 215:
-#line 2508 "Gmsh.y"
+#line 2510 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
     break;
 
   case 216:
-#line 2515 "Gmsh.y"
+#line 2517 "Gmsh.y"
     {
       int type = (int)(yyvsp[(6) - (7)].v)[0];
       double coef = fabs((yyvsp[(6) - (7)].v)[1]);
@@ -6531,7 +6533,7 @@ yyreduce:
     break;
 
   case 217:
-#line 2569 "Gmsh.y"
+#line 2571 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (6)].l));
       if(k != 0 && k != 3 && k != 4){
@@ -6604,7 +6606,7 @@ yyreduce:
     break;
 
   case 218:
-#line 2639 "Gmsh.y"
+#line 2641 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
@@ -6612,7 +6614,7 @@ yyreduce:
     break;
 
   case 219:
-#line 2644 "Gmsh.y"
+#line 2646 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (5)].l));
       if(k != 0 && k != 6 && k != 8){
@@ -6682,7 +6684,7 @@ yyreduce:
     break;
 
   case 220:
-#line 2711 "Gmsh.y"
+#line 2713 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (5)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
@@ -6728,7 +6730,7 @@ yyreduce:
     break;
 
   case 221:
-#line 2754 "Gmsh.y"
+#line 2756 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -6751,7 +6753,7 @@ yyreduce:
     break;
 
   case 222:
-#line 2780 "Gmsh.y"
+#line 2782 "Gmsh.y"
     { 
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -6777,7 +6779,7 @@ yyreduce:
     break;
 
   case 223:
-#line 2803 "Gmsh.y"
+#line 2805 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -6803,26 +6805,26 @@ yyreduce:
     break;
 
   case 224:
-#line 2826 "Gmsh.y"
+#line 2828 "Gmsh.y"
     {
     ;}
     break;
 
   case 225:
-#line 2829 "Gmsh.y"
+#line 2831 "Gmsh.y"
     {
     ;}
     break;
 
   case 226:
-#line 2838 "Gmsh.y"
+#line 2840 "Gmsh.y"
     { 
       ReplaceAllDuplicates();
     ;}
     break;
 
   case 227:
-#line 2842 "Gmsh.y"
+#line 2844 "Gmsh.y"
     { 
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
         ReplaceAllDuplicates();
@@ -6835,47 +6837,47 @@ yyreduce:
     break;
 
   case 228:
-#line 2857 "Gmsh.y"
+#line 2859 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 229:
-#line 2858 "Gmsh.y"
+#line 2860 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 230:
-#line 2859 "Gmsh.y"
+#line 2861 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 231:
-#line 2860 "Gmsh.y"
+#line 2862 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 232:
-#line 2861 "Gmsh.y"
+#line 2863 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 233:
-#line 2862 "Gmsh.y"
+#line 2864 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 234:
-#line 2863 "Gmsh.y"
+#line 2865 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 235:
-#line 2864 "Gmsh.y"
+#line 2866 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 236:
-#line 2866 "Gmsh.y"
+#line 2868 "Gmsh.y"
     { 
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -6885,307 +6887,307 @@ yyreduce:
     break;
 
   case 237:
-#line 2872 "Gmsh.y"
+#line 2874 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 238:
-#line 2873 "Gmsh.y"
+#line 2875 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 239:
-#line 2874 "Gmsh.y"
+#line 2876 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 240:
-#line 2875 "Gmsh.y"
+#line 2877 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 241:
-#line 2876 "Gmsh.y"
+#line 2878 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 242:
-#line 2877 "Gmsh.y"
+#line 2879 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 243:
-#line 2878 "Gmsh.y"
+#line 2880 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 244:
-#line 2879 "Gmsh.y"
+#line 2881 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 245:
-#line 2880 "Gmsh.y"
+#line 2882 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 246:
-#line 2881 "Gmsh.y"
+#line 2883 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 247:
-#line 2882 "Gmsh.y"
+#line 2884 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 248:
-#line 2883 "Gmsh.y"
+#line 2885 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 249:
-#line 2884 "Gmsh.y"
+#line 2886 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 250:
-#line 2885 "Gmsh.y"
+#line 2887 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 251:
-#line 2886 "Gmsh.y"
+#line 2888 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 252:
-#line 2887 "Gmsh.y"
+#line 2889 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 253:
-#line 2888 "Gmsh.y"
+#line 2890 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 254:
-#line 2889 "Gmsh.y"
+#line 2891 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 255:
-#line 2890 "Gmsh.y"
+#line 2892 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 256:
-#line 2891 "Gmsh.y"
+#line 2893 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 257:
-#line 2892 "Gmsh.y"
+#line 2894 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 258:
-#line 2893 "Gmsh.y"
+#line 2895 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 259:
-#line 2894 "Gmsh.y"
+#line 2896 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 260:
-#line 2895 "Gmsh.y"
+#line 2897 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 261:
-#line 2896 "Gmsh.y"
+#line 2898 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 262:
-#line 2897 "Gmsh.y"
+#line 2899 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 263:
-#line 2898 "Gmsh.y"
+#line 2900 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 264:
-#line 2899 "Gmsh.y"
+#line 2901 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 265:
-#line 2900 "Gmsh.y"
+#line 2902 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 266:
-#line 2901 "Gmsh.y"
+#line 2903 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 267:
-#line 2902 "Gmsh.y"
+#line 2904 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 268:
-#line 2903 "Gmsh.y"
+#line 2905 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 269:
-#line 2905 "Gmsh.y"
+#line 2907 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 270:
-#line 2906 "Gmsh.y"
+#line 2908 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 271:
-#line 2907 "Gmsh.y"
+#line 2909 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 272:
-#line 2908 "Gmsh.y"
+#line 2910 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 273:
-#line 2909 "Gmsh.y"
+#line 2911 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 274:
-#line 2910 "Gmsh.y"
+#line 2912 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 275:
-#line 2911 "Gmsh.y"
+#line 2913 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 276:
-#line 2912 "Gmsh.y"
+#line 2914 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 277:
-#line 2913 "Gmsh.y"
+#line 2915 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 278:
-#line 2914 "Gmsh.y"
+#line 2916 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 279:
-#line 2915 "Gmsh.y"
+#line 2917 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 280:
-#line 2916 "Gmsh.y"
+#line 2918 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 281:
-#line 2917 "Gmsh.y"
+#line 2919 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 282:
-#line 2918 "Gmsh.y"
+#line 2920 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 283:
-#line 2919 "Gmsh.y"
+#line 2921 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 284:
-#line 2920 "Gmsh.y"
+#line 2922 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 285:
-#line 2921 "Gmsh.y"
+#line 2923 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 286:
-#line 2922 "Gmsh.y"
+#line 2924 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 287:
-#line 2923 "Gmsh.y"
+#line 2925 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 288:
-#line 2924 "Gmsh.y"
+#line 2926 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 289:
-#line 2925 "Gmsh.y"
+#line 2927 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 290:
-#line 2934 "Gmsh.y"
+#line 2936 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 291:
-#line 2935 "Gmsh.y"
+#line 2937 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 292:
-#line 2936 "Gmsh.y"
+#line 2938 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 293:
-#line 2937 "Gmsh.y"
+#line 2939 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 294:
-#line 2938 "Gmsh.y"
+#line 2940 "Gmsh.y"
     { (yyval.d) = Get_GmshMajorVersion(); ;}
     break;
 
   case 295:
-#line 2939 "Gmsh.y"
+#line 2941 "Gmsh.y"
     { (yyval.d) = Get_GmshMinorVersion(); ;}
     break;
 
   case 296:
-#line 2940 "Gmsh.y"
+#line 2942 "Gmsh.y"
     { (yyval.d) = Get_GmshPatchVersion(); ;}
     break;
 
   case 297:
-#line 2945 "Gmsh.y"
+#line 2947 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -7198,7 +7200,7 @@ yyreduce:
     break;
 
   case 298:
-#line 2958 "Gmsh.y"
+#line 2960 "Gmsh.y"
     {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ;
@@ -7213,7 +7215,7 @@ yyreduce:
     break;
 
   case 299:
-#line 2970 "Gmsh.y"
+#line 2972 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -7231,7 +7233,7 @@ yyreduce:
     break;
 
   case 300:
-#line 2985 "Gmsh.y"
+#line 2987 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c));
@@ -7244,7 +7246,7 @@ yyreduce:
     break;
 
   case 301:
-#line 2995 "Gmsh.y"
+#line 2997 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -7257,7 +7259,7 @@ yyreduce:
     break;
 
   case 302:
-#line 3005 "Gmsh.y"
+#line 3007 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -7275,7 +7277,7 @@ yyreduce:
     break;
 
   case 303:
-#line 3023 "Gmsh.y"
+#line 3025 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
@@ -7283,7 +7285,7 @@ yyreduce:
     break;
 
   case 304:
-#line 3028 "Gmsh.y"
+#line 3030 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
@@ -7291,7 +7293,7 @@ yyreduce:
     break;
 
   case 305:
-#line 3033 "Gmsh.y"
+#line 3035 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -7304,7 +7306,7 @@ yyreduce:
     break;
 
   case 306:
-#line 3043 "Gmsh.y"
+#line 3045 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -7317,7 +7319,7 @@ yyreduce:
     break;
 
   case 307:
-#line 3053 "Gmsh.y"
+#line 3055 "Gmsh.y"
     { 
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -7325,70 +7327,70 @@ yyreduce:
     break;
 
   case 308:
-#line 3061 "Gmsh.y"
+#line 3063 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
   case 309:
-#line 3065 "Gmsh.y"
+#line 3067 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 310:
-#line 3069 "Gmsh.y"
+#line 3071 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 311:
-#line 3073 "Gmsh.y"
+#line 3075 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 312:
-#line 3077 "Gmsh.y"
+#line 3079 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 313:
-#line 3084 "Gmsh.y"
+#line 3086 "Gmsh.y"
     { 
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
     ;}
     break;
 
   case 314:
-#line 3088 "Gmsh.y"
+#line 3090 "Gmsh.y"
     { 
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 315:
-#line 3092 "Gmsh.y"
+#line 3094 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 316:
-#line 3096 "Gmsh.y"
+#line 3098 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 317:
-#line 3103 "Gmsh.y"
+#line 3105 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -7396,14 +7398,14 @@ yyreduce:
     break;
 
   case 318:
-#line 3108 "Gmsh.y"
+#line 3110 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
   case 319:
-#line 3115 "Gmsh.y"
+#line 3117 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -7411,14 +7413,14 @@ yyreduce:
     break;
 
   case 320:
-#line 3120 "Gmsh.y"
+#line 3122 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 321:
-#line 3124 "Gmsh.y"
+#line 3126 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -7426,14 +7428,14 @@ yyreduce:
     break;
 
   case 322:
-#line 3129 "Gmsh.y"
+#line 3131 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 323:
-#line 3133 "Gmsh.y"
+#line 3135 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7444,7 +7446,7 @@ yyreduce:
     break;
 
   case 324:
-#line 3141 "Gmsh.y"
+#line 3143 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7455,14 +7457,14 @@ yyreduce:
     break;
 
   case 325:
-#line 3152 "Gmsh.y"
+#line 3154 "Gmsh.y"
     { 
       (yyval.l) = (yyvsp[(1) - (1)].l); 
     ;}
     break;
 
   case 326:
-#line 3156 "Gmsh.y"
+#line 3158 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -7474,7 +7476,7 @@ yyreduce:
     break;
 
   case 327:
-#line 3168 "Gmsh.y"
+#line 3170 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7485,7 +7487,7 @@ yyreduce:
     break;
 
   case 328:
-#line 3176 "Gmsh.y"
+#line 3178 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7496,7 +7498,7 @@ yyreduce:
     break;
 
   case 329:
-#line 3184 "Gmsh.y"
+#line 3186 "Gmsh.y"
     { 
       (yyval.l) = List_Create(2, 1, sizeof(double)); 
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d)); 
@@ -7506,7 +7508,7 @@ yyreduce:
     break;
 
   case 330:
-#line 3191 "Gmsh.y"
+#line 3193 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double)); 
       if(!(yyvsp[(5) - (5)].d) || ((yyvsp[(1) - (5)].d) < (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) < 0) || ((yyvsp[(1) - (5)].d) > (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) > 0)){
@@ -7520,7 +7522,7 @@ yyreduce:
     break;
 
   case 331:
-#line 3202 "Gmsh.y"
+#line 3204 "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
@@ -7543,7 +7545,7 @@ yyreduce:
     break;
 
   case 332:
-#line 3222 "Gmsh.y"
+#line 3224 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -7556,7 +7558,7 @@ yyreduce:
     break;
 
   case 333:
-#line 3232 "Gmsh.y"
+#line 3234 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -7569,7 +7571,7 @@ yyreduce:
     break;
 
   case 334:
-#line 3242 "Gmsh.y"
+#line 3244 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -7582,7 +7584,7 @@ yyreduce:
     break;
 
   case 335:
-#line 3252 "Gmsh.y"
+#line 3254 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -7602,7 +7604,7 @@ yyreduce:
     break;
 
   case 336:
-#line 3272 "Gmsh.y"
+#line 3274 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -7610,21 +7612,21 @@ yyreduce:
     break;
 
   case 337:
-#line 3277 "Gmsh.y"
+#line 3279 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 338:
-#line 3281 "Gmsh.y"
+#line 3283 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 339:
-#line 3285 "Gmsh.y"
+#line 3287 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -7636,21 +7638,21 @@ yyreduce:
     break;
 
   case 340:
-#line 3297 "Gmsh.y"
+#line 3299 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
   case 341:
-#line 3301 "Gmsh.y"
+#line 3303 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
   case 342:
-#line 3313 "Gmsh.y"
+#line 3315 "Gmsh.y"
     {
       int flag;
       (yyval.u) = Get_ColorForString(ColorString, -1, (yyvsp[(1) - (1)].c), &flag);
@@ -7660,7 +7662,7 @@ yyreduce:
     break;
 
   case 343:
-#line 3320 "Gmsh.y"
+#line 3322 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -7670,14 +7672,14 @@ yyreduce:
     break;
 
   case 344:
-#line 3330 "Gmsh.y"
+#line 3332 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 345:
-#line 3334 "Gmsh.y"
+#line 3336 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = Get_ColorTable((int)(yyvsp[(3) - (6)].d));
@@ -7692,7 +7694,7 @@ yyreduce:
     break;
 
   case 346:
-#line 3349 "Gmsh.y"
+#line 3351 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -7700,21 +7702,21 @@ yyreduce:
     break;
 
   case 347:
-#line 3354 "Gmsh.y"
+#line 3356 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 348:
-#line 3361 "Gmsh.y"
+#line 3363 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 349:
-#line 3365 "Gmsh.y"
+#line 3367 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -7730,36 +7732,36 @@ yyreduce:
     break;
 
   case 350:
-#line 3378 "Gmsh.y"
+#line 3380 "Gmsh.y"
     { 
-      const char *val = "";
-      StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), val);
-      (yyval.c) = (char*)Malloc((strlen(val) + 1) * sizeof(char));
-      strcpy((yyval.c), val);
+      std::string out;
+      StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), "", out);
+      (yyval.c) = (char*)Malloc((out.size() + 1) * sizeof(char));
+      strcpy((yyval.c), out.c_str());
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
     ;}
     break;
 
   case 351:
-#line 3386 "Gmsh.y"
+#line 3388 "Gmsh.y"
     { 
-      const char *val = "";
-      StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), val);
-      (yyval.c) = (char*)Malloc((strlen(val) + 1) * sizeof(char));
-      strcpy((yyval.c), val);
+      std::string out;
+      StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), "", out);
+      (yyval.c) = (char*)Malloc((out.size() + 1) * sizeof(char));
+      strcpy((yyval.c), out.c_str());
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
     ;}
     break;
 
   case 352:
-#line 3397 "Gmsh.y"
+#line 3399 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 353:
-#line 3401 "Gmsh.y"
+#line 3403 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -7770,7 +7772,7 @@ yyreduce:
     break;
 
   case 354:
-#line 3409 "Gmsh.y"
+#line 3411 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
@@ -7781,7 +7783,7 @@ yyreduce:
     break;
 
   case 355:
-#line 3417 "Gmsh.y"
+#line 3419 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -7798,7 +7800,7 @@ yyreduce:
     break;
 
   case 356:
-#line 3431 "Gmsh.y"
+#line 3433 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -7815,14 +7817,14 @@ yyreduce:
     break;
 
   case 357:
-#line 3445 "Gmsh.y"
+#line 3447 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 358:
-#line 3449 "Gmsh.y"
+#line 3451 "Gmsh.y"
     {
       char tmpstring[1024];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -7845,7 +7847,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 7849 "Gmsh.tab.cpp"
+#line 7851 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -8059,7 +8061,7 @@ yyreturn:
 }
 
 
-#line 3469 "Gmsh.y"
+#line 3471 "Gmsh.y"
 
 
 int PrintListOfDouble(char *format, List_T *list, char *buffer)
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 84027d72cc..f0e52196a8 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -750,12 +750,14 @@ Affectation :
 
   | tSTRING '.' tSTRING tAFFECT StringExpr tEND 
     { 
-      StringOption(GMSH_SET|GMSH_GUI, $1, 0, $3, $5);
+      std::string dummy;
+      StringOption(GMSH_SET|GMSH_GUI, $1, 0, $3, $5, dummy);
       Free($1); Free($3);
     }
   | tSTRING '[' FExpr ']' '.' tSTRING tAFFECT StringExpr tEND 
     { 
-      StringOption(GMSH_SET|GMSH_GUI, $1, (int)$3, $6, $8);
+      std::string dummy;
+      StringOption(GMSH_SET|GMSH_GUI, $1, (int)$3, $6, $8, dummy);
       Free($1); Free($6);
     }
 
@@ -3376,18 +3378,18 @@ StringExprVar :
     }
   | tSTRING '.' tSTRING
     { 
-      const char *val = "";
-      StringOption(GMSH_GET, $1, 0, $3, val);
-      $$ = (char*)Malloc((strlen(val) + 1) * sizeof(char));
-      strcpy($$, val);
+      std::string out;
+      StringOption(GMSH_GET, $1, 0, $3, "", out);
+      $$ = (char*)Malloc((out.size() + 1) * sizeof(char));
+      strcpy($$, out.c_str());
       Free($1); Free($3);
     }
   | tSTRING '[' FExpr ']' '.' tSTRING
     { 
-      const char *val = "";
-      StringOption(GMSH_GET, $1, (int)$3, $6, val);
-      $$ = (char*)Malloc((strlen(val) + 1) * sizeof(char));
-      strcpy($$, val);
+      std::string out;
+      StringOption(GMSH_GET, $1, (int)$3, $6, "", out);
+      $$ = (char*)Malloc((out.size() + 1) * sizeof(char));
+      strcpy($$, out.c_str());
       Free($1); Free($6);
     }
 ;
-- 
GitLab