kolibrios-gitea/programs/rtfread/trunk/rtfactn.inc

390 lines
12 KiB
PHP
Raw Normal View History

rgsymRtf:
; Keyword descriptions
;rgsymRtf[] = {
; keyword dflt fPassDflt kwd idx implemented
if syms eq 12
SYM "f", 0, fFalse, kwdProp, ipropFont
SYM "*", 0, fFalse, kwdSpec, ipfnSkipDest ,1
SYM "'", 0, fFalse, kwdSpec, ipfnHex ,1
SYM "par", 0, fFalse, kwdChar, 0x0a ,1
SYM "u", 0, fFalse, kwdUC, 0 ,1
SYM "line", 0, fFalse, kwdChar, 0xa ,1
SYM "plain", 0, fFalse, kwdProp, ipropPlain ,1
SYM 0x9, 0, fFalse, kwdChar, 0x09 ,1
SYM "tab", 0, fFalse, kwdChar, 0x09 ,1
SYM "b", 1, fFalse, kwdProp, ipropBold ,1
SYM "ul", 1, fFalse, kwdProp, ipropUnderline
SYM "i", 1, fFalse, kwdProp, ipropItalic ,1
SYM "li", 0, fFalse, kwdProp, ipropLeftInd
SYM "ri", 0, fFalse, kwdProp, ipropRightInd
SYM "fi", 0, fFalse, kwdProp, ipropFirstInd
SYM "~", 0, fFalse, kwdChar, ' ' ,1
SYM "cols", 1, fFalse, kwdProp, ipropCols
SYM "qc", justC, fTrue, kwdProp, ipropJust ,1
SYM "ql", justL, fTrue, kwdProp, ipropJust ,1
SYM "qr", justR, fTrue, kwdProp, ipropJust ,1
SYM "qj", justF, fTrue, kwdProp, ipropJust
SYM "cf", 0, fFalse, kwdProp, ipropForeColor ,1
SYM "red", 0, fFalse, kwdColor, 16 ,1
SYM "green", 0, fFalse, kwdColor, 8 ,1
SYM "blue", 0, fFalse, kwdColor, 0 ,1
SYM "fs", 0, fFalse, kwdProp, ipropFontSize ,1
SYM "sbknone", sbkNon, fTrue, kwdProp, ipropSbk
SYM "sbkcol", sbkCol, fTrue, kwdProp, ipropSbk
SYM "sbkeven", sbkEvn, fTrue, kwdProp, ipropSbk
SYM "sbkodd", sbkOdd, fTrue, kwdProp, ipropSbk
SYM "sbkpage", sbkPg, fTrue, kwdProp, ipropSbk
SYM "pgnx", 0, fFalse, kwdProp, ipropPgnX
SYM "pgny", 0, fFalse, kwdProp, ipropPgnY
SYM "pgndec", pgDec, fTrue, kwdProp, ipropPgnFormat
SYM "pgnucrm", pgURom, fTrue, kwdProp, ipropPgnFormat
SYM "pgnlcrm", pgLRom, fTrue, kwdProp, ipropPgnFormat
SYM "pgnucltr", pgULtr, fTrue, kwdProp, ipropPgnFormat
SYM "pgnlcltr", pgLLtr, fTrue, kwdProp, ipropPgnFormat
SYM "paperw", 12240, fFalse, kwdProp, ipropXaPage
SYM "paperh", 15480, fFalse, kwdProp, ipropYaPage
SYM "margl", 1800, fFalse, kwdProp, ipropXaLeft
SYM "margr", 1800, fFalse, kwdProp, ipropXaRight
SYM "margt", 1440, fFalse, kwdProp, ipropYaTop
SYM "margb", 1440, fFalse, kwdProp, ipropYaBottom
SYM "pgnstart", 1, fTrue, kwdProp, ipropPgnStart
SYM "facingp", 1, fTrue, kwdProp, ipropFacingp
SYM "landscape",1, fTrue, kwdProp, ipropLandscape
SYM "ldblquote",0, fFalse, kwdChar, '"' ,1
SYM "rdblquote",0, fFalse, kwdChar, '"' ,1
SYM "bin", 0, fFalse, kwdSpec, ipfnBin ,1
SYM "author", 0, fFalse, kwdDest, idestSkip
SYM "buptim", 0, fFalse, kwdDest, idestSkip
SYM "bullet", 0, fFalse, kwdChar, '*' ,1
SYM "cell", 0, fFalse, kwdChar, 0x09 ,1
SYM "colortbl", 0, fFalse, kwdDest, idestColor ,1
SYM "comment", 0, fFalse, kwdDest, idestSkip
SYM "creatim", 0, fFalse, kwdDest, idestSkip
SYM "doccomm", 0, fFalse, kwdDest, idestSkip
SYM "fonttbl", 0, fFalse, kwdDest, idestSkip
SYM "footer", 0, fFalse, kwdDest, idestSkip
SYM "footerf", 0, fFalse, kwdDest, idestSkip
SYM "footerl", 0, fFalse, kwdDest, idestSkip
SYM "footerr", 0, fFalse, kwdDest, idestSkip
SYM "footnote", 0, fFalse, kwdDest, idestSkip
SYM "ftncn", 0, fFalse, kwdDest, idestSkip
SYM "ftnsep", 0, fFalse, kwdDest, idestSkip
SYM "ftnsepc", 0, fFalse, kwdDest, idestSkip
SYM "header", 0, fFalse, kwdDest, idestSkip
SYM "headerf", 0, fFalse, kwdDest, idestSkip
SYM "headerl", 0, fFalse, kwdDest, idestSkip
SYM "headerr", 0, fFalse, kwdDest, idestSkip
SYM "info", 0, fFalse, kwdDest, idestSkip
SYM "keywords", 0, fFalse, kwdDest, idestSkip
SYM "operator", 0, fFalse, kwdDest, idestSkip
SYM "pict", 0, fFalse, kwdDest, idestSkip
SYM "printim", 0, fFalse, kwdDest, idestSkip
SYM "private1", 0, fFalse, kwdDest, idestSkip
SYM "revtim", 0, fFalse, kwdDest, idestSkip
SYM "row", 0, fFalse, kwdChar, 0x0a ,1
SYM "rxe", 0, fFalse, kwdDest, idestSkip
SYM "stylesheet",0, fFalse, kwdDest, idestSkip
SYM "subject", 0, fFalse, kwdDest, idestSkip
SYM "tc", 0, fFalse, kwdDest, idestSkip
SYM "title", 0, fFalse, kwdDest, idestSkip
SYM "trowd", 0, fFalse, kwdChar, 0x0a ,1
SYM "txe", 0, fFalse, kwdDest, idestSkip
SYM "xe", 0, fFalse, kwdDest, idestSkip
SYM "{", 0, fFalse, kwdChar, '{' ,1
SYM "}", 0, fFalse, kwdChar, '}' ,1
SYM "\", 0, fFalse, kwdChar, '\' ,1
end if
SYM 0xa, 0, fFalse, kwdChar, 0x0a ,1
SYM 0xd, 0, fFalse, kwdChar, 0x0a ,1
;
; %%Function: ecApplyPropChange
;
; Set the property identified by _iprop_ to the value _val_.
;
ecApplyPropChange:
; in : eax-iprop, ebx - value
pusha
cmp [rds],rdsSkip
jne .noskip
.ok:
Return ecOK
.noskip:
lea esi,[eax*2+eax+rgprop] ;rgprop[iprop]
mov cx,word[esi]
movzx edx,byte[esi+2]
Prcheck Dop
Prcheck Sep
Prcheck Pap
Prcheck Chp
cmp byte[esi],actnSpec
jne .bad
.checked:
cmp cl,actnByte
jne .nob
mov byte[esi+edx],bl
jmp .ok
.nob:
cmp cl,actnWord
jne .now
mov [esi+edx],ebx
jmp .ok
.now:
cmp cl,actnSpec
jne .nos
call ecParseSpecialProperty
jmp .__ex
.nos:
cmp cl,actnFloatFS
jne .bad
mov [Chp+5],ebx
call updFS
jmp .ok
.bad:
mov eax,ecBadTable
Epilog
updFS:
cmp dword[Chp+5],0
jnz .no0
mov dword[Chp+5],24
.no0:
fild dword[Chp+5]
fmul dword[Free-4]
fst dword[Free+12]
fstp dword[Free+16]
ret
;
; %%Function: ecParseSpecialProperty
;
; Set a property that requires code to evaluate.
;
ecParseSpecialProperty:
; in : eax-iprop, ebx - value
; cmp al,ipropPard
; jne .nopap
; push eax
; mov ecx,SIZE_Pap
; mov edi,RetroSave+9
; xor eax,eax
; rep stosb
; pop eax
; .nopap:
MemSet ipropPard,Pap
MemSet ipropPlain,Chp
MemSet ipropSectd,Sep
mov eax,ecBadTable
ret
.ms:
xor eax,eax
rep stosb
ret
;
; %%Function: ecTranslateKeyword.
;
; Step 3.
; Search rgsymRtf for szKeyword and evaluate it appropriately.
;
; Inputs:
; szKeyword: The RTF control to evaluate.
; param: The parameter of the RTF control.
; fParam: fTrue if the control had a parameter; (that is, if param is valid
; fFalse if it did not.
ecTranslateKeyword:
; in: esi->pasKeyword; ebx-param, eax-fParam
pusha
mov edx,isymMax
mov edi,rgsymRtf
.next:
add edi,5
movzx ecx,byte[edi]
inc ecx
push edi esi ecx
repe cmpsb
pop ecx esi edi
jz .found
add edi,ecx
; inc edi
dec edx
test edx,edx
jne .next
cmp dl,[fSkipDestIfUnk]
jz .discard
mov [rds],rdsSkip
mov [fSkipDestIfUnk],dl
.discard:
Return ecOK
.found:
and [fSkipDestIfUnk],0
mov cx,[edi-3]
cmp ch,kwdProp
jne .nop
test cl,cl
jnz .usedeflt
test al,al
jnz .validparm
.usedeflt:
mov ebx,[edi-5]
.validparm:
movzx eax,byte[edi-1]
call ecApplyPropChange
jmp .__ex
.nop:
movzx eax,byte[edi-1]
cmp ch,kwdChar
jne .noc
.pchar:
mov edi,[esp]
test eax,eax
jz .__ex
mov esi,[esp+36]
call ecParseChar
mov [esp],edi
mov [esp+36],esi
jmp .__ex
.noc:
cmp ch,kwdDest
jne .nod
call ecChangeDest
jmp .__ex
.nod:
cmp ch,kwdSpec
jne .nos
call ecParseSpecialKeyword
jmp .__ex
.nos:
cmp ch,kwdColor
jne .nocol
cmp [rds],rdsColor
jne .bad
mov edx,[colorptr]
mov ecx,eax
mov esi,0xff
shl esi,cl
not esi
shl ebx,cl
and [edx],esi
or [edx],ebx
.okk:
Return ecOK
.nocol:
cmp ch,kwdUC
jne .bad
mov eax,[esp+36]
cmp byte[eax],'\'
je .nobyte
inc dword[esp+36]
.nobyte:
cmp ebx,0x400
jb .okk
mov eax,ebx
uc2oem
cmp ecx,1
jae .pchar
lea eax,[ebx-0x410+0xc0]
jmp .pchar
.bad:
mov eax,ecBadTable
Epilog
; %%Function: ecChangeDest
;
; Change to the destination specified by idest.
; There's usually more to do here than this...
ecChangeDest:
; in: eax- idest
cmp [rds],rdsSkip
jne .noskip
jmp .okk;Return ecOK
.noskip:
cmp eax,rdsColor
jne .nocol
mov [rds],al
jmp .okk
.nocol:
mov [rds],rdsSkip
.okk:
mov eax,ecOK
.ex:
ret
; %%Function: ecEndGroupAction
;
; The destination specified by rds is coming to a close.
; If there's any cleanup that needs to be done, do it now.
ecEndGroupAction:
; in: eax-rds
mov eax,ecOK
ret
; %%Function: ecParseSpecialKeyword
;
; Evaluate an RTF control that needs special processing.
ecParseSpecialKeyword:
; in: eax-IPFN
cmp [rds],rdsSkip
jne .noskip
cmp eax,ipfnBin
jne .ok
.noskip:
cmp eax,ipfnBin
jne .nobin
mov [ris],risBin
push [lParam]
pop [cbBin]
jmp .ok
.nobin:
cmp eax,ipfnSkipDest
jne .noskd
mov [fSkipDestIfUnk],fTrue
jmp .ok
.noskd:
cmp eax,ipfnHex
jne .nohex
mov [ris],risHex
jmp .ok
.nohex:
Return ecBadTable
.ok:
mov eax,ecOK
.__ex:
ret
; RTF parser tables
rgprop:
; Property descriptions
;PROP rgprop [ipropMax] = {
PROP actnByte, propChp, 0 ; ipropBold
PROP actnByte, propChp, 1 ; ipropItalic
PROP actnByte, propChp, 2 ; ipropUnderline
PROP actnWord, propPap, 0 ; ipropLeftInd
PROP actnWord, propPap, 4 ; ipropRightInd
PROP actnWord, propPap, 8 ; ipropFirstInd
PROP actnWord, propSep, 0 ; ipropCols
PROP actnWord, propSep, 5 ; ipropPgnX
PROP actnWord, propSep, 9 ; ipropPgnY
PROP actnWord, propDop, 0 ; ipropXaPage
PROP actnWord, propDop, 4 ; ipropYaPage
PROP actnWord, propDop, 8 ; ipropXaLeft
PROP actnWord, propDop, 12 ; ipropXaRight
PROP actnWord, propDop, 16 ; ipropYaTop
PROP actnWord, propDop, 20 ; ipropYaBottom
PROP actnWord, propDop, 24 ; ipropPgnStart
PROP actnByte, propSep, 4 ; ipropSbk
PROP actnByte, propSep, 13 ; ipropPgnFormat
PROP actnByte, propDop, 28 ; ipropFacingp
PROP actnByte, propDop, 29 ; ipropLandscape
PROP actnByte, propPap, 12 ; ipropJust
PROP actnSpec, propPap, 0 ; ipropPard
PROP actnSpec, propChp, 0 ; ipropPlain
PROP actnSpec, propSep, 0 ; ipropSectd
PROP actnByte, propChp, 3 ; ipropForeColor
PROP actnByte, propChp, 4 ; ipropFont
PROP actnFloatFS,propChp, 5 ; ipropFontSize