2011-12-05

Win32forth 6.14中文支援補正

win32forth 6.xx開始之後,就不太支援中文了,先前有貼過一個修正方法,但最近又有高手提出更方便且徹底的修正,所以在這裡繼續紀錄一份.



你只要下載patch614forchinese.f
然後在win32for裡面
fload patch614forchinese
即可

這次的修正主要原理是
定義了 xTR ( adr n table -- ) 其功能與 TR ( adr n table -- )一樣, 將位址在 adr 長度為 n 字串中英文字母依 table 變大寫或變小寫。只是 xTR 遇中文會自動跳過, 但 TR 把每個中文字當作兩個英文字母處理 (可能就會改了原來的中文字)

原出處:https://mail.google.com/mail/?zx=c5kun3itqmev&shva=1#inbox/133eae7e98ea9bba

如果你沒法下載,也可以把以下內容存成該檔案即可
\ patch614ForChinese.f

\ 這裡定義的 xTR 其功能與 TR 一樣, 將位址在 adr 長度為 n 字串中英文字母依 table 變大寫或變小寫, 
\ 只是 xTR 遇中文會自動跳過, 但 TR 把每個中文字當作兩個英文字母處理 (可能就會改了原來的中文字)

\ 例如: s" aBc陳爽xYz" 2dup uCaseTab xTR type 會印出 ==> ABC陳爽XYZ
\       s" aBc陳淇xYz" 2dup lCaseTab xTR type 會印出 ==> abc陳淇xyz

\ 但是: s" aBc陳爽xYz" 2dup uCaseTab  TR type 會印出 ==> ABC陳淇XYZ
\       s" aBc陳淇xYz" 2dup lCaseTab  TR type 會印出 ==> abc陳爽xyz

\ xTR ( adr n table -- )
( 404314 18 43 40 00             ) CODE xTR     \ ebx <== table
( 404318 5F                      )      pop     edi   \ edi <== len
( 404319 59                      )      pop     ecx   \ ecx <== addr
( 40431A 52                      )      push    edx   \ save edx
( 40431B 03 F9                   )      add     edi, ecx  \ edi <== addr + len
( 40431D 33 C0                   )      xor     eax, eax  \ eax <== 0
( 40431F 3B F9                   ) @@1: cmp     edi, ecx  \ goto @@4, if edi >= ecx
( 404321 72 14                   )      jb      short @@4 
( 404323 8A 01                   )      mov     al, [ecx]  \ al <== [ecx]
( 404325 80 F8 80                )      cmp     al, # $80  \ goto @@2, if eax >= # $80
( 404328 73 07                   )      jae     short @@2 
( 40432A 8A 14 03                )      mov     dl, [ebx] [eax] \ dl <== uppercase of al
( 40432D 88 11                   )      mov     [ecx], dl  \ [ecx] <== dl \ 原字母換成大寫
( 40432F EB 02                   )      jmp     short @@3  \ goto @@3
( 404331 FF C1                   ) @@2: inc     ecx   \ ecx <== exc + 1 \ 跳過中文字
( 404333 FF C1                   ) @@3: inc     ecx   \ ecx <== exc + 1
( 404335 EB E8                   )      jmp     short @@1 \ back @@1
( 404337 33 FF                   ) @@4: xor     edi, edi  \ edi <= 0
( 404339 5A                      )      pop     edx   \ restore edx
( 40433A 5B                      )      pop     ebx   \ tos
( 40433B 8B 06 83 C6 04 FF 20    )      next   
( 404342                         ) c;

: patch614ForChinese
  ['] xtr dup
\ 以 xtr 取代 uppercase 中在位址 402290 的 tr
  $402290 dup @ ['] tr <> abort" cannot fix uppercase " !
\ 以 xtr 取代 upper     中在位址 40C348 的 tr
  $40C348 dup @ ['] tr <> abort" cannot fix upper "     ! ;
  patch614ForChinese

\ 因為 uppercase 會被下列指令用到
\   ?MISSING  SEARCH-WORDLIST  CAPS-FIND  PARMFIND  NEW-NUMBER  WINLIBRARY  LINKFILE
\   NEXTWORD  "COMMENT  DEFINITE-WORD  [DEFINED]  (.PROCS)  .PROCS  (WORDS)  CONSTANTS
\   CONSTANTS  _WORDS  @WORD  $.VIEWINFO  ?UPPERCASE

\ 並且 upper     會被下列指令用到
\   "HEADER  ARG-1"  "PATH+  CAPS-SEARCH  CAPS-SEARCH  CAPS-COMPARE  CAPS-COMPARE
\   GET1LINE  SHOWHEAD  "COMMENT  "MATCHES

沒有留言: