X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fcharconv.tcl;h=fcc83fd4097cd51595d14672a4cffb6f2bbec7df;hb=719e0dcf2d15c08086a06457701e21c6aff3d791;hp=8ce076834a506dd02d688765815625859630123c;hpb=f72e3ad49303bc42c4ea9343ae59f0dbed4b0694;p=yaz-moved-to-github.git diff --git a/src/charconv.tcl b/src/charconv.tcl index 8ce0768..fcc83fd 100755 --- a/src/charconv.tcl +++ b/src/charconv.tcl @@ -2,7 +2,7 @@ # the next line restats using tclsh \ exec tclsh "$0" "$@" # -# $Id: charconv.tcl,v 1.3 2004-03-16 13:12:42 adam Exp $ +# $Id: charconv.tcl,v 1.6 2004-03-20 07:16:25 adam Exp $ proc usage {} { puts {charconv.tcl: [-p prefix] [-s split] [-o ofile] file ... } @@ -17,11 +17,11 @@ proc preamble_trie {ofilehandle} { puts $f "\#include " puts $f " struct yaz_iconv_trie_flat { - char *from; + char from\[6\]; $totype to; }; struct yaz_iconv_trie_dir { - struct yaz_iconv_trie *ptr; + short ptr; $totype to; }; @@ -31,16 +31,17 @@ proc preamble_trie {ofilehandle} { }; " puts $f { - static unsigned long lookup(struct yaz_iconv_trie *t, unsigned char *inp, + static unsigned long lookup(struct yaz_iconv_trie **ptrs, int ptr, unsigned char *inp, size_t inbytesleft, size_t *no_read) { + struct yaz_iconv_trie *t = (ptr >= 0) ? ptrs[ptr] : 0; if (!t || inbytesleft < 1) - return 0; + return 0; if (t->dir) { size_t ch = inp[0] & 0xff; unsigned long code = - lookup(t->dir[ch].ptr, inp+1, inbytesleft-1, no_read); + lookup(ptrs, t->dir[ch].ptr, inp+1, inbytesleft-1, no_read); if (code) { (*no_read)++; @@ -56,7 +57,7 @@ proc preamble_trie {ofilehandle} { else { struct yaz_iconv_trie_flat *flat = t->flat; - while (flat->from) + while (flat->to) { size_t len = strlen(flat->from); if (len <= inbytesleft) @@ -72,7 +73,6 @@ proc preamble_trie {ofilehandle} { } return 0; } - } } @@ -86,7 +86,7 @@ proc reset_trie {} { set trie(no) 1 set trie(size) 0 set trie(max) 0 - set trie(split) 40 + set trie(split) 50 set trie(prefix) {} } @@ -177,7 +177,7 @@ proc dump_trie {ofilehandle} { puts -nonewline $f "\", 0x[lindex $m 1]" puts $f "\}," } - puts $f " \{0, 0\}" + puts $f " \{\"\", 0\}" puts $f "\};" puts $f "struct yaz_iconv_trie $trie(prefix)page${this} = \{" puts $f " $trie(prefix)page${this}_flat, 0" @@ -189,10 +189,10 @@ proc dump_trie {ofilehandle} { set ch [format %02X $i] set null 1 if {[info exist trie($this,ptr,$ch)]} { - puts -nonewline $f "&$trie(prefix)page$trie($this,ptr,$ch), " + puts -nonewline $f "$trie($this,ptr,$ch), " set null 0 } else { - puts -nonewline $f "0, " + puts -nonewline $f "-1, " } if {[info exist trie($this,to,$ch)]} { puts -nonewline $f "0x$trie($this,to,$ch)\}" @@ -215,12 +215,20 @@ proc dump_trie {ofilehandle} { puts $f "\};" } } + + puts $f "struct yaz_iconv_trie *$trie(prefix)ptrs \[\] = {" + for {set this 0} {$this < $trie(no)} {incr this} { + puts $f " &$trie(prefix)page$this," + } + puts $f "0, };" + puts $f "" + puts $f "unsigned long yaz_$trie(prefix)_conv (unsigned char *inp, size_t inbytesleft, size_t *no_read) { unsigned long code; - code = lookup(&$trie(prefix)page0, inp, inbytesleft, no_read); + code = lookup($trie(prefix)ptrs, 0, inp, inbytesleft, no_read); if (!code) { *no_read = 1; @@ -248,7 +256,6 @@ proc readfile {fname ofilehandle prefix omits} { if {[regexp {} $line s]} { reset_trie set trie(prefix) "${prefix}" - puts "new table $tablenumber" } elseif {[regexp {} $line s]} { dump_trie $ofilehandle } elseif {[regexp {([0-9A-Fa-f]*)} $line s hex ucs]} { @@ -257,7 +264,6 @@ proc readfile {fname ofilehandle prefix omits} { } elseif {[regexp {} $line s]} { if {[lsearch $omits $tablenumber] == -1} { dump_trie $ofilehandle @@ -285,7 +291,6 @@ proc readfile {fname ofilehandle prefix omits} { set verbose 0 set ifile {} set ofile out.c -set trie(split) 40 set prefix {c} # Parse command line set l [llength $argv]