← Documents Documentation/admin-guide/cifs/winucase_convert.pl GitHub 원문 ↗

Linux 6.18.37 · Admin guide

Windows 대문자 매핑 표 변환기

Windows 8 대문자 매핑 표를 상위·하위 바이트로 나눈 2단계 wchar_t C 배열로 변환하는 Perl 생성 도구를 설명합니다.

Source pathDocumentation/admin-guide/cifs/winucase_convert.pl
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

winucase_convert.pl:1-62

Windows 8 대문자 매핑 표를 상위·하위 바이트로 나눈 2단계 wchar_t C 배열로 변환하는 Perl 생성 도구를 설명합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 #!/usr/bin/perl -w
2 #
3 # winucase_convert.pl -- convert "Windows 8 Upper Case Mapping Table.txt" to
4 # a two-level set of C arrays.
5 #
6 # Copyright 2013: Jeff Layton <jlayton@redhat.com>
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <https://www.gnu.org/licenses/>.
20 #
21
22 while(<>) {
23 next if (!/^0x(..)(..)\t0x(....)\t/);
24 $firstchar = hex($1);
25 $secondchar = hex($2);
26 $uppercase = hex($3);
27
28 $top[$firstchar][$secondchar] = $uppercase;
29 }
30
31 for ($i = 0; $i < 256; $i++) {
32 next if (!$top[$i]);
33
34 printf("static const wchar_t t2_%2.2x[256] = {", $i);
35 for ($j = 0; $j < 256; $j++) {
36 if (($j % 8) == 0) {
37 print "\n\t";
38 } else {
39 print " ";
40 }
41 printf("0x%4.4x,", $top[$i][$j] ? $top[$i][$j] : 0);
42 }
43 print "\n};\n\n";
44 }
45
46 printf("static const wchar_t *const toplevel[256] = {", $i);
47 for ($i = 0; $i < 256; $i++) {
48 if (($i % 8) == 0) {
49 print "\n\t";
50 } elsif ($top[$i]) {
51 print " ";
52 } else {
53 print " ";
54 }
55
56 if ($top[$i]) {
57 printf("t2_%2.2x,", $i);
58 } else {
59 print "NULL,";
60 }
61 }
62 print "\n};\n\n";
63

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

목적과 사용 허가

1-20

이 Perl 스크립트 `winucase_convert.pl`은 `Windows 8 Upper Case Mapping Table.txt`를 읽어 2단계 C 배열 집합으로 변환합니다. 첫 줄의 `#!/usr/bin/perl -w`는 Perl 경고를 활성화해 실행하며, 저작권자는 Jeff Layton입니다.

배포 조건은 GNU 일반 공중 사용 허가서(GPL) 버전 3 또는 이후 버전입니다. 유용성을 기대해 배포하지만 상품성이나 특정 목적 적합성에 대한 보증은 없으며, 라이선스 사본을 받지 못했다면 명시된 GNU 웹 주소에서 확인하라는 표준 고지를 포함합니다.

#!/usr/bin/perl -w
#
# winucase_convert.pl -- convert "Windows 8 Upper Case Mapping Table.txt" to
#                        a two-level set of C arrays.
#
#   Copyright 2013: Jeff Layton <jlayton@redhat.com>
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <https://www.gnu.org/licenses/>.
#

입력 행 파싱과 2차원 매핑

21-29

`while (<>)`는 명령줄에 지정된 파일 또는 표준 입력을 한 줄씩 읽습니다. 정규식 `^0x(..)(..) 0x(....) `에 맞지 않는 줄은 `next`로 건너뜁니다. 일치한 입력은 원본 코드 포인트의 상위 바이트 `$1`, 하위 바이트 `$2`, 네 자리 대문자 코드 `$3`을 탭 구분 형식에서 추출합니다.

`hex()`로 각 16진수 문자열을 정수로 바꾼 뒤 `$top[$firstchar][$secondchar] = $uppercase`에 저장합니다. 따라서 `$top`의 첫 번째 인덱스는 원본 코드 포인트의 상위 8비트, 두 번째 인덱스는 하위 8비트이고 값은 대응하는 대문자 코드 포인트입니다.

