+static void fun_addcut(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_CUT, 0);
+}
+
+/*
+ * Create a string containing the mapped characters provided.
+ */
+static void fun_mkstring(const char *s, void *data, int num)
+{
+ chrwork *arg = (chrwork *) data;
+ const char **res, *p = s;
+
+ res = chr_map_input(arg->map, &s, strlen(s), 0);
+ if (*res == (char*) CHR_UNKNOWN)
+ yaz_log(YLOG_WARN, "Map: '%s' has no mapping", p);
+ strncat(arg->string, *res, CHR_MAXSTR - strlen(arg->string));
+ arg->string[CHR_MAXSTR] = '\0';
+}
+
+/*
+ * Create an unmodified string (scan_string handler).
+ */
+static void fun_add_equivalent_string(const char *s, void *data, int num)
+{
+ chr_equiv_work *arg = (chr_equiv_work *) data;
+
+ if (arg->no_eq == CHR_MAXEQUIV)
+ return;
+ arg->eq[arg->no_eq++] = nmem_strdup(arg->nmem, s);
+}
+
+/*
+ * Add a map to the string contained in the argument.
+ */
+static void fun_add_map(const char *s, void *data, int num)
+{
+ chrwork *arg = (chrwork *) data;
+
+ assert(arg->map->input);
+ yaz_log(YLOG_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++)
+ yaz_log(YLOG_DEBUG, " %3d", (unsigned char) *s);
+}
+
+static int scan_to_utf8(yaz_iconv_t t, ucs4_t *from, size_t inlen,
+ char *outbuf, size_t outbytesleft)