Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4720 → Rev 4721

/programs/develop/libraries/utils/trunk/_atof.inc
0,0 → 1,300
;-----------------------------------------------------------------------------+
; ”ã­ªæ¨ï ¯à¥®¡à §®¢ ­¨ï áâப¨ ¢ ¢¥é¥á⢥­­®¥ ç¨á«® [ by ManHunter / PCL ] |
;-----------------------------------------------------------------------------|
;  à ¬¥âàë: |
; lpStr - 㪠§ â¥«ì ­  ¨á室­ãî áâப㠢 ä®à¬ â¥ ASCIIZ |
; lpResult - 㪠§ â¥«ì ­  ¯¥à¥¬¥­­ãî-¯à¨¥¬­¨ª §­ ç¥­¨ï |
;   ¢ë室¥: |
; EAX = 1 - áâப  ãᯥ譮 ¯à¥®¡à §®¢ ­  |
; EAX = 0 - áâப  ­¥ ¬®¦¥â ¡ëâì ¯à¥®¡à §®¢ ­  ¢ ç¨á«® |
;-----------------------------------------------------------------------------+
proc string2float lpStr:DWORD, lpResult:DWORD
; ‹®ª «ì­ë¥ ¯¥à¥¬¥­­ë¥
locals
dot dd ? ; “ª § â¥«ì ­  ¤à®¡­ãî ç áâì
exp dd ? ; “ª § â¥«ì ­  íªá¯®­¥­âã
digit dd ? ; –¨äà 
endl
pusha
; à®¢¥àª  áâப¨ ­  ¢ «¨¤­®áâì
mov [digit],1
mov [exp],0
mov [dot],0
mov esi,[lpStr]
; Œ¨­ãá ¨«¨ ¯«îá ¬®¦¥â ¡ëâì ⮫쪮 ¢ ­ ç «¥
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_chk_loop
@@:
inc esi
; ®á«¥ §­ ª  ­¥ ¬®¦¥â ¡ëâì ­ã«ï
cmp byte [esi],0
je .loc_chk_error
.loc_chk_loop:
; ‚ áâப¥ ¤®«¦­ë ¡ëâì æ¨äà, íªá¯®­¥­â  ¨ ­¥ ¡®«¥¥ ®¤­®© â®çª¨
lodsb
or al,al
jz .loc_chk_complete
cmp al,'e'
je .loc_chk_exp
cmp al,'E'
je .loc_chk_exp
cmp al,'.'
je .loc_chk_dot
cmp al,'0'
jb .loc_chk_error
cmp al,'9'
ja .loc_chk_error
jmp .loc_chk_loop
.loc_chk_dot:
; ’®çª  ¢ áâப¥ 㦥 ¥áâì?
cmp [dot],0
; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
jne .loc_chk_error
; ªá¯®­¥­â  㦥 ¥áâì?
cmp [exp],0
; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
jne .loc_chk_error
; “ª § â¥«ì ­  ¤à®¡­ãî ç áâì
mov [dot],esi
jmp .loc_chk_loop
.loc_chk_exp:
; ªá¯®­¥­â  㦥 ¥áâì?
cmp [exp],0
; ‘âப  ¨¬¥¥â ­¥ª®à४â­ë© ä®à¬ â
jne .loc_chk_error
; “ª § â¥«ì ­  ­ ç «® íªá¯®­¥­âë
mov [exp],esi
; ‘ࠧ㠯®á«¥ íªá¯®­¥­âë ­¥ ¬®¦¥â ¡ëâì ­ã«ï
cmp byte [esi],0
je .loc_chk_error
; ®á«¥ íªá¯®­¥­âë ¬®¦¥â ¡ëâì §­ ª
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_chk_loop
@@:
inc esi
; ‘ࠧ㠯®á«¥ ¬¨­ãá  ­¥ ¬®¦¥â ¡ëâì ­ã«ï
cmp byte [esi],0
je .loc_chk_error
; à®¢¥à¨âì á«¥¤ãî騩 ᨬ¢®«
jmp .loc_chk_loop
.loc_chk_error:
; ‘âப  ­¥ ï¥âáï ç¨á«®¬
mov [digit],0
jmp .loc_ret
.loc_chk_complete:
; ˆ­¨æ¨ «¨§ æ¨ï ᮯà®æ¥áá®à 
finit
;  ç «ì­®¥ §­ ç¥­¨¥ ç¨á« 
fldz
; Œ­®¦¨â¥«ì ¨ ¤¥«¨â¥«ì
mov [digit],10
fild dword [digit]
; ‡ ¯¨áì §­ ç¥­¨© ¤® § ¯ï⮩
mov esi,[lpStr]
; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_before_dot
@@:
inc esi
; à¥®¡à §®¢ ­¨¥ ç¨á«  ¤® § ¯ï⮩
.loc_before_dot:
lodsb
; Š®­¥æ áâப¨?
or al,al
jz .loc_complete
cmp al,'.'
je .loc_complete_before_dot
cmp al,'e'
je .loc_exp
cmp al,'E'
je .loc_exp
; Žç¥à¥¤­ ï æ¨äà 
sub al,'0'
movzx eax,al
mov [digit],eax
; ‡ ¯¨á âì
fild dword [digit]
fxch st2
fmul st0,st1
fxch st2
fadd st2,st0
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
jmp .loc_before_dot
; à¥®¡à §®¢ ­¨¥ ¤à®¡­®© ç á⨠ç¨á« 
.loc_complete_before_dot:
; „஡­ ï ç áâì ¥áâì?
cmp [dot],0
je .loc_complete_after_dot
; ªá¯®­¥­â  ¥áâì?
cmp [exp],0
je @f
; “ª § â¥«ì ­  ­ ç «® íªá¯®­¥­âë
mov esi,[exp]
jmp .loc_start_after_dot
@@:
; ˆ­ ç¥ ¯¥à¥­¥á⨠㪠§ â¥«ì ­  ª®­¥æ áâப¨
xor ecx,ecx
dec ecx
xor eax,eax
mov edi,esi
repne scasb
mov esi,edi
.loc_start_after_dot:
std
dec esi
dec esi
; „஡­ ï ç áâì
fldz
fxch st1
.loc_after_dot:
lodsb
; Š®­¥æ ¤à®¡­®© ç áâ¨?
cmp al,'.'
je .loc_complete_after_dot
; Žç¥à¥¤­ ï æ¨äà 
sub al,'0'
movzx eax,al
mov [digit],eax
; ‡ ¯¨á âì
fild dword [digit]
fadd st2,st0
fxch st2
fdiv st0,st1
fxch st2
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
jmp .loc_after_dot
.loc_complete_after_dot:
; ‘¡à®á¨âì ä« £ ­ ¯à ¢«¥­¨ï
cld
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
; ‘«®¦¨âì ¤à®¡­ãî ¨ 楫ãî ç áâì
fadd st1,st0
.loc_exp:
; ªá¯®­¥­â  ¥áâì?
cmp [exp],0
je .loc_complete
; ®«ãç¨âì §­ ç¥­¨¥ íªá¯®­¥­âë
xor ecx,ecx
mov esi,[exp]
; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
cmp byte [esi],'-'
je @f
cmp byte [esi],'+'
jne .loc_start_exp
@@:
inc esi
.loc_start_exp:
lodsb
or al,al
jz .loc_end_exp
sub al,'0'
movzx eax,al
imul ecx,10
add ecx,eax
jmp .loc_start_exp
.loc_end_exp:
or ecx,ecx
jz .loc_complete
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
mov [digit],10
fild dword [digit]
; „¥«¨âì ¨«¨ 㬭®¦ âì?
mov esi,[exp]
cmp byte [esi],'-'
je .loc_exp_divide
.loc_exp_multiple:
fmul st1,st0
loop .loc_exp_multiple
jmp .loc_complete
.loc_exp_divide:
fdiv st1,st0
loop .loc_exp_divide
.loc_complete:
ffree st0 ; ®ç¨áâ¨âì á⥪
fincstp
; ‚ ­ ç «¥ áâப¨ ¬¨­ãá?
mov esi,[lpStr]
cmp byte [esi],'-'
jne @f
; ˆ§¬¥­¨âì §­ ª ç¨á« 
fchs
@@:
; ‡ ¯¨á âì §­ ç¥­¨¥ ¢ ï祩ªã ¯ ¬ïâ¨
mov eax,[lpResult]
; …᫨ âॡã¥âáï ¯®¢ë襭­ ï â®ç­®áâì, â® ¯à¨¥¬­¨ª
; ¤®«¦¥­ ¨¬¥âì à §¬¥à QWORD,   á«¥¤ãîéãî ª®¬ ­¤ã
; ­ ¤® § ¬¥­¨âì ­  fstp qword [eax]
fstp tword [eax]
; “ᯥ譮¥ ¯à¥®¡à §®¢ ­¨¥
mov [digit],1
.loc_ret:
popa
; ¥§ã«ìâ â ¯à¥®¡à §®¢ ­¨ï
mov eax,[digit]
ret
endp