16진수 상수 테이블을 변환하려면 sed를 사용하시겠습니까?

16진수 상수 테이블을 변환하려면 sed를 사용하시겠습니까?

큰 상수 테이블이 포함된 C++ 소스 파일이 있습니다. 그들은 S 상자이고 다음과 같습니다.이것:

const word64 T[8][256] =
{
    {
        0xa832a829d77f9aa8, 0x4352432297d41143, 0x5f3e5fc2df80615f, 0x061e063014121806,
        0x6bda6b7f670cb16b, 0x75bc758f2356c975, 0x6cc16c477519ad6c, 0x592059f2cb927959,
        0x71a871af3b4ad971, 0xdf84dfb6f8275bdf, 0x87a1874c35b22687, 0x95fb95dc59cc6e95,
        ...
    }
}

다음과 같이 C 매크로에서 각 18자 상수를 래핑해야 합니다.

W64LIT(0xa832a829d77f9aa8), W64LIT(0x4352432297d41143), W64LIT(0x5f3e5fc2df80615f), W64LIT(0x061e063014121806)

sed가 솔루션의 일부라는 것을 알고 있지만 "16비트 16진수 부분 일치"에 문제가 있습니다.

매크로에서 각 64비트 16진수 값을 어떻게 래핑할 수 있나요 W64LIT?


큰 변화의 이유는 PowerMac의 오래된 Apple 컴파일러 때문입니다. 스트림을 생성합니다.

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
...

ULL그러나 이전 Microsoft 컴파일러에서는 이를 처리할 수 없었기 때문에 단순히 추가할 수는 없습니다 . 따라서 매크로는 운영 체제 간의 평화를 유지합니다.

답변1

이것은 나에게 효과적입니다.

sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'

여기에는 "0x"라는 접두사가 붙은 16개의 16진수(소문자만) 시퀀스가 ​​포함됩니다.

관련 정보