gettext \
intprops \
linebreak \
+ localcharset \
memcasecmp \
memchr \
memcmp \
+Di Mai 30 19:51:19 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+ * gtksheet.c gtksheet.h: constness. Removed dependence on glib2.10
+
Sat May 27 16:29:36 WST 2006 John Darrington <john@darrington.wattle.id.au>
* gtksheet.c: Removed call to gtk_entry_set_text, which caused warnings
#define DEFAULT_COLUMN_WIDTH 80
+
static gboolean gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col);
static inline
GtkRequisition *requisition);
/* Attributes routines */
-static void init_attributes (GtkSheet *sheet, gint col,
+static void init_attributes (const GtkSheet *sheet, gint col,
GtkSheetCellAttr *attributes);
GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IS_FROZEN);
- if(text && strlen(text) > 0){
- gtk_sheet_get_attributes(sheet, row, col, &attributes);
- justification=attributes.justification;
- gtk_sheet_set_cell(sheet, row, col, justification, text);
- }
+ if(text && strlen(text) > 0)
+ {
+ gtk_sheet_get_attributes(sheet, row, col, &attributes);
+ justification = attributes.justification;
+ gtk_sheet_set_cell(sheet, row, col, justification, text);
+ }
if(sheet->freeze_count == 0)
GTK_SHEET_UNSET_FLAGS(sheet, GTK_SHEET_IS_FROZEN);
gtk_sheet_size_allocate_entry(GtkSheet *sheet)
{
GtkAllocation shentry_allocation;
- GtkSheetCellAttr attributes;
+ GtkSheetCellAttr attributes = { 0 };
GtkEntry *sheet_entry;
GtkStyle *style = NULL, *previous_style = NULL;
gint row, col;
sheet_entry = GTK_ENTRY(gtk_sheet_get_entry(sheet));
- gtk_sheet_get_attributes(sheet, sheet->active_cell.row, sheet->active_cell.col, &attributes);
+ gtk_sheet_get_attributes(sheet, sheet->active_cell.row, sheet->active_cell.col, &attributes);
- if(GTK_WIDGET_REALIZED(sheet->sheet_entry)){
+ if(GTK_WIDGET_REALIZED(sheet->sheet_entry))
+ {
- if(!GTK_WIDGET(sheet_entry)->style)
+ if(!GTK_WIDGET(sheet_entry)->style)
gtk_widget_ensure_style(GTK_WIDGET(sheet_entry));
- previous_style = GTK_WIDGET(sheet_entry)->style;
-
- style = gtk_style_copy(previous_style);
- style->bg[GTK_STATE_NORMAL] = attributes.background;
- style->fg[GTK_STATE_NORMAL] = attributes.foreground;
- style->text[GTK_STATE_NORMAL] = attributes.foreground;
- style->bg[GTK_STATE_ACTIVE] = attributes.background;
- style->fg[GTK_STATE_ACTIVE] = attributes.foreground;
- style->text[GTK_STATE_ACTIVE] = attributes.foreground;
-
- pango_font_description_free(style->font_desc);
- style->font_desc = pango_font_description_copy(attributes.font_desc);
-
- GTK_WIDGET(sheet_entry)->style = style;
- gtk_widget_size_request(sheet->sheet_entry, NULL);
- GTK_WIDGET(sheet_entry)->style = previous_style;
-
- if(style != previous_style){
- if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
- style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL];
- style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL];
- style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE];
- style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE];
+ previous_style = GTK_WIDGET(sheet_entry)->style;
+
+ style = gtk_style_copy(previous_style);
+ style->bg[GTK_STATE_NORMAL] = attributes.background;
+ style->fg[GTK_STATE_NORMAL] = attributes.foreground;
+ style->text[GTK_STATE_NORMAL] = attributes.foreground;
+ style->bg[GTK_STATE_ACTIVE] = attributes.background;
+ style->fg[GTK_STATE_ACTIVE] = attributes.foreground;
+ style->text[GTK_STATE_ACTIVE] = attributes.foreground;
+
+ pango_font_description_free(style->font_desc);
+ style->font_desc = pango_font_description_copy(attributes.font_desc);
+
+ GTK_WIDGET(sheet_entry)->style = style;
+ gtk_widget_size_request(sheet->sheet_entry, NULL);
+ GTK_WIDGET(sheet_entry)->style = previous_style;
+
+ if(style != previous_style){
+ if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
+ style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL];
+ style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL];
+ style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE];
+ style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE];
+ }
+ gtk_widget_set_style(GTK_WIDGET(sheet_entry), style);
+ }
}
- gtk_widget_set_style(GTK_WIDGET(sheet_entry), style);
- }
- }
if(GTK_IS_ITEM_ENTRY(sheet_entry))
max_size = GTK_ITEM_ENTRY(sheet_entry)->text_max_size;
}
- if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
- shentry_allocation.x += 2;
- shentry_allocation.y += 2;
- shentry_allocation.width -= MIN(shentry_allocation.width, 3);
- shentry_allocation.height -= MIN(shentry_allocation.height, 3);
- }
+ if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry))
+ {
+ shentry_allocation.x += 2;
+ shentry_allocation.y += 2;
+ shentry_allocation.width -= MIN(shentry_allocation.width, 3);
+ shentry_allocation.height -= MIN(shentry_allocation.height, 3);
+ }
gtk_widget_size_allocate(sheet->sheet_entry, &shentry_allocation);
gboolean
-gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *attributes)
+gtk_sheet_get_attributes(const GtkSheet *sheet, gint row, gint col,
+ GtkSheetCellAttr *attributes)
{
const GdkColor *fg, *bg;
const GtkJustification *j ;
init_attributes(sheet, col, attributes);
if ( !sheet->model)
- return FALSE;
+ return FALSE;
attributes->is_editable = g_sheet_model_is_editable(sheet->model, row, col);
attributes->is_visible = g_sheet_model_is_visible(sheet->model, row, col);
}
static void
-init_attributes(GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
+init_attributes(const GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
{
/* DEFAULT VALUES */
attributes->foreground = GTK_WIDGET(sheet)->style->black;
attributes->is_editable = TRUE;
attributes->is_visible = TRUE;
attributes->font_desc = GTK_WIDGET(sheet)->style->font_desc;
-
}
-
/********************************************************************
GtkSheetButton *
gtk_sheet_button_new(void)
{
- GtkSheetButton *button = g_slice_new(GtkSheetButton);
+ GtkSheetButton *button = g_malloc(sizeof(GtkSheetButton));
button->state = GTK_STATE_NORMAL;
button->label = NULL;
gtk_sheet_button_free(GtkSheetButton *button)
{
g_free(button->label);
- g_slice_free(GtkSheetButton, button);
+ g_free(button);
}
/* get cell attributes of the given cell */
/* TRUE means that the cell is currently allocated */
gboolean
-gtk_sheet_get_attributes (GtkSheet *sheet,
+gtk_sheet_get_attributes (const GtkSheet *sheet,
gint row, gint col,
GtkSheetCellAttr *attributes);
+Tue May 30 19:52:33 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+ * settings.c: Added call to i18n{done, init}.
+
Tue May 9 21:09:17 2006 Ben Pfaff <blp@gnu.org>
* procedure.h: Add WARN_UNUSED_RESULT to procedure function
#include "format.h"
#include "value.h"
#include "xalloc.h"
+#include <libpspp/i18n.h>
static int viewlength = 24;
static int viewwidth = 79;
settings_init (void)
{
init_viewport ();
+ i18n_init ();
}
void
settings_done (void)
{
+ i18n_done ();
}
/* Screen length in lines. */
+Tue May 30 19:45:12 WST 2006 John Darrington <john@darrington.wattle.id.au>
+
+ * i18n.c i18n.h: New files.
+
Tue May 16 06:50:35 2006 Ben Pfaff <blp@gnu.org>
* automake.mk (src/libpspp/version.c): Removed groff_font_path,
src/libpspp/freaderror.h \
src/libpspp/hash.c \
src/libpspp/hash.h \
+ src/libpspp/i18n.c \
+ src/libpspp/i18n.h \
src/libpspp/magic.c \
src/libpspp/magic.h \
src/libpspp/misc.c \
--- /dev/null
+/* PSPP - computes sample statistics.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ Written by John Darrington <john@darrington.wattle.id.au>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#include <config.h>
+#include <xalloc.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <iconv.h>
+#include <errno.h>
+
+#include "i18n.h"
+
+#include <localcharset.h>
+
+
+static char *locale = 0;
+static const char *charset;
+
+
+static iconv_t convertor[n_CONV];
+
+/* Return a string based on TEXT converted according to HOW.
+ If length is not -1, then it must be the number of bytes in TEXT.
+ The returned string must be freed when no longer required.
+*/
+char *
+recode_string(enum conv_id how, const char *text, int length)
+{
+ char *outbuf = 0;
+ size_t outbufferlength;
+ size_t result;
+ char *ip ;
+ char *op ;
+ size_t inbytes = 0;
+ size_t outbytes ;
+
+ /* FIXME: Need to ensure that this char is valid in the target encoding */
+ const char fallbackchar = '?';
+
+ if ( length == -1 )
+ length = strlen(text);
+
+ assert(how < n_CONV);
+
+ for ( outbufferlength = 1 ; outbufferlength != 0; outbufferlength <<= 1 )
+ if ( outbufferlength > length)
+ break;
+
+ outbuf = xmalloc(outbufferlength);
+ op = outbuf;
+ ip = (char *) text;
+
+ outbytes = outbufferlength;
+ inbytes = length;
+
+ do {
+
+
+ result = iconv(convertor[how], &ip, &inbytes,
+ &op, &outbytes);
+
+ if ( -1 == result )
+ {
+ int the_error = errno;
+
+ switch ( the_error)
+ {
+ case EILSEQ:
+ case EINVAL:
+ if ( outbytes > 0 )
+ {
+ *op++ = fallbackchar;
+ outbytes--;
+ ip++;
+ inbytes--;
+ break;
+ }
+ /* Fall through */
+ case E2BIG:
+ free(outbuf);
+ outbufferlength <<= 1;
+ outbuf = xmalloc(outbufferlength);
+ op = outbuf;
+ ip = (char *) text;
+ outbytes = outbufferlength;
+ inbytes = length;
+ break;
+ default:
+ /* should never happen */
+ break;
+ }
+
+ }
+
+ } while ( -1 == result );
+
+ *op = '\0';
+
+
+ return outbuf;
+}
+
+
+/* Returns the current PSPP locale */
+const char *
+get_pspp_locale(void)
+{
+ assert ( locale);
+ return locale;
+}
+
+/* Set the PSPP locale */
+void
+set_pspp_locale(const char *l)
+{
+ char *current_locale;
+ const char *current_charset;
+
+ free(locale);
+ locale = strdup(l);
+
+ current_locale = setlocale(LC_CTYPE, 0);
+ current_charset = locale_charset();
+ setlocale(LC_CTYPE, locale);
+
+ charset = locale_charset();
+ setlocale(LC_CTYPE, current_locale);
+
+ iconv_close(convertor[CONV_PSPP_TO_UTF8]);
+ convertor[CONV_PSPP_TO_UTF8] = iconv_open("UTF-8", charset);
+
+ iconv_close(convertor[CONV_SYSTEM_TO_PSPP]);
+ convertor[CONV_SYSTEM_TO_PSPP] = iconv_open(charset, current_charset);
+}
+
+void
+i18n_init(void)
+{
+ assert ( ! locale) ;
+ locale = strdup(setlocale(LC_CTYPE, NULL));
+
+ setlocale(LC_CTYPE, locale);
+ charset = locale_charset();
+
+ convertor[CONV_PSPP_TO_UTF8] = iconv_open("UTF-8", charset);
+ convertor[CONV_SYSTEM_TO_PSPP] = iconv_open(charset, charset);
+}
+
+
+void
+i18n_done(void)
+{
+ int i;
+ free(locale);
+ locale = 0;
+
+ for(i = 0 ; i < n_CONV; ++i )
+ iconv_close(convertor[i]);
+}
--- /dev/null
+/* PSPP - computes sample statistics.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+ Written by John Darrington <john@darrington.wattle.id.au>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#ifndef I18N_H
+#define I18N_H
+
+const char * get_pspp_locale(void);
+void set_pspp_locale(const char *locale);
+const char * get_pspp_charset(void);
+
+void i18n_done(void);
+void i18n_init(void);
+
+enum conv_id
+ {
+ CONV_PSPP_TO_UTF8,
+ CONV_SYSTEM_TO_PSPP,
+ n_CONV
+ };
+
+
+char * recode_string(enum conv_id how, const char *text, int len);
+
+
+
+#endif /* i18n.h */
+
+Tue May 30 19:53:35 WST 2006 John Darringotn <john@darrington.wattle.id.au>
+
+ * menu-actions.c menu-actions.h psppire.c: Fixed up load/new
+ interactions with startup.
+
+ * psppire-data-store.c: Fixed bad i18n call.
+
+ * pspppire-var-store.c, psppire-var-store.h: constness.
+
+ * helper.c: Implemented proper way to convert from PSPP to UTF8 encoding.
+
+
Sat May 27 16:25:38 WST 2006 John Darrington <john@darrington.wattle.id.au>
* customentry.c data-sheet.c menu-actions.c message-dialog.c
-
#include "helper.h"
#include <data/data-in.h>
#include <libpspp/message.h>
+#include <libpspp/i18n.h>
+
#include <ctype.h>
#include <string.h>
+#include <data/settings.h>
/* Formats a value according to FORMAT
The returned string must be freed when no longer required */
char *
pspp_locale_to_utf8(const gchar *text, gssize len, GError **err)
{
- GError *tmp_error = 0;
-
- gchar *s;
-
- if ( ! text )
- return 0;
-
- s = g_locale_to_utf8(text, len, 0, 0, &tmp_error);
-
- if ( tmp_error)
- {
- g_warning("Error converting to UTF8: %s", tmp_error->message);
- g_propagate_error (err, tmp_error);
- }
-
- return s;
+ return recode_string(CONV_PSPP_TO_UTF8, text, len);
}
static const gchar window_title[] = N_("PSPP Data Editor");
+/* Sets the title bar to TEXT */
static void
psppire_set_window_title(const gchar *text)
{
gchar *title = g_strdup_printf("%s --- %s", text, gettext(window_title));
gtk_window_set_title(GTK_WINDOW(data_editor), title);
-
- g_free(title);
}
-void
-on_new1_activate (GtkMenuItem *menuitem,
- gpointer user_data)
+
+gboolean
+clear_file(void)
{
GtkWidget *data_sheet = get_widget_assert(xml, "data_sheet");
GtkWidget *var_sheet = get_widget_assert(xml, "variable_sheet");
if (psppire_handle)
fh_free(psppire_handle);
psppire_handle = 0 ;
+
+ return TRUE;
}
+void
+on_new1_activate (GtkMenuItem *menuitem,
+ gpointer user_data)
+{
+ clear_file();
+}
+
+
static gboolean
populate_case_from_reader(struct ccase *c, gpointer aux)
switch_menus(page_num);
}
-static void
-var_data_selection_init()
+
+/* Initialised things on the variable sheet */
+void
+var_data_selection_init(void)
{
notebook = GTK_NOTEBOOK(get_widget_assert(xml, "notebook1"));
menuitems[PAGE_DATA_SHEET] = get_widget_assert(xml, "data1");
select_sheet(PAGE_VAR_SHEET);
}
-
-/* Callback which occurs when gtk_main is entered */
-gboolean
-callbacks_on_init(gpointer data)
-{
- psppire_set_window_title(gettext(untitled));
-
- var_data_selection_init();
-
- return FALSE;
-}
gint int1, gint int2);
-gboolean callbacks_on_init(gpointer data) ;
-
-
/* Switch between the VAR SHEET and the DATA SHEET */
enum {PAGE_DATA_SHEET = 0, PAGE_VAR_SHEET};
gboolean load_system_file(const gchar *file_name);
+gboolean clear_file(void);
void select_sheet(gint page);
+void var_data_selection_init(void);
+
#endif
FP. No null terminator is appended to the buffer. */
data_out (s->str, fp, v);
-
text = pspp_locale_to_utf8(s->str, fp->w, 0);
g_string_free(s, TRUE);
/* Return the width that an 'M' character would occupy when typeset at
row, col */
static guint
-M_width(GtkSheet *sheet, gint row, gint col)
+M_width(const GtkSheet *sheet, gint row, gint col)
{
GtkSheetCellAttr attributes;
PangoRectangle rect;
PsppireDataStore *ds = PSPPIRE_DATA_STORE(geom);
if ( unit >= psppire_dict_get_var_cnt(ds->dict) )
- return pspp_locale_to_utf8(null_var_name, -1, 0);
+ return g_locale_to_utf8(null_var_name, -1, 0, 0, 0);
pv = psppire_dict_get_variable(ds->dict, unit);
void
-psppire_var_store_set_font(PsppireVarStore *store, PangoFontDescription *fd)
+psppire_var_store_set_font(PsppireVarStore *store, const PangoFontDescription *fd)
{
g_return_if_fail (store);
g_return_if_fail (PSPPIRE_IS_VAR_STORE (store));
/*< private >*/
PsppireDict *dict;
GdkColor disabled;
- PangoFontDescription *font_desc;
+ const PangoFontDescription *font_desc;
};
struct _PsppireVarStoreClass
/* Return the number of variables */
gint psppire_var_store_get_var_cnt(PsppireVarStore *var_store);
-void psppire_var_store_set_font(PsppireVarStore *store, PangoFontDescription *fd);
+void psppire_var_store_set_font(PsppireVarStore *store, const PangoFontDescription *fd);
#ifdef __cplusplus
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
-/*
- * Initial main.c file generated by Glade. Edit as required.
- * Glade will not overwrite this file.
- */
#include <assert.h>
#include <libintl.h>
#include <libpspp/version.h>
#include <libpspp/copyleft.h>
+#include <data/settings.h>
+
#include <getopt.h>
#include <gtk/gtk.h>
#include <gtk/gtk.h>
static bool parse_command_line (int *argc, char ***argv,
gchar **filename, GError **err);
-static void
-i18n_init (void)
-{
-#if ENABLE_NLS
-#if HAVE_LC_MESSAGES
- setlocale (LC_MESSAGES, "");
-#endif
- setlocale (LC_MONETARY, "");
- bindtextdomain (PACKAGE, locale_dir);
- textdomain (PACKAGE);
-#endif /* ENABLE_NLS */
-}
-
-
int
main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
+ /* gtk_init messes with the locale.
+ So unset the bits we want to control ourselves */
+ setlocale (LC_NUMERIC, "C");
+
+ bindtextdomain (PACKAGE, locale_dir);
+ textdomain (PACKAGE);
+
if ( ! parse_command_line(&argc, &argv, &filename, &err) )
{
g_clear_error(&err);
return 1;
}
-
glade_init();
- i18n_init();
+
+ settings_init();
+
+
+
+ /*
+ set_pspp_locale("da_DK");
+ */
message_dialog_init();
gtk_sheet_set_model(data_sheet, G_SHEET_MODEL(data_store));
- gtk_init_add(callbacks_on_init, 0);
-
if (filename)
gtk_init_add((GtkFunction)load_system_file, filename);
+ else
+ gtk_init_add((GtkFunction)clear_file, 0);
+
+ var_data_selection_init();
/* start the event loop */
gtk_main();
message_dialog_done();
+ settings_done();
+
return 0;
}
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
+
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
+
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
+
cleanup()
{
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{
cd /
-# rm -rf $TEMPDIR
+ rm -rf $TEMPDIR
}
STAT_CONFIG_PATH=$top_srcdir/config
export STAT_CONFIG_PATH
+LANG=C
+export LANG
cleanup()
{