Eu tenho um monte das seguintes declarações globais em um arquivo .c:
fi_status_t ACLINFRA_CORE_OK = { { e_FI_STAT_MODULE_ACLINFRA, e_FI_STAT_ACLINFRA_SUBMOD_CORE, e_FI_STATUS_OK }, NULL };
fi_status_t ACLINFRA_CORE_ERR_GDFW_REG_FAILED = { { e_FI_STAT_MODULE_ACLINFRA, e_FI_STAT_ACLINFRA_SUBMOD_CORE, e_CORE_ERR_GDFW_REG_FAILED }, NULL };
fi_status_t ACLINFRA_CORE_ERR_DHAS_REG_FAILED = { { e_FI_STAT_MODULE_ACLINFRA, e_FI_STAT_ACLINFRA_SUBMOD_CORE, e_CORE_ERR_DHAS_REG_FAILED }, NULL };
fi_status_t ACLINFRA_CORE_ERR_GDFW_REQ_FAILED = { { e_FI_STAT_MODULE_ACLINFRA, e_FI_STAT_ACLINFRA_SUBMOD_CORE, e_CORE_ERR_GDFW_REQ_FAILED }, NULL };
Agora, eu puxei e colei em um .h
arquivo. Mas como uso o emacs para convertê-los facilmente nas extern
declarações equivalentes usando query-replace-regexp
?
A declaração externa teria a seguinte aparência:
extern fi_status_t ACLINFRA_CORE_OK;
Substituir:
^\(\w.*?\) *=.*
por:
extern \1;
Explicação: combine linhas começando (
^
) com um constituinte de palavra (\w
) seguido por qualquer número de caracteres que não seja nova linha (.*?
) até a primeira ocorrência de zero ou mais espaços ( *
) seguido por um sinal de igual e mais caracteres além de uma nova linha (=.*
) . A parte da linha até e excluindo os espaços opcionais seguidos do sinal de igual é colocada em um grupo que o texto de substituição pode usar como\1
.Se você tiver inicializadores que abrangem várias linhas, convém remover as linhas que começam com algum espaço em branco, com
M-x flush-lines
no regex^\s-
.