- case '{':
- s++;
- begin = prim(&s);
- if (*s != '-')
- {
- logf(LOG_FATAL, "Bad range in char-map");
- return -1;
- }
- s++;
- end = prim(&s);
- if (end <= begin)
- {
- logf(LOG_FATAL, "Bad range in char-map");
- return -1;
- }
- s++;
- for (c = begin; c <= end; c++)
- {
- str[0] = c; str[1] = '\0';
- (*fun)((char *) str, data, num ? (*num)++ : 0);
- }
- break;
- case '[': s++; abort(); break;
- case '(':
- p = (unsigned char*) ++s;
- /* Find the end-marker, ignoring escapes */
- do
- {
- if (!(p = (unsigned char*) strchr((char*) p, ')')))
- {
- logf(LOG_FATAL, "Missing ')' in string");
- return -1;
- }
- }
- while (*(p - 1) == '\\');
- *p = 0;
- (*fun)(s, data, num ? (*num)++ : 0);
- s = (char*) p + 1;
- break;
- default:
- c = prim(&s);
- str[0] = c; str[1] = '\0';
- (*fun)((char *) str, data, num ? (*num)++ : 0);
+ case '{':
+ s++;
+ begin = zebra_prim_w(&s);
+ if (*s != '-')
+ {
+ yaz_log(YLOG_FATAL, "Bad range in char-map");
+ return -1;
+ }
+ s++;
+ end = zebra_prim_w(&s);
+ if (end <= begin)
+ {
+ yaz_log(YLOG_FATAL, "Bad range in char-map");
+ return -1;
+ }
+ s++;
+ for (c = begin; c <= end; c++)
+ {
+ if (scan_to_utf8(t_utf8, &c, 1, str, sizeof(str)-1))
+ return -1;
+ (*fun)(str, data, num ? (*num)++ : 0);
+ }
+ break;
+ case '(':
+ ++s;
+ i = 0;
+ while (*s != ')' || s[-1] == '\\')
+ {
+ if (*s == '\0')
+ {
+ yaz_log(YLOG_FATAL, "Missing ) in charmap");
+ return -1;
+ }
+ arg_prim[i++] = zebra_prim_w(&s);
+ }
+ arg_prim[i] = 0;
+ if (scan_to_utf8(t_utf8, arg_prim, zebra_ucs4_strlen(arg_prim), str, sizeof(str)-1))
+ return -1;
+ (*fun)(str, data, num ? (*num)++ : 0);
+ s++;
+ break;
+ default:
+ c = zebra_prim_w(&s);
+ if (scan_to_utf8(t_utf8, &c, 1, str, sizeof(str)-1))
+ return -1;
+ (*fun)(str, data, num ? (*num)++ : 0);