Win32 API 日本語リファレンス
ホームGlobalization › UCPTrie

UCPTrie

構造体
サイズx64: 48 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
indexWORD*8/4+0+0コードポイントからデータへ写像するインデックス配列。
dataUCPTrieData8/4+8+4値幅に応じたデータ配列を表す共用体UCPTrieData。
indexLengthINT4+16+8インデックス配列の要素数。
dataLengthINT4+20+12データ配列の要素数。
highStartINT4+24+16高位範囲が始まるコードポイント。これ以上はnullValue扱い。
shifted12HighStartWORD2+28+20highStartを12ビット右シフトした値。
typeCHAR1+30+22トライの型(高速か小型か)を示す値。
valueWidthCHAR1+31+23データ値のビット幅(8/16/32)を示す値。
reserved32DWORD4+32+2432ビット予約フィールド。
reserved16WORD2+36+2816ビット予約フィールド。
index3NullOffsetWORD2+38+30index-3のnullブロックへのオフセット。
dataNullOffsetINT4+40+32データ配列のnullブロックへのオフセット。
nullValueDWORD4+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 Structure
import 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: uint32
struct 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 非対応)。必要に応じ手動でアクセス。