Comment typo
[yaz-moved-to-github.git] / src / charconv.tcl
index 2d946d0..0f1ddc2 100755 (executable)
@@ -1,19 +1,24 @@
 #!/bin/sh
-# the next line restats using tclsh \
-exec tclsh "$0" "$@"
+# the next line restarts using tclsh \
+if [ -f /usr/local/bin/tclsh8.4 ]; then exec tclsh8.4 "$0" "$@"; else exec tclsh "$0" "$@"; fi
 #
-# $Id: charconv.tcl,v 1.8 2005-03-16 21:26:37 adam Exp $
+# $Id: charconv.tcl,v 1.16 2006-05-23 09:43:37 mike Exp $
 
 proc usage {} {
     puts {charconv.tcl: [-p prefix] [-s split] [-o ofile] file ... }
     exit 1
 }
 
-proc preamble_trie {ofilehandle} {
+proc preamble_trie {ofilehandle ifiles ofile} {
     set f $ofilehandle
 
     set totype {unsigned }
 
+    puts $f "/** \\file $ofile"
+    puts $f "    \\brief Character conversion, generated from [lindex $ifiles 0]"
+    puts $f ""
+    puts $f "    Generated automatically by charconv.tcl"
+    puts $f "*/"
     puts $f "\#include <string.h>"
     puts $f "
         struct yaz_iconv_trie_flat {
@@ -22,7 +27,7 @@ proc preamble_trie {ofilehandle} {
             $totype to : 24;
         };
         struct yaz_iconv_trie_dir {
-            short ptr : 15;
+            int ptr : 15;
             unsigned combining : 1;
             $totype to : 24;
         };
@@ -36,7 +41,7 @@ proc preamble_trie {ofilehandle} {
         static unsigned long lookup(struct yaz_iconv_trie **ptrs, int ptr, unsigned char *inp,
                                     size_t inbytesleft, size_t *no_read, int *combining)
         {
-            struct yaz_iconv_trie *t = (ptr >= 0) ? ptrs[ptr] : 0;
+            struct yaz_iconv_trie *t = (ptr > 0) ? ptrs[ptr-1] : 0;
             if (!t || inbytesleft < 1)
                 return 0;
             if (t->dir)
@@ -200,10 +205,10 @@ proc dump_trie {ofilehandle} {
                 set ch [format %02X $i]
                 set null 1
                 if {[info exist trie($this,ptr,$ch)]} {
-                    puts -nonewline $f "$trie($this,ptr,$ch), "
+                    puts -nonewline $f "[expr $trie($this,ptr,$ch)+1], "
                     set null 0
                 } else {
-                    puts -nonewline $f "-1, "
+                    puts -nonewline $f "0, "
                 }
                 if {[info exist trie($this,combining,$ch)]} {
                     puts -nonewline $f "$trie($this,combining,$ch), "
@@ -245,22 +250,22 @@ proc dump_trie {ofilehandle} {
         {
             unsigned long code;
             
-            code = lookup($trie(prefix)ptrs, 0, inp, inbytesleft, no_read, combining);
+            code = lookup($trie(prefix)ptrs, 1, inp, inbytesleft, no_read, combining);
             if (!code)
             {
                 *no_read = 1;
-                code = *inp;
             }
             return code;
         }
     "
 }
 
-proc readfile {fname ofilehandle prefix omits} {
+proc readfile {fname ofilehandle prefix omits reverse} {
     global trie
 
     set marc_lines 0
     set ucs_lines 0
+    set utf_lines 0
     set codename_lines 0
     set lineno 0
     set f [open $fname r]
@@ -291,12 +296,21 @@ proc readfile {fname ofilehandle prefix omits} {
            }
        } elseif {[regexp {</code>} $line s]} {
            if {[string length $ucs]} {
-               for {set i 0} {$i < [string length $marc]} {incr i 2} {
-                   lappend hex [string range $marc $i [expr $i+1]]
+               if {$reverse} {
+                   for {set i 0} {$i < [string length $utf]} {incr i 2} {
+                       lappend hex [string range $utf $i [expr $i+1]]
+                   }
+                   # puts "ins_trie $hex $marc
+                   ins_trie $hex $marc $combining $codename
+                   unset hex
+               } else {
+                   for {set i 0} {$i < [string length $marc]} {incr i 2} {
+                       lappend hex [string range $marc $i [expr $i+1]]
+                   }
+                   # puts "ins_trie $hex $ucs"
+                   ins_trie $hex $ucs $combining $codename
+                   unset hex
                }
-               # puts "ins_trie $hex $ucs"
-               ins_trie $hex $ucs $combining $codename
-               unset hex
            }
            set marc {}
            set uni {}
@@ -320,6 +334,8 @@ proc readfile {fname ofilehandle prefix omits} {
            set combining 1
        } elseif {[regexp {<ucs>([0-9A-Fa-f]*)</ucs>} $line s ucs]} {
            incr ucs_lines
+       } elseif {[regexp {<utf-8>([0-9A-Fa-f]*)</utf-8>} $line s utf]} {
+           incr utf_lines
        }
     }
     close $f
@@ -329,6 +345,7 @@ set verbose 0
 set ifile {}
 set ofile out.c
 set prefix {c}
+set reverse_map 0
 # Parse command line
 set l [llength $argv]
 set i 0
@@ -363,6 +380,9 @@ while {$i < $l} {
             }
             lappend omits $arg
        }
+       -r {
+           set reverse_map 1
+       }
         default {
            lappend ifiles $arg
         }
@@ -375,10 +395,10 @@ if {![info exists ifiles]} {
 }
 
 set ofilehandle [open $ofile w]
-preamble_trie $ofilehandle
+preamble_trie $ofilehandle $ifiles $ofile
 
 foreach ifile $ifiles {
-    readfile $ifile $ofilehandle $prefix $omits
+    readfile $ifile $ofilehandle $prefix $omits $reverse_map
 }
 close $ofilehandle