Bug#306036: marked as done (dia: Please include patch to fix locale changes when exporting to EPS and, SVG.)

Debian Bug Tracking System owner@bugs.debian.org
Sat, 18 Jun 2005 13:03:20 -0700


Your message dated Sat, 18 Jun 2005 15:47:58 -0400
with message-id <E1DjjIM-0003Ux-00@newraff.debian.org>
and subject line Bug#306036: fixed in dia 0.94.0-11
has caused the attached Bug report to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what I am
talking about this indicates a serious mail system misconfiguration
somewhere.  Please contact me immediately.)

Debian bug tracking system administrator
(administrator, Debian Bugs database)

--------------------------------------
Received: (at submit) by bugs.debian.org; 23 Apr 2005 21:36:29 +0000
>From hcauwelier@oursours.net Sat Apr 23 14:36:28 2005
Return-path: <hcauwelier@oursours.net>
Received: from miner.numericable.net [80.236.3.113] 
	by spohr.debian.org with esmtp (Exim 3.35 1 (Debian))
	id 1DPSIc-000602-00; Sat, 23 Apr 2005 14:36:26 -0700
Received: (qmail 22485 invoked from network); 23 Apr 2005 21:35:46 -0000
Received: from unknown (HELO [192.168.1.2]) ([81.220.179.3])
          (envelope-sender <hcauwelier@oursours.net>)
          by miner.numericable.net (qmail-ldap-1.03) with SMTP
          for <submit@bugs.debian.org>; 23 Apr 2005 21:35:46 -0000
Message-ID: <426ABFBD.7040200@oursours.net>
Date: Sat, 23 Apr 2005 23:35:57 +0200
From: =?ISO-8859-15?Q?Herv=E9_Cauwelier?= <hcauwelier@oursours.net>
Organization: GrandeOurse
User-Agent: Mozilla Thunderbird 1.0.2 (X11/20050404)
X-Accept-Language: fr, en
MIME-Version: 1.0
To: submit@bugs.debian.org
Subject: dia: Please include patch to fix locale changes when exporting to
 EPS and, SVG.
X-Enigmail-Version: 0.90.0.0
X-Enigmail-Supports: pgp-inline, pgp-mime
Content-Type: multipart/mixed;
 boundary="------------030007030609000809010601"
Delivered-To: submit@bugs.debian.org
X-Spam-Checker-Version: SpamAssassin 2.60-bugs.debian.org_2005_01_02 
	(1.212-2003-09-23-exp) on spohr.debian.org
X-Spam-Status: No, hits=-5.1 required=4.0 tests=BAYES_44,HAS_PACKAGE 
	autolearn=no version=2.60-bugs.debian.org_2005_01_02
X-Spam-Level: 

This is a multi-part message in MIME format.
--------------030007030609000809010601
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 8bit

Package: dia
Severity: wishlist

You will find attached a dpatch made from CVS changes to fix exporting
decimal numbers.

-- System Information:
Debian Release: 3.1
   APT prefers unstable
   APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.10-1-386
Locale: LANG=fr_FR@euro, LC_CTYPE=fr_FR@euro (charmap=ANSI_X3.4-1968) 
(ignored: LC_ALL set to C)

-- 
Hervé Cauwelier
http://www.oursours.net/

--------------030007030609000809010601
Content-Type: text/plain;
 name="03_fix-locale-usage.dpatch"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="03_fix-locale-usage.dpatch"

#! /bin/sh /usr/share/dpatch/dpatch-run
## 03_fix-locale-usage.dpatch by Hervé Cauwelier <hcauwelier@oursours.net>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.

@DPATCH@
diff -urNad dia-0.94.0/app/diapsft2renderer.c /tmp/dpep.5h0a8c/dia-0.94.0/app/diapsft2renderer.c
--- dia-0.94.0/app/diapsft2renderer.c	2005-04-23 22:52:34.061160456 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/app/diapsft2renderer.c	2005-04-23 22:52:34.934027760 +0200
@@ -278,6 +278,10 @@
   FT_Int load_flags = FT_LOAD_DEFAULT|FT_LOAD_NO_BITMAP;
   FT_Glyph glyph;
   FT_Error error;
+  gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar d1_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar d2_buf[G_ASCII_DTOSTR_BUF_SIZE];
 
   /* Need to transform */
 
@@ -297,8 +301,11 @@
   outline_info.OUT = renderer->file;
 
   fprintf(renderer->file, 
-	  "gsave %f %f translate %f %f scale\n",
-	  pos_x, pos_y, 2.54/72.0, -2.54/72.0);
+         "gsave %s %s translate %s %s scale\n",
+         g_ascii_formatd(px_buf, sizeof(px_buf), "%f", pos_x),
+         g_ascii_formatd(py_buf, sizeof(py_buf), "%f", pos_y),
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", 2.54/72.0),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", -2.54/72.0) );
   fprintf(renderer->file, "start_ol\n");
 
   if ((error=FT_Load_Glyph(face, glyph_index, load_flags))) {
diff -urNad dia-0.94.0/app/diapsrenderer.c /tmp/dpep.5h0a8c/dia-0.94.0/app/diapsrenderer.c
--- dia-0.94.0/app/diapsrenderer.c	2005-04-23 22:52:34.063160152 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/app/diapsrenderer.c	2005-04-23 22:52:34.936027456 +0200
@@ -32,6 +32,10 @@
 #include "dia_image.h"
 #include "font.h"
 
+#define DTOSTR_BUF_SIZE G_ASCII_DTOSTR_BUF_SIZE
+#define psrenderer_dtostr(buf,d) \
+   g_ascii_formatd(buf, sizeof(buf), "%f", d)
+
 /* Returns TRUE if this file is an encapsulated postscript file
  * (including e.g. epsi).
  */
@@ -49,12 +53,16 @@
 lazy_setcolor(DiaPsRenderer *renderer,
               Color *color)
 {
+  gchar r_buf[DTOSTR_BUF_SIZE];
+  gchar g_buf[DTOSTR_BUF_SIZE];
+  gchar b_buf[DTOSTR_BUF_SIZE];
+
   if (!color_equals(color, &(renderer->lcolor))) {
     renderer->lcolor = *color;
-    fprintf(renderer->file, "%f %f %f srgb\n",
-            (double) color->red,
-            (double) color->green,
-            (double) color->blue);    
+    fprintf(renderer->file, "%s %s %s srgb\n",
+            psrenderer_dtostr(r_buf, (gdouble) color->red),
+            psrenderer_dtostr(g_buf, (gdouble) color->green),
+            psrenderer_dtostr(b_buf, (gdouble) color->blue) );    
   }
 }
 
@@ -126,12 +134,14 @@
 set_linewidth(DiaRenderer *self, real linewidth)
 {  /* 0 == hairline **/
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  gchar lw_buf[DTOSTR_BUF_SIZE];
 
   /* Adobe's advice:  Set to very small but fixed size, to avoid changes
    * due to different resolution output. */
   /* .01 cm becomes <5 dots on 1200 DPI */
   if (linewidth == 0.0) linewidth=.01;
-  fprintf(renderer->file, "%f slw\n", (double) linewidth);
+  fprintf(renderer->file, "%s slw\n",
+         psrenderer_dtostr(lw_buf, (gdouble) linewidth) );
 }
 
 static void
@@ -185,6 +195,9 @@
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
   real hole_width;
+  gchar dashl_buf[DTOSTR_BUF_SIZE];
+  gchar dotl_buf[DTOSTR_BUF_SIZE];
+  gchar holew_buf[DTOSTR_BUF_SIZE];
 
   renderer->saved_line_style = mode;
   
@@ -193,28 +206,36 @@
     fprintf(renderer->file, "[] 0 sd\n");
     break;
   case LINESTYLE_DASHED:
-    fprintf(renderer->file, "[%f] 0 sd\n", renderer->dash_length);
+    fprintf(renderer->file, "[%s] 0 sd\n",
+           psrenderer_dtostr(dashl_buf, renderer->dash_length) );
     break;
   case LINESTYLE_DASH_DOT:
     hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
-    fprintf(renderer->file, "[%f %f %f %f] 0 sd\n",
-	    renderer->dash_length,
-	    hole_width,
-	    renderer->dot_length,
-	    hole_width );
+    psrenderer_dtostr(holew_buf, hole_width);
+    psrenderer_dtostr(dashl_buf, renderer->dash_length);
+    psrenderer_dtostr(dotl_buf, renderer->dot_length);
+    fprintf(renderer->file, "[%s %s %s %s] 0 sd\n",
+           dashl_buf,
+           holew_buf,
+           dotl_buf,
+           holew_buf );
     break;
   case LINESTYLE_DASH_DOT_DOT:
     hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
-    fprintf(renderer->file, "[%f %f %f %f %f %f] 0 sd\n",
-	    renderer->dash_length,
-	    hole_width,
-	    renderer->dot_length,
-	    hole_width,
-	    renderer->dot_length,
-	    hole_width );
+    psrenderer_dtostr(holew_buf, hole_width);
+    psrenderer_dtostr(dashl_buf, renderer->dash_length);
+    psrenderer_dtostr(dotl_buf, renderer->dot_length);
+    fprintf(renderer->file, "[%s %s %s %s %s %s] 0 sd\n",
+           dashl_buf,
+           holew_buf,
+           dotl_buf,
+           holew_buf,
+           dotl_buf,
+           holew_buf );
     break;
   case LINESTYLE_DOTTED:
-    fprintf(renderer->file, "[%f] 0 sd\n", renderer->dot_length);
+    fprintf(renderer->file, "[%s] 0 sd\n",
+           psrenderer_dtostr(dotl_buf, renderer->dot_length) );
     break;
   }
 }
