aboutsummaryrefslogtreecommitdiff
path: root/ft_atoi_base.s
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-11-22 21:20:22 +0100
committerCharles <sircharlesaze@gmail.com>2019-11-22 21:20:22 +0100
commit8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb (patch)
tree13b1910aee2a8c9a73af3ad2042cd78e4a0a9e90 /ft_atoi_base.s
parentef74d8b236ba8c62ddb190ce64ea3d8b593ad1eb (diff)
downloadlibasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.tar.gz
libasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.tar.bz2
libasm-8e3a5ac569a3ccc1101b58fe8ef673f02b4961fb.zip
ft_atoi_base without the actual base, ft_list_push_front, ft_list_size
Diffstat (limited to 'ft_atoi_base.s')
-rw-r--r--ft_atoi_base.s114
1 files changed, 87 insertions, 27 deletions
diff --git a/ft_atoi_base.s b/ft_atoi_base.s
index bc675af..6245765 100644
--- a/ft_atoi_base.s
+++ b/ft_atoi_base.s
@@ -6,53 +6,113 @@
# By: cacharle <marvin@42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2019/11/22 03:59:15 by cacharle #+# #+# #
-# Updated: 2019/11/22 05:20:12 by cacharle ### ########.fr #
+# Updated: 2019/11/22 21:18:08 by cacharle ### ########.fr #
# #
# **************************************************************************** #
.globl _ft_atoi_base
+.globl _check_base
+# int ft_atoi_base(const char*, const char*);
_ft_atoi_base:
+ push rbp # save previous stackframe
+ mov rbp, rsp # create new one
+
mov rbx, rdi # rbx = str
mov rcx, rsi # rcx = base
- xor rdx, rdx # rdx = 0
-
- # remove spaces
- FT_ATOI_BASE_SPACE_LOOP:
- cmp byte ptr [rbx], 20h # if space jump next
- je NEXT
+ mov rdi, rcx
+ call _check_base
+ cmp rax, 0
+ je CHECK_BASE_ERROR
- mov dl, byte ptr [rbx] # if \t\n\r\v\f jump next
- sub dl, 9h
- cmp dl, 5h
- jl NEXT
+ mov rdi, rcx
+ call _ft_strlen
+ #mov r8, rax # r8 = radix
+ #mov rax, r8
- jmp FT_ATOI_BASE_SPACE_LOOP_END # if all above false end loop
- NEXT: # next iteration
- inc rbx
- jmp FT_ATOI_BASE_SPACE_LOOP
+ xor rdx, rdx # rdx = 0
+ FT_ATOI_BASE_SPACE_LOOP: # remove spaces
+ mov rdi, [rbx]
+ call ft_isspace
+ cmp rax, 1
+ jne FT_ATOI_BASE_SPACE_LOOP_END
+ inc rbx
+ jmp FT_ATOI_BASE_SPACE_LOOP
FT_ATOI_BASE_SPACE_LOOP_END:
xor rax, rax # rax = 0
xor rdx, rdx # rdx = 0
-
FT_ATOI_BASE_LOOP:
- # while isdigit
- cmp byte ptr [rbx], 30h
- jl FT_ATOI_BASE_END # if *rbx < '0' jmp end
+ cmp byte ptr [rbx], 30h # while isdigit
+ jl FT_ATOI_BASE_END # if *rbx < '0' jmp end
cmp byte ptr [rbx], 39h
- ja FT_ATOI_BASE_END # if *rbx > '9' jmp end
+ ja FT_ATOI_BASE_END # if *rbx > '9' jmp end
- imul eax, 10 # eax *= 10
- # dl = *str & 0x0F
+ imul eax, 10 # eax *= 10, shift previous digits
mov dl, byte ptr [rbx]
- and dl, 0x0F
- add eax, edx # eax += dl (digit)
- inc rbx # next char
+ and dl, 0x0F # char to digit
+ add eax, edx # insert as first digit
+ inc rbx
jmp FT_ATOI_BASE_LOOP
-
FT_ATOI_BASE_END:
- ret
+ pop rbp
+ ret
+_base_pos:
+ mov rcx, rsi
+ xor rax, rax
+ BASE_POS_LOOP:
+ cmp byte ptr [rdi + rax], 0
+ je BASE_POS_NOT_FOUND
+ cmp cl, byte ptr [rdi + rax]
+ je BASE_POS_FOUND
+ inc eax
+ jmp BASE_POS_LOOP
+ BASE_POS_NOT_FOUND:
+ mov eax, 0xFFFFFFFF
+ BASE_POS_FOUND:
+ ret
+_check_base:
+ push rbx
+ mov rbx, rsp
+
+ mov rbx, rdi # rbx = str
+
+ call _ft_strlen # f strlen(rbx) < 2
+ cmp eax, 2
+ jl CHECK_BASE_ERROR
+
+ CHECK_BASE_LOOP:
+ cmp byte ptr [rbx], 2bh # *rbx == '-' || *rbx == '+'
+ je CHECK_BASE_ERROR
+ cmp byte ptr [rbx], 2dh
+ je CHECK_BASE_ERROR
+ call ft_isspace
+ cmp rax, 1
+ je CHECK_BASE_ERROR
+
+ inc rbx
+ cmp byte ptr [rbx], 0h
+ jne CHECK_BASE_LOOP
+ mov rax, 1
+ pop rbx
+ ret
+ CHECK_BASE_ERROR:
+ xor rax, rax
+ pop rbx
+ ret
+
+ft_isspace:
+ cmp byte ptr [rdi], 20h # if space jump next
+ je ISSPACE_TRUE_END
+ mov dl, byte ptr [rdi] # if \t\n\r\v\f jump next
+ sub dl, 9h
+ cmp dl, 5h
+ jl ISSPACE_TRUE_END
+ xor rax, rax
+ ret
+ ISSPACE_TRUE_END:
+ mov rax, 1
+ ret