Version 5.14.8
[yaz-moved-to-github.git] / util / yaz-icu.c
index 3e0c1d8..ac7806a 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2013 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 
@@ -26,6 +26,7 @@
 
 #include <yaz/icu.h>
 #include <yaz/wrbuf.h>
+#include <yaz/backtrace.h>
 
 /* commando line and config parameters */
 struct config_t {
@@ -33,6 +34,7 @@ struct config_t {
     char print[1024];
     int xmloutput;
     int sortoutput;
+    int org_output;
     yaz_icu_chain_t chain;
     FILE * infile;
     FILE * outfile;
@@ -45,6 +47,7 @@ void print_option_error(const struct config_t *p_config)
             "   -c file         XML configuration\n"
             "   -p a|c|l|t      Print ICU info \n"
             "   -s              Show sort normalization key\n"
+            "   -o              Show org positions\n"
             "   -x              XML output instread of text\n"
             "\n"
             "Examples:\n"
@@ -77,10 +80,11 @@ void read_params(int argc, char **argv, struct config_t *p_config)
     p_config->chain = 0;
     p_config->infile = 0;
     p_config->outfile = stdout;
+    p_config->org_output = 0;
 
     /* set up command line parameters */
 
-    while ((ret = options("c:p:xs", argv, argc, &arg)) != -2)
+    while ((ret = options("c:op:sx", argv, argc, &arg)) != -2)
     {
         switch (ret)
         {
@@ -96,6 +100,9 @@ void read_params(int argc, char **argv, struct config_t *p_config)
         case 'x':
             p_config->xmloutput = 1;
             break;
+        case 'o':
+            p_config->org_output = 1;
+            break;
         case 0:
             if (p_config->infile)
             {
@@ -448,8 +455,6 @@ static void process_text_file(struct config_t *p_config)
     {
         printf("Could not set up ICU chain from config file '%s' \n",
                 p_config->conffile);
-        if (!U_SUCCESS(status))
-            printf("ICU Error: %d %s\n", status, u_errorName(status));
         exit(1);
     }
 
@@ -474,9 +479,11 @@ static void process_text_file(struct config_t *p_config)
             else
             {
                 size_t start, len;
+                const char *org_string = 0;
                 const char *sortkey = icu_chain_token_sortkey(p_config->chain);
 
-                icu_chain_get_org_info(p_config->chain, &start, &len);
+                icu_chain_get_org_info2(p_config->chain, &start, &len,
+                                        &org_string);
                 wrbuf_rewind(sw);
                 wrbuf_puts_escaped(sw, sortkey);
                 token_count++;
@@ -507,17 +514,26 @@ static void process_text_file(struct config_t *p_config)
                 }
                 else
                 {
-                    fprintf(p_config->outfile, "%lu %lu '%s' '%s' %ld+%ld",
+                    fprintf(p_config->outfile, "%lu %lu '%s' '%s'",
                             token_count,
                             line_count,
                             icu_chain_token_norm(p_config->chain),
-                            icu_chain_token_display(p_config->chain),
-                            (long) start,
-                            (long) len);
+                            icu_chain_token_display(p_config->chain));
                     if (p_config->sortoutput)
                     {
                         fprintf(p_config->outfile, " '%s'", wrbuf_cstr(sw));
                     }
+                    if (p_config->org_output)
+                    {
+                        fprintf(p_config->outfile, " %ld+%ld",
+                                (long) start, (long) len);
+                        fputc(' ', p_config->outfile);
+                        fwrite(org_string, 1, start, p_config->outfile);
+                        fputc('*', p_config->outfile);
+                        fwrite(org_string + start, 1, len, p_config->outfile);
+                        fputc('*', p_config->outfile);
+                        fputs(org_string + start + len, p_config->outfile);
+                    }
                     fprintf(p_config->outfile, "\n");
                 }
             }
@@ -545,6 +561,7 @@ int main(int argc, char **argv)
 #if YAZ_HAVE_ICU
     struct config_t config;
 
+    yaz_enable_panic_backtrace(*argv);
     read_params(argc, argv, &config);
 
     if (config.conffile && strlen(config.conffile))