입력 필드 분해
입력 부분Perl 변수용도
첫 번째 2자리 16진수$firstchar = hex($1)상위 바이트와 1단계 배열 인덱스
두 번째 2자리 16진수$secondchar = hex($2)하위 바이트와 2단계 배열 인덱스
대문자 4자리 16진수$uppercase = hex($3)출력 wchar_t 매핑 값

정규식 캡처와 생성 배열 인덱스의 대응입니다.


while(<>) {
        next if (!/^0x(..)(..)\t0x(....)\t/);
        $firstchar = hex($1);
        $secondchar = hex($2);
        $uppercase = hex($3);

        $top[$firstchar][$secondchar] = $uppercase;
}

2단계 wchar_t 배열 출력

30-44

첫 번째 `for` 루프는 상위 바이트 `$i`를 0부터 255까지 순회하고 `$top[$i]`가 없는 블록은 건너뜁니다. 존재하는 블록마다 `static const wchar_t t2_%2.2x[256]` 형식의 C 배열을 생성하므로 배열 이름에는 상위 바이트가 두 자리 16진수로 들어갑니다.

내부 루프는 하위 바이트 `$j`의 256개 항목을 출력합니다. 8개마다 새 줄과 탭을 넣고 그 밖에는 공백을 넣어 C 초기화 목록을 정렬합니다. 매핑이 있으면 해당 대문자 코드 값을 `0x%4.4x,` 형식으로, 없으면 `0x0000,`으로 출력한 뒤 배열을 닫습니다.

2단계 배열 생성
$i = 0..255$top[$i] 존재 확인t2_XX[256] 시작$j = 0..255매핑 값 또는 0 출력배열 종료

매핑이 존재하는 상위 바이트 블록만 256개 wchar_t 값으로 내보냅니다.


for ($i = 0; $i < 256; $i++) {
        next if (!$top[$i]);

        printf("static const wchar_t t2_%2.2x[256] = {", $i);
        for ($j = 0; $j < 256; $j++) {
                if (($j % 8) == 0) {
                        print "\n\t";
                } else {
                        print " ";
                }
                printf("0x%4.4x,", $top[$i][$j] ? $top[$i][$j] : 0);
        }
        print "\n};\n\n";
}

최상위 포인터 배열 출력

45-62

마지막 부분은 `static const wchar_t *const toplevel[256]` 포인터 배열을 출력합니다. 다시 0부터 255까지 상위 바이트를 순회하며 8개마다 줄을 바꾸고, 해당 블록이 있으면 `t2_XX,`를, 없으면 `NULL,`을 기록합니다.

이 2단계 구조를 사용하면 전체 65,536개 값을 연속 배열로 항상 보관하지 않고, 실제 매핑이 있는 상위 바이트 블록만 256항목 배열로 할당할 수 있습니다. 조회자는 코드 포인트의 상위 바이트로 `toplevel`을 고르고, 포인터가 `NULL`이 아니면 하위 바이트로 `t2_XX`를 인덱싱합니다.

생성되는 C 자료구조
계층출력 형식의미
2단계 값 배열static const wchar_t t2_XX[256]특정 상위 바이트에 속한 하위 바이트별 대문자 값
최상위 포인터static const wchar_t *const toplevel[256]상위 바이트별 2단계 배열 선택
빈 블록NULL해당 상위 바이트에 생성할 매핑 배열이 없음
빈 항목0x0000블록은 존재하지만 해당 하위 바이트 매핑은 없음

스크립트 출력의 두 계층과 빈 블록 표현을 정리합니다.


printf("static const wchar_t *const toplevel[256] = {", $i);
for ($i = 0; $i < 256; $i++) {
        if (($i % 8) == 0) {
                print "\n\t";
        } elsif ($top[$i]) {
                print " ";
        } else {
                print "  ";
        }

        if ($top[$i]) {
                printf("t2_%2.2x,", $i);
        } else {
                print "NULL,";
        }
}
print "\n};\n\n";