+static void zebra_map_read (ZebraMaps zms, const char *name)
+{
+ FILE *f;
+ char line[512];
+ char *argv[10];
+ int argc;
+ int lineno = 0;
+ struct zebra_map **zm = 0, *zp;
+
+ if (!(f = yaz_path_fopen(zms->tabpath, name, "r")))
+ {
+ logf(LOG_WARN|LOG_ERRNO, "%s", name);
+ return ;
+ }
+ while ((argc = readconf_line(f, &lineno, line, 512, argv, 10)))
+ {
+ if (!yaz_matchstr (argv[0], "index") && argc == 2)
+ {
+ if (!zm)
+ zm = &zms->map_list;
+ else
+ zm = &(*zm)->next;
+ *zm = (struct zebra_map *) nmem_malloc (zms->nmem, sizeof(**zm));
+ (*zm)->reg_id = argv[1][0];
+ (*zm)->maptab_name = NULL;
+ (*zm)->maptab = NULL;
+ (*zm)->type = ZEBRA_MAP_TYPE_INDEX;
+ (*zm)->completeness = 0;
+ (*zm)->positioned = 1;
+ (*zm)->replace_tokens = 0;
+ }
+ else if (!yaz_matchstr (argv[0], "sort") && argc == 2)
+ {
+ if (!zm)
+ zm = &zms->map_list;
+ else
+ zm = &(*zm)->next;
+ *zm = (struct zebra_map *) nmem_malloc (zms->nmem, sizeof(**zm));
+ (*zm)->reg_id = argv[1][0];
+ (*zm)->maptab_name = NULL;
+ (*zm)->type = ZEBRA_MAP_TYPE_SORT;
+ (*zm)->u.sort.entry_size = 80;
+ (*zm)->maptab = NULL;
+ (*zm)->completeness = 0;
+ (*zm)->positioned = 0;
+ (*zm)->replace_tokens = 0;
+ }
+ else if (zm && !yaz_matchstr (argv[0], "charmap") && argc == 2)
+ {
+ (*zm)->maptab_name = nmem_strdup (zms->nmem, argv[1]);
+ }
+ else if (zm && !yaz_matchstr (argv[0], "completeness") && argc == 2)
+ {
+ (*zm)->completeness = atoi (argv[1]);
+ }
+ else if (zm && !yaz_matchstr (argv[0], "position") && argc == 2)
+ {
+ (*zm)->positioned = atoi (argv[1]);
+ }
+ else if (zm && !yaz_matchstr (argv[0], "entrysize") && argc == 2)
+ {
+ if ((*zm)->type == ZEBRA_MAP_TYPE_SORT)
+ (*zm)->u.sort.entry_size = atoi (argv[1]);
+ }
+ else if (zm && !yaz_matchstr (argv[0], "replace") && argc >= 2)
+ {
+ struct zm_token *token = nmem_malloc (zms->nmem, sizeof(*token));
+ token->next = (*zm)->replace_tokens;
+ (*zm)->replace_tokens = token;
+#if 0
+ logf (LOG_LOG, "replace %s", argv[1]);
+#endif
+ token->token_from = 0;
+ if (argc >= 2)
+ {
+ char *cp = argv[1];
+ int *dp = token->token_from = (int *)
+ nmem_malloc (zms->nmem, (1+strlen(cp))*sizeof(int));
+ while (*cp)
+ if (*cp == '$')
+ {
+ *dp++ = ' ';
+ cp++;
+ }
+ else if (*cp == '.')
+ {
+ *dp++ = ZEBRA_REPLACE_ANY;
+ cp++;
+ }
+ else
+ {
+ *dp++ = zebra_prim(&cp);
+#if 0
+ logf (LOG_LOG, " char %2X %c", dp[-1], dp[-1]);
+#endif
+ }
+ *dp = '\0';
+ }
+ if (argc >= 3)
+ {
+ char *cp = argv[2];
+ char *dp = token->token_to =
+ nmem_malloc (zms->nmem, strlen(cp)+1);
+ while (*cp)
+ if (*cp == '$')
+ {
+ *dp++ = ' ';
+ cp++;
+ }
+ else
+ *dp++ = zebra_prim(&cp);
+ *dp = '\0';
+ }
+ else
+ token->token_to = 0;
+ }
+ }
+ if (zm)
+ (*zm)->next = NULL;
+ fclose (f);
+
+ for (zp = zms->map_list; zp; zp = zp->next)
+ zms->lookup_array[zp->reg_id] = zp;
+}
+
+static void zms_map_handle (void *p, const char *name, const char *value)