Added stamp-h.in (used by AM_CONFIG_HEADER).
[gedcom-parse.git] / gedcom / encoding.c
index d306dfa7b347627b401f9e7e2308035db39cef2d..a801b5fb0506f6db6b07ded492d076c13ef50211 100644 (file)
@@ -1,11 +1,22 @@
-/*  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.                                   *
-
- (C) 2001 by The Genes Development Team
- Original author: Peter Verthez (Peter.Verthez@advalvas.be)
-*/
+/* Conversion between encodings.
+   Copyright (C) 2001 The Genes Development Team
+   This file is part of the Gedcom parser library.
+   Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
+
+   The Gedcom parser library is free software; you can redistribute it
+   and/or modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The Gedcom parser library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the Gedcom parser library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 /* $Id$ */
 /* $Name$ */
 #include <iconv.h>
 #include <search.h>
 #include <stdio.h>
+#include <limits.h>
+#include <stdlib.h>
 #include "gedcom_internal.h"
 #include "encoding.h"
 
 #define INTERNAL_ENCODING "UTF8"
 #define ENCODING_CONF_FILE "gedcom.enc"
+#define GCONV_SEARCH_PATH "GCONV_PATH"
 #define MAXBUF 255
 
 static iconv_t cd_to_internal = (iconv_t) -1;
@@ -83,8 +97,44 @@ void init_encodings()
     char gedcom_n[MAXBUF + 1];
     char charwidth[MAXBUF + 1];
     char iconv_n[MAXBUF + 1];
+    char *gconv_path;
+
+    /* Add gedcom data directory to gconv search path */
+    gconv_path = getenv(GCONV_SEARCH_PATH);
+    if (gconv_path == NULL || strstr(gconv_path, PKGDATADIR) == NULL) {
+      char *new_gconv_path;
+      if (gconv_path == NULL) {
+       new_gconv_path = (char *)malloc(strlen(GCONV_SEARCH_PATH)
+                                       + strlen(PKGDATADIR)
+                                       + 2);
+       sprintf(new_gconv_path, "%s=%s", GCONV_SEARCH_PATH, PKGDATADIR);
+      }
+      else {
+       new_gconv_path = (char *)malloc(strlen(GCONV_SEARCH_PATH)
+                                       + strlen(gconv_path)
+                                       + strlen(PKGDATADIR)
+                                       + 3);
+       sprintf(new_gconv_path, "%s=%s:%s",
+               GCONV_SEARCH_PATH, gconv_path, PKGDATADIR);
+      }
+      if (putenv(new_gconv_path) != 0) {
+       gedcom_warning("Failed updating environment variable %s",
+                      GCONV_SEARCH_PATH);
+      }
+    }
+    
+    /* Open gedcom configuration file and read */
     in = fopen(ENCODING_CONF_FILE, "r");
-    if (in != NULL) {
+    if (in == NULL) {
+      char path[PATH_MAX];
+      sprintf(path, "%s/%s", PKGDATADIR, ENCODING_CONF_FILE);
+      in = fopen(path, "r");
+    }
+    if (in == NULL) {
+      gedcom_warning("Could not open encoding configuration file '%s'",
+                    ENCODING_CONF_FILE);
+    }
+    else {
       while (fgets(buffer, sizeof(buffer), in) != NULL) {
        if (buffer[strlen(buffer) - 1] != '\n') {
          gedcom_error("Line too long in encoding configuration file '%s'",
@@ -104,10 +154,6 @@ void init_encodings()
       }
       fclose(in);
     }
-    else {
-      gedcom_warning("Could not open encoding configuration file '%s'",
-                    ENCODING_CONF_FILE);
-    }
   }
 }