diff --git a/Common/Context.h b/Common/Context.h
index 97d034a0874fc72aa74acb31db390c72f474e71f..ee31682287493193517d71d58d478608e818cc7e 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -1,4 +1,4 @@
-/* $Id: Context.h,v 1.20 2000-12-11 22:09:42 geuzaine Exp $ */
+/* $Id: Context.h,v 1.21 2000-12-20 10:40:49 geuzaine Exp $ */
 #ifndef _CONTEXT_H_
 #define _CONTEXT_H_
 
@@ -140,9 +140,10 @@ class Context_T {
 
   /* print options */
   struct{
-    int format, type;
+    int format;
+    int eps_quality, jpeg_quality;
     char *font;
-    int  font_size;
+    int  font_size, gl_fonts;
   } print;
 
   // trackball functions 
diff --git a/Common/Options.h b/Common/Options.h
index 1e0f47b1d66d418cc29cb47225a98e299936f4b2..82a066af97b0e95073af78c6184e74549671a378 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -1,4 +1,4 @@
-/* $Id: Options.h,v 1.6 2000-12-11 22:09:42 geuzaine Exp $ */
+/* $Id: Options.h,v 1.7 2000-12-20 10:40:49 geuzaine Exp $ */
 #ifndef _OPTIONS_H_
 #define _OPTIONS_H_
 
@@ -190,10 +190,11 @@ StringXNumber PostProcessingOptions_Number[] = {
 } ;
 
 StringXNumber PrintOptions_Number[] = {
-  { "Type"     , GMSH_INT,    (void*)&CTX.print.type      , PRINT_GL2PS_SIMPLE }, 
-  { "Format"   , GMSH_INT,    (void*)&CTX.print.format    , FORMAT_EPS }, 
-  { "FontSize" , GMSH_INT,    (void*)&CTX.print.font_size , 12. }, 
-  { NULL       , GMSH_DOUBLE, NULL , 0. }
+  { "Format"      , GMSH_INT,    (void*)&CTX.print.format       , FORMAT_AUTO }, 
+  { "EpsQuality"  , GMSH_INT,    (void*)&CTX.print.eps_quality  , 1 }, 
+  { "JpegQuality" , GMSH_INT,    (void*)&CTX.print.jpeg_quality , 100 }, 
+  { "FontSize"    , GMSH_INT,    (void*)&CTX.print.font_size    , 12. }, 
+  { NULL          , GMSH_DOUBLE, NULL , 0. }
 } ;
 
 // COLORS
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index 535ebe40b33a8ba4bfcfd72fba20c63fe7c58ddd..ffa7065c0961b480f2568ff6f8ae83b0e8be043e 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -1,4 +1,4 @@
-/* $Id: Draw.h,v 1.7 2000-11-27 10:58:54 geuzaine Exp $ */
+/* $Id: Draw.h,v 1.8 2000-12-20 10:40:52 geuzaine Exp $ */
 #ifndef _DRAW_H_
 #define _DRAW_H_
 
@@ -11,12 +11,6 @@
 #define TO_SCREEN  1
 #define TO_FILE    2
 
-#define PRINT_XDUMP            1
-#define PRINT_GL2PS_SIMPLE     2
-#define PRINT_GL2PS_RECURSIVE  3
-#define PRINT_GL2PS_IMAGE      4
-#define PRINT_GL2GIF           5
-
 void Init(void);
 void InitOv(void);
 void InitShading(void);
diff --git a/Graphics/Makefile b/Graphics/Makefile
index 0e5e2cd44425a9075459aa0c44e2add434012ee4..8eb73afff5fd77be68264677b564f1f21e5a24a0 100644
--- a/Graphics/Makefile
+++ b/Graphics/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.6 2000-12-18 08:31:45 geuzaine Exp $
+# $Id: Makefile,v 1.7 2000-12-20 10:40:52 geuzaine Exp $
 #
 # Makefile for "libGraphics.a"
 #
@@ -20,7 +20,7 @@ RM       = rm
 RMFLAGS  = -f
 
 LIB      = ../lib/libGraphics.a
-INCLUDE  = -I../Common -I../DataStr -I../Geo -I../Graphics -I../Unix -I../Mesh
+INCLUDE  = -I../Common -I../DataStr -I../Geo -I../Graphics -I../Unix -I../Mesh -I../jpeg
 
 CFLAGS   = $(C_FLAGS) $(OS_FLAGS) $(VERSION_FLAGS) $(INCLUDE)\
            $(GL_INCLUDE) $(MOTIF_INCLUDE)
@@ -35,7 +35,8 @@ SRC = Draw.cpp \
       Scale.cpp \
       Axes.cpp \
       gl2ps.cpp\
-      gl2gif.cpp
+      gl2gif.cpp\
+      gl2jpeg.cpp
 
 
 OBJ = $(SRC:.cpp=.o)
diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp
index 90e650c3750bc78c43d014d7c075662889079cf1..a4587aace2ef22faaecab1763b19bbccc783eeaa 100644
--- a/Graphics/Scale.cpp
+++ b/Graphics/Scale.cpp
@@ -1,4 +1,4 @@
-/* $Id: Scale.cpp,v 1.9 2000-12-18 08:31:45 geuzaine Exp $ */
+/* $Id: Scale.cpp,v 1.10 2000-12-20 10:40:52 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -32,8 +32,7 @@ extern List_T   *Post_ViewList;
 void Draw_String(char *s){
 
   if(CTX.stream == TO_FILE){
-    if(CTX.print.type == PRINT_GL2PS_SIMPLE ||
-       CTX.print.type == PRINT_GL2PS_RECURSIVE) {
+    if(!CTX.print.gl_fonts && CTX.print.eps_quality > 0){
       gl2psText(s,CTX.print.font,CTX.print.font_size);
       return ;
     }
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 546c07bf4baf0a0cac422f26fd2202782ec35623..4f8e460791b0153359a44cab611ff32798357a44 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -1,4 +1,4 @@
-/* $Id: Mesh.h,v 1.7 2000-11-28 06:55:11 geuzaine Exp $ */
+/* $Id: Mesh.h,v 1.8 2000-12-20 10:40:54 geuzaine Exp $ */
 #ifndef _MESH_H_
 #define _MESH_H_
 
@@ -15,6 +15,8 @@
 #define FORMAT_BMP  6
 #define FORMAT_GIF  7
 #define FORMAT_GEO  8
+#define FORMAT_JPEG 9
+#define FORMAT_AUTO 10
 
 #define CONV_VALUE    0.8
 
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index ad550afa137c62f1ba60311b4de1c59c320cd5ec..2a4719d8541f2265eae8e497d5d3ffd79813052b 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -168,7 +168,7 @@
 #define	UNARYPREC	418
 
 #line 1 "Gmsh.y"
- /* $Id: Gmsh.tab.cpp,v 1.51 2000-12-19 09:01:13 geuzaine Exp $ */
+ /* $Id: Gmsh.tab.cpp,v 1.52 2000-12-20 10:40:56 geuzaine Exp $ */
 
 #include <stdarg.h>
 
@@ -595,21 +595,21 @@ static const short yyrline[] = { 0,
   1328,  1344,  1351,  1357,  1363,  1369,  1375,  1394,  1406,  1412,
   1431,  1452,  1460,  1466,  1472,  1478,  1490,  1496,  1502,  1514,
   1520,  1525,  1530,  1537,  1539,  1540,  1543,  1548,  1559,  1577,
-  1585,  1589,  1600,  1672,  1692,  1696,  1715,  1731,  1745,  1770,
-  1795,  1821,  1827,  1832,  1837,  1841,  1851,  1857,  1863,  1867,
-  1871,  1875,  1879,  1884,  1891,  1895,  1900,  1918,  1928,  1946,
-  1963,  1980,  2001,  2021,  2041,  2058,  2082,  2087,  2098,  2100,
-  2103,  2105,  2106,  2107,  2108,  2111,  2113,  2114,  2115,  2116,
-  2117,  2118,  2119,  2120,  2127,  2128,  2129,  2130,  2131,  2132,
-  2133,  2134,  2135,  2136,  2137,  2138,  2139,  2140,  2141,  2142,
-  2143,  2144,  2145,  2146,  2147,  2148,  2149,  2150,  2151,  2152,
-  2153,  2154,  2155,  2156,  2157,  2158,  2163,  2168,  2172,  2184,
-  2202,  2214,  2232,  2244,  2264,  2285,  2309,  2330,  2354,  2375,
-  2400,  2407,  2420,  2427,  2431,  2435,  2439,  2444,  2449,  2453,
-  2457,  2463,  2467,  2472,  2476,  2481,  2485,  2489,  2495,  2501,
-  2507,  2511,  2517,  2532,  2539,  2545,  2554,  2566,  2570,  2578,
-  2591,  2596,  2600,  2605,  2610,  2628,  2633,  2654,  2663,  2669,
-  2674,  2678
+  1585,  1589,  1600,  1655,  1675,  1679,  1698,  1714,  1728,  1753,
+  1778,  1804,  1810,  1815,  1820,  1824,  1834,  1840,  1846,  1850,
+  1854,  1858,  1862,  1867,  1874,  1878,  1883,  1901,  1911,  1929,
+  1946,  1963,  1984,  2004,  2024,  2041,  2065,  2070,  2081,  2083,
+  2086,  2088,  2089,  2090,  2091,  2094,  2096,  2097,  2098,  2099,
+  2100,  2101,  2102,  2103,  2110,  2111,  2112,  2113,  2114,  2115,
+  2116,  2117,  2118,  2119,  2120,  2121,  2122,  2123,  2124,  2125,
+  2126,  2127,  2128,  2129,  2130,  2131,  2132,  2133,  2134,  2135,
+  2136,  2137,  2138,  2139,  2140,  2141,  2146,  2151,  2155,  2167,
+  2185,  2197,  2215,  2227,  2247,  2268,  2292,  2313,  2337,  2358,
+  2383,  2390,  2403,  2410,  2414,  2418,  2422,  2427,  2432,  2436,
+  2440,  2446,  2450,  2455,  2459,  2464,  2468,  2472,  2478,  2484,
+  2490,  2494,  2500,  2515,  2522,  2528,  2537,  2549,  2553,  2561,
+  2574,  2579,  2583,  2588,  2593,  2611,  2616,  2637,  2646,  2652,
+  2657,  2661
 };
 #endif
 
@@ -4591,31 +4591,8 @@ case 203:
       else if(!strcmp(yyvsp[-2].c, "Print")){
 
 	if(!CTX.interactive){ // we're in interactive mode
-	  char ext[6];
-	  strcpy(ext,yyvsp[-1].c+(strlen(yyvsp[-1].c)-4));
-	  Replot();
-	  extern void CreateImage (char *name, FILE *fp);
-	  FILE *fp = 0;
-	  if(!strcmp(ext,".gif")){
-	    fp = fopen(yyvsp[-1].c,"wb");
-	    CTX.print.type = PRINT_GL2GIF;
-	  }
-	  else if(!strcmp(ext,".eps")){
-	    fp = fopen(yyvsp[-1].c,"w");
-	    CTX.print.type =  PRINT_GL2PS_RECURSIVE;
-	  } 
-	  else if(!strcmp(ext,".xpm")){
-	    fp = fopen(yyvsp[-1].c,"wb");
-	    CTX.print.type =  PRINT_XDUMP;
-	    CTX.print.format = FORMAT_XPM;
-	  } 
-	  if(fp){
-	    CreateImage(yyvsp[-1].c,fp);
-	    fclose(fp);
-	  }
-	  else{
-	    vyyerror("Unable to Open File '%s'", yyvsp[-1].c);
-	  }
+	  void CreateImage (char *name, int format);
+	  CreateImage(yyvsp[-1].c, CTX.print.format);
 	}
 	
       }
@@ -4630,13 +4607,19 @@ case 203:
 
 	Print_Mesh(THEM, yyvsp[-1].c, CTX.mesh.format);
 
+      }
+      else if(!strcmp(yyvsp[-2].c, "System")){
+	
+	Msg(PARSER_INFO, "Executing System Call \"%s\"");
+	system(yyvsp[-1].c);
+
       }
       else
 	vyyerror("Unknown Command '%s'", yyvsp[-2].c);
     ;
     break;}
 case 204:
