uniClass.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:3k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #!/bin/sh
  2. # The next line is executed by /bin/sh, but not tcl 
  3. exec tclsh "$0" ${1+"$@"}
  4. #
  5. # uniClass.tcl --
  6. #
  7. # Generates the character ranges and singletons that are used in
  8. # generic/regc_locale.c for translation of character classes.
  9. # This file must be generated using a tclsh that contains the
  10. # correct corresponding tclUniData.c file (generated by uniParse.tcl)
  11. # in order for the class ranges to match.
  12. #
  13. proc emitRange {first last} {
  14.     global ranges numranges chars numchars
  15.     if {$first < ($last-1)} {
  16. append ranges [format "{0x%04x, 0x%04x}, " 
  17. $first $last]
  18. if {[incr numranges] % 4 == 0} {
  19.     append ranges "n    "
  20. }
  21.     } else {
  22. append chars [format "0x%04x, " $first]
  23. incr numchars
  24. if {$numchars % 9 == 0} {
  25.     append chars "n    "
  26. }
  27. if {$first != $last} {
  28.     append chars [format "0x%04x, " $last]
  29.     incr numchars
  30.     if {$numchars % 9 == 0} {
  31. append chars "n    "
  32.     }
  33. }
  34.     }
  35. }
  36. proc genTable {type} {
  37.     global first last ranges numranges chars numchars
  38.     set first -2
  39.     set last -2
  40.     set ranges "    "
  41.     set numranges 0
  42.     set chars "    "
  43.     set numchars 0
  44.     for {set i 0} {$i <= 0xFFFF} {incr i} {
  45. if {[string is $type [format %c $i]]} {
  46.     if {$i == ($last + 1)} {
  47. set last $i
  48.     } else {
  49. if {$first > 0} {
  50.     emitRange $first $last
  51. }
  52. set first $i
  53. set last $i
  54.     }
  55. }
  56.     }
  57.     emitRange $first $last
  58.     set ranges [string trimright $ranges "tn ,"]
  59.     set chars  [string trimright $chars "tn ,"]
  60.     if {$ranges != ""} {
  61. puts "static crange ${type}RangeTable[] = {n$rangesn};n"
  62. puts "#define NUM_[string toupper $type]_RANGE (sizeof(${type}RangeTable)/sizeof(crange))n"
  63.     } else {
  64. puts "/* no contiguous ranges of $type characters */n"
  65.     }
  66.     if {$chars != ""} {
  67. puts "static chr ${type}CharTable[] = {n$charsn};n"
  68. puts "#define NUM_[string toupper $type]_CHAR (sizeof(${type}CharTable)/sizeof(chr))n"
  69.     } else {
  70. puts "/* no singletons of $type characters */n"
  71.     }
  72. }
  73. puts "/*
  74.  * Declarations of Unicode character ranges.  This code
  75.  * is automatically generated by the tools/uniClass.tcl script
  76.  * and used in generic/regc_locale.c.  Do not modify by hand.
  77.  */
  78. "
  79. foreach {type desc} {
  80.     alpha "alphabetic characters"
  81.     digit "decimal digit characters"
  82.     punct "punctuation characters"
  83.     space "white space characters"
  84.     lower "lowercase characters"
  85.     upper "uppercase characters"
  86.     graph "unicode print characters excluding space"
  87. } {
  88.     puts "/* Unicode: $desc */n"
  89.     genTable $type
  90. }
  91. puts "/*
  92.  * End of auto-generated Unicode character ranges declarations.
  93.  */"