Pular para o conteúdo

Textos e char*

UTF-8 na ida, o NULL que vira void na volta, e o texto que o C alocou e alguém precisa liberar.

No C, texto é um ponteiro para bytes terminados em zero — sem codificação declarada e sem tamanho. Declarado como texto, o parâmetro vai em UTF-8 com o zero no fim, e o retorno volta como texto da linguagem, lido até o primeiro zero.

dataforge
adopt Arcane.C as C

libc := C.padrao()
tamanho := libc.funcao("strlen", ["texto"], "tamanho")
comparar := libc.funcao("strcmp", ["texto", "texto"], "i32")
ambiente := libc.funcao("getenv", ["texto"], "texto")

assert tamanho("café") is 5                       // BYTES em UTF-8, não letras
assert comparar("abc", "abd") smaller 0
assert ambiente("NAO_EXISTE_DE_JEITO_NENHUM") is void   // o NULL do C

Três armadilhas#

ArmadilhaO que acontece
o C conta bytesstrlen("café") é 5: o é ocupa dois
um zero no meioo C para ali: "a\x00b" chega como "a"
texto alocado pelo Cstrdup, getline: quem recebe libera — do lado de cá, com a função de liberar da própria biblioteca