Isso funciona para mim:
sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'
Isso envolve qualquer sequência de 16 dígitos hexadecimais (apenas em minúsculas) prefixados com “0x”.
Eu tenho um arquivo de origem C ++ com uma grande tabela de constantes. Eles são s-boxes e parecem this :
const word64 T[8][256] =
{
{
0xa832a829d77f9aa8, 0x4352432297d41143, 0x5f3e5fc2df80615f, 0x061e063014121806,
0x6bda6b7f670cb16b, 0x75bc758f2356c975, 0x6cc16c477519ad6c, 0x592059f2cb927959,
0x71a871af3b4ad971, 0xdf84dfb6f8275bdf, 0x87a1874c35b22687, 0x95fb95dc59cc6e95,
...
}
}
Eu preciso envolver cada constante de 18 caracteres em uma macro C assim:
W64LIT(0xa832a829d77f9aa8), W64LIT(0x4352432297d41143), W64LIT(0x5f3e5fc2df80615f), W64LIT(0x061e063014121806)
Eu sei que o sed faz parte da solução, mas estou tendo problemas com o "coincidir com uma parte hexadecimal de 16 dígitos.
Como eu envolvo cada valor hexadecimal de 64 bits na macro W64LIT
?
A razão para a grande mudança é um antigo compilador da Apple encontrado nos PowerMacs. Produz um fluxo de:
g++ -DNDEBUG -g2 -O3 -fPIC -pipe -c kalyna.cpp
kalyna.cpp:432: error: integer constant is too large for 'long' type
kalyna.cpp:509: error: integer constant is too large for 'long' type
kalyna.cpp:608: error: integer constant is too large for 'long' type
kalyna.cpp:713: error: integer constant is too large for 'long' type
...
No entanto, não podemos simplesmente adicionar ULL
porque os primeiros compiladores da Microsoft não conseguem lidar com isso. Então a macro mantém a paz entre os sistemas operacionais.
Tags text-processing sed