ホーム › Globalization › UCPTrie
UCPTrie
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| index | WORD* | 8/4 | +0 | +0 | コードポイントからデータへ写像するインデックス配列。 |
| data | UCPTrieData | 8/4 | +8 | +4 | 値幅に応じたデータ配列を表す共用体UCPTrieData。 |
| indexLength | INT | 4 | +16 | +8 | インデックス配列の要素数。 |
| dataLength | INT | 4 | +20 | +12 | データ配列の要素数。 |
| highStart | INT | 4 | +24 | +16 | 高位範囲が始まるコードポイント。これ以上はnullValue扱い。 |
| shifted12HighStart | WORD | 2 | +28 | +20 | highStartを12ビット右シフトした値。 |
| type | CHAR | 1 | +30 | +22 | トライの型(高速か小型か)を示す値。 |
| valueWidth | CHAR | 1 | +31 | +23 | データ値のビット幅(8/16/32)を示す値。 |
| reserved32 | DWORD | 4 | +32 | +24 | 32ビット予約フィールド。 |
| reserved16 | WORD | 2 | +36 | +28 | 16ビット予約フィールド。 |
| index3NullOffset | WORD | 2 | +38 | +30 | index-3のnullブロックへのオフセット。 |
| dataNullOffset | INT | 4 | +40 | +32 | データ配列のnullブロックへのオフセット。 |
| nullValue | DWORD | 4 | +44 | +36 | 範囲外コードポイントに返す既定値。 |
各言語での定義
#include <windows.h>
// UCPTrieData (x64 8 / x86 4 バイト)
typedef struct UCPTrieData {
void* ptr0;
WORD* ptr16;
DWORD* ptr32;
BYTE* ptr8;
} UCPTrieData;
// UCPTrie (x64 48 / x86 40 バイト)
typedef struct UCPTrie {
WORD* index;
UCPTrieData data;
INT indexLength;
INT dataLength;
INT highStart;
WORD shifted12HighStart;
CHAR type;
CHAR valueWidth;
DWORD reserved32;
WORD reserved16;
WORD index3NullOffset;
INT dataNullOffset;
DWORD nullValue;
} UCPTrie;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UCPTrieData
{
public IntPtr ptr0;
public IntPtr ptr16;
public IntPtr ptr32;
public IntPtr ptr8;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct UCPTrie
{
public IntPtr index;
public UCPTrieData data;
public int indexLength;
public int dataLength;
public int highStart;
public ushort shifted12HighStart;
public sbyte type;
public sbyte valueWidth;
public uint reserved32;
public ushort reserved16;
public ushort index3NullOffset;
public int dataNullOffset;
public uint nullValue;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure UCPTrieData
Public ptr0 As IntPtr
Public ptr16 As IntPtr
Public ptr32 As IntPtr
Public ptr8 As IntPtr
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure UCPTrie
Public index As IntPtr
Public data As UCPTrieData
Public indexLength As Integer
Public dataLength As Integer
Public highStart As Integer
Public shifted12HighStart As UShort
Public type As SByte
Public valueWidth As SByte
Public reserved32 As UInteger
Public reserved16 As UShort
Public index3NullOffset As UShort
Public dataNullOffset As Integer
Public nullValue As UInteger
End Structureimport ctypes
from ctypes import wintypes
class UCPTrieData(ctypes.Structure):
_fields_ = [
("ptr0", ctypes.c_void_p),
("ptr16", ctypes.c_void_p),
("ptr32", ctypes.c_void_p),
("ptr8", ctypes.c_void_p),
]
class UCPTrie(ctypes.Structure):
_fields_ = [
("index", ctypes.c_void_p),
("data", UCPTrieData),
("indexLength", ctypes.c_int),
("dataLength", ctypes.c_int),
("highStart", ctypes.c_int),
("shifted12HighStart", ctypes.c_ushort),
("type", ctypes.c_byte),
("valueWidth", ctypes.c_byte),
("reserved32", wintypes.DWORD),
("reserved16", ctypes.c_ushort),
("index3NullOffset", ctypes.c_ushort),
("dataNullOffset", ctypes.c_int),
("nullValue", wintypes.DWORD),
]#[repr(C)]
pub struct UCPTrieData {
pub ptr0: *mut core::ffi::c_void,
pub ptr16: *mut core::ffi::c_void,
pub ptr32: *mut core::ffi::c_void,
pub ptr8: *mut core::ffi::c_void,
}
#[repr(C)]
pub struct UCPTrie {
pub index: *mut core::ffi::c_void,
pub data: UCPTrieData,
pub indexLength: i32,
pub dataLength: i32,
pub highStart: i32,
pub shifted12HighStart: u16,
pub type: i8,
pub valueWidth: i8,
pub reserved32: u32,
pub reserved16: u16,
pub index3NullOffset: u16,
pub dataNullOffset: i32,
pub nullValue: u32,
}import "golang.org/x/sys/windows"
type UCPTrieData struct {
ptr0 uintptr
ptr16 uintptr
ptr32 uintptr
ptr8 uintptr
}
type UCPTrie struct {
index uintptr
data UCPTrieData
indexLength int32
dataLength int32
highStart int32
shifted12HighStart uint16
type int8
valueWidth int8
reserved32 uint32
reserved16 uint16
index3NullOffset uint16
dataNullOffset int32
nullValue uint32
}type
UCPTrieData = record
ptr0: Pointer;
ptr16: Pointer;
ptr32: Pointer;
ptr8: Pointer;
end;
UCPTrie = record
index: Pointer;
data: UCPTrieData;
indexLength: Integer;
dataLength: Integer;
highStart: Integer;
shifted12HighStart: Word;
type: Shortint;
valueWidth: Shortint;
reserved32: DWORD;
reserved16: Word;
index3NullOffset: Word;
dataNullOffset: Integer;
nullValue: DWORD;
end;const UCPTrieData = extern struct {
ptr0: ?*anyopaque,
ptr16: ?*anyopaque,
ptr32: ?*anyopaque,
ptr8: ?*anyopaque,
};
const UCPTrie = extern struct {
index: ?*anyopaque,
data: UCPTrieData,
indexLength: i32,
dataLength: i32,
highStart: i32,
shifted12HighStart: u16,
type: i8,
valueWidth: i8,
reserved32: u32,
reserved16: u16,
index3NullOffset: u16,
dataNullOffset: i32,
nullValue: u32,
};type
UCPTrieData {.bycopy.} = object
ptr0: pointer
ptr16: pointer
ptr32: pointer
ptr8: pointer
UCPTrie {.bycopy.} = object
index: pointer
data: UCPTrieData
indexLength: int32
dataLength: int32
highStart: int32
shifted12HighStart: uint16
type: int8
valueWidth: int8
reserved32: uint32
reserved16: uint16
index3NullOffset: uint16
dataNullOffset: int32
nullValue: uint32struct UCPTrieData
{
void* ptr0;
void* ptr16;
void* ptr32;
void* ptr8;
}
struct UCPTrie
{
void* index;
UCPTrieData data;
int indexLength;
int dataLength;
int highStart;
ushort shifted12HighStart;
byte type;
byte valueWidth;
uint reserved32;
ushort reserved16;
ushort index3NullOffset;
int dataNullOffset;
uint nullValue;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; UCPTrie サイズ: 40 バイト(x86)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; index : WORD* (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; data : UCPTrieData (+4, 4byte) varptr(st)+4 を基点に操作(4byte:入れ子/配列)
; indexLength : INT (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dataLength : INT (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; highStart : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; shifted12HighStart : WORD (+20, 2byte) wpoke st,20,値 / 値 = wpeek(st,20)
; type : CHAR (+22, 1byte) poke st,22,値 / 値 = peek(st,22)
; valueWidth : CHAR (+23, 1byte) poke st,23,値 / 値 = peek(st,23)
; reserved32 : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; reserved16 : WORD (+28, 2byte) wpoke st,28,値 / 値 = wpeek(st,28)
; index3NullOffset : WORD (+30, 2byte) wpoke st,30,値 / 値 = wpeek(st,30)
; dataNullOffset : INT (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; nullValue : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; UCPTrie サイズ: 48 バイト(x64)
dim st, 12 ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; index : WORD* (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; data : UCPTrieData (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; indexLength : INT (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; dataLength : INT (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; highStart : INT (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; shifted12HighStart : WORD (+28, 2byte) wpoke st,28,値 / 値 = wpeek(st,28)
; type : CHAR (+30, 1byte) poke st,30,値 / 値 = peek(st,30)
; valueWidth : CHAR (+31, 1byte) poke st,31,値 / 値 = peek(st,31)
; reserved32 : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; reserved16 : WORD (+36, 2byte) wpoke st,36,値 / 値 = wpeek(st,36)
; index3NullOffset : WORD (+38, 2byte) wpoke st,38,値 / 値 = wpeek(st,38)
; dataNullOffset : INT (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; nullValue : DWORD (+44, 4byte) st.11 = 値 / 値 = st.11 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global UCPTrie
#field intptr index
#field byte data 8
#field int indexLength
#field int dataLength
#field int highStart
#field short shifted12HighStart
#field byte type
#field byte valueWidth
#field int reserved32
#field short reserved16
#field short index3NullOffset
#field int dataNullOffset
#field int nullValue
#endstruct
stdim st, UCPTrie ; NSTRUCT 変数を確保
st->indexLength = 100
mes "indexLength=" + st->indexLength
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。