@@ -251,9 +272,11 @@
 set_font(DiaRenderer *self, DiaFont *font, real height)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  gchar h_buf[DTOSTR_BUF_SIZE];
 
-  fprintf(renderer->file, "/%s-latin1 ff %f scf sf\n",
-          dia_font_get_psfontname(font), (double)height*0.7);
+  fprintf(renderer->file, "/%s-latin1 ff %s scf sf\n",
+          dia_font_get_psfontname(font),
+         psrenderer_dtostr(h_buf, (gdouble) height*0.7) );
 }
 
 static void
@@ -262,11 +285,18 @@
 	  Color *line_color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  gchar sx_buf[DTOSTR_BUF_SIZE];
+  gchar sy_buf[DTOSTR_BUF_SIZE];
+  gchar ex_buf[DTOSTR_BUF_SIZE];
+  gchar ey_buf[DTOSTR_BUF_SIZE];
 
   lazy_setcolor(renderer,line_color);
 
-  fprintf(renderer->file, "n %f %f m %f %f l s\n",
-	  start->x, start->y, end->x, end->y);
+  fprintf(renderer->file, "n %s %s m %s %s l s\n",
+         psrenderer_dtostr(sx_buf, start->x),
+         psrenderer_dtostr(sy_buf, start->y),
+         psrenderer_dtostr(ex_buf, end->x),
+         psrenderer_dtostr(ey_buf, end->y) );
 }
 
 static void
@@ -276,39 +306,60 @@
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
   int i;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
 
   lazy_setcolor(renderer,line_color);
   
-  fprintf(renderer->file, "n %f %f m ",
-	  points[0].x, points[0].y);
+  fprintf(renderer->file, "n %s %s m ",
+         psrenderer_dtostr(px_buf, points[0].x),
+         psrenderer_dtostr(py_buf, points[0].y) );
 
   for (i=1;i<num_points;i++) {
-    fprintf(renderer->file, "%f %f l ",
-	  points[i].x, points[i].y);
+    fprintf(renderer->file, "%s %s l ",
+           psrenderer_dtostr(px_buf, points[i].x),
+           psrenderer_dtostr(py_buf, points[i].y) );
   }
 
   fprintf(renderer->file, "s\n");
 }
 
 static void
-draw_polygon(DiaRenderer *self, 
-	      Point *points, int num_points, 
-	      Color *line_color)
+psrenderer_polygon(DiaPsRenderer *renderer,
+                  Point *points,
+                  gint num_points,
+                  Color *line_color,
+                  gboolean filled)
 {
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  int i;
-  
-  lazy_setcolor(renderer,line_color);
-  
-  fprintf(renderer->file, "n %f %f m ",
-	  points[0].x, points[0].y);
+  gint i;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
+
+  lazy_setcolor(renderer, line_color);
+
+  fprintf(renderer->file, "n %s %s m ",
+         psrenderer_dtostr(px_buf, points[0].x),
+         psrenderer_dtostr(py_buf, points[0].y) );
+
 
   for (i=1;i<num_points;i++) {
-    fprintf(renderer->file, "%f %f l ",
-	  points[i].x, points[i].y);
+    fprintf(renderer->file, "%s %s l ",
+           psrenderer_dtostr(px_buf, points[i].x),
+           psrenderer_dtostr(py_buf, points[i].y) );
   }
+  if (filled)
+    fprintf(renderer->file, "ef\n");
+  else
+    fprintf(renderer->file, "cp s\n");
+}
 
-  fprintf(renderer->file, "cp s\n");
+static void
+draw_polygon(DiaRenderer *self, 
+	      Point *points, int num_points, 
+	      Color *line_color)
+{
+  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  psrenderer_polygon(renderer, points, num_points, line_color, FALSE);
 }
 
 static void
@@ -317,19 +368,34 @@
 	      Color *fill_color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  int i;
+  psrenderer_polygon(renderer, points, num_points, fill_color, TRUE);
+}
 
-  lazy_setcolor(renderer,fill_color);
-  
-  fprintf(renderer->file, "n %f %f m ",
-	  points[0].x, points[0].y);
+static void
+psrenderer_rect(DiaPsRenderer *renderer,
+               Point *ul_corner,
+               Point *lr_corner,
+               Color *color,
+               gboolean filled)
+{
+  gchar ulx_buf[DTOSTR_BUF_SIZE];
+  gchar uly_buf[DTOSTR_BUF_SIZE];
+  gchar lrx_buf[DTOSTR_BUF_SIZE];
+  gchar lry_buf[DTOSTR_BUF_SIZE];
 
-  for (i=1;i<num_points;i++) {
-    fprintf(renderer->file, "%f %f l ",
-	  points[i].x, points[i].y);
-  }
+  lazy_setcolor(renderer,color);
 
-  fprintf(renderer->file, "ef\n");
+  psrenderer_dtostr(ulx_buf, (gdouble) ul_corner->x);
+  psrenderer_dtostr(uly_buf, (gdouble) ul_corner->y);
+  psrenderer_dtostr(lrx_buf, (gdouble) lr_corner->x);
+  psrenderer_dtostr(lry_buf, (gdouble) lr_corner->y);
+  
+  fprintf(renderer->file, "n %s %s m %s %s l %s %s l %s %s l %s\n",
+         ulx_buf, uly_buf,
+         ulx_buf, lry_buf,
+         lrx_buf, lry_buf,
+         lrx_buf, uly_buf,
+         filled ? "f" : "cp s" );
 }
 
 static void
@@ -338,14 +404,7 @@
 	  Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-
-  lazy_setcolor(renderer,color);
-  
-  fprintf(renderer->file, "n %f %f m %f %f l %f %f l %f %f l cp s\n",
-	  (double) ul_corner->x, (double) ul_corner->y,
-	  (double) ul_corner->x, (double) lr_corner->y,
-	  (double) lr_corner->x, (double) lr_corner->y,
-	  (double) lr_corner->x, (double) ul_corner->y );
+  psrenderer_rect(renderer, ul_corner, lr_corner, color, FALSE);
 }
 
 static void
@@ -354,31 +413,53 @@
 	  Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  psrenderer_rect(renderer, ul_corner, lr_corner, color, TRUE);
+}
 
-  lazy_setcolor(renderer,color);
+static void
+psrenderer_arc(DiaPsRenderer *renderer,
+              Point *center,
+              real width, real height,
+              real angle1, real angle2,
+              Color *color,
+              gboolean filled)
+{
+  gchar cx_buf[DTOSTR_BUF_SIZE];
+  gchar cy_buf[DTOSTR_BUF_SIZE];
+  gchar a1_buf[DTOSTR_BUF_SIZE];
+  gchar a2_buf[DTOSTR_BUF_SIZE];
+  gchar w_buf[DTOSTR_BUF_SIZE];
+  gchar h_buf[DTOSTR_BUF_SIZE];
 
-  fprintf(renderer->file, "n %f %f m %f %f l %f %f l %f %f l f\n",
-	  (double) ul_corner->x, (double) ul_corner->y,
-	  (double) ul_corner->x, (double) lr_corner->y,
-	  (double) lr_corner->x, (double) lr_corner->y,
-	  (double) lr_corner->x, (double) ul_corner->y );
+  lazy_setcolor(renderer, color);
+
+  psrenderer_dtostr(cx_buf, (gdouble) center->x);
+  psrenderer_dtostr(cy_buf, (gdouble) center->y);
+  psrenderer_dtostr(a1_buf, (gdouble) 360.0 - angle1);
+  psrenderer_dtostr(a2_buf, (gdouble) 360.0 - angle2);
+  psrenderer_dtostr(w_buf, (gdouble) width / 2.0);
+  psrenderer_dtostr(h_buf, (gdouble) height / 2.0);
+
+  fprintf(renderer->file, "n ");
+
+  if (filled)
+    fprintf(renderer->file, "%s %s m ", cx_buf, cy_buf);
+
+  fprintf(renderer->file, "%s %s %s %s %s %s ellipse %s\n",
+         cx_buf, cy_buf, w_buf, h_buf, a2_buf, a1_buf,
+         filled ? "f" : "s" );
 }
 
+
 static void
-draw_arc(DiaRenderer *self, 
+draw_arc(DiaRenderer *self,
 	 Point *center,
 	 real width, real height,
 	 real angle1, real angle2,
 	 Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-
-  lazy_setcolor(renderer,color);
-
-  fprintf(renderer->file, "n %f %f %f %f %f %f ellipse s\n",
-	  (double) center->x, (double) center->y,
-	  (double) width/2.0, (double) height/2.0,
-	  (double) 360.0 - angle2, (double) 360.0 - angle1 );
+  psrenderer_arc(renderer, center, width, height, angle1, angle2, color, FALSE);
 }
 
 static void
@@ -389,14 +470,29 @@
 	 Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  psrenderer_arc(renderer, center, width, height, angle1, angle2, color, TRUE);
+}
 
+static void
+psrenderer_ellipse(DiaPsRenderer *renderer,
+                  Point *center,
+                  real width, real height,
+                  Color *color,
+                  gboolean filled)
+{
+  gchar cx_buf[DTOSTR_BUF_SIZE];
+  gchar cy_buf[DTOSTR_BUF_SIZE];
+  gchar w_buf[DTOSTR_BUF_SIZE];
+  gchar h_buf[DTOSTR_BUF_SIZE];
+  
   lazy_setcolor(renderer,color);
 
-  fprintf(renderer->file, "n %f %f m %f %f %f %f %f %f ellipse f\n",
-	  (double) center->x, (double) center->y,
-	  (double) center->x, (double) center->y,
-	  (double) width/2.0, (double) height/2.0,
-	  (double) 360.0 - angle2, (double) 360.0 - angle1 );
+  fprintf(renderer->file, "n %s %s %s %s 0 360 ellipse %s\n",
+         psrenderer_dtostr(cx_buf, (gdouble) center->x),
+         psrenderer_dtostr(cy_buf, (gdouble) center->y),
+         psrenderer_dtostr(w_buf, (gdouble) width / 2.0),
+         psrenderer_dtostr(h_buf, (gdouble) height / 2.0),
+         filled ? "f" : "cp s" );
 }
 
 static void
@@ -406,12 +502,7 @@
 	     Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-
-  lazy_setcolor(renderer,color);
-
-  fprintf(renderer->file, "n %f %f %f %f 0 360 ellipse cp s\n",
-	  (double) center->x, (double) center->y,
-	  (double) width/2.0, (double) height/2.0 );
+  psrenderer_ellipse(renderer, center, width, height, color, FALSE);
 }
 
 static void
@@ -421,30 +512,32 @@
 	     Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-
-  lazy_setcolor(renderer,color);
-
-  fprintf(renderer->file, "n %f %f %f %f 0 360 ellipse f\n",
-	  (double) center->x, (double) center->y,
-	  (double) width/2.0, (double) height/2.0 );
+  psrenderer_ellipse(renderer, center, width, height, color, TRUE);
 }
 
 static void
-draw_bezier(DiaRenderer *self, 
-	    BezPoint *points,
-	    int numpoints, /* numpoints = 4+3*n, n=>0 */
-	    Color *color)
+psrenderer_bezier(DiaPsRenderer *renderer,
+                 BezPoint *points,
+                 gint numpoints,
+                 Color *color,
+                 gboolean filled)
 {
-  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  int i;
+  gint  i;
+  gchar p1x_buf[DTOSTR_BUF_SIZE];
+  gchar p1y_buf[DTOSTR_BUF_SIZE];
+  gchar p2x_buf[DTOSTR_BUF_SIZE];
+  gchar p2y_buf[DTOSTR_BUF_SIZE];
+  gchar p3x_buf[DTOSTR_BUF_SIZE];
+  gchar p3y_buf[DTOSTR_BUF_SIZE];
 
   lazy_setcolor(renderer,color);
 
   if (points[0].type != BEZ_MOVE_TO)
     g_warning("first BezPoint must be a BEZ_MOVE_TO");
 
-  fprintf(renderer->file, "n %f %f m",
-	  (double) points[0].p1.x, (double) points[0].p1.y);
+  fprintf(renderer->file, "n %s %s m",
+         psrenderer_dtostr(p1x_buf, (gdouble) points[0].p1.x),
+         psrenderer_dtostr(p1y_buf, (gdouble) points[0].p1.y) );
   
   for (i = 1; i < numpoints; i++)
     switch (points[i].type) {
@@ -452,18 +545,35 @@
       g_warning("only first BezPoint can be a BEZ_MOVE_TO");
       break;
     case BEZ_LINE_TO:
-      fprintf(renderer->file, " %f %f l",
-	      (double) points[i].p1.x, (double) points[i].p1.y);
+      fprintf(renderer->file, " %s %s l",
+             psrenderer_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+             psrenderer_dtostr(p1y_buf, (gdouble) points[i].p1.y) );
       break;
     case BEZ_CURVE_TO:
-      fprintf(renderer->file, " %f %f %f %f %f %f c",
-	      (double) points[i].p1.x, (double) points[i].p1.y,
-	      (double) points[i].p2.x, (double) points[i].p2.y,
-	      (double) points[i].p3.x, (double) points[i].p3.y );
+      fprintf(renderer->file, " %s %s %s %s %s %s c",
+             psrenderer_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+             psrenderer_dtostr(p1y_buf, (gdouble) points[i].p1.y),
+             psrenderer_dtostr(p2x_buf, (gdouble) points[i].p2.x),
+             psrenderer_dtostr(p2y_buf, (gdouble) points[i].p2.y),
+             psrenderer_dtostr(p3x_buf, (gdouble) points[i].p3.x),
+             psrenderer_dtostr(p3y_buf, (gdouble) points[i].p3.y) );
       break;
     }
 
-  fprintf(renderer->file, " s\n");
+  if (filled)
+    fprintf(renderer->file, " ef\n");
+  else
+    fprintf(renderer->file, " s\n");
+}
+
+static void
+draw_bezier(DiaRenderer *self, 
+           BezPoint *points,
+           int numpoints, /* numpoints = 4+3*n, n=>0 */
+           Color *color)
+{
+  DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
+  psrenderer_bezier(renderer, points, numpoints, color, FALSE);
 }
 
 static void
@@ -473,34 +583,7 @@
 	    Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  int i;
-
-  lazy_setcolor(renderer,color);
-
-  if (points[0].type != BEZ_MOVE_TO)
-    g_warning("first BezPoint must be a BEZ_MOVE_TO");
-
-  fprintf(renderer->file, "n %f %f m",
-	  (double) points[0].p1.x, (double) points[0].p1.y);
-  
-  for (i = 1; i < numpoints; i++)
-    switch (points[i].type) {
-    case BEZ_MOVE_TO:
-      g_warning("only first BezPoint can be a BEZ_MOVE_TO");
-      break;
-    case BEZ_LINE_TO:
-      fprintf(renderer->file, " %f %f l",
-	      (double) points[i].p1.x, (double) points[i].p1.y);
-      break;
-    case BEZ_CURVE_TO:
-      fprintf(renderer->file, " %f %f %f %f %f %f c",
-	      (double) points[i].p1.x, (double) points[i].p1.y,
-	      (double) points[i].p2.x, (double) points[i].p2.y,
-	      (double) points[i].p3.x, (double) points[i].p3.y );
-      break;
-    }
-
-  fprintf(renderer->file, " ef\n");
+  psrenderer_bezier(renderer, points, numpoints, color, TRUE);
 }
 
 static void
@@ -510,10 +593,12 @@
 	    Color *color)
 {
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
-  char *buffer;
-  const char *str;
-  int len;
+  gchar *buffer;
   gchar *localestr;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
+  const gchar *str;
+  gint len;
   GError * error = NULL;
 
   if (1 > strlen(text))
@@ -550,15 +635,19 @@
 
   switch (alignment) {
   case ALIGN_LEFT:
-    fprintf(renderer->file, "%f %f m", pos->x, pos->y);
+    fprintf(renderer->file, "%s %s m",
+           psrenderer_dtostr(px_buf, pos->x),
+           psrenderer_dtostr(py_buf, pos->y) );
     break;
   case ALIGN_CENTER:
-    fprintf(renderer->file, "dup sw 2 div %f ex sub %f m",
-	    pos->x, pos->y);
+    fprintf(renderer->file, "dup sw 2 div %s ex sub %s m",
+           psrenderer_dtostr(px_buf, pos->x),
+           psrenderer_dtostr(py_buf, pos->y) );
     break;
   case ALIGN_RIGHT:
-    fprintf(renderer->file, "dup sw %f ex sub %f m",
-	    pos->x, pos->y);
+    fprintf(renderer->file, "dup sw %s ex sub %s m",
+           psrenderer_dtostr(px_buf, pos->x),
+           psrenderer_dtostr(py_buf, pos->y) );
     break;
   }
   
@@ -574,10 +663,12 @@
   DiaPsRenderer *renderer = DIA_PS_RENDERER(self);
   int img_width, img_height, img_rowstride;
   int v;
-  int                 x, y;
+  int x, y;
   real ratio;
   guint8 *rgb_data;
   guint8 *mask_data;
+  gchar d1_buf[DTOSTR_BUF_SIZE];
+  gchar d2_buf[DTOSTR_BUF_SIZE];
 
   img_width = dia_image_width(image);
   img_rowstride = dia_image_rowstride(image);
@@ -593,8 +684,12 @@
   /* color output only */
   fprintf(renderer->file, "/pix %i string def\n", img_width * 3);
   fprintf(renderer->file, "%i %i 8\n", img_width, img_height);
-  fprintf(renderer->file, "%f %f tr\n", point->x, point->y);
-  fprintf(renderer->file, "%f %f sc\n", width, height);
+  fprintf(renderer->file, "%s %s tr\n",
+                          psrenderer_dtostr(d1_buf, point->x),
+                          psrenderer_dtostr(d2_buf, point->y) );
+  fprintf(renderer->file, "%s %s sc\n",
+                          psrenderer_dtostr(d1_buf, width),
+                          psrenderer_dtostr(d2_buf, height) );
   fprintf(renderer->file, "[%i 0 0 %i 0 0]\n", img_width, img_height);
 
   fprintf(renderer->file, "{currentfile pix readhexstring pop}\n");
@@ -797,11 +892,18 @@
 static void
 end_prolog (DiaPsRenderer *renderer)
 {
+  gchar d1_buf[DTOSTR_BUF_SIZE];
+  gchar d2_buf[DTOSTR_BUF_SIZE];
+  
   if (renderer_is_eps(renderer)) {
     fprintf(renderer->file,
-            "%f %f scale\n", renderer->scale, -renderer->scale);
+            "%s %s scale\n",
+           psrenderer_dtostr(d1_buf, renderer->scale),
+           psrenderer_dtostr(d2_buf, -renderer->scale) );
     fprintf(renderer->file,
-            "%f %f translate\n", -renderer->extent.left, -renderer->extent.bottom);
+            "%s %s translate\n",
+           psrenderer_dtostr(d1_buf, -renderer->extent.left),
+           psrenderer_dtostr(d2_buf, -renderer->extent.bottom) );
   } else {
     /* done by BoundingBox above */
   }
diff -urNad dia-0.94.0/app/paginate_psprint.c /tmp/dpep.5h0a8c/dia-0.94.0/app/paginate_psprint.c
--- dia-0.94.0/app/paginate_psprint.c	2005-04-23 22:52:34.064160000 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/app/paginate_psprint.c	2005-04-23 22:52:34.936027456 +0200
@@ -24,7 +24,6 @@
 #endif
 
 #include <stdio.h>
-#include <locale.h>
 #include <string.h> /* strlen */
 #include <signal.h>
 #include <errno.h>
@@ -71,6 +70,8 @@
   gfloat tmargin = data->paper.tmargin, bmargin = data->paper.bmargin;
   gfloat lmargin = data->paper.lmargin;
   gfloat scale = data->paper.scaling;
+  gchar d1_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar d2_buf[G_ASCII_DTOSTR_BUF_SIZE];
 
   rend->paper = data->paper.name;
 
@@ -90,22 +91,38 @@
 
   /* transform coordinate system */
   if (data->paper.is_portrait) {
-    fprintf(rend->file, "%f %f scale\n", 28.346457*scale, -28.346457*scale);
-    fprintf(rend->file, "%f %f translate\n", lmargin/scale - bounds->left,
-	    -bmargin/scale - bounds->bottom);
+    fprintf(rend->file, "%s %s scale\n",
+           g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", 28.346457*scale),
+           g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", -28.346457*scale) );
+    fprintf(rend->file, "%s %s translate\n",
+           g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", lmargin/scale - bounds->left),
+           g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", -bmargin/scale - bounds->bottom) );
   } else {
     fprintf(rend->file, "90 rotate\n");
-    fprintf(rend->file, "%f %f scale\n", 28.346457*scale, -28.346457*scale);
-    fprintf(rend->file, "%f %f translate\n", lmargin/scale - bounds->left,
-	    tmargin/scale - bounds->top);
+    fprintf(rend->file, "%s %s scale\n",
+           g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", 28.346457*scale),
+           g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", -28.346457*scale) );
+    fprintf(rend->file, "%s %s translate\n",
+           g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", lmargin/scale - bounds->left),
+           g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", tmargin/scale - bounds->top) );
   }
 
   /* set up clip mask */
-  fprintf(rend->file, "n %f %f m ", bounds->left, bounds->top);
-  fprintf(rend->file, "%f %f l ", bounds->right, bounds->top);
-  fprintf(rend->file, "%f %f l ", bounds->right, bounds->bottom);
-  fprintf(rend->file, "%f %f l ", bounds->left, bounds->bottom);
-  fprintf(rend->file, "%f %f l ", bounds->left, bounds->top);
+  fprintf(rend->file, "n %s %s m ",
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", bounds->left),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", bounds->top) );
+  fprintf(rend->file, "%s %s l ",
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", bounds->right),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", bounds->top) );
+  fprintf(rend->file, "%s %s l ",
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", bounds->right),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", bounds->bottom) );
+  fprintf(rend->file, "%s %s l ",
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", bounds->left),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", bounds->bottom) );
+  fprintf(rend->file, "%s %s l ",
+         g_ascii_formatd(d1_buf, sizeof(d1_buf), "%f", bounds->left),
+         g_ascii_formatd(d2_buf, sizeof(d2_buf), "%f", bounds->top) );
   /* Tip from Dov Grobgeld: Clip does not destroy the path, so we should
      do a newpath afterwards */
   fprintf(rend->file, "clip n\n"); 
diff -urNad dia-0.94.0/lib/diasvgrenderer.c /tmp/dpep.5h0a8c/dia-0.94.0/lib/diasvgrenderer.c
--- dia-0.94.0/lib/diasvgrenderer.c	2005-04-23 22:52:34.065159848 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/lib/diasvgrenderer.c	2005-04-23 22:53:09.347796072 +0200
@@ -34,7 +34,6 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#include <locale.h>
 
 #include <libxml/entities.h>
 #include <libxml/tree.h>
@@ -48,6 +47,10 @@
 
 #include "diasvgrenderer.h"
 
+#define DTOSTR_BUF_SIZE G_ASCII_DTOSTR_BUF_SIZE
+#define dia_svg_dtostr(buf,d) \
+       g_ascii_formatd(buf,sizeof(buf),"%g",d)
+
 /* DiaSvgRenderer methods */
 static void
 begin_render(DiaRenderer *self)
