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 CTrês armadilhas#
| Armadilha | O que acontece |
|---|---|
| o C conta bytes | strlen("café") é 5: o é ocupa dois |
| um zero no meio | o C para ali: "a\x00b" chega como "a" |
| texto alocado pelo C | strdup, getline: quem recebe libera — do lado de cá, com a função de liberar da própria biblioteca |