Source 'tag' in abs-file
[idzebra-moved-to-github.git] / util / charmap.c
index 7b03644..fdbf0bf 100644 (file)
@@ -1,61 +1,9 @@
 /*
- * Copyright (C) 1996-1999, Index Data
+ * Copyright (C) 1996-2002, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
- * $Log: charmap.c,v $
- * Revision 1.16  1999-09-07 07:19:21  adam
- * Work on character mapping. Implemented replace rules.
- *
- * Revision 1.15  1999/05/26 07:49:14  adam
- * C++ compilation.
- *
- * Revision 1.14  1998/10/13 20:09:18  adam
- * Changed call to readconf_line.
- *
- * Revision 1.13  1997/10/27 14:33:06  adam
- * Moved towards generic character mapping depending on "structure"
- * field in abstract syntax file. Fixed a few memory leaks. Fixed
- * bug with negative integers when doing searches with relational
- * operators.
- *
- * Revision 1.12  1997/09/05 15:30:11  adam
- * Changed prototype for chr_map_input - added const.
- * Added support for C++, headers uses extern "C" for public definitions.
- *
- * Revision 1.11  1997/09/05 09:52:32  adam
- * Extra argument added to function chr_read_maptab (tab path).
- *
- * Revision 1.10  1997/07/01 13:01:08  adam
- * Bug fix in routine find_entry: didn't take into account the len arg.
- *
- * Revision 1.9  1996/10/29 13:48:14  adam
- * Updated to use zebrautl.h instead of alexutil.h.
- *
- * Revision 1.8  1996/10/18 12:39:23  adam
- * Uses LOG_DEBUG instead of LOG_WARN for "Character map overlap".
- *
- * Revision 1.7  1996/06/06  12:08:56  quinn
- * Fixed bug.
- *
- * Revision 1.6  1996/06/04  13:28:00  quinn
- * More work on charmapping
- *
- * Revision 1.5  1996/06/04  08:32:15  quinn
- * Moved default keymap to keychars.c
- *
- * Revision 1.4  1996/06/03  16:32:13  quinn
- * Temporary bug-fix
- *
- * Revision 1.3  1996/06/03  15:17:46  quinn
- * Fixed bug.
- *
- * Revision 1.2  1996/06/03  10:15:09  quinn
- * Fixed bug in mapping function.
- *
- * Revision 1.1  1996/05/31  09:07:18  quinn
- * Work on character-set handling
- *
+ * $Id: charmap.c,v 1.19 2002-02-18 11:47:23 adam Exp $
  *
  */
 
@@ -68,7 +16,7 @@
 #include <string.h>
 #include <assert.h>
 
-#include <yaz-util.h>
+#include <yaz/yaz-util.h>
 #include <charmap.h>
 
 #define CHR_MAXSTR 1024
@@ -109,8 +57,11 @@ typedef struct chrwork
  * Add an entry to the character map.
  */
 static chr_t_entry *set_map_string(chr_t_entry *root, NMEM nmem,
-                                  const char *from, int len, char *to)
+                                  const char *from, int len, char *to,
+                                   const char *from_0)
 {
+    if (!from_0)
+        from_0 = from;
     if (!root)
     {
        root = (chr_t_entry *) nmem_malloc(nmem, sizeof(*root));
@@ -121,6 +72,13 @@ static chr_t_entry *set_map_string(chr_t_entry *root, NMEM nmem,
     {
        if (!root->target || !root->target[0] || strcmp(root->target[0], to))
        {
+            if (from_0 && 
+                root->target && root->target[0] && root->target[0][0] &&
+                strcmp (root->target[0], CHR_UNKNOWN))
+            {
+                yaz_log (LOG_WARN, "duplicate entry for charmap from '%s'",
+                         from_0);
+            }
            root->target = (unsigned char **)
                nmem_malloc(nmem, sizeof(*root->target)*2);
            root->target[0] = (unsigned char *) nmem_strdup(nmem, to);
@@ -140,7 +98,7 @@ static chr_t_entry *set_map_string(chr_t_entry *root, NMEM nmem,
        }
        if (!(root->children[(unsigned char) *from] =
            set_map_string(root->children[(unsigned char) *from], nmem,
-                          from + 1, len - 1, to)))
+                          from + 1, len - 1, to, from_0)))
            return 0;
     }
     return root;
@@ -228,7 +186,8 @@ unsigned char zebra_prim(char **s)
 {
     unsigned char c;
     unsigned int i;
-    
+
+    yaz_log (LOG_DEBUG, "prim %.3s", *s);
     if (**s == '\\')
     {
        (*s)++;
@@ -241,16 +200,30 @@ unsigned char zebra_prim(char **s)
        case 't': c = '\t'; (*s)++; break;
        case 's': c = ' '; (*s)++; break;
        case 'x': sscanf(*s, "x%2x", &i); c = i; *s += 3; break;
-       case '{': case '[': case '(': case '}': case ']': case ')': case '$':
-           (*s)++;
-           break;
-       default:
-           sscanf(*s, "%3o", &i); c = i; *s += 3; break;
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+           sscanf(*s, "%3o", &i);
+            c = i;
+            *s += 3;
+            break;
+        default:
+            (*s)++;
        }
-       return c;
     }
-    c = **s;
-    ++(*s);
+    else
+    {
+        c = **s;
+        ++(*s);
+    }
+    yaz_log (LOG_DEBUG, "out %d", c);
     return c;
 }
 
@@ -264,7 +237,7 @@ static void fun_addentry(const char *s, void *data, int num)
     char tmp[2];
     
     tmp[0] = num; tmp[1] = '\0';
-    tab->input = set_map_string(tab->input, tab->nmem, s, strlen(s), tmp);
+    tab->input = set_map_string(tab->input, tab->nmem, s, strlen(s), tmp, 0);
     tab->output[num + tab->base_uppercase] =
        (unsigned char *) nmem_strdup(tab->nmem, s);
 }
@@ -277,7 +250,7 @@ static void fun_addspace(const char *s, void *data, int num)
 {
     chrmaptab tab = (chrmaptab) data;
     tab->input = set_map_string(tab->input, tab->nmem, s, strlen(s),
-                               (char*) CHR_SPACE);
+                               (char*) CHR_SPACE, 0);
 }
 
 /*
@@ -303,10 +276,11 @@ static void fun_add_map(const char *s, void *data, int num)
     chrwork *arg = (chrwork *) data;
 
     assert(arg->map->input);
-    logf (LOG_LOG, "set map %.*s", (int) strlen(s), s);
-    set_map_string(arg->map->input, arg->map->nmem, s, strlen(s), arg->string);
+    logf (LOG_DEBUG, "set map %.*s", (int) strlen(s), s);
+    set_map_string(arg->map->input, arg->map->nmem, s, strlen(s), arg->string,
+                   0);
     for (s = arg->string; *s; s++)
-       logf (LOG_LOG, " %3d", (unsigned char) *s);
+       logf (LOG_DEBUG, " %3d", (unsigned char) *s);
 }
 
 /*
@@ -317,11 +291,11 @@ static void fun_add_qmap(const char *s, void *data, int num)
     chrwork *arg = (chrwork *) data;
 
     assert(arg->map->q_input);
-    logf (LOG_LOG, "set qmap %.*s", (int) strlen(s), s);
+    logf (LOG_DEBUG, "set qmap %.*s", (int) strlen(s), s);
     set_map_string(arg->map->q_input, arg->map->nmem, s,
-                  strlen(s), arg->string);
+                  strlen(s), arg->string, 0);
     for (s = arg->string; *s; s++)
-       logf (LOG_LOG, " %3d", (unsigned char) *s);
+       logf (LOG_DEBUG, " %3d", (unsigned char) *s);
 }
 
 
@@ -393,7 +367,7 @@ chrmaptab chrmaptab_create(const char *tabpath, const char *name, int map_only)
     int argc, num = (int) *CHR_BASE, i;
     NMEM nmem;
 
-    logf (LOG_LOG, "maptab %s open", name);
+    logf (LOG_DEBUG, "maptab %s open", name);
     if (!(f = yaz_path_fopen(tabpath, name, "r")))
     {
        logf(LOG_WARN|LOG_ERRNO, "%s", name);
@@ -542,7 +516,7 @@ chrmaptab chrmaptab_create(const char *tabpath, const char *name, int map_only)
        chrmaptab_destroy(res);
        res = 0;
     }
-    logf (LOG_LOG, "maptab %s close %d errors", name, errors);
+    logf (LOG_DEBUG, "maptab %s close %d errors", name, errors);
     return res;
 }