@@ -128,44 +131,58 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   real hole_width;
-  char *old_locale;
+  gchar dash_length_buf[DTOSTR_BUF_SIZE];
+  gchar dot_length_buf[DTOSTR_BUF_SIZE];
+  gchar hole_width_buf[DTOSTR_BUF_SIZE];
 
   renderer->saved_line_style = mode;
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   g_free(renderer->linestyle);
   switch(mode) {
   case LINESTYLE_SOLID:
     renderer->linestyle = NULL;
     break;
   case LINESTYLE_DASHED:
-    renderer->linestyle = g_strdup_printf("%g", renderer->dash_length);
+    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
+    renderer->linestyle = g_strdup_printf("%s", dash_length_buf);
     break;
   case LINESTYLE_DASH_DOT:
     hole_width = (renderer->dash_length - renderer->dot_length) / 2.0;
-    renderer->linestyle = g_strdup_printf("%g %g %g %g",
-					  renderer->dash_length,
-					  hole_width,
-					  renderer->dot_length,
-					  hole_width);
+
+    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
+    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+    dia_svg_dtostr(hole_width_buf, hole_width);
+
+    renderer->linestyle = g_strdup_printf("%s %s %s %s",
+                                         dash_length_buf,
+                                         hole_width_buf,
+                                         dot_length_buf,
+                                         hole_width_buf );
     break;
   case LINESTYLE_DASH_DOT_DOT:
     hole_width = (renderer->dash_length - 2.0*renderer->dot_length) / 3.0;
-    renderer->linestyle = g_strdup_printf("%g %g %g %g %g %g",
-					  renderer->dash_length,
-					  hole_width,
-					  renderer->dot_length,
-					  hole_width,
-					  renderer->dot_length,
-					  hole_width );
+
+    dia_svg_dtostr(dash_length_buf, renderer->dash_length);
+    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+    dia_svg_dtostr(hole_width_buf, hole_width);
+
+    renderer->linestyle = g_strdup_printf("%s %s %s %s %s %s",
+                                         dash_length_buf,
+                                         hole_width_buf,
+                                         dot_length_buf,
+                                         hole_width_buf,
+                                         dot_length_buf,
+                                         hole_width_buf );
     break;
   case LINESTYLE_DOTTED:
-    renderer->linestyle = g_strdup_printf("%g", renderer->dot_length);
+
+    dia_svg_dtostr(dot_length_buf, renderer->dot_length);
+
+    renderer->linestyle = g_strdup_printf("%s", dot_length_buf);
     break;
   default:
     renderer->linestyle = NULL;
   }
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -199,15 +216,13 @@
 	       Color *colour)
 {
   static GString *str = NULL;
-  char *old_locale;
+  gchar linewidth_buf[DTOSTR_BUF_SIZE];
 
   if (!str) str = g_string_new(NULL);
   g_string_truncate(str, 0);
 
   /* TODO(CHECK): the shape-export didn't have 'fill: none' here */
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_string_sprintf(str, "fill: none; fill-opacity:0; stroke-width: %g", renderer->linewidth);
-  setlocale(LC_NUMERIC, old_locale);
+  g_string_sprintf(str, "fill: none; fill-opacity:0; stroke-width: %s", dia_svg_dtostr(linewidth_buf, renderer->linewidth) );
   if (strcmp(renderer->linecap, "butt"))
     g_string_sprintfa(str, "; stroke-linecap: %s", renderer->linecap);
   if (strcmp(renderer->linejoin, "miter"))
@@ -246,23 +261,20 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "line", NULL);
 
   xmlSetProp(node, "style", get_draw_style(renderer, line_colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", start->x);
-  xmlSetProp(node, "x1", buf);
-  g_snprintf(buf, sizeof(buf), "%g", start->y);
-  xmlSetProp(node, "y1", buf);
-  g_snprintf(buf, sizeof(buf), "%g", end->x);
-  xmlSetProp(node, "x2", buf);
-  g_snprintf(buf, sizeof(buf), "%g", end->y);
-  xmlSetProp(node, "y2", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, start->x);
+  xmlSetProp(node, "x1", d_buf);
+  dia_svg_dtostr(d_buf, start->y);
+  xmlSetProp(node, "y1", d_buf);
+  dia_svg_dtostr(d_buf, end->x);
+  xmlSetProp(node, "x2", d_buf);
+  dia_svg_dtostr(d_buf, end->y);
+  xmlSetProp(node, "y2", d_buf);
 }
 
 static void
@@ -274,19 +286,20 @@
   int i;
   xmlNodePtr node;
   GString *str;
-  char *old_locale;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "polyline", NULL);
   
   xmlSetProp(node, "style", get_draw_style(renderer, line_colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++)
-    g_string_sprintfa(str, "%g,%g ", points[i].x, points[i].y);
+    g_string_sprintfa(str, "%s,%s ",
+                     dia_svg_dtostr(px_buf, points[i].x),
+                     dia_svg_dtostr(py_buf, points[i].y) );
   xmlSetProp(node, "points", str->str);
   g_string_free(str, TRUE);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -298,19 +311,20 @@
   int i;
   xmlNodePtr node;
   GString *str;
-  char *old_locale;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "polygon", NULL);
   
   xmlSetProp(node, "style", get_draw_style(renderer, line_colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++)
-    g_string_sprintfa(str, "%g,%g ", points[i].x, points[i].y);
+    g_string_sprintfa(str, "%s,%s ",
+                     dia_svg_dtostr(px_buf, points[i].x),
+                     dia_svg_dtostr(py_buf, points[i].y) );
   xmlSetProp(node, "points", str->str);
   g_string_free(str, TRUE);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -322,19 +336,20 @@
   int i;
   xmlNodePtr node;
   GString *str;
-  char *old_locale;
+  gchar px_buf[DTOSTR_BUF_SIZE];
+  gchar py_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "polygon", NULL);
   
   xmlSetProp(node, "style", get_fill_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++)
-    g_string_sprintfa(str, "%g,%g ", points[i].x, points[i].y);
+    g_string_sprintfa(str, "%s,%s ",
+                     dia_svg_dtostr(px_buf, points[i].x),
+                     dia_svg_dtostr(py_buf, points[i].y) );
   xmlSetProp(node, "points", str->str);
   g_string_free(str, TRUE);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -344,23 +359,20 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, NULL, "rect", NULL);
 
   xmlSetProp(node, "style", get_draw_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->x);
-  xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->y);
-  xmlSetProp(node, "y", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
-  xmlSetProp(node, "width", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
-  xmlSetProp(node, "height", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, ul_corner->x);
+  xmlSetProp(node, "x", d_buf);
+  dia_svg_dtostr(d_buf, ul_corner->y);
+  xmlSetProp(node, "y", d_buf);
+  dia_svg_dtostr(d_buf, lr_corner->x - ul_corner->x);
+  xmlSetProp(node, "width", d_buf);
+  dia_svg_dtostr(d_buf, lr_corner->y - ul_corner->y);
+  xmlSetProp(node, "height", d_buf);
 }
 
 static void
@@ -370,23 +382,20 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "rect", NULL);
 
   xmlSetProp(node, "style", get_fill_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->x);
