diff options
Diffstat (limited to 'src/cep.S')
| -rw-r--r-- | src/cep.S | 53 |
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 |