sys7.1-doc-wip/Internal/Asm/IntlResourcesPriv.a
2019-07-27 22:37:48 +08:00

287 lines
8.5 KiB
Plaintext

;
; File: IntlResourcesPriv.a
;
; Contains: Macros for building itl2, and equates used for IntlTokenize code in
; ScriptMgrUtilText.a and itl4Roman.a. This file can be given to localizers and script
; developers along with sources for RomanItl2.a and itl4Roman.a. The macros are
; extracted from itl2 source to avoid unnecessary duplication. The itl4 equates are
; separated out from ScriptPriv.a because the other stuff in ScriptPriv.a should not
; be distributed and is not neeeded in order to build itl4 resources.
;
; Written by: PKE Peter Edberg
;
; Copyright: © 1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <2> 11/20/92 PKE Also add in SetFSRow macro used in script itl2 sources.
; <1> 11/17/92 PKE Extracted itl2 macros from RomanItl2.a and itl4 equates from
; ScriptPriv.a
;
;___________________________________________________________________________________________________
IF &TYPE('__INCLUDINGINTLRESOURCESPRIV__') = 'UNDEFINED' THEN
__INCLUDINGINTLRESOURCESPRIV__ SET 1
; ----------------------------------------------------------------------------
tblSize equ 256 ; bumped from 65 to 70 <03/12/89 pke> and up to 256 <1>
; ===============================MACROS=============================================
;
; Set up compressed type & case tables for CharType and Transliterate <12/16/87med>
;
; Modified SetClass macro to add NoMarkList <03/29/89 pke>
; eliminated LowerNoMarkList <1>
macro
SetClass &type, &casestrip, &case, &strip, &rest
gbla &cls[256], &TypeList[tblSize]
gbla &UpperList[tblSize], &LowerList[tblSize]
gbla &UpperNoMarkList[tblSize], &NoMarkList[tblSize]
lcla &i,&j,&first,&a,&b,&c,&t,&cs,&s
&t: seta &eval(&type)
&cs: seta &eval(&casestrip) ; change case + strip diacritics <9/23/88 ldc>
&c: seta &eval(&case) ; change case only
&s: seta &eval(&strip) ; strip diacritics only <03/12/89 pke>
&i: seta 5 ; now 5th parameter <03/12/89 pke>
while &i <= &nbr(&syslist) do
if &nbr(&syslist[&i]) then
&a: seta &eval(&syslist[&i,1])
&b: seta &eval(&syslist[&i,2])
else
&a: seta &eval(&syslist[&i])
&b: seta &a
endif
if &first = 0 then
&first: seta &a
endif
while &a <= &b do
&cls[&a+1]: seta lastClass
&a: seta &a+1
endWhile
&i: seta &i+1
endWhile
lastClass: set lastClass+1
&TypeList[lastClass]: seta &t
&UpperList[lastClass]: seta 0
&LowerList[lastClass]: seta 0
&UpperNoMarkList[lastClass]: seta 0
&NoMarkList[lastClass]: seta 0
if &c <> 0 then
if (&t**$80)= 0 then ; lowercase or no case
&UpperList[lastClass]: seta $000000FF**(&c-&first)
&UpperNoMarkList[lastClass]: seta $000000FF**(&cs-&first) ; <09/23/88 ldc>
else ; uppercase
&LowerList[lastClass]: seta $000000FF**(&c-&first)
&UpperNoMarkList[lastClass]: seta $000000FF**(&s-&first) ; <03/12/89 pke>
endif
&NoMarkList[lastClass]: seta $000000FF**(&s-&first) ; <03/29/89 pke>
endif
endMacro
; ==========================================================================================
; modified DumpCharTable macro to add NoMarkList <03/29/89 pke>
; eliminated LowerNoMarkList <1>
macro
DumpCharTable &index
gbla &cls[256], &TypeList[tblSize]
gbla &UpperList[tblSize], &LowerList[tblSize]
gbla &UpperNoMarkList[tblSize], &NoMarkList[tblSize]
lcla &i
&i: seta 1
if &index = 0 then
while &i <= 256 do ; corrected to <= <04/12/89 pke>
dc.b &cls[&i],&cls[&i+1],&cls[&i+2],&cls[&i+3],&cls[&i+4],&cls[&i+5],&cls[&i+6],&cls[&i+7]
&i: seta &i+8
endWhile
elseif &index = 1 then ; Type list
while &i <= lastClass do
dc.b &TypeList[&i]
&i: seta &i+1
endWhile
elseif &index = 2 then ; Uppercase delta list
while &i <= lastClass do
dc.b &UpperList[&i]
&i: seta &i+1
endWhile
elseif &index = 3 then ; Lowercase delta list
while &i <= lastClass do
dc.b &LowerList[&i]
&i: seta &i+1
endWhile
elseif &index = 4 then ; StripUppercase delta list
while &i <= lastClass do
dc.b &UpperNoMarkList[&i]
&i: seta &i+1
endWhile
elseif &index < 7 then ; Strip (diacritics) delta list (was 6, now 5 to replace unused LowerNoMarkList)
while &i <= lastClass do
dc.b &NoMarkList[&i]
&i: seta &i+1
endWhile
endif
align 2
endMacro
; ----------------------------------------------------------------------------
; macro: setByte
; input: Base address, value, settings.
; Each setting is either a number or a range (f,s).
;
; This macro is used to create the first part of a breakTable, the character
; type array. This array is indexed by ASCII code, and contains the type of
; each character. For example, the characters 'a' through 'z' will all have
; the type 'letter' in the array.
; ----------------------------------------------------------------------------
macro
setByte &base,&v
print push,nomdir
lcla &n,&a,&b,&value
&value seta &eval(&v)
&n seta 3
while &n<=&nbr(&syslist) do
if &nbr(&syslist[&n]) then
&a seta &eval(&syslist[&n,1])
&b seta &eval(&syslist[&n,2])
else
&a seta &eval(&syslist[&n])
&b seta &a
endif
org &base+&a
dcb.b &b-&a+1,&value
&n seta &n+1
endwhile
org
print pop
endm
; ----------------------------------------------------------------------------
; macro: SetRow
; input: Base address, state number, action 1, action 2, …
; other symbols: Assumes Nstate and Nclass are set to the number of states
; and the number of classes, respectively (uses these for
; error checking only)
; Note: each action is a state number, optionally preceded by '*' to indicate
; that the word in progress should be updated to include the current
; char
;
; Macro for setting up transition table rows and transition table index values
; No error checking yet!
; ----------------------------------------------------------------------------
macro
SetRow &base, &state
print push, nogen
lcla &off, &n, &act
lclc &str
&off seta * - &eval(&base)
org &base + (&eval(&state) << 1)
dc.w &off
org
&n seta 2
while &n<&nbr(&syslist) do
&n seta &n+1
&act seta 0
&str setc &syslist[&n]
if &scanne('*',&str,1)<>0 then
&act seta $80
&str setc &substr(&str,2,&len(&str))
endif
&act seta &act OR (&eval(&str) << 1)
dc.b &act
endw
print pop
endm
; ****************************************************************************
; FindScriptRun macros
; ****************************************************************************
; ----------------------------------------------------------------------------
; macro: SetFSRow
; input: Base address, state number, action 1, action 2, …
; other symbols: Assumes Nstate and Nclass are set to the number of states
; and the number of classes, respectively (uses these for
; error checking only)
; Note: each action is a state number, optionally preceded by:
; '*' to mark, i.e. indicate that the word in progress should be
; updated to include the current char
; 'e' to exit. In this case, the following number is an index into
; a table of ScriptRunStatus values - it specifies the correct
; value for the completed run.
;
; Macro for setting up transition table rows and transition table index values
; No error checking yet!
; ----------------------------------------------------------------------------
macro
SetFSRow &base, &state
print push, nogen
lcla &off, &n, &act
lclc &str
&off seta * - &eval(&base)
org &base + (&eval(&state) << 1)
dc.w &off
org
&n seta 2
while &n<&nbr(&syslist) do
&n seta &n+1
&act seta 0
&str setc &syslist[&n]
if &scanne('*',&str,1)<>0 then
&act seta $80
&str setc &substr(&str,2,&len(&str))
endif
if &scanne('e',&str,1)<>0 then
&act seta &act OR $40
&str setc &substr(&str,2,&len(&str))
endif
&act seta &act OR &eval(&str)
dc.b &act
endw
print pop
endm
; ----------------------------------------------------------------------------
; IntlTokenize equates for itl4 and IntlTokenize code
; ----------------------------------------------------------------------------
srcA EQU a0
srcL EQU d0
toks EQU a1
tokL EQU d1
holdA EQU a2
cSym EQU d2
lastA EQU a3
ld EQU d3
map EQU a4
lc1 EQU d4
pBlok EQU a5
lc2 EQU d5
temp EQU d6
dTab EQU a6
temp1 EQU d7
rd EQU ld
escRD EQU lc1
rc EQU ld
mapEmergOffset equ -8
mapExtendOffset equ -4
magicStackTokenEnd equ 6
magicStackErrorValue equ 4
; ----------------------------------------------------------------------------
ENDIF ; ...already included