summaryrefslogtreecommitdiffstats
path: root/src/cep.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/cep.S')
-rw-r--r--src/cep.S53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/cep.S b/src/cep.S
new file mode 100644
index 0000000..8b7661d
--- /dev/null
+++ b/src/cep.S
@@ -0,0 +1,53 @@
+#include "abi.inc"
+#include "defs.inc"
+
+ .text
+
+PUBFUNC cepis_normalize_cep
+ test %rsi, %rsi
+ jz .Lnorm_usage
+ movb $0, (%rsi)
+ test %rdi, %rdi
+ jz .Lnorm_bad
+ xor %ecx, %ecx
+.Lnorm_loop:
+ movzbl (%rdi), %eax
+ inc %rdi
+ test %al, %al
+ jz .Lnorm_done
+ cmp $'-', %al
+ je .Lnorm_loop
+ cmp $'.', %al
+ je .Lnorm_loop
+ cmp $' ', %al
+ je .Lnorm_loop
+ cmp $9, %al
+ jb .Lnorm_digit
+ cmp $13, %al
+ jbe .Lnorm_loop
+.Lnorm_digit:
+ cmp $'0', %al
+ jb .Lnorm_bad
+ cmp $'9', %al
+ ja .Lnorm_bad
+ cmp $8, %rcx
+ jae .Lnorm_bad
+ mov %al, (%rsi, %rcx, 1)
+ inc %rcx
+ jmp .Lnorm_loop
+.Lnorm_done:
+ cmp $8, %rcx
+ jne .Lnorm_bad
+ movb $0, 8(%rsi)
+ xor %eax, %eax
+ ret
+.Lnorm_bad:
+ movb $0, (%rsi)
+ mov $CEPIS_ERR_INVALID_CEP, %eax
+ ret
+.Lnorm_usage:
+ mov $CEPIS_ERR_USAGE, %eax
+ ret
+ENDFUNC cepis_normalize_cep
+
+ .section .note.GNU-stack,"",@progbits