X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcharconv.tcl;h=0f1ddc283095e0dc77ccb4ef1f0ec49b568c053a;hp=6ffdd650a53c2aa693b392fbfe8ec29651025d3e;hb=00abdd969f52b04d5d53e4645c30596f4040060b;hpb=9527520d6b18b7c74d74ff4ad42fbf7eab73d203 diff --git a/src/charconv.tcl b/src/charconv.tcl index 6ffdd65..0f1ddc2 100755 --- a/src/charconv.tcl +++ b/src/charconv.tcl @@ -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.9 2005-11-06 01:55:06 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 " 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,7 +250,7 @@ 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; @@ -255,11 +260,12 @@ proc dump_trie {ofilehandle} { " } -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] @@ -290,12 +296,21 @@ proc readfile {fname ofilehandle prefix omits} { } } elseif {[regexp {} $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 {} @@ -319,6 +334,8 @@ proc readfile {fname ofilehandle prefix omits} { set combining 1 } elseif {[regexp {([0-9A-Fa-f]*)} $line s ucs]} { incr ucs_lines + } elseif {[regexp {([0-9A-Fa-f]*)} $line s utf]} { + incr utf_lines } } close $f @@ -328,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 @@ -362,6 +380,9 @@ while {$i < $l} { } lappend omits $arg } + -r { + set reverse_map 1 + } default { lappend ifiles $arg } @@ -374,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