94 lines
2.2 KiB
ArmAsm
94 lines
2.2 KiB
ArmAsm
#################################################################
|
|
# #
|
|
# Copyright 2006, 2008 Fidelity Information Services, Inc #
|
|
# #
|
|
# This source code contains the intellectual property #
|
|
# of its copyright holder(s), and is made available #
|
|
# under a license. If you do not know the terms of #
|
|
# the license, please stop and do not read further. #
|
|
# #
|
|
#################################################################
|
|
|
|
# PAGE ,132
|
|
.title op_fnzextract.s
|
|
|
|
# .386
|
|
# .MODEL FLAT, C
|
|
|
|
.include "linkage.si"
|
|
.INCLUDE "mval_def.si"
|
|
|
|
.sbttl op_fnzextract
|
|
# PAGE +
|
|
# ------------------------------------
|
|
# op_fnzextract.s
|
|
#
|
|
# Mumps $Extract function
|
|
# ------------------------------------
|
|
|
|
# --------------------------------
|
|
# op_fnzextract (int last, int first, mval *src, mval *dest)
|
|
# --------------------------------
|
|
# esi - src mval
|
|
# edi - dest mval
|
|
# ecx - src. str. len.
|
|
# ebx - resultant str. len.
|
|
# eax - first index
|
|
# edx - last index
|
|
|
|
last = 8
|
|
first = 12
|
|
src = 16
|
|
dest = 20
|
|
|
|
.text
|
|
|
|
.extern n2s
|
|
.extern underr
|
|
|
|
# PUBLIC op_fnzextract
|
|
ENTRY op_fnzextract
|
|
enter $0,$0
|
|
pushl %edi
|
|
pushl %esi
|
|
pushl %ebx
|
|
|
|
movl src(%ebp),%esi # esi - src. mval
|
|
mv_force_defined %esi, l00
|
|
movl %esi, src(%ebp) # save possibly modified src ptr
|
|
mv_force_str %esi, l01
|
|
movl src(%ebp),%esi # esi - src.mval
|
|
movl first(%ebp),%eax # eax - first
|
|
cmpl $0,%eax
|
|
jg l10
|
|
movl $1,%eax # if first < 1, then first = 1
|
|
l10: movl last(%ebp),%edx # edx - last
|
|
movl dest(%ebp),%edi # edi - last
|
|
movw $mval_m_str,mval_w_mvtype(%edi) # always a string
|
|
movl mval_l_strlen(%esi),%ecx # ecx - src. str. len.
|
|
cmpl %eax,%ecx # if left index > str. len,
|
|
# then null result
|
|
jl l25
|
|
cmpl %edx,%ecx # right index may be at most the len.
|
|
jge l20 # of the source string
|
|
movl %ecx,%edx
|
|
l20: movl %edx,%ebx
|
|
subl %eax,%ebx # result len. = end - start + 1
|
|
addl $1,%ebx
|
|
jg l30 # if len > 0, then continue
|
|
l25: movl $0,mval_l_strlen(%edi)
|
|
jmp retlab
|
|
|
|
l30: movl %ebx,mval_l_strlen(%edi) # dest. str. len.
|
|
subl $1,%eax # base = src.addr + left ind. - 1
|
|
addl mval_a_straddr(%esi),%eax
|
|
movl %eax,mval_a_straddr(%edi) # string addr.
|
|
retlab: popl %ebx
|
|
popl %esi
|
|
popl %edi
|
|
leave
|
|
ret
|
|
# op_fnzextract ENDP
|
|
|
|
# END
|