-#line 1673 "Gmsh.y"
+#line 1656 "Gmsh.y"
 {
       if(!strcmp(yyvsp[-2].c, "Sleep")){
 
@@ -4658,13 +4641,13 @@ case 204:
     ;
     break;}
 case 205:
-#line 1693 "Gmsh.y"
+#line 1676 "Gmsh.y"
 {
       exit(0);
     ;
     break;}
 case 206:
-#line 1697 "Gmsh.y"
+#line 1680 "Gmsh.y"
 {
       if(!CTX.interactive){ // we're in interactive mode
 	if(Tree_Nbr(THEM->Points) != Last_NumberOfPoints){
@@ -4679,7 +4662,7 @@ case 206:
     ;
     break;}
 case 207:
-#line 1718 "Gmsh.y"
+#line 1701 "Gmsh.y"
 {
       FILE* ff;
       if(RecursionLevel)
@@ -4695,7 +4678,7 @@ case 207:
     ;
     break;}
 case 208:
-#line 1732 "Gmsh.y"
+#line 1715 "Gmsh.y"
 {
       FILE* ff;
       if(RecursionLevel)
@@ -4711,7 +4694,7 @@ case 208:
     ;
     break;}
 case 209:
-#line 1746 "Gmsh.y"
+#line 1729 "Gmsh.y"
 {
       FILE* ff;
       if(RecursionLevel)
@@ -4738,7 +4721,7 @@ case 209:
     ;
     break;}
 case 210:
-#line 1771 "Gmsh.y"
+#line 1754 "Gmsh.y"
 {
       FILE* ff;
       if(RecursionLevel)
@@ -4765,7 +4748,7 @@ case 210:
     ;
     break;}
 case 211:
-#line 1796 "Gmsh.y"
+#line 1779 "Gmsh.y"
 {
       if(LoopControlVariablesTab[ImbricatedLoop-1][1] >  
 	 LoopControlVariablesTab[ImbricatedLoop-1][0]){
@@ -4793,7 +4776,7 @@ case 211:
     ;
     break;}
 case 212:
-#line 1822 "Gmsh.y"
+#line 1805 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->createFunction(yyvsp[0].c,yyin,yylineno))
 	vyyerror("Redefinition of function %s",yyvsp[0].c);
@@ -4801,39 +4784,39 @@ case 212:
     ;
     break;}
 case 213:
-#line 1828 "Gmsh.y"
+#line 1811 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->leaveFunction(&yyin,yylineno))
 	vyyerror("Error while exiting function");
     ;
     break;}
 case 214:
-#line 1833 "Gmsh.y"
+#line 1816 "Gmsh.y"
 {
       if(!FunctionManager::Instance()->enterFunction(yyvsp[-1].c,&yyin,yylineno))
 	vyyerror("Unknown Function %s",yyvsp[-1].c);
     ;
     break;}
 case 215:
-#line 1838 "Gmsh.y"
+#line 1821 "Gmsh.y"
 {
       if(!yyvsp[-1].d) skip_until("EndIf");
     ;
     break;}
 case 216:
-#line 1842 "Gmsh.y"
+#line 1825 "Gmsh.y"
 {
     ;
     break;}
 case 217:
-#line 1853 "Gmsh.y"
+#line 1836 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,&pc,&prc,NULL);
     ;
     break;}
 case 218:
-#line 1858 "Gmsh.y"
+#line 1841 "Gmsh.y"
 {
       Curve *pc, *prc;
       Extrude_ProtudePoint(0,(int)yyvsp[-8].d,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,
@@ -4841,55 +4824,55 @@ case 218:
     ;
     break;}
 case 219:
-#line 1864 "Gmsh.y"
+#line 1847 "Gmsh.y"
 {
       Extrude_ProtudeCurve(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,NULL);
     ;
     break;}
 case 220:
-#line 1868 "Gmsh.y"
+#line 1851 "Gmsh.y"
 {
       Extrude_ProtudeCurve(0,(int)yyvsp[-8].d,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,NULL);
     ;
     break;}
 case 221:
-#line 1872 "Gmsh.y"
+#line 1855 "Gmsh.y"
 {
       Extrude_ProtudeSurface(1,(int)yyvsp[-4].d,yyvsp[-2].v[0],yyvsp[-2].v[1],yyvsp[-2].v[2],0.,0.,0.,0.,0,NULL);
     ;
     break;}
 case 222:
-#line 1876 "Gmsh.y"
+#line 1859 "Gmsh.y"
 {
       Extrude_ProtudeSurface(0,(int)yyvsp[-8].d,yyvsp[-6].v[0],yyvsp[-6].v[1],yyvsp[-6].v[2],yyvsp[-4].v[0],yyvsp[-4].v[1],yyvsp[-4].v[2],yyvsp[-2].d,0,NULL);
     ;
     break;}
 case 223:
-#line 1880 "Gmsh.y"
+#line 1863 "Gmsh.y"
 {
     int vol = NEWREG();
     Extrude_ProtudeSurface(1,(int)yyvsp[-7].d,yyvsp[-5].v[0],yyvsp[-5].v[1],yyvsp[-5].v[2],0.,0.,0.,0.,vol,&extr);
   ;
     break;}
 case 224:
-#line 1885 "Gmsh.y"
+#line 1868 "Gmsh.y"
 {
     int vol = NEWREG();
     Extrude_ProtudeSurface(0,(int)yyvsp[-11].d,yyvsp[-9].v[0],yyvsp[-9].v[1],yyvsp[-9].v[2],yyvsp[-7].v[0],yyvsp[-7].v[1],yyvsp[-7].v[2],yyvsp[-5].d,vol,&extr);
   ;
     break;}
 case 225:
-#line 1893 "Gmsh.y"
+#line 1876 "Gmsh.y"
 {
     ;
     break;}
 case 226:
-#line 1896 "Gmsh.y"
+#line 1879 "Gmsh.y"
 {
     ;
     break;}
 case 227:
-#line 1902 "Gmsh.y"
+#line 1885 "Gmsh.y"
 {
       double d;
       int j;
@@ -4908,13 +4891,13 @@ case 227:
     ;
     break;}
 case 228:
-#line 1919 "Gmsh.y"
+#line 1902 "Gmsh.y"
 {
       extr.mesh.Recombine = true;
     ;
     break;}
 case 229:
-#line 1930 "Gmsh.y"
+#line 1913 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -4933,7 +4916,7 @@ case 229:
     ;
     break;}
 case 230:
-#line 1947 "Gmsh.y"
+#line 1930 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -4952,7 +4935,7 @@ case 230:
     ;
     break;}
 case 231:
-#line 1964 "Gmsh.y"
+#line 1947 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -4971,7 +4954,7 @@ case 231:
     ;
     break;}
 case 232:
-#line 1981 "Gmsh.y"
+#line 1964 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -4994,7 +4977,7 @@ case 232:
     ;
     break;}
 case 233:
-#line 2002 "Gmsh.y"
+#line 1985 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -5016,7 +4999,7 @@ case 233:
     ;
     break;}
 case 234:
-#line 2022 "Gmsh.y"
+#line 2005 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d,THEM);
       if(!v)
@@ -5038,7 +5021,7 @@ case 234:
     ;
     break;}
 case 235:
-#line 2042 "Gmsh.y"
+#line 2025 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -5057,7 +5040,7 @@ case 235:
     ;
     break;}
 case 236:
-#line 2059 "Gmsh.y"
+#line 2042 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
@@ -5076,79 +5059,79 @@ case 236:
     ;
     break;}
 case 237:
-#line 2084 "Gmsh.y"
+#line 2067 "Gmsh.y"
 { 
       Coherence_PS();
     ;
     break;}
 case 238:
-#line 2088 "Gmsh.y"
+#line 2071 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 239:
-#line 2099 "Gmsh.y"
+#line 2082 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 240:
-#line 2100 "Gmsh.y"
+#line 2083 "Gmsh.y"
 { yyval.d = -yyvsp[0].d; ;
     break;}
 case 241:
-#line 2104 "Gmsh.y"
+#line 2087 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 242:
-#line 2105 "Gmsh.y"
+#line 2088 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 243:
-#line 2106 "Gmsh.y"
+#line 2089 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 244:
-#line 2107 "Gmsh.y"
+#line 2090 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 245:
-#line 2108 "Gmsh.y"
+#line 2091 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 246:
-#line 2112 "Gmsh.y"
+#line 2095 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 247:
-#line 2113 "Gmsh.y"
+#line 2096 "Gmsh.y"
 { yyval.d = yyvsp[-1].d ;          ;
     break;}
 case 248:
-#line 2114 "Gmsh.y"
+#line 2097 "Gmsh.y"
 { yyval.d = -yyvsp[0].d ;         ;
     break;}
 case 249:
-#line 2115 "Gmsh.y"
+#line 2098 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 250:
-#line 2116 "Gmsh.y"
+#line 2099 "Gmsh.y"
 { yyval.d = !yyvsp[0].d ;         ;
     break;}
 case 251:
-#line 2117 "Gmsh.y"
+#line 2100 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d ;     ;
     break;}
 case 252:
-#line 2118 "Gmsh.y"
+#line 2101 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d ;     ;
     break;}
 case 253:
-#line 2119 "Gmsh.y"
+#line 2102 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d ;     ;
     break;}
 case 254:
-#line 2121 "Gmsh.y"
+#line 2104 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	vyyerror("Division by Zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -5157,143 +5140,143 @@ case 254:
     ;
     break;}
 case 255:
-#line 2127 "Gmsh.y"
+#line 2110 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d ;  ;
     break;}
 case 256:
-#line 2128 "Gmsh.y"
+#line 2111 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d,yyvsp[0].d) ;  ;
     break;}
 case 257:
-#line 2129 "Gmsh.y"
+#line 2112 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d ;     ;
     break;}
 case 258:
-#line 2130 "Gmsh.y"
+#line 2113 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d ;     ;
     break;}
 case 259:
-#line 2131 "Gmsh.y"
+#line 2114 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d ;    ;
     break;}
 case 260:
-#line 2132 "Gmsh.y"
+#line 2115 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d ;    ;
     break;}
 case 261:
-#line 2133 "Gmsh.y"
+#line 2116 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d ;    ;
     break;}
 case 262:
-#line 2134 "Gmsh.y"
+#line 2117 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d ;    ;
     break;}
 case 263:
-#line 2135 "Gmsh.y"
+#line 2118 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d ;    ;
     break;}
 case 264:
-#line 2136 "Gmsh.y"
+#line 2119 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d ;    ;
     break;}
 case 265:
-#line 2137 "Gmsh.y"
+#line 2120 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d ; ;
     break;}
 case 266:
-#line 2138 "Gmsh.y"
+#line 2121 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 267:
-#line 2139 "Gmsh.y"
+#line 2122 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 268:
-#line 2140 "Gmsh.y"
+#line 2123 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 269:
-#line 2141 "Gmsh.y"
+#line 2124 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 270:
-#line 2142 "Gmsh.y"
+#line 2125 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 271:
-#line 2143 "Gmsh.y"
+#line 2126 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 272:
-#line 2144 "Gmsh.y"
+#line 2127 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 273:
-#line 2145 "Gmsh.y"
+#line 2128 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 274:
-#line 2146 "Gmsh.y"
+#line 2129 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 275:
-#line 2147 "Gmsh.y"
+#line 2130 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 276:
-#line 2148 "Gmsh.y"
+#line 2131 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
     break;}
 case 277:
-#line 2149 "Gmsh.y"
+#line 2132 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 278:
-#line 2150 "Gmsh.y"
+#line 2133 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 279:
-#line 2151 "Gmsh.y"
+#line 2134 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 280:
-#line 2152 "Gmsh.y"
+#line 2135 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 281:
-#line 2153 "Gmsh.y"
+#line 2136 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 282:
-#line 2154 "Gmsh.y"
+#line 2137 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 283:
-#line 2155 "Gmsh.y"
+#line 2138 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 284:
-#line 2156 "Gmsh.y"
+#line 2139 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 285:
-#line 2157 "Gmsh.y"
+#line 2140 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 286:
-#line 2158 "Gmsh.y"
+#line 2141 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 287:
-#line 2167 "Gmsh.y"
+#line 2150 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 288:
-#line 2168 "Gmsh.y"
+#line 2151 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 289:
-#line 2173 "Gmsh.y"
+#line 2156 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5307,7 +5290,7 @@ case 289:
     ;
     break;}
 case 290:
-#line 2185 "Gmsh.y"
+#line 2168 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5326,7 +5309,7 @@ case 290:
     ;
     break;}
 case 291:
-#line 2203 "Gmsh.y"
+#line 2186 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5340,7 +5323,7 @@ case 291:
     ;
     break;}
 case 292:
-#line 2215 "Gmsh.y"
+#line 2198 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5359,7 +5342,7 @@ case 292:
     ;
     break;}
 case 293:
-#line 2233 "Gmsh.y"
+#line 2216 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5373,7 +5356,7 @@ case 293:
     ;
     break;}
 case 294:
-#line 2245 "Gmsh.y"
+#line 2228 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5392,7 +5375,7 @@ case 294:
     ;
     break;}
 case 295:
-#line 2265 "Gmsh.y"
+#line 2248 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-2].c))){
 	vyyerror("Unknown Numeric Option Class '%s'", yyvsp[-2].c);
@@ -5415,7 +5398,7 @@ case 295:
     ;
     break;}
 case 296:
-#line 2286 "Gmsh.y"
+#line 2269 "Gmsh.y"
 {
       if(strcmp(yyvsp[-7].c, "PostProcessing")){
 	vyyerror("Unknown View Option Class '%s'", yyvsp[-7].c);
@@ -5440,7 +5423,7 @@ case 296:
     ;
     break;}
 case 297:
-#line 2310 "Gmsh.y"
+#line 2293 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	vyyerror("Unknown Numeric Option Class '%s'", yyvsp[-3].c);
@@ -5463,7 +5446,7 @@ case 297:
     ;
     break;}
 case 298:
-#line 2331 "Gmsh.y"
+#line 2314 "Gmsh.y"
 {
       if(strcmp(yyvsp[-8].c, "PostProcessing")){
 	vyyerror("Unknown View Option Class '%s'", yyvsp[-8].c);
@@ -5488,7 +5471,7 @@ case 298:
     ;
     break;}
 case 299:
-#line 2355 "Gmsh.y"
+#line 2338 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	vyyerror("Unknown Numeric Option Class '%s'", yyvsp[-3].c);
@@ -5511,7 +5494,7 @@ case 299:
     ;
     break;}
 case 300:
-#line 2376 "Gmsh.y"
+#line 2359 "Gmsh.y"
 {
       if(strcmp(yyvsp[-8].c, "PostProcessing")){
 	vyyerror("Unknown View Option Class '%s'", yyvsp[-8].c);
@@ -5536,7 +5519,7 @@ case 300:
     ;
     break;}
 case 301:
-#line 2402 "Gmsh.y"
+#line 2385 "Gmsh.y"
 { 
       ListOfDouble2_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.)) 
@@ -5544,7 +5527,7 @@ case 301:
     ;
     break;}
 case 302:
-#line 2408 "Gmsh.y"
+#line 2391 "Gmsh.y"
 {
       ListOfDouble2_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)){
@@ -5557,7 +5540,7 @@ case 302:
    ;
     break;}
 case 303:
-#line 2422 "Gmsh.y"
+#line 2405 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double)) ;
       //??? Avec ce qui suit, bison se plante sur DEC
@@ -5565,110 +5548,110 @@ case 303:
     ;
     break;}
 case 304:
-#line 2428 "Gmsh.y"
+#line 2411 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = -yyvsp[0].v[i] ;
     ;
     break;}
 case 305:
-#line 2432 "Gmsh.y"
+#line 2415 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 306:
-#line 2436 "Gmsh.y"
+#line 2419 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i] ;
     ;
     break;}
 case 307:
-#line 2440 "Gmsh.y"
+#line 2423 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i] ;
     ;
     break;}
 case 308:
-#line 2446 "Gmsh.y"
+#line 2429 "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 309:
-#line 2450 "Gmsh.y"
+#line 2433 "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 310:
-#line 2454 "Gmsh.y"
+#line 2437 "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 311:
-#line 2458 "Gmsh.y"
+#line 2441 "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 312:
-#line 2465 "Gmsh.y"
+#line 2448 "Gmsh.y"
 {
     ;
     break;}
 case 313:
-#line 2468 "Gmsh.y"
+#line 2451 "Gmsh.y"
 {
     ;
     break;}
 case 314:
-#line 2474 "Gmsh.y"
+#line 2457 "Gmsh.y"
 {
     ;
     break;}
 case 315:
-#line 2477 "Gmsh.y"
+#line 2460 "Gmsh.y"
 {
     ;
     break;}
 case 316:
-#line 2483 "Gmsh.y"
+#line 2466 "Gmsh.y"
 {
     ;
     break;}
 case 317:
-#line 2486 "Gmsh.y"
+#line 2469 "Gmsh.y"
 {
        yyval.l=ListOfListOfDouble_L;
     ;
     break;}
 case 318:
-#line 2490 "Gmsh.y"
+#line 2473 "Gmsh.y"
 {
        yyval.l=ListOfListOfDouble_L;
     ;
     break;}
 case 319:
-#line 2497 "Gmsh.y"
+#line 2480 "Gmsh.y"
 {
       ListOfListOfDouble_L = List_Create(2,1,sizeof(List_T*)) ;
       List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ;
     ;
     break;}
 case 320:
-#line 2502 "Gmsh.y"
+#line 2485 "Gmsh.y"
 {
       List_Add(ListOfListOfDouble_L, &(yyvsp[0].l)) ;
     ;
     break;}
 case 321:
-#line 2509 "Gmsh.y"
+#line 2492 "Gmsh.y"
 {
     ;
     break;}
 case 322:
-#line 2512 "Gmsh.y"
+#line 2495 "Gmsh.y"
 {
       ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
       List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
@@ -5676,7 +5659,7 @@ case 322:
     ;
     break;}
 case 323:
-#line 2518 "Gmsh.y"
+#line 2501 "Gmsh.y"
 {
       ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5693,20 +5676,20 @@ case 323:
     ;
     break;}
 case 324:
-#line 2533 "Gmsh.y"
+#line 2516 "Gmsh.y"
 {
       yyval.l=ListOfDouble_L;
     ;
     break;}
 case 325:
-#line 2541 "Gmsh.y"
+#line 2524 "Gmsh.y"
 {
       ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
       List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
     ;
     break;}
 case 326:
-#line 2546 "Gmsh.y"
+#line 2529 "Gmsh.y"
 { 
       ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
       for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
@@ -5717,7 +5700,7 @@ case 326:
     ;
     break;}
 case 327:
-#line 2555 "Gmsh.y"
+#line 2538 "Gmsh.y"
 { 
       ListOfDouble_L = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5731,13 +5714,13 @@ case 327:
     ;
     break;}
 case 328:
-#line 2567 "Gmsh.y"
+#line 2550 "Gmsh.y"
 {
       List_Add(ListOfDouble_L, &(yyvsp[0].d)) ;
     ;
     break;}
 case 329:
-#line 2571 "Gmsh.y"
+#line 2554 "Gmsh.y"
 {
       for(i=0 ; i<List_Nbr(ListOfDouble2_L) ; i++){
 	List_Read(ListOfDouble2_L, i, &d) ;
@@ -5747,7 +5730,7 @@ case 329:
     ;
     break;}
 case 330:
-#line 2579 "Gmsh.y"
+#line 2562 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-2].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5760,33 +5743,33 @@ case 330:
     ;
     break;}
 case 331:
-#line 2593 "Gmsh.y"
+#line 2576 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 332:
-#line 2597 "Gmsh.y"
+#line 2580 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 333:
-#line 2601 "Gmsh.y"
+#line 2584 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, (int)yyvsp[-1].d, yyvsp[-3].c, &flag);
       if(flag) vyyerror("Unknown Color '%s'", yyvsp[-3].c);
     ;
     break;}
 case 334:
-#line 2606 "Gmsh.y"
+#line 2589 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
       if(flag) vyyerror("Unknown Color '%s'", yyvsp[0].c);
     ;
     break;}
 case 335:
-#line 2611 "Gmsh.y"
+#line 2594 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-4].c))){
 	vyyerror("Unknown Color Option Class '%s'", yyvsp[-4].c);
@@ -5804,13 +5787,13 @@ case 335:
     ;
     break;}
 case 336:
-#line 2630 "Gmsh.y"
+#line 2613 "Gmsh.y"
 {
       yyval.l = ListOfColor_L;
     ;
     break;}
 case 337:
-#line 2634 "Gmsh.y"
+#line 2617 "Gmsh.y"
 {
       if(!ListOfColor_L)
 	ListOfColor_L = List_Create(256,10,sizeof(unsigned int)) ;
@@ -5831,7 +5814,7 @@ case 337:
     ;
     break;}
 case 338:
-#line 2656 "Gmsh.y"
+#line 2639 "Gmsh.y"
 {
       if(!ListOfColor_L)
 	ListOfColor_L = List_Create(256,10,sizeof(unsigned int)) ;
@@ -5841,25 +5824,25 @@ case 338:
     ;
     break;}
 case 339:
-#line 2664 "Gmsh.y"
+#line 2647 "Gmsh.y"
 {
       List_Add(ListOfColor_L, &(yyvsp[0].u)) ;
     ;
     break;}
 case 340:
-#line 2671 "Gmsh.y"
+#line 2654 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 341:
-#line 2675 "Gmsh.y"
+#line 2658 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 342:
-#line 2679 "Gmsh.y"
+#line 2662 "Gmsh.y"
 {
       for(i = 0 ; i<List_Nbr(ListOfDouble_L) ; i++){
 	if(!i){
@@ -6081,7 +6064,7 @@ yyerrhandle:
   yystate = yyn;
   goto yynewstate;
 }
-#line 2703 "Gmsh.y"
+#line 2686 "Gmsh.y"
 
 
 void InitSymbols(void){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 16d96e8022114d08f367518aa3e23df2114c7c72..448833a7beac4c01dd2c7227e0786e97e29d9152 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,4 +1,4 @@
-%{ /* $Id: Gmsh.y,v 1.46 2000-12-18 08:32:08 geuzaine Exp $ */
+%{ /* $Id: Gmsh.y,v 1.47 2000-12-20 10:40:56 geuzaine Exp $ */
 
 #include <stdarg.h>
 
@@ -1626,31 +1626,8 @@ Command :
       else if(!strcmp($1, "Print")){
 
 	if(!CTX.interactive){ // we're in interactive mode
-	  char ext[6];
-	  strcpy(ext,$2+(strlen($2)-4));
-	  Replot();
-	  extern void CreateImage (char *name, FILE *fp);
-	  FILE *fp = 0;
-	  if(!strcmp(ext,".gif")){
-	    fp = fopen($2,"wb");
-	    CTX.print.type = PRINT_GL2GIF;
-	  }
-	  else if(!strcmp(ext,".eps")){
-	    fp = fopen($2,"w");
-	    CTX.print.type =  PRINT_GL2PS_RECURSIVE;
-	  } 
-	  else if(!strcmp(ext,".xpm")){
-	    fp = fopen($2,"wb");
-	    CTX.print.type =  PRINT_XDUMP;
-	    CTX.print.format = FORMAT_XPM;
-	  } 
-	  if(fp){
-	    CreateImage($2,fp);
-	    fclose(fp);
-	  }
-	  else{
-	    vyyerror("Unable to Open File '%s'", $2);
-	  }
+	  void CreateImage (char *name, int format);
+	  CreateImage($2, CTX.print.format);
 	}
 	
       }
@@ -1665,6 +1642,12 @@ Command :
 
 	Print_Mesh(THEM, $2, CTX.mesh.format);
 
+      }
+      else if(!strcmp($1, "System")){
+	
+	Msg(PARSER_INFO, "Executing System Call \"%s\"");
+	system($2);
+
       }
       else
 	vyyerror("Unknown Command '%s'", $1);
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index c78da5a552abbe12e76e0991ebb857a34c5ae53f..4273caf57820ac4b4b87d347e172c526821f6c16 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.51 2000-12-19 09:01:13 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.52 2000-12-20 10:40:56 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
diff --git a/Unix/CbFile.cpp b/Unix/CbFile.cpp
index 0c3ca50cb9434a820f7a15fdbd5b4a2109c617e2..2e566ca170f134131290cf8633237c28b461bf23 100644
--- a/Unix/CbFile.cpp
+++ b/Unix/CbFile.cpp
@@ -1,4 +1,4 @@
-/* $Id: CbFile.cpp,v 1.12 2000-12-17 21:17:30 remacle Exp $ */
+/* $Id: CbFile.cpp,v 1.13 2000-12-20 10:40:58 geuzaine Exp $ */
 
 #include <unistd.h>
 
@@ -17,6 +17,7 @@
 #include "XDump.h"
 #include "gl2ps.h"
 #include "gl2gif.h"
+#include "gl2jpeg.h"
 
 extern Context_T   CTX;
 extern XContext_T  XCTX;
@@ -30,7 +31,7 @@ static int WARNING_OVERRIDE = 0;
 /* ------------------------------------------------------------------------ */
 
 void SaveToDisk (char *FileName, Widget warning, 
-                 void (*function)(char *filename, FILE *file)){
+                 void (*function)(char *filename, int format)){
   FILE    *fp ;
   static char KeepFileName[256];
 
@@ -48,82 +49,138 @@ void SaveToDisk (char *FileName, Widget warning,
     }
   }
 
-  if(!(fp = fopen(KeepFileName,"w"))) {
-    Msg(WARNING, "Unable to Open File '%s'", KeepFileName); 
-    WARNING_OVERRIDE = 0;
-    return;
-  }
-
-  function(KeepFileName, fp);
-
-  fclose(fp);
+  function(KeepFileName, CTX.print.format);
 
   WARNING_OVERRIDE = 0;
 }
 
-void CreateImage (char *name, FILE *fp) {
-  FILE    *tmp;
+void CreateImage (char *name, int format) {
+  FILE    *tmp, *fp;
   GLint    size3d;
-  char     cmd[1000];
+  char     cmd[1000], ext[6];
   char     *tmpFileName="tmp.xwd";
   int      res;
 
-  switch(CTX.print.type){
-    
-  case PRINT_XDUMP :    
-    switch(CTX.print.format){
-    case FORMAT_XPM :
-      Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), fp);    
-      break;
-    case FORMAT_EPS :
-      tmp = fopen(tmpFileName,"w");
-      Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), tmp);
-      fclose(tmp);
-      sprintf(cmd, "xpr -device ps -gray 4 %s >%s", tmpFileName, name);
-      Msg(INFOS, "Executing '%s'", cmd);
-      system(cmd);
-      unlink(tmpFileName);
-      break;
+  CTX.print.gl_fonts = 1;
+
+  switch(format){
+
+  case FORMAT_AUTO :
+    strcpy(ext,name+(strlen(name)-4));
+    if     (!strcmp(ext,".gif")) CreateImage(name, FORMAT_GIF);
+    else if(!strcmp(ext,".jpg")) CreateImage(name, FORMAT_JPEG);
+    else if(!strcmp(ext,".eps")) CreateImage(name, FORMAT_EPS);
+    else if(!strcmp(ext,".xpm")) CreateImage(name, FORMAT_XPM);
+    else if(!strcmp(ext,".geo")) CreateImage(name, FORMAT_GEO);
+    else Msg(ERROR, "Unknown Extension \"%s\" for Automatic Format Detection");
+    break;
+
+  case FORMAT_XPM :
+    if(!(fp = fopen(name,"wb"))) {
+      Msg(WARNING, "Unable to Open File '%s'", name); 
+      WARNING_OVERRIDE = 0;
+      return;
     }
+    Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), fp);    
     Msg(INFOS, "XPM Creation Complete '%s'", name);
     Msg (INFO, "Wrote File '%s'", name);
-    break ;
+    fclose(fp);
+    break;
+
+  case FORMAT_JPEG :
+    if(!(fp = fopen(name,"wb"))) {
+      Msg(WARNING, "Unable to Open File '%s'", name); 
+      WARNING_OVERRIDE = 0;
+      return;
+    }
+    Replot();
+    create_jpeg(fp, CTX.viewport[2]-CTX.viewport[0],
+		CTX.viewport[3]-CTX.viewport[1]);
+    Msg(INFOS, "JPEG Creation Complete '%s'", name);
+    Msg (INFO, "Wrote File '%s'", name);
+    fclose(fp);
+    break;
 
-  case PRINT_GL2GIF :
+  case FORMAT_GIF :
     // have to replot for filling again buffer ...
+    if(!(fp = fopen(name,"wb"))) {
+      Msg(WARNING, "Unable to Open File '%s'", name); 
+      WARNING_OVERRIDE = 0;
+      return;
+    }
     Replot();
     create_gif(fp, CTX.viewport[2]-CTX.viewport[0],
                CTX.viewport[3]-CTX.viewport[1]);
     Msg(INFOS, "GIF Creation Complete '%s'", name);
     Msg (INFO, "Wrote File '%s'", name);
+    fclose(fp);
     break;
 
-  case PRINT_GL2PS_SIMPLE :
-  case PRINT_GL2PS_RECURSIVE :
-    size3d = 0 ;
-    res = GL2PS_OVERFLOW ;
-    while(res == GL2PS_OVERFLOW){
-      size3d += 2048*2048 ;
-      gl2psBeginPage(TheBaseFileName, "Gmsh", 
-                     (CTX.print.type == PRINT_GL2PS_SIMPLE ? 
-                      GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT),
-                     GL2PS_SIMPLE_LINE_OFFSET | GL2PS_DRAW_BACKGROUND,
-                     GL_RGBA, 0, NULL, size3d, fp);
-      CTX.stream = TO_FILE ;
-      Init();
-      Draw();
-      CTX.stream = TO_SCREEN ;
-      res = gl2psEndPage();
+  case FORMAT_EPS :
+
+    switch(CTX.print.eps_quality){
+
+    case 0 : // Bitmap EPS
+      if(!(fp = fopen(name,"w"))) {
+	Msg(WARNING, "Unable to Open File '%s'", name); 
+	WARNING_OVERRIDE = 0;
+	return;
+      }
+      if(!(tmp = fopen(tmpFileName,"w"))){
+	Msg(WARNING, "Unable to Open File '%s'", tmpFileName); 
+	return;
+      }
+      Window_Dump(XCTX.display, XCTX.scrnum, XtWindow(WID.G.glw), tmp);
+      fclose(tmp);
+      sprintf(cmd, "xpr -device ps -gray 4 %s >%s", tmpFileName, name);
+      Msg(INFOS, "Executing '%s'", cmd);
+      system(cmd);
+      unlink(tmpFileName);
+      Msg(INFOS, "Bitmap EPS Creation Complete '%s'", name);
+      Msg (INFO, "Wrote File '%s'", name);
+      fclose(fp);
+      break;
+      
+    default : // Vector EPS
+      if(!(fp = fopen(name,"w"))) {
+	Msg(WARNING, "Unable to Open File '%s'", name); 
+	WARNING_OVERRIDE = 0;
+	return;
+      }
+      CTX.print.gl_fonts = 0;
+      size3d = 0 ;
+      res = GL2PS_OVERFLOW ;
+      while(res == GL2PS_OVERFLOW){
+	size3d += 2048*2048 ;
+	gl2psBeginPage(TheBaseFileName, "Gmsh", 
+		       (CTX.print.eps_quality == 1 ? GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT),
+		       GL2PS_SIMPLE_LINE_OFFSET | GL2PS_DRAW_BACKGROUND,
+		       GL_RGBA, 0, NULL, size3d, fp);
+	CTX.stream = TO_FILE ;
+	Init();
+	Draw();
+	CTX.stream = TO_SCREEN ;
+	res = gl2psEndPage();
+      }
+      Msg(INFOS, "EPS Creation Complete '%s'", name);
+      Msg (INFO, "Wrote File '%s'", name);
+      fclose(fp);
+      CTX.print.gl_fonts = 1;
+      break;
+      
     }
-    Msg(INFOS, "EPS Creation Complete '%s'", name);
-    Msg (INFO, "Wrote File '%s'", name);
+    break ;
+    
+  case FORMAT_GEO :
+    Print_Geo(&M, name);
     break;
-
+    
   default :
-    Msg(WARNING, "Unknown Print Type");
+    Msg(WARNING, "Unknown Print Format");
     break;
   }
 
+
 }
 
 /* ------------------------------------------------------------------------ */
@@ -150,12 +207,8 @@ void FileCb(Widget w, XtPointer client_data, XtPointer call_data){
   case FILE_SAVE_OPTIONS_AS    : Print_Context(c); break;
   case FILE_CANCEL             : WARNING_OVERRIDE = 0; break;
   case FILE_PRINT              : 
-    if(CTX.print.format == FORMAT_GEO)
-      Print_Geo(&M, c);
-    else{
-      SaveToDisk(c, WID.ED.printDialog, CreateImage); 
-      Init(); Draw(); 
-    }
+    SaveToDisk(c, WID.ED.printDialog, CreateImage); 
+    Init(); Draw(); 
     break;
   default :
     Msg(WARNING, "Unknown event in FileCb : %d", (long int)client_data); 
diff --git a/Unix/CbOptions.cpp b/Unix/CbOptions.cpp
index 8f37a7fc4a313a2798a91a3e9c8ec32f3f2c0691..30f987709aa36e11ec3f5005d7fbdb1dea8ad6fa 100644
--- a/Unix/CbOptions.cpp
+++ b/Unix/CbOptions.cpp
@@ -1,4 +1,4 @@
-/* $Id: CbOptions.cpp,v 1.12 2000-12-08 11:16:55 geuzaine Exp $ */
+/* $Id: CbOptions.cpp,v 1.13 2000-12-20 10:40:58 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -131,18 +131,17 @@ void OptionsCb (Widget w, XtPointer client_data, XtPointer call_data){
 
     /* print */
 
-  case OPTIONS_PRINT_XDUMP        : 
-    CTX.print.type = PRINT_XDUMP; CTX.print.format = FORMAT_XPM; break;
-  case OPTIONS_PRINT_GL2GIF       : 
-    CTX.print.type = PRINT_GL2GIF; CTX.print.format = FORMAT_GIF; break;
-  case OPTIONS_PRINT_GL2PS_SIMPLE : 
-    CTX.print.type = PRINT_GL2PS_SIMPLE; CTX.print.format = FORMAT_EPS;break;
-  case OPTIONS_PRINT_GL2PS_COMPLEX: 
-    CTX.print.type = PRINT_GL2PS_RECURSIVE; CTX.print.format = FORMAT_EPS;break;
-  case OPTIONS_PRINT_GL2PS_IMAGE  : 
-    CTX.print.type = PRINT_XDUMP; CTX.print.format = FORMAT_EPS;break;
-  case OPTIONS_PRINT_GEO          : 
-    CTX.print.type = -1; CTX.print.format = FORMAT_GEO;break;
+  case OPTIONS_PRINT_AUTO         : CTX.print.format = FORMAT_AUTO; break;
+  case OPTIONS_PRINT_XDUMP        : CTX.print.format = FORMAT_XPM; break;
+  case OPTIONS_PRINT_GL2GIF       : CTX.print.format = FORMAT_GIF; break;
+  case OPTIONS_PRINT_GL2JPEG      : CTX.print.format = FORMAT_JPEG; break;
+  case OPTIONS_PRINT_GL2PS_SIMPLE : CTX.print.format = FORMAT_EPS; 
+                                    CTX.print.eps_quality = 1; break;
+  case OPTIONS_PRINT_GL2PS_COMPLEX: CTX.print.format = FORMAT_EPS; 
+                                    CTX.print.eps_quality = 2; break;
+  case OPTIONS_PRINT_GL2PS_IMAGE  : CTX.print.format = FORMAT_EPS; 
+                                    CTX.print.eps_quality = 0; break;
+  case OPTIONS_PRINT_GEO          : CTX.print.format = FORMAT_GEO; break;
 
     /* geometrie */
 
diff --git a/Unix/CbOptions.h b/Unix/CbOptions.h
index 141993e258a30e786cabb65b8b22029670392f12..d517bd2e5c25e764e944650c48d1f978d5556278 100644
--- a/Unix/CbOptions.h
+++ b/Unix/CbOptions.h
@@ -1,4 +1,4 @@
-/* $Id: CbOptions.h,v 1.8 2000-12-05 19:03:21 geuzaine Exp $ */
+/* $Id: CbOptions.h,v 1.9 2000-12-20 10:40:58 geuzaine Exp $ */
 #ifndef _CB_OPTIONS_H_
 #define _CB_OPTIONS_H_
 
@@ -98,11 +98,15 @@
 
 /* options print */
 
-#define  OPTIONS_PRINT_XDUMP                    400
-#define  OPTIONS_PRINT_GL2PS_SIMPLE             401
-#define  OPTIONS_PRINT_GL2PS_COMPLEX            402
-#define  OPTIONS_PRINT_GL2PS_IMAGE              403
-#define  OPTIONS_PRINT_GL2GIF                   404
-#define  OPTIONS_PRINT_GEO                      405
-                                             
+#define  OPTIONS_PRINT_AUTO                     400
+#define  OPTIONS_PRINT_XDUMP                    401
+#define  OPTIONS_PRINT_GL2PS_SIMPLE             402
+#define  OPTIONS_PRINT_GL2PS_COMPLEX            403
+#define  OPTIONS_PRINT_GL2PS_IMAGE              404
+#define  OPTIONS_PRINT_GL2GIF                   405
+#define  OPTIONS_PRINT_GEO                      406
+#define  OPTIONS_PRINT_GL2JPEG                  407
+
+
+
 #endif
diff --git a/Unix/Register.cpp b/Unix/Register.cpp
index 4bc3d6b2fed0c31d78660645bc2033fc179bc616..e08c258a5991f572b694a042071eb159164c1371 100644
--- a/Unix/Register.cpp
+++ b/Unix/Register.cpp
@@ -1,4 +1,4 @@
-/* $Id: Register.cpp,v 1.13 2000-12-13 13:57:00 geuzaine Exp $ */
+/* $Id: Register.cpp,v 1.14 2000-12-20 10:40:58 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -147,11 +147,13 @@ void RegisterCallbacks_FD(Widgets_T *w){
 
   register_ok_cb       (w->FD.printDialog,     FileCb,    FILE_PRINT);
   register_cancel_cb   (w->FD.printDialog,     ManageCb,  w->FD.printDialog);
-  register_activate_cb (w->FD.printButt[0],    OptionsCb, OPTIONS_PRINT_GL2PS_SIMPLE);
-  register_activate_cb (w->FD.printButt[1],    OptionsCb, OPTIONS_PRINT_GL2PS_COMPLEX);
-  register_activate_cb (w->FD.printButt[2],    OptionsCb, OPTIONS_PRINT_XDUMP);
-  register_activate_cb (w->FD.printButt[3],    OptionsCb, OPTIONS_PRINT_GL2GIF);
-  register_activate_cb (w->FD.printButt[4],    OptionsCb, OPTIONS_PRINT_GEO);
+  register_activate_cb (w->FD.printButt[0],    OptionsCb, OPTIONS_PRINT_AUTO);
+  register_activate_cb (w->FD.printButt[1],    OptionsCb, OPTIONS_PRINT_GL2PS_SIMPLE);
+  register_activate_cb (w->FD.printButt[2],    OptionsCb, OPTIONS_PRINT_GL2PS_COMPLEX);
+  register_activate_cb (w->FD.printButt[3],    OptionsCb, OPTIONS_PRINT_XDUMP);
+  register_activate_cb (w->FD.printButt[4],    OptionsCb, OPTIONS_PRINT_GL2JPEG);
+  register_activate_cb (w->FD.printButt[5],    OptionsCb, OPTIONS_PRINT_GL2GIF);
+  register_activate_cb (w->FD.printButt[6],    OptionsCb, OPTIONS_PRINT_GEO);
 }
 
 void RegisterCallbacks_OD(Widgets_T *w){
diff --git a/Unix/Widgets.cpp b/Unix/Widgets.cpp
index 29c99b66c69ad74c130b12f6888f80adcba5138e..f8375a614bf96e44476bd34c7ad740234f15f468 100644
--- a/Unix/Widgets.cpp
+++ b/Unix/Widgets.cpp
@@ -1,4 +1,4 @@
-/* $Id: Widgets.cpp,v 1.18 2000-12-13 13:57:00 geuzaine Exp $ */
+/* $Id: Widgets.cpp,v 1.19 2000-12-20 10:40:58 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -655,7 +655,7 @@ void CreateWidgets_FD(Widgets_T *w){
 
   /* print */
   i=0 ;
-  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Print Image to File")); i++;
+  XtSetArg(arg[i], XmNdialogTitle, XmStringCreateSimple("Print to File")); i++;
   XtSetArg(arg[i], XmNnoMatchString, XmStringCreateSimple("[ NONE ]")); i++;
   XtSetArg(arg[i], XmNdirMask, XmStringCreateSimple("*")); i++;
   XtSetArg(arg[i], XmNautoUnmanage, False); i++; /* + pratique qd on sauve des animations */
@@ -683,25 +683,33 @@ void CreateWidgets_FD(Widgets_T *w){
   w->FD.printPane[0] = XmCreatePulldownMenu(w->FD.printRowCol, "FDprintPane0", arg, i);
 
   i=0;
-  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (fast)")); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("By Extension")); i++;
   w->FD.printButt[0] = XmCreatePushButton(w->FD.printPane[0], "MprintButt0", arg, i);
   XtManageChild(w->FD.printButt[0]);
   i=0;
-  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS (accurate)")); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS Simple Sort")); i++;
   w->FD.printButt[1] = XmCreatePushButton(w->FD.printPane[0], "MprintButt1", arg, i);
   XtManageChild(w->FD.printButt[1]);
   i=0;
-  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("XPM")); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("EPS Accurate Sort")); i++;
   w->FD.printButt[2] = XmCreatePushButton(w->FD.printPane[0], "MprintButt2", arg, i);
   XtManageChild(w->FD.printButt[2]);
   i=0;
-  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GIF")); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("XPM")); i++;
   w->FD.printButt[3] = XmCreatePushButton(w->FD.printPane[0], "MprintButt3", arg, i);
   XtManageChild(w->FD.printButt[3]);
   i=0;
-  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GEO")); i++;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("JPEG")); i++;
   w->FD.printButt[4] = XmCreatePushButton(w->FD.printPane[0], "MprintButt4", arg, i);
   XtManageChild(w->FD.printButt[4]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GIF")); i++;
+  w->FD.printButt[5] = XmCreatePushButton(w->FD.printPane[0], "MprintButt5", arg, i);
+  XtManageChild(w->FD.printButt[5]);
+  i=0;
+  XtSetArg(arg[i], XmNlabelString, XmStringCreateSimple("GEO")); i++;
+  w->FD.printButt[6] = XmCreatePushButton(w->FD.printPane[0], "MprintButt6", arg, i);
+  XtManageChild(w->FD.printButt[6]);
 
   i=0;
   XtSetArg(arg[i], XmNsubMenuId, w->FD.printPane[0]); i++;