-  xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->y);
-  xmlSetProp(node, "y", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
-  xmlSetProp(node, "width", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
-  xmlSetProp(node, "height", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, ul_corner->x);
+  xmlSetProp(node, "x", d_buf);
+  dia_svg_dtostr(d_buf, ul_corner->y);
+  xmlSetProp(node, "y", d_buf);
+  dia_svg_dtostr(d_buf, lr_corner->x - ul_corner->x);
+  xmlSetProp(node, "width", d_buf);
+  dia_svg_dtostr(d_buf, lr_corner->y - ul_corner->y);
+  xmlSetProp(node, "height", d_buf);
 }
 
 static int sweep (real x1,real y1,real x2,real y2,real x3,real y3)
@@ -419,7 +428,12 @@
   real y2=center->y - ry*sin(angle2*G_PI/180);
   int swp = sweep(x1,y1,x2,y2,center->x,center->y);
   int l_arc;
-  char *old_locale;
+  gchar x1_buf[DTOSTR_BUF_SIZE];
+  gchar y1_buf[DTOSTR_BUF_SIZE];
+  gchar rx_buf[DTOSTR_BUF_SIZE];
+  gchar ry_buf[DTOSTR_BUF_SIZE];
+  gchar x2_buf[DTOSTR_BUF_SIZE];
+  gchar y2_buf[DTOSTR_BUF_SIZE];
 
   if (angle2 > angle1) {
     l_arc = (angle2 - angle1) > 180;
@@ -435,14 +449,13 @@
   xmlSetProp(node, "style", get_draw_style(renderer, colour));
 
   /* this path might be incorrect ... */
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "M %g,%g A %g,%g 0 %d %d %g,%g",
-	     x1, y1,
-	     rx, ry,l_arc ,swp ,
-	     x2, y2);
+  g_snprintf(buf, sizeof(buf), "M %s,%s A %s,%s 0 %d %d %s,%s",
+            dia_svg_dtostr(x1_buf, x1), dia_svg_dtostr(y1_buf, y1),
+            dia_svg_dtostr(rx_buf, rx), dia_svg_dtostr(ry_buf, ry),
+            l_arc, swp,
+            dia_svg_dtostr(x2_buf, x2), dia_svg_dtostr(y2_buf, y2) );
 
   xmlSetProp(node, "d", buf);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -462,7 +475,14 @@
   real y2=center->y - ry*sin(angle2*G_PI/180);
   int swp = sweep(x1,y1,x2,y2,center->x,center->y);
   int l_arc;
-  char *old_locale;
+  gchar x1_buf[DTOSTR_BUF_SIZE];
+  gchar y1_buf[DTOSTR_BUF_SIZE];
+  gchar rx_buf[DTOSTR_BUF_SIZE];
+  gchar ry_buf[DTOSTR_BUF_SIZE];
+  gchar x2_buf[DTOSTR_BUF_SIZE];
+  gchar y2_buf[DTOSTR_BUF_SIZE];
+  gchar cx_buf[DTOSTR_BUF_SIZE];
+  gchar cy_buf[DTOSTR_BUF_SIZE];
 
   if (angle2 > angle1) {
     l_arc = (angle2 - angle1) > 180;
@@ -478,15 +498,15 @@
   xmlSetProp(node, "style", get_fill_style(renderer, colour));
 
   /* this path might be incorrect ... */
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "M %g,%g A %g,%g 0 %d %d %g,%g L %g,%g z",
-	     x1, y1,
-	     rx, ry,l_arc ,swp ,
-	     x2, y2,
-	     center->x, center->y);
+  g_snprintf(buf, sizeof(buf), "M %s,%s A %s,%s 0 %d %d %s,%s L %s,%s z",
+            dia_svg_dtostr(x1_buf, x1), dia_svg_dtostr(y2_buf, y2),
+            dia_svg_dtostr(rx_buf, rx), dia_svg_dtostr(ry_buf, ry),
+            l_arc, swp,
+            dia_svg_dtostr(x2_buf, x2), dia_svg_dtostr(y2_buf, y2),
+            dia_svg_dtostr(cx_buf, center->x),
+            dia_svg_dtostr(cy_buf, center->y) );
 
   xmlSetProp(node, "d", buf);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -497,23 +517,20 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "ellipse", NULL);
 
   xmlSetProp(node, "style", get_draw_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", center->x);
-  xmlSetProp(node, "cx", buf);
-  g_snprintf(buf, sizeof(buf), "%g", center->y);
-  xmlSetProp(node, "cy", buf);
-  g_snprintf(buf, sizeof(buf), "%g", width / 2);
-  xmlSetProp(node, "rx", buf);
-  g_snprintf(buf, sizeof(buf), "%g", height / 2);
-  xmlSetProp(node, "ry", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, center->x);
+  xmlSetProp(node, "cx", d_buf);
+  dia_svg_dtostr(d_buf, center->y);
+  xmlSetProp(node, "cy", d_buf);
+  dia_svg_dtostr(d_buf, width / 2);
+  xmlSetProp(node, "rx", d_buf);
+  dia_svg_dtostr(d_buf, height / 2);
+  xmlSetProp(node, "ry", d_buf);
 }
 
 static void
@@ -524,23 +541,20 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "ellipse", NULL);
 
   xmlSetProp(node, "style", get_fill_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", center->x);
-  xmlSetProp(node, "cx", buf);
-  g_snprintf(buf, sizeof(buf), "%g", center->y);
-  xmlSetProp(node, "cy", buf);
-  g_snprintf(buf, sizeof(buf), "%g", width / 2);
-  xmlSetProp(node, "rx", buf);
-  g_snprintf(buf, sizeof(buf), "%g", height / 2);
-  xmlSetProp(node, "ry", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, center->x);
+  xmlSetProp(node, "cx", d_buf);
+  dia_svg_dtostr(d_buf, center->y);
+  xmlSetProp(node, "cy", d_buf);
+  dia_svg_dtostr(d_buf, width / 2);
+  xmlSetProp(node, "rx", d_buf);
+  dia_svg_dtostr(d_buf, height / 2);
+  xmlSetProp(node, "ry", d_buf);
 }
 
 static void
@@ -553,7 +567,12 @@
   int i;
   xmlNodePtr node;
   GString *str;
-  char *old_locale;
+  gchar p1x_buf[DTOSTR_BUF_SIZE];
+  gchar p1y_buf[DTOSTR_BUF_SIZE];
+  gchar p2x_buf[DTOSTR_BUF_SIZE];
+  gchar p2y_buf[DTOSTR_BUF_SIZE];
+  gchar p3x_buf[DTOSTR_BUF_SIZE];
+  gchar p3y_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "path", NULL);
   
@@ -561,12 +580,12 @@
 
   str = g_string_new(NULL);
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   if (points[0].type != BEZ_MOVE_TO)
     g_warning("first BezPoint must be a BEZ_MOVE_TO");
 
-  g_string_sprintf(str, "M %g %g", (double)points[0].p1.x,
-		   (double)points[0].p1.y);
+  g_string_sprintf(str, "M %s %s",
+                  dia_svg_dtostr(p1x_buf, (gdouble) points[0].p1.x),
+                  dia_svg_dtostr(p1y_buf, (gdouble) points[0].p1.y) );
 
   for (i = 1; i < numpoints; i++)
     switch (points[i].type) {
@@ -574,19 +593,22 @@
       g_warning("only first BezPoint can be a BEZ_MOVE_TO");
       break;
     case BEZ_LINE_TO:
-      g_string_sprintfa(str, " L %g,%g",
-			(double) points[i].p1.x, (double) points[i].p1.y);
+      g_string_sprintfa(str, " L %s,%s",
+                       dia_svg_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+                       dia_svg_dtostr(p1y_buf, (gdouble) points[i].p1.y) );
       break;
     case BEZ_CURVE_TO:
-      g_string_sprintfa(str, " C %g,%g %g,%g %g,%g",
-			(double) points[i].p1.x, (double) points[i].p1.y,
-			(double) points[i].p2.x, (double) points[i].p2.y,
-			(double) points[i].p3.x, (double) points[i].p3.y );
+      g_string_sprintfa(str, " C %s,%s %s,%s %s,%s",
+                       dia_svg_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+                       dia_svg_dtostr(p1y_buf, (gdouble) points[i].p1.y),
+                       dia_svg_dtostr(p2x_buf, (gdouble) points[i].p2.x),
+                       dia_svg_dtostr(p2y_buf, (gdouble) points[i].p2.y),
+                       dia_svg_dtostr(p3x_buf, (gdouble) points[i].p3.x),
+                       dia_svg_dtostr(p3y_buf, (gdouble) points[i].p3.y) );
       break;
     }
   xmlSetProp(node, "d", str->str);
   g_string_free(str, TRUE);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -599,7 +621,12 @@
   int i;
   xmlNodePtr node;
   GString *str;
-  char *old_locale;
+  gchar p1x_buf[DTOSTR_BUF_SIZE];
+  gchar p1y_buf[DTOSTR_BUF_SIZE];
+  gchar p2x_buf[DTOSTR_BUF_SIZE];
+  gchar p2y_buf[DTOSTR_BUF_SIZE];
+  gchar p3x_buf[DTOSTR_BUF_SIZE];
+  gchar p3y_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "path", NULL);
   
@@ -607,12 +634,12 @@
 
   str = g_string_new(NULL);
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   if (points[0].type != BEZ_MOVE_TO)
     g_warning("first BezPoint must be a BEZ_MOVE_TO");
 
-  g_string_sprintf(str, "M %g %g", (double)points[0].p1.x,
-		   (double)points[0].p1.y);
+  g_string_sprintf(str, "M %s %s",
+                  dia_svg_dtostr(p1x_buf, (gdouble) points[0].p1.x),
+                  dia_svg_dtostr(p1y_buf, (gdouble) points[0].p1.y) );
  
   for (i = 1; i < numpoints; i++)
     switch (points[i].type) {
@@ -620,20 +647,23 @@
       g_warning("only first BezPoint can be a BEZ_MOVE_TO");
       break;
     case BEZ_LINE_TO:
-      g_string_sprintfa(str, " L %g,%g",
-			(double) points[i].p1.x, (double) points[i].p1.y);
+      g_string_sprintfa(str, " L %s,%s",
+                       dia_svg_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+                       dia_svg_dtostr(p1y_buf, (gdouble) points[i].p1.y) );
       break;
     case BEZ_CURVE_TO:
-      g_string_sprintfa(str, " C %g,%g %g,%g %g,%g",
-			(double) points[i].p1.x, (double) points[i].p1.y,
-			(double) points[i].p2.x, (double) points[i].p2.y,
-			(double) points[i].p3.x, (double) points[i].p3.y );
+      g_string_sprintfa(str, " C %s,%s %s,%s %s,%s",
+                       dia_svg_dtostr(p1x_buf, (gdouble) points[i].p1.x),
+                       dia_svg_dtostr(p1y_buf, (gdouble) points[i].p1.y),
+                       dia_svg_dtostr(p2x_buf, (gdouble) points[i].p2.x),
+                       dia_svg_dtostr(p2y_buf, (gdouble) points[i].p2.y),
+                       dia_svg_dtostr(p3x_buf, (gdouble) points[i].p3.x),
+                       dia_svg_dtostr(p3y_buf, (gdouble) points[i].p3.y) );
       break;
     }
   g_string_append(str, "z");
   xmlSetProp(node, "d", str->str);
   g_string_free(str, TRUE);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -644,10 +674,9 @@
 {    
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
   char *style, *tmp;
   real saved_width;
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "text", text);
  
@@ -670,9 +699,8 @@
     style = g_strconcat(style, "; text-anchor:end", NULL);
     break;
   }
-  old_locale = setlocale(LC_NUMERIC, "C");
-  tmp = g_strdup_printf("%s; font-size: %g", style, self->font_height);
-  setlocale(LC_NUMERIC, old_locale);
+  tmp = g_strdup_printf("%s; font-size: %s", style,
+                       dia_svg_dtostr(d_buf, self->font_height) );
   g_free (style);
   style = tmp;
 
@@ -691,12 +719,10 @@
   xmlSetProp(node, "style", style);
   g_free(style);
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", pos->x);
-  xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", pos->y);
-  xmlSetProp(node, "y", buf);
-  setlocale(LC_NUMERIC, old_locale);
+  dia_svg_dtostr(d_buf, pos->x);
+  xmlSetProp(node, "x", d_buf);
+  dia_svg_dtostr(d_buf, pos->y);
+  xmlSetProp(node, "y", d_buf);
 }
 
 static void
@@ -707,22 +733,19 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar d_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, NULL, "image", NULL);
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", point->x);
-  xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", point->y);
-  xmlSetProp(node, "y", buf);
-  g_snprintf(buf, sizeof(buf), "%g", width);
-  xmlSetProp(node, "width", buf);
-  g_snprintf(buf, sizeof(buf), "%g", height);
-  xmlSetProp(node, "height", buf);
+  dia_svg_dtostr(d_buf, point->x);
+  xmlSetProp(node, "x", d_buf);
+  dia_svg_dtostr(d_buf, point->y);
+  xmlSetProp(node, "y", d_buf);
+  dia_svg_dtostr(d_buf, width);
+  xmlSetProp(node, "width", d_buf);
+  dia_svg_dtostr(d_buf, height);
+  xmlSetProp(node, "height", d_buf);
   xmlSetProp(node, "xlink:href", dia_image_filename(image));
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 /* constructor */
diff -urNad dia-0.94.0/lib/dia_xml.c /tmp/dpep.5h0a8c/dia-0.94.0/lib/dia_xml.c
--- dia-0.94.0/lib/dia_xml.c	2005-04-23 22:52:34.066159696 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/lib/dia_xml.c	2005-04-23 22:52:34.938027152 +0200
@@ -21,7 +21,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <locale.h>
 #include <math.h>
 #include <fcntl.h>
 
@@ -767,33 +766,40 @@
 data_add_point(AttributeNode attr, const Point *point)
 {
   DataNode data_node;
-  char buffer[80+1]; /* Large enought? */
-  char *old_locale;
-
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buffer, 80, "%g,%g", point->x, point->y);
-  setlocale(LC_NUMERIC, old_locale);
+  gchar *buffer;
+  gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  
+  g_ascii_formatd(px_buf, sizeof(px_buf), "%g", point->x);
+  g_ascii_formatd(py_buf, sizeof(py_buf), "%g", point->y);
+  buffer = g_strconcat(px_buf, ",", py_buf, NULL);
   
   data_node = xmlNewChild(attr, NULL, "point", NULL);
   xmlSetProp(data_node, "val", buffer);
+  g_free(buffer);
 }
 
 void
 data_add_rectangle(AttributeNode attr, const Rectangle *rect)
 {
   DataNode data_node;
-  char buffer[160+1]; /* Large enough? */
-  char *old_locale;
+  gchar *buffer;
+  gchar rl_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar rr_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar rt_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar rb_buf[G_ASCII_DTOSTR_BUF_SIZE];
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buffer, 160, "%g,%g;%g,%g",
-	     rect->left, rect->top,
-	     rect->right, rect->bottom);
-  setlocale(LC_NUMERIC, old_locale);
+  g_ascii_formatd(rl_buf, sizeof(rl_buf), "%g", rect->left);
+  g_ascii_formatd(rr_buf, sizeof(rr_buf), "%g", rect->right);
+  g_ascii_formatd(rt_buf, sizeof(rt_buf), "%g", rect->top);
+  g_ascii_formatd(rb_buf, sizeof(rb_buf), "%g", rect->bottom);
+
+  buffer = g_strconcat(rl_buf, ",", rt_buf, ";", rr_buf, ",", rb_buf, NULL);
   
   data_node = xmlNewChild(attr, NULL, "rectangle", NULL);
   xmlSetProp(data_node, "val", buffer);
 
+  g_free(buffer);
 }
 
 void
diff -urNad dia-0.94.0/plug-ins/shape/shape-export.c /tmp/dpep.5h0a8c/dia-0.94.0/plug-ins/shape/shape-export.c
--- dia-0.94.0/plug-ins/shape/shape-export.c	2005-04-23 22:52:34.068159392 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/plug-ins/shape/shape-export.c	2005-04-23 22:52:34.939027000 +0200
@@ -39,7 +39,6 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#include <locale.h>
 
 /* the dots per centimetre to render this diagram at */
 /* this matches the setting `100%' setting in dia. */
@@ -271,12 +270,12 @@
                       Point *point) 
 {
   xmlNodePtr node;
-  char buf[512];
+  char buf[G_ASCII_DTOSTR_BUF_SIZE];
   
   node = xmlNewChild(renderer->connection_root, NULL, "point", NULL);
-  g_snprintf(buf, sizeof(buf), "%g", point->x);
+  g_ascii_formatd(buf, sizeof(buf), "%g", point->x);
   xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", point->y);
+  g_ascii_formatd(buf, sizeof(buf), "%g", point->y);
   xmlSetProp(node, "y", buf);
 }
 
@@ -311,6 +310,8 @@
   xmlNodePtr node;
   GString *str;
   Point center;
+  gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "polyline", NULL);
   
@@ -319,7 +320,9 @@
 
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++) {
-    g_string_sprintfa(str, "%g,%g ", points[i].x, points[i].y);
+    g_string_append_printf(str, "%s,%s ",
+                          g_ascii_formatd(px_buf, sizeof(px_buf), "%g", points[i].x),
+                          g_ascii_formatd(py_buf, sizeof(py_buf), "%g", points[i].y) );
     add_connection_point(SHAPE_RENDERER(self), &points[i]);
   }
   xmlSetProp(node, "points", str->str);
@@ -343,6 +346,8 @@
   xmlNodePtr node;
   GString *str;
   Point center;
+  gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE];
+  gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, "polygon", NULL);
   
@@ -351,7 +356,9 @@
 
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++) {
-    g_string_sprintfa(str, "%g,%g ", points[i].x, points[i].y);
+    g_string_append_printf(str, "%s,%s ",
+                          g_ascii_formatd(px_buf, sizeof(px_buf), "%g", points[i].x),
+                          g_ascii_formatd(py_buf, sizeof(py_buf), "%g", points[i].y) );
     add_connection_point(SHAPE_RENDERER(self), &points[i]);
   }
   for(i = 1; i < num_points; i++) {
@@ -453,7 +460,6 @@
     gchar *point;
     gchar *png_filename = NULL;
     DiaExportFilter *exportfilter;
-    char *old_locale;
     gfloat old_scaling;
     Rectangle *ext = &data->extents;
     gfloat scaling_x, scaling_y;
@@ -479,7 +485,6 @@
       data->paper.scaling = old_scaling;
     }
     /* create the shape */
-    old_locale = setlocale(LC_NUMERIC, "C");
     if((renderer = new_shape_renderer(data, filename))) {
       data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
       g_object_unref (renderer);
@@ -488,7 +493,6 @@
     /* Create a sheet entry if applicable (../../sheets exists) */
     
 
-    setlocale(LC_NUMERIC, old_locale);
     g_free(png_filename);
 }
 
diff -urNad dia-0.94.0/plug-ins/svg/render_svg.c /tmp/dpep.5h0a8c/dia-0.94.0/plug-ins/svg/render_svg.c
--- dia-0.94.0/plug-ins/svg/render_svg.c	2005-04-23 22:52:34.068159392 +0200
+++ /tmp/dpep.5h0a8c/dia-0.94.0/plug-ins/svg/render_svg.c	2005-04-23 22:52:34.939027000 +0200
@@ -29,7 +29,6 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#include <locale.h>
 
 #include <libxml/entities.h>
 #include <libxml/tree.h>
@@ -228,27 +227,24 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
  
   node = xmlNewChild(renderer->root, NULL, "rect", NULL);
 
   xmlSetProp(node, "style", 
              DIA_SVG_RENDERER_GET_CLASS(self)->get_draw_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->x);
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->x);
   xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->y);
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->y);
   xmlSetProp(node, "y", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
+  g_ascii_formatd(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
   xmlSetProp(node, "width", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
+  g_ascii_formatd(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
   xmlSetProp(node, "height", buf);
-  g_snprintf(buf, sizeof(buf),"%g", rounding);
+  g_ascii_formatd(buf, sizeof(buf),"%g", rounding);
   xmlSetProp(node, "rx", buf);
   xmlSetProp(node, "ry", buf);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -258,27 +254,24 @@
 {
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char buf[512];
-  char *old_locale;
+  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, NULL, "rect", NULL);
 
   xmlSetProp(node, "style", 
              DIA_SVG_RENDERER_GET_CLASS(self)->get_fill_style(renderer, colour));
 
-  old_locale = setlocale(LC_NUMERIC, "C");
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->x);
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->x);
   xmlSetProp(node, "x", buf);
-  g_snprintf(buf, sizeof(buf), "%g", ul_corner->y);
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->y);
   xmlSetProp(node, "y", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
+  g_ascii_formatd(buf, sizeof(buf), "%g", lr_corner->x - ul_corner->x);
   xmlSetProp(node, "width", buf);
-  g_snprintf(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
+  g_ascii_formatd(buf, sizeof(buf), "%g", lr_corner->y - ul_corner->y);
   xmlSetProp(node, "height", buf);
-  g_snprintf(buf, sizeof(buf),"%g", rounding);
+  g_ascii_formatd(buf, sizeof(buf),"%g", rounding);
   xmlSetProp(node, "rx", buf);
   xmlSetProp(node, "ry", buf);
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static void
@@ -286,14 +279,11 @@
            const gchar *diafilename, void* user_data)
 {
   DiaSvgRenderer *renderer;
-  char *old_locale;
 
-  old_locale = setlocale(LC_NUMERIC, "C");
   if ((renderer = new_svg_renderer(data, filename))) {
     data_render(data, DIA_RENDERER(renderer), NULL, NULL, NULL);
     g_object_unref(renderer);
   }
-  setlocale(LC_NUMERIC, old_locale);
 }
 
 static const gchar *extensions[] = { "svg", NULL };

--------------030007030609000809010601--

---------------------------------------
Received: (at 306036-close) by bugs.debian.org; 18 Jun 2005 19:51:49 +0000
>From katie@ftp-master.debian.org Sat Jun 18 12:51:49 2005
Return-path: <katie@ftp-master.debian.org>
Received: from newraff.debian.org [208.185.25.31] (mail)
	by spohr.debian.org with esmtp (Exim 3.35 1 (Debian))
	id 1DjjM5-0007Xh-00; Sat, 18 Jun 2005 12:51:49 -0700
Received: from katie by newraff.debian.org with local (Exim 3.35 1 (Debian))
	id 1DjjIM-0003Ux-00; Sat, 18 Jun 2005 15:47:58 -0400
From: Roland Stigge <stigge@antcom.de>
To: 306036-close@bugs.debian.org
X-Katie: $Revision: 1.56 $
Subject: Bug#306036: fixed in dia 0.94.0-11
Message-Id: <E1DjjIM-0003Ux-00@newraff.debian.org>
Sender: Archive Administrator <katie@ftp-master.debian.org>
Date: Sat, 18 Jun 2005 15:47:58 -0400
Delivered-To: 306036-close@bugs.debian.org
X-Spam-Checker-Version: SpamAssassin 2.60-bugs.debian.org_2005_01_02 
	(1.212-2003-09-23-exp) on spohr.debian.org
X-Spam-Status: No, hits=-6.0 required=4.0 tests=BAYES_00,HAS_BUG_NUMBER 
	autolearn=no version=2.60-bugs.debian.org_2005_01_02
X-Spam-Level: 
X-CrossAssassin-Score: 6

Source: dia
Source-Version: 0.94.0-11

We believe that the bug you reported is fixed in the latest version of
dia, which is due to be installed in the Debian FTP archive:

dia-common_0.94.0-11_all.deb
  to pool/main/d/dia/dia-common_0.94.0-11_all.deb
dia-gnome_0.94.0-11_i386.deb
  to pool/main/d/dia/dia-gnome_0.94.0-11_i386.deb
dia-libs_0.94.0-11_i386.deb
  to pool/main/d/dia/dia-libs_0.94.0-11_i386.deb
dia_0.94.0-11.diff.gz
  to pool/main/d/dia/dia_0.94.0-11.diff.gz
dia_0.94.0-11.dsc
  to pool/main/d/dia/dia_0.94.0-11.dsc
dia_0.94.0-11_i386.deb
  to pool/main/d/dia/dia_0.94.0-11_i386.deb



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to 306036@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Roland Stigge <stigge@antcom.de> (supplier of updated dia package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing ftpmaster@debian.org)


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.7
Date: Fri, 17 Jun 2005 19:25:03 +0200
Source: dia
Binary: dia-libs dia-common dia-gnome dia
Architecture: source i386 all
Version: 0.94.0-11
Distribution: unstable
Urgency: low
Maintainer: Roland Stigge <stigge@antcom.de>
Changed-By: Roland Stigge <stigge@antcom.de>
Description: 
 dia        - Diagram editor
 dia-common - Diagram editor (common files)
 dia-gnome  - Diagram editor (GNOME version)
 dia-libs   - Diagram editor (library files)
Closes: 270547 305521 306036 306040 306041 306042 310980 311401 313687
Changes: 
 dia (0.94.0-11) unstable; urgency=low
 .
   * po/de.po: Applied translation fixes patch by Jens Seidel (Closes: #313687)
 .
 dia (0.94.0-10) experimental; urgency=low
 .
   * po/pl.po: Fixed Object menu translations, thanks to Marcin Owsiany
     (Closes: #311401)
 .
 dia (0.94.0-9) experimental; urgency=low
 .
   * po/es.po: Fixed menu accelerators, thanks to Roberto C. Sanchez
     (Closes: #310980)
 .
 dia (0.94.0-8) experimental; urgency=low
 .
   * debian/control: Added dpatch to Build-Depends
   * Included dpatch based on the one by komar@ukr.net fixing .png references
     in sheet files which are now .xpm references (Closes: #270547)
   * Included the following dpatches by Hervé Cauwelier
     <hcauwelier@oursours.net>:
     - fix-another-crash-with-line-wrapping-code (Closes: #306042)
     - fix-image-rendering-endianess (Closes: #306041)
     - stop-special-casing-the-first-display-of-a-diagram (Closes: #306040)
     - GCC 4 fixes: user-lib-prefix, fix-static-parse-path (Closes: #305521)
     - locale-usage (Closes: #306036)
Files: 
 7ced12c0c6a2f810a6db684dcc53b512 1405 graphics optional dia_0.94.0-11.dsc
 a086cd2ff1b8a5eeb6aa0bf7bdc7469b 28289 graphics optional dia_0.94.0-11.diff.gz
 b972827d274d90f856cee1ef2e6a045b 2149296 graphics optional dia-common_0.94.0-11_all.deb
 50ce0e4b9f6dde04117327794e5a6c7f 584770 graphics optional dia-libs_0.94.0-11_i386.deb
 a1bc6166699fc2514f82936d1f216f6e 186762 graphics optional dia_0.94.0-11_i386.deb
 c6f25c1e5f05f58df88e795f2f539fef 188286 gnome optional dia-gnome_0.94.0-11_i386.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.1 (GNU/Linux)

iD8DBQFCsw91caH/YBv43g8RAhl8AJ0XEQ3Jxt2KcMOsiRpi6aSP3bttyACgrwzo
U4YUn/aEJ0Gl61FrMgIomtw=
=G/Kk
-----END PGP SIGNATURE-----