fis-gtm/sr_i386/op_fnzextract.s

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