#include "abi.inc" #include "defs.inc" .text FUNC cepis__addr_field_offset PROLOGUE 24 mov %rdi, %rbx lea cepis__addr_fields(%rip), %r12 .Lfo_loop: mov (%r12), %rsi test %rsi, %rsi jz .Lfo_none mov %rbx, %rdi call strcmp@PLT test %eax, %eax jz .Lfo_hit add $16, %r12 jmp .Lfo_loop .Lfo_hit: mov 8(%r12), %rax EPILOGUE ret .Lfo_none: mov $-1, %rax EPILOGUE ret ENDFUNC cepis__addr_field_offset FUNC cepis__addr_set PROLOGUE 24 mov %rdi, %rbx mov %rsi, %r12 mov %rdx, %r13 mov (%rbx, %r12, 1), %rdi test %rdi, %rdi jz .Lset_store call free@PLT .Lset_store: mov %r13, (%rbx, %r12, 1) EPILOGUE ret ENDFUNC cepis__addr_set FUNC cepis__address_new PROLOGUE 24 mov $1, %rdi mov $A_SIZE, %rsi call calloc@PLT test %rax, %rax jz .Lanew_out mov %rax, %rbx xor %r12d, %r12d .Lanew_loop: cmp $(A_NFIELDS * 8), %r12 jae .Lanew_done call cepis__empty test %rax, %rax jz .Lanew_fail mov %rax, (%rbx, %r12, 1) add $8, %r12 jmp .Lanew_loop .Lanew_done: mov %rbx, %rax .Lanew_out: EPILOGUE ret .Lanew_fail: mov %rbx, %rdi call cepis_address_free xor %eax, %eax EPILOGUE ret ENDFUNC cepis__address_new PUBFUNC cepis_address_free PROLOGUE 24 test %rdi, %rdi jz .Lafree_out mov %rdi, %rbx xor %r12d, %r12d .Lafree_loop: cmp $(A_NFIELDS * 8), %r12 jae .Lafree_geo mov (%rbx, %r12, 1), %rdi test %rdi, %rdi jz .Lafree_next call free@PLT .Lafree_next: add $8, %r12 jmp .Lafree_loop .Lafree_geo: mov A_GEO(%rbx), %r13 test %r13, %r13 jz .Lafree_raw mov GEO_PRECISAO(%r13), %rdi test %rdi, %rdi jz .Lafree_geo_self call free@PLT .Lafree_geo_self: mov %r13, %rdi call free@PLT .Lafree_raw: mov A_RAW(%rbx), %rdi test %rdi, %rdi jz .Lafree_self call free@PLT .Lafree_self: mov %rbx, %rdi call free@PLT .Lafree_out: EPILOGUE ret ENDFUNC cepis_address_free PUBFUNC cepis_address_list_free PROLOGUE 24 test %rdi, %rdi jz .Llfree_out mov %rdi, %rbx mov %rsi, %r12 xor %r13d, %r13d .Llfree_loop: cmp %r12, %r13 jae .Llfree_self mov (%rbx, %r13, 8), %rdi call cepis_address_free inc %r13 jmp .Llfree_loop .Llfree_self: mov %rbx, %rdi call free@PLT .Llfree_out: EPILOGUE ret ENDFUNC cepis_address_list_free PUBFUNC cepis_health_free PROLOGUE 24 test %rdi, %rdi jz .Lhfree_out mov %rdi, %rbx mov H_STATUS(%rbx), %rdi test %rdi, %rdi jz .Lhfree_1 call free@PLT .Lhfree_1: mov H_DNE(%rbx), %rdi test %rdi, %rdi jz .Lhfree_2 call free@PLT .Lhfree_2: mov H_BASE_GERADA(%rbx), %rdi test %rdi, %rdi jz .Lhfree_3 call free@PLT .Lhfree_3: mov H_RAW(%rbx), %rdi test %rdi, %rdi jz .Lhfree_self call free@PLT .Lhfree_self: mov %rbx, %rdi call free@PLT .Lhfree_out: EPILOGUE ret ENDFUNC cepis_health_free PUBFUNC cepis_geo_is_precise xor %eax, %eax test %rdi, %rdi jz .Lprec_out mov GEO_PRECISAO(%rdi), %rdi test %rdi, %rdi jz .Lprec_out lea .Ls_logradouro_val(%rip), %rsi jmp cepis__streq_tail .Lprec_out: ret ENDFUNC cepis_geo_is_precise FUNC cepis__streq_tail PROLOGUE 8 call strcmp@PLT test %eax, %eax jz .Lseq_yes xor %eax, %eax EPILOGUE ret .Lseq_yes: mov $1, %eax EPILOGUE ret ENDFUNC cepis__streq_tail PUBFUNC cepis_address_formatted_cep test %rsi, %rsi jz .Lfmt_out movb $0, (%rsi) test %rdi, %rdi jz .Lfmt_out mov A_CEP(%rdi), %rdi test %rdi, %rdi jz .Lfmt_out xor %ecx, %ecx xor %edx, %edx .Lfmt_loop: cmp $9, %rcx jae .Lfmt_end movzbl (%rdi, %rcx, 1), %eax test %al, %al jz .Lfmt_end cmp $5, %rcx jne .Lfmt_put movb $'-', (%rsi, %rdx, 1) inc %rdx .Lfmt_put: mov %al, (%rsi, %rdx, 1) inc %rdx inc %rcx jmp .Lfmt_loop .Lfmt_end: movb $0, (%rsi, %rdx, 1) .Lfmt_out: ret ENDFUNC cepis_address_formatted_cep FUNC cepis__geo_parse PROLOGUE 88 mov %rsi, %r14 movq $0, (%r14) movq $0, LOCAL3(%rbp) xor %r15d, %r15d cmpb $'{', (%rdi) jne .Lgeo_fail lea 1(%rdi), %rdi call cepis__js_ws mov %rax, %rbx cmpb $'}', (%rbx) je .Lgeo_finish .Lgeo_pair: cmpb $'"', (%rbx) jne .Lgeo_fail mov %rbx, %rdi lea LOCAL4(%rbp), %rsi call cepis__js_string test %rax, %rax jz .Lgeo_fail mov %rax, %rdi call cepis__js_ws mov %rax, %rbx cmpb $':', (%rbx) jne .Lgeo_fail_key inc %rbx mov LOCAL4(%rbp), %rdi lea .Ls_lat(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lgeo_lat mov LOCAL4(%rbp), %rdi lea .Ls_lon(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lgeo_lon mov LOCAL4(%rbp), %rdi lea .Ls_raio_m(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lgeo_raio mov LOCAL4(%rbp), %rdi lea .Ls_precisao(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lgeo_prec mov %rbx, %rdi call cepis__js_skip jmp .Lgeo_after .Lgeo_lat: mov %rbx, %rdi lea LOCAL0(%rbp), %rsi call cepis__js_number or $1, %r15d jmp .Lgeo_after .Lgeo_lon: mov %rbx, %rdi lea LOCAL1(%rbp), %rsi call cepis__js_number or $2, %r15d jmp .Lgeo_after .Lgeo_raio: mov %rbx, %rdi lea LOCAL2(%rbp), %rsi call cepis__js_number or $4, %r15d jmp .Lgeo_after .Lgeo_prec: mov LOCAL3(%rbp), %rdi test %rdi, %rdi jz .Lgeo_prec_go call free@PLT movq $0, LOCAL3(%rbp) .Lgeo_prec_go: mov %rbx, %rdi lea LOCAL3(%rbp), %rsi call cepis__js_scalar_text or $8, %r15d .Lgeo_after: mov %rax, %r12 mov LOCAL4(%rbp), %rdi call free@PLT movq $0, LOCAL4(%rbp) test %r12, %r12 jz .Lgeo_fail mov %r12, %rdi call cepis__js_ws mov %rax, %rbx cmpb $',', (%rbx) je .Lgeo_comma cmpb $'}', (%rbx) je .Lgeo_finish jmp .Lgeo_fail .Lgeo_comma: lea 1(%rbx), %rdi call cepis__js_ws mov %rax, %rbx jmp .Lgeo_pair .Lgeo_finish: cmp $15, %r15d jne .Lgeo_fail cmpq $0, LOCAL3(%rbp) je .Lgeo_fail mov $1, %rdi mov $GEO_SIZE, %rsi call calloc@PLT test %rax, %rax jz .Lgeo_fail mov %rax, %rbx movsd LOCAL0(%rbp), %xmm0 movsd %xmm0, GEO_LAT(%rbx) movsd LOCAL1(%rbp), %xmm0 movsd %xmm0, GEO_LON(%rbx) cvttsd2si LOCAL2(%rbp), %rax mov %rax, GEO_RAIO_M(%rbx) mov LOCAL3(%rbp), %rax mov %rax, GEO_PRECISAO(%rbx) movq $0, LOCAL3(%rbp) mov %rbx, (%r14) EPILOGUE ret .Lgeo_fail_key: mov LOCAL4(%rbp), %rdi call free@PLT .Lgeo_fail: mov LOCAL3(%rbp), %rdi test %rdi, %rdi jz .Lgeo_fail_out call free@PLT .Lgeo_fail_out: EPILOGUE ret ENDFUNC cepis__geo_parse FUNC cepis__address_from_json PROLOGUE 40 mov %rsi, %r14 movq $0, (%r14) mov %rdi, %r15 call cepis__address_new test %rax, %rax jz .Lafj_nomem mov %rax, %rbx mov %r15, %rdi call cepis__strdup test %rax, %rax jz .Lafj_nomem_free mov %rax, A_RAW(%rbx) mov %r15, %rdi call cepis__js_ws mov %rax, %r12 cmpb $'{', (%r12) jne .Lafj_invalid lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 cmpb $'}', (%r12) je .Lafj_ok .Lafj_pair: cmpb $'"', (%r12) jne .Lafj_invalid mov %r12, %rdi lea LOCAL0(%rbp), %rsi call cepis__js_string test %rax, %rax jz .Lafj_invalid mov %rax, %rdi call cepis__js_ws mov %rax, %r12 cmpb $':', (%r12) jne .Lafj_invalid_key lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 mov LOCAL0(%rbp), %rdi lea .Ls_geo(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lafj_geo mov LOCAL0(%rbp), %rdi call cepis__addr_field_offset cmp $0, %rax jl .Lafj_unknown mov %rax, %r13 movzbl (%r12), %eax cmp $'{', %al je .Lafj_unknown cmp $'[', %al je .Lafj_unknown mov %r12, %rdi lea LOCAL1(%rbp), %rsi call cepis__js_scalar_text test %rax, %rax jz .Lafj_invalid_key mov %rax, %r12 mov %rbx, %rdi mov %r13, %rsi mov LOCAL1(%rbp), %rdx call cepis__addr_set jmp .Lafj_next .Lafj_unknown: mov %r12, %rdi call cepis__js_skip test %rax, %rax jz .Lafj_invalid_key mov %rax, %r12 jmp .Lafj_next .Lafj_geo: mov %r12, %rdi call cepis__js_skip test %rax, %rax jz .Lafj_invalid_key mov %rax, %r13 cmpb $'{', (%r12) jne .Lafj_geo_done mov %r12, %rdi lea LOCAL2(%rbp), %rsi call cepis__geo_parse mov LOCAL2(%rbp), %rax test %rax, %rax jz .Lafj_geo_done mov %rax, A_GEO(%rbx) .Lafj_geo_done: mov %r13, %r12 .Lafj_next: mov LOCAL0(%rbp), %rdi call free@PLT movq $0, LOCAL0(%rbp) mov %r12, %rdi call cepis__js_ws mov %rax, %r12 cmpb $',', (%r12) je .Lafj_comma cmpb $'}', (%r12) je .Lafj_ok jmp .Lafj_invalid .Lafj_comma: lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 jmp .Lafj_pair .Lafj_ok: mov %rbx, (%r14) xor %eax, %eax EPILOGUE ret .Lafj_invalid_key: mov LOCAL0(%rbp), %rdi call free@PLT .Lafj_invalid: mov %rbx, %rdi call cepis_address_free mov $CEPIS_ERR_INVALID_RESPONSE, %eax EPILOGUE ret .Lafj_nomem_free: mov %rbx, %rdi call cepis_address_free .Lafj_nomem: mov $CEPIS_ERR_NOMEM, %eax EPILOGUE ret ENDFUNC cepis__address_from_json FUNC cepis__health_from_json PROLOGUE 40 mov %rsi, %r14 movq $0, (%r14) mov %rdi, %r15 mov $1, %rdi mov $H_SIZE, %rsi call calloc@PLT test %rax, %rax jz .Lhfj_nomem mov %rax, %rbx call cepis__empty test %rax, %rax jz .Lhfj_nomem_free mov %rax, H_STATUS(%rbx) call cepis__empty test %rax, %rax jz .Lhfj_nomem_free mov %rax, H_DNE(%rbx) call cepis__empty test %rax, %rax jz .Lhfj_nomem_free mov %rax, H_BASE_GERADA(%rbx) mov %r15, %rdi call cepis__strdup test %rax, %rax jz .Lhfj_nomem_free mov %rax, H_RAW(%rbx) mov %r15, %rdi call cepis__js_ws mov %rax, %r12 cmpb $'{', (%r12) jne .Lhfj_invalid lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 cmpb $'}', (%r12) je .Lhfj_ok .Lhfj_pair: cmpb $'"', (%r12) jne .Lhfj_invalid mov %r12, %rdi lea LOCAL0(%rbp), %rsi call cepis__js_string test %rax, %rax jz .Lhfj_invalid mov %rax, %rdi call cepis__js_ws mov %rax, %r12 cmpb $':', (%r12) jne .Lhfj_invalid_key lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 mov LOCAL0(%rbp), %rdi lea .Ls_status(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lhfj_status mov LOCAL0(%rbp), %rdi lea .Ls_dne(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lhfj_dne mov LOCAL0(%rbp), %rdi lea .Ls_base_gerada(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lhfj_base mov LOCAL0(%rbp), %rdi lea .Ls_ceps(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lhfj_ceps mov LOCAL0(%rbp), %rdi lea .Ls_geo(%rip), %rsi call strcmp@PLT test %eax, %eax jz .Lhfj_geo mov %r12, %rdi call cepis__js_skip test %rax, %rax jz .Lhfj_invalid_key mov %rax, %r12 jmp .Lhfj_next .Lhfj_status: mov $H_STATUS, %r13 jmp .Lhfj_text .Lhfj_dne: mov $H_DNE, %r13 jmp .Lhfj_text .Lhfj_base: mov $H_BASE_GERADA, %r13 .Lhfj_text: movzbl (%r12), %eax cmp $'{', %al je .Lhfj_skipval cmp $'[', %al je .Lhfj_skipval mov %r12, %rdi lea LOCAL1(%rbp), %rsi call cepis__js_scalar_text test %rax, %rax jz .Lhfj_invalid_key mov %rax, %r12 mov (%rbx, %r13, 1), %rdi call free@PLT mov LOCAL1(%rbp), %rax mov %rax, (%rbx, %r13, 1) jmp .Lhfj_next .Lhfj_skipval: mov %r12, %rdi call cepis__js_skip test %rax, %rax jz .Lhfj_invalid_key mov %rax, %r12 jmp .Lhfj_next .Lhfj_ceps: mov $H_CEPS, %r13 jmp .Lhfj_int .Lhfj_geo: mov $H_GEO, %r13 .Lhfj_int: movzbl (%r12), %eax cmp $'{', %al je .Lhfj_skipval cmp $'[', %al je .Lhfj_skipval mov %r12, %rdi lea LOCAL1(%rbp), %rsi call cepis__js_number test %rax, %rax jz .Lhfj_skipval mov %rax, %r12 cvttsd2si LOCAL1(%rbp), %rax mov %rax, (%rbx, %r13, 1) .Lhfj_next: mov LOCAL0(%rbp), %rdi call free@PLT movq $0, LOCAL0(%rbp) mov %r12, %rdi call cepis__js_ws mov %rax, %r12 cmpb $',', (%r12) je .Lhfj_comma cmpb $'}', (%r12) je .Lhfj_ok jmp .Lhfj_invalid .Lhfj_comma: lea 1(%r12), %rdi call cepis__js_ws mov %rax, %r12 jmp .Lhfj_pair .Lhfj_ok: mov %rbx, (%r14) xor %eax, %eax EPILOGUE ret .Lhfj_invalid_key: mov LOCAL0(%rbp), %rdi call free@PLT .Lhfj_invalid: mov %rbx, %rdi call cepis_health_free mov $CEPIS_ERR_INVALID_RESPONSE, %eax EPILOGUE ret .Lhfj_nomem_free: mov %rbx, %rdi call cepis_health_free .Lhfj_nomem: mov $CEPIS_ERR_NOMEM, %eax EPILOGUE ret ENDFUNC cepis__health_from_json .section .rodata .Ls_cep: .asciz "cep" .Ls_logradouro: .asciz "logradouro" .Ls_complemento: .asciz "complemento" .Ls_unidade: .asciz "unidade" .Ls_bairro: .asciz "bairro" .Ls_localidade: .asciz "localidade" .Ls_uf: .asciz "uf" .Ls_estado: .asciz "estado" .Ls_regiao: .asciz "regiao" .Ls_ibge: .asciz "ibge" .Ls_gia: .asciz "gia" .Ls_ddd: .asciz "ddd" .Ls_siafi: .asciz "siafi" .Ls_geo: .asciz "geo" .Ls_lat: .asciz "lat" .Ls_lon: .asciz "lon" .Ls_raio_m: .asciz "raio_m" .Ls_precisao: .asciz "precisao" .Ls_status: .asciz "status" .Ls_dne: .asciz "dne" .Ls_ceps: .asciz "ceps" .Ls_base_gerada: .asciz "base_gerada_em" .Ls_logradouro_val: .asciz "logradouro" .section .data.rel.ro,"aw",@progbits .p2align 3 .globl cepis__addr_fields .hidden cepis__addr_fields cepis__addr_fields: .quad .Ls_cep, A_CEP .quad .Ls_logradouro, A_LOGRADOURO .quad .Ls_complemento, A_COMPLEMENTO .quad .Ls_unidade, A_UNIDADE .quad .Ls_bairro, A_BAIRRO .quad .Ls_localidade, A_LOCALIDADE .quad .Ls_uf, A_UF .quad .Ls_estado, A_ESTADO .quad .Ls_regiao, A_REGIAO .quad .Ls_ibge, A_IBGE .quad .Ls_gia, A_GIA .quad .Ls_ddd, A_DDD .quad .Ls_siafi, A_SIAFI .quad 0, 0 .section .note.GNU-stack,"",@progbits