MDNライブラリ
機能概要
MDNライブラリ(libmdn)は多言語ドメイン名の変換に関わる各種の処理を実装するモジュールの集合です。 このライブラリは以下のような機能を提供します。
- エンコーディング(コードセット)変換
- NAMEPREPに基づく文字列の正規化
- DNSメッセージの解析、再組み立て
- クライアント用設定ファイルの読み込み
エンコーディング (コードセット) 変換
文字列のエンコーディングを変換し、その結果を返します。 MDNライブラリの内部では、 文字列はすべて UTF-8エンコーディングであるとして取り扱われます。 そこで、このモジュールは以下の機能を提供します。
- あるエンコーディングから UTF-8への変換
- UTF-8からあるエンコーディングへの変換
エンコーディングは大きく分けて、次の2種類があります。
- アプリケーションが使用するエンコーディング(シフトJIS、EUC等)
- 多言語ドメイン名で使用するためにデザインされた特別なエンコーディング(RACE、LACE等)
このモジュールでは前者のエンコーディング変換のためにiconv()
ユーティリティを使用し、
後者のエンコーディング変換のためには独自の変換関数を実装して使用しています。
NAMEPREPに基づく正規化
NAMEPREPの記述に従って、与えられたドメイン名文字列の正規化、 文字のマッピング、禁止文字の検査、 文字が未割り当てられていないコードポイントを含んでいるかどうかの検査を行います。
ローカルルールによるドメイン名のマッピング
NAMEPREPとは別に、 ローカルルールに基づいて文字のマッピングを行います。
DNSメッセージの解析、再組み立て
DNSプロキシサーバ(mdnsproxy)では、 クライアントから送られてきたDNSメッセージに含まれるドメイン名に対してエンコーディング変換や正規化を行い、 その結果をDNSサーバに送ります。 このために以下の機能を提供します。
- DNSメッセージを解析し、ドメイン名を取り出す
- 変換したドメイン名を用いてDNSメッセージを再構成する
ローカルエンコーディングの判別
アプリケーションプログラムが使用しているローカルエンコーディング(コードセット)を自動判別します。 判別は基本的にはアプリケーションのロケール情報を利用しますが、 環境変数で指定することも可能になっています。
クライアント用設定ファイルの読み込み
アプリケーションにリンクされるリゾルバライブラリでエンコーディング変換や正規化を行う場合、 使用するエンコーディングや正規化方式は設定ファイルに記述されます。 このファイルを読み込む機能を提供します。
モジュール一覧
MDNライブラリは以下のモジュールから構成されます。
ace
モジュール- laceやraceといった、 ドメイン名のエンコーディング変換モジュールで共通する処理をまとめたモジュール
altdude
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているAltDUDEエンコーディングの変換モジュール
amcacem
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-Mエンコーディングの変換モジュール
amcaceo
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-Oエンコーディングの変換モジュール
amcacer
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-Rエンコーディングの変換モジュール
api
モジュール- リゾルバライブラリやアプリケーション向けに、 ドメイン名のエンコーディング変換や正規化を行うための高レベルのインタフェースを提供するモジュール
brace
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているBRACEエンコーディングの変換モジュール
checker
モジュール- ドメイン名に使用できない文字が含まれているかどうかを検査するモジュール
converter
モジュール- 文字列のエンコーディング(コードセット)の変換モジュール
debug
モジュール- デバッグ用出力のためのユーティリティモジュール
delimitermap
モジュール-
ドメイン名の中の特定の文字をピリオド(`
.
')にマッピングするためのモジュール dn
モジュール- DNSメッセージ内のドメイン名の展開・圧縮を行うモジュール
dude
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているDUDEエンコーディングの変換モジュール
filechecker
モジュール- ドメイン名に使用できない文字を定義したファイルを読み込んで、 与えられた文字列に使用できない文字が含まれているかどうかを調べるモジュール
filemapper
モジュール- 文字のマッピング規則を定義したファイルを読み込んで、 ドメイン名文字列中の文字のマッピングを行うモジュール
lace
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているLACEエンコーディングの変換モジュール
localencoding
モジュール- アプリケーションの使用しているエンコーディングを推測するモジュール
log
モジュール- MDNライブラリのログの出力処理を制御するモジュール
mapselector
モジュール- 与えられたドメイン名のトップレベルのドメインに応じて、 異なるローカルなマッピングを行うモジュール
msgheader
モジュール- DNSメッセージのヘッダの解析モジュール
msgtrans
モジュール- DNSプロキシサーバでのDNSメッセージの変換を行うためのモジュール
nameprep
モジュール- NAMEPREPに記述された、ドメインの正規化、マッピング、 禁止文字の検査などを行うモジュール
normalizer
モジュール- 文字列の正規化を行うモジュール
race
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているRACEエンコーディングの変換モジュール
res
モジュール- リゾルバライブラリ、 あるいはアプリケーションでドメイン名のエンコーディング変換や正規化を行うための低レベルのインタフェースを提供するモジュール
resconf
モジュール- リゾルバライブラリ、 あるいはアプリケーションでドメイン名のエンコーディング変換や正規化を行う際の設定ファイルを読み込むためのモジュール
result
モジュール- ライブラリの各関数が返すリザルトコードを扱うモジュール
selectiveencode
モジュール- テキストの中から非ASCII文字を含むドメイン名を探し出すモジュール
strhash
モジュール- 文字列をキーとするハッシュ表を実現するモジュール
ucsmap
モジュール- 文字のマッピング規則の登録、およびマッピングを行うモジュール
ucsset
モジュール- 文字の登録を行うモジュール
unicode
モジュール- Unicode の各種文字属性を取得するモジュール
unormalize
モジュール- Unicode で定義されている標準の正規化を行うモジュール
utf5
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているUTF-5の基本処理を行うモジュール
utf6
モジュール- ドメイン名のエンコーディング方式の一つとして提案されているUTF-6エンコーディングの変換モジュール
utf8
モジュール- UTF-8エンコーディング文字列の基本処理を行うモジュール
util
モジュール- 他のモジュールで使われる共用関数を提供するモジュール
version
モジュール- ライブラリのバージョン情報を取得するためのモジュール
以下にモジュールの呼び出し関係図を示します。
ただしほとんどすべてのモジュールから呼び出されているdebug
モジュールとlog
モジュール、
また共用関数を納めたutil
モジュールは割愛してあります。
モジュール詳細
MDNライブラリに含まれるすべてのモジュールについて、 その仕様を記述します。 まず各モジュールで共通に使用される、 関数の戻り値について説明したあと、 モジュール毎に詳細を解説します。
API関数の戻り値
MDNライブラリのほとんど全てのAPI関数は、
戻り値として列挙型であるmdn_result_t
型の値を返します。
値の一覧とその意味を示します。
mdn_success
- 処理が成功したことを示します。
mdn_notfound
- 検索処理などにおいて、見つからなかったことを示します。
mdn_invalid_encoding
- エンコーディング変換において、 入力された文字列のエンコーディングが間違っていることを示します。
mdn_invalid_syntax
- ファイルなどの書式に間違いがあることを示します。
mdn_invalid_name
- 指定された名前が間違っていることを示します。
mdn_invalid_message
- 入力されたDNSメッセージが正しくないことを示します。
mdn_invalid_action
- 文字列の変換方法の指定に誤りがあることを示します。
mdn_invalid_codepoint
- 入力された文字のコードポイントが、規定範囲外の値であることを示します。
mdn_buffer_overflow
- 結果を格納するバッファの大きさが足りないことを示します。
mdn_noentry
- 指定された項目が存在しないことを示します。
mdn_nomemory
- メモリのアロケーションに失敗したことを示します。
mdn_nofile
- 指定されたファイルの読み込みに失敗したことを示します。
mdn_nomapping
- 文字列のエンコーディング(コードセット)を変換する際、 変換ターゲットの文字集合に含まれない文字があった(つまり正しく変換できなかった)ことを示します。
mdn_context_required
- 文字の大文字小文字変換の際に、 正しい変換を行うには文脈情報が必要であることを示します。
mdn_prohibited
- 入力された文字列が、 使用を禁止する文字を含んでいたことを示します。
mdn_failure
- 上記のいずれにも当てはまらないエラーが発生したことを示します。
ace
モジュール
ace
モジュールは、lace、race、といった、
ドメイン名のエンコーディング変換モジュールで共通する処理をまとめたモジュールです。
このモジュールは、
converter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してRACE
や LACE
といったエンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__ace_convert
mdn_result_t mdn__ace_convert(mdn__ace_t ctx, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
ACE文字列とUTF-8文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならACEからUTF-8へ、
mdn_converter_u2l
ならUTF-8からACEへの変換となります。
ctxの型mdn__ace_t
は次のように定義されており、
ACEのプリフィックス・サフィックスや実際の変換関数へのポインタを保持しています。
enum { mdn__ace_prefix, mdn__ace_suffix }; typedef mdn_result_t (*mdn__ace_proc_t)(const char *from, size_t fromlen, char *to, size_t tolen); typedef struct { int id_type; /* mdn__ace_prefix/mdn__ace_suffix */ const char *id_str; /* prefix/suffix string */ mdn__ace_proc_t encoder;/* encode procedure */ mdn__ace_proc_t decoder;/* decode procedure */ } mdn__ace_t;
dirがmdn_converter_l2u
の場合には次のような処理が行われます。
- fromで指定されるドメイン名文字列をラベルに分解し、 それぞれについて以下の2から5の処理を実行します。
- ctxで指定されるデータからACEのプリフィックスあるいはサフィックスを取り出し、 ラベル文字列がそれにマッチするかを調べます。 マッチしなければ変換せずにそのままコピーします。
- マッチすればラベルからプリフィックスあるいはサフィックスを除去し、 ctxで指定されるデコード関数を呼び出してUTF-8エンコーディングのラベル文字列に変換します。
- デコード結果が従来のASCIIドメイン名として正当なものかどうかを調べます。 もし正当なものなら、 そのラベルは本来ACEに変換してはならないものなのでエラーとします。
- デコードした文字列をctxで指定されるエンコード関数を呼び出して再度ACEに戻します。 これと元のACE文字列を比較し、マッチしなければエラーとします。
- ラベル毎の変換結果をドメイン名にまとめてto で指定される領域に格納します。
またdirがmdn_converter_u2l
の場合には次のような処理が行われます。
- fromで指定されるドメイン名文字列をラベルに分解し、 それぞれについて以下の2から4の処理を実行します。
- ラベル文字列が従来のASCIIドメイン名として正当なものかどうかを調べます。 正当なものであればACEへの変換は不要なのでそのままコピーします。
- ctxで指定されるエンコード関数を呼び出してACEに変換します。
- ctxで指定されるデータからACEのプリフィックスあるいはサフィックスを取り出し、 ACE変換結果の文字列に付加します。
- ラベル毎の変換結果をドメイン名にまとめてtoで指定される領域に格納します。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
altdude
モジュール
altdude
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているAltDUDE エンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してAltDUDE
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__altdude_open
mdn_result_t mdn__altdude_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
AltDUDEエンコーディングとの変換をオープンします。
実際には何もしません。
常にmdn_success
を返します。
mdn__altdude_close
mdn_result_t mdn__altdude_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
AltDUDEエンコーディングとの変換をクローズします。
実際には何もしません。
常にmdn_success
を返します。
mdn__altdude_convert
mdn_result_t mdn__altdude_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
AltDUDEエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならAltDUDEエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからAltDUDEエンコーディングへの変換となります。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
amcacem
モジュール
amcacem
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-M エンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してAMC-ACE-M
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__amcacem_open
mdn_result_t mdn__amcacem_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
AMC-ACE-Mエンコーディングとの変換をオープンします。
実際には何もしません。
常に mdn_success
を返します。
mdn__amcacem_close
mdn_result_t mdn__amcacem_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
AMC-ACE-Mエンコーディングとの変換をクローズします。
実際には何もしません。
常に mdn_success
を返します。
mdn__amcacem_convert
mdn_result_t mdn__amcacem_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
AMC-ACE-Mエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならAMC-ACE-MエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからAMC-ACE-Mエンコーディングへの変換となります。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
amcaceo
モジュール
amcaceo
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-O エンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してAMC-ACE-O
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__amcaceo_open
mdn_result_t mdn__amcaceo_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
AMC-ACE-Oエンコーディングとの変換をオープンします。
実際には何もしません。
常に mdn_success
を返します。
mdn__amcaceo_close
mdn_result_t mdn__amcaceo_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
AMC-ACE-Oエンコーディングとの変換をクローズします。
実際には何もしません。
常に mdn_success
を返します。
mdn__amcaceo_convert
mdn_result_t mdn__amcaceo_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
AMC-ACE-Oエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならAMC-ACE-OエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからAMC-ACE-Oエンコーディングへの変換となります。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
amcacer
モジュール
amcacer
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているAMC-ACE-RエンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してAMC-ACE-R
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__amcacer_open
mdn_result_t mdn__amcacer_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
AMC-ACE-Rエンコーディングとの変換をオープンします。
実際には何もしません。
常にmdn_success
を返します。
mdn__amcacer_close
mdn_result_t mdn__amcacer_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
AMC-ACE-Rエンコーディングとの変換をクローズします。
実際には何もしません。
常にmdn_success
を返します。
mdn__amcacer_convert
mdn_result_t mdn__amcacer_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
AMC-ACE-Rエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならAMC-ACE-RエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからAMC-ACE-Rエンコーディングへの変換となります。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
api
モジュール
api
モジュールは、
リゾルバライブラリやアプリケーション向けに、
ドメイン名のエンコーディング変換や正規化を行うための高レベルのインタフェースを提供するモジュールです。
一般のアプリケーションはこのモジュールを使用することで、
多言語ドメインに関する一連の処理を容易に行うことができるように設計されています。
このモジュールでは対応できない特殊な処理を行いたいときは、
より低レベルなインターフェースを提供するres
モジュールを使用します。
以下にモジュールの提供するAPI関数を示します。
mdn_nameinit
mdn_result_t mdn_nameinit(void);
ライブラリ全体の初期化を行い、
あらかじめ決められたファイル(mdn.conf
)から設定を読み込みます。
ただし、二度以上この関数を呼んでも、
初期化が行われるのは最初の呼び出し時だけです。
この関数を呼び出す前に、
後述するmdn_encodename
、
あるいはmdn_decodename
が呼び出されたときは、
エンコード、デコードの処理に先だって自動的に初期化が行われます。
返される値は
mdn_success
、
mdn_nofile
、
mdn_invalid_syntax
、
mdn_invalid_name
、
mdn_nomemory
のいずれかです。
mdn_encodename
mdn_result_t mdn_encodename(int actions, const char *from, char *to, size_t tolen);
ドメイン名のエンコードを行います。 入力文字列fromを変換し、 結果をtoとtolenで指定される領域に書き込みます。
actionsには、
mdn_encodename
に行わせたいエンコード動作を指定します。
次に挙げるフラグの論理和の値(例: MDN_NAMEPREP | MDN_IDNCONV
) を指定するようにします。
指定された動作は、ここに挙げた順序でそれぞれ行われます。
MDN_LOCALCONV
- ローカルエンコーディング (shift_JIS や Big5 など) の文字列を UTF-8に変換する。
MDN_DELIMMAP
- 特定の文字をピリオド (U+002E FULL STOP) に変換する。
MDN_LOCALMAP
- ドメイン名のトップレベルドメインに応じて、異なるローカルなマッピングを行う。
MDN_NAMEPREP
- NAMEPREPに基づいて、正規化、文字のマッピング、使用禁止文字が含まれているかどうかの判定を行う。
MDN_UNASCHECK
- Unicode で文字が割り当てられていないコード番号を含んでいないかどうかの判断を行う。
MDN_IDNCONV
- UTF-8の文字列を多言語ドメイン用のエンコーディング (LACE, RACEなど) に変換する。
利便性を配慮して、
これらすべての動作を行わせるためのフラグMDN_ENCODE_APP
も用意されています。
特殊なことを行う場合を除き、
通常アプリケーションはactions
にこのMDN_ENCODE_APP
を指定することになります。
actions
に何も指定しなければ(つまり0を指定した場合は)、
文字列は単にコピーされます。
返される値は
mdn_success
、
mdn_invalid_encoding
、
mdn_invalid_syntax
、
mdn_invalid_name
、
mdn_invalid_action
、
mdn_buffer_overflow
、
mdn_nomemory
、
mdn_nofile
、
mdn_prohibited
のいずれかです。
mdn_decodename
mdn_result_t mdn_decodename(int actions, const char *from, char *to, size_t tolen);
ドメイン名のデコードを行います。 入力文字列fromを変換し、 結果をtoとtolenで指定される領域に書き込みます。
actionsには、デコードにおいて、
mdn_decodename
に行わせたい変換動作を指定します。
次に挙げるフラグの論理和の値を指定するようにします。
指定された動作は、ここに挙げたのと同じ順序でそれぞれ行われます。
MDN_IDNCONV
- 多言語ドメイン用のエンコーディング (LACE, RACE など) の文字列をUTF-8に変換する。
MDN_LOCALCONV
- UTF-8の文字列をローカルエンコーディング (shift_JIS や Big5 など)に変換する。
利便性を配慮して、
これらすべての動作を行わせるためのフラグMDN_DECODE_APP
も用意されています。
特殊なことを行う場合を除き、
通常アプリケーションはactions
にこのMDN_DECODE_APP
を指定することになります。
actions
に何も指定しなければ、
文字列は単にコピーされます。
返される値は
mdn_success
、
mdn_invalid_encoding
、
mdn_invalid_syntax
、
mdn_invalid_name
、
mdn_invalid_action
、
mdn_buffer_overflow
、
mdn_nomemory
、
mdn_nofile
、
mdn_prohibited
のいずれかです。
mdn_localtoutf8
mdn_result_t mdn_localtoutf8(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_LOCALCONV, from, to, tolen)
と等価です。
mdn_delimitermap
mdn_result_t mdn_delimitermap(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_DELIMMAP, from, to, tolen)
と等価です。
mdn_localmap
mdn_result_t mdn_localmap(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_LOCALMAP, from, to, tolen)
と等価です。
mdn_nameprep
mdn_result_t mdn_nameprep(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_NAMEPREP, from, to, tolen)
と等価です。
mdn_utf8toidn
mdn_result_t mdn_utf8toidn(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_IDNCONV, from, to, tolen)
と等価です。
mdn_idntoutf8
mdn_result_t mdn_idntoutf8(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_decodename(MDN_IDNCONV, from, to, tolen)
と等価です。
mdn_utf8tolocal
mdn_result_t mdn_utf8tolocal(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_decodename(MDN_LOCALCONV, from, to, tolen)
と等価です。
mdn_localtoidn
mdn_result_t mdn_localtoidn(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_encodename(MDN_ENCODE_APP, from, to, tolen)
と等価です。
mdn_localtolatin
mdn_result_t mdn_localtolatin(const char *from, char *to, size_t tolen);
実体はcppマクロで、
mdn_decodename(MDN_DECODE_APP, from, to, tolen)
と等価です。
brace
モジュール
brace
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているBRACEエンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してBRACE
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__brace_open
mdn_result_t mdn__brace_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
BRACEエンコーディングとの変換をオープンします。
実際には何もしません。
常に mdn_success
を返します。
mdn__brace_close
mdn_result_t mdn__brace_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
BRACEエンコーディングとの変換をクローズします。
実際には何もしません。
常に mdn_success
を返します。
mdn__brace_convert
mdn_result_t mdn__brace_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
BRACEエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならBRACEエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからBRACEエンコーディングへの変換となります。
返される値は
mdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
checker
モジュール
checker
モジュールは、
ドメイン名に使用できない文字が含まれているかどうかを検査するためのモジュールです。
現在サポートされている検査方式は次の通りです。
- NAMEPREPの禁止文字の検査
- NAMEPREPの未割り当てコードポイントの検査
- 禁止文字、未割り当てコードポイントを定義したファイルを読み込み、その記述にしたがった検査
また別の新たな検査方式を追加登録するためのAPIも用意されています。
checker
モジュールは「検査コンテキスト」という概念を用います。
検査に先立ってまず検査コンテキストを作成し、
使用する検査方式をコンテキストに登録しておきます。
実際の検査処理の際には検査方式ではなく、
この検査コンテキストを指定します。
検査コンテキストの型はmdn_checker_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_checker *mdn_checker_t;
以下にモジュールの提供するAPI関数を示します。
mdn_checker_initialize
mdn_result_t mdn_checker_initialize(void)
モジュールの初期化処理を行います。 本モジュールの他のAPI関数を呼ぶ前に 必ず呼び出してください。
返される値は
mdn_success
、
mdn_nomemory
のいずれかです。
mdn_checker_create
mdn_result_t mdn_checker_create(mdn_checker_t *ctxp)
検査用の空のコンテキストを作成し、
ctxpの指す領域に格納します。
返されるコンテキストは空で、検査方式は一つも含まれていません。
検査方式を追加するにはmdn_checker_add
、
mdn_checker_addall
を用います。
コンテキストで作成された時点では、
コンテキストの参照カウントは1になっています。
返される値は
mdn_success
、
mdn_nomemory
のいずれかです。
mdn_checker_destroy
void mdn_checker_destroy(mdn_checker_t ctx)
mdn_checker_create
で作成した検査コンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn_checker_incrref
void mdn_checker_incrref(mdn_checker_t ctx)
mdn_checker_create
で作成した検査コンテキストの参照カウントを一つ増やします。
mdn_checker_add
extern mdn_result_t mdn_checker_add(mdn_checker_t ctx, const char *name)
mdn_checker_create
で作成した検査コンテキストに、
nameで指定される検査方式を追加します。
一つのコンテキストに複数の検査方式を追加することができます。
検査方式nameの書式は次のようになります。
MDN_CHECKER_PROHIBIT_PREFIX
<nameprep-version>- NAMEPREPバージョン <nameprep-version> の禁止文字検査を行います。
MDN_CHECKER_UNASSIGNED_PREFIX
<nameprep-version>- NAMEPREPバージョン <nameprep-version> の未割り当てコードポイントの検査を行います。
MDN_CHECKER_PROHIBIT_PREFIX fileset
:<path>- <path>で指定されたファイルから禁止文字の定義を読み込み、 その内容に従って検査を行います。 ファイルの記述方法については、 セットファイルの形式の項を参照してください。
MDN_CHECKER_UNASSIGNED_PREFIX fileset
:<path>- ファイルから未割り当てコードポイントの定義を読み込み、 その内容に従って検査を行います。 ファイルの記述方法については、 セットファイルの形式の項を参照してください。
- <prefix>
:
<parameter> -
mdn_checker_register
で登録した検査方式<prefix>による検査を行います。 <parameter>は、 登録した関数create
に対して引数<parameter>として渡されます。
MDN_CHECKER_PROHIBIT_PREFIX
およびMDN_CHECKER_UNASSIGNED_PREFIX
はcppマクロで、
実際にはそのマクロの値を用います。
また、その後ろのfileset
や<nameprep-version>との間に空白を開けてはいけません。
したがって、文字列nameは、
実際には次のような方法で生成することになります。
sprintf(name, "%s%s", MDN_CHECKER_PROHIBIT_PREFIX, nameprep_version); sprintf(name, "%sfileset:%s", MDN_CHECKER_UNASSIGNED_PREFIX, file_path);
返される値は
mdn_success
、
mdn_invalid_name
、
mdn_nomemory
のいずれかです。
mdn_checker_addall
mdn_result_t mdn_checker_addall(mdn_checker_t ctx, const char **names, int nnames)
mdn_checker_addall
は一度に複数の検査方式を追加することを除いて、
mdn_checker_add
と同じです。
長さnnamesからなる配列namesの各要素を検査方式として登録します。
すべての方式の追加に成功するとmdn_success
を返します。
登録に失敗した場合、
失敗した方式より先に記述されていた方式だけがコンテキストctx
に登録された状態になります。
mdn_checker_lookup
mdn_result_t mdn_checker_lookup(mdn_checker_t ctx, const char *utf8, const char **found)
UTF-8でエンコードされた文字列utf8をctxに指定された検査方式で検査します。
文字列が禁止文字、
未割り当てコードポイントを含んでいた場合、
foundにその先頭位置を格納します。
含まれていない場合は、NULL
を返します。
返される値は
mdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
mdn_checker_register
mdn_result_t mdn_checker_register(const char *prefix, mdn_checker_createproc_t create, mdn_checker_destroyproc_t destroy, mdn_checker_lookupproc_t lookup)
新しい検査方式を登録します。
prefixには、検査方法の名称を指定します。
mdn_checker_add
、
mdn_checker_addall
でコンテキストに検査方式を追加する際には、
この名称で検査方法を指定します。
create、destroy、lookupには、
それぞれmdn_checker_create
、
mdn_checker_destroy
、
mdn_checker_lookup
の処理が行われる際に、
呼び出してほしい関数を指定します。
それぞれの関数は、次のような引数、戻り値でなくてはなりません。
typedef mdn_result_t (*mdn_checker_createproc_t) (const char *parameter, void **ctxp); typedef void (*mdn_checker_destroyproc_t) (void *ctx); typedef mdn_result_t (*mdn_checker_lookupproc_t) (void *ctx, const char *utf8, const char **found);
返される値は
mdn_success
、
mdn_nomemory
のいずれかです。
converter
モジュール
converter
モジュールは、
文字列のエンコーディング(コードセット)を変換します。
MDNライブラリは内部処理に UTF-8エンコーディングの文字列を使用するため、
このモジュールはあるエンコーディングと UTF-8との間の相互変換を行います。
現在サポートされているエンコーディングは次の通りです。
-
iconv()
がサポートしているエンコーディング
iconv()とは汎用的なコードセット変換機能を提供する関数で、 この関数がサポートするエンコーディングをサポートします。 iconv() がサポートするエンコーディングは実装依存なので、 具体的にどのエンコーディングが使用可能なのかはiconv()のドキュメントをご覧ください。 -
UTF-5
多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-jseng-utf5-01.txtをご覧ください。 -
RACE
これも多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-ietf-idn-race-03.txtをご覧ください。 -
BRACE
これも多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-ietf-idn-brace-00.txtをご覧ください。 -
LACE
これも多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-ietf-idn-lace-01.txtをご覧ください。 -
DUDE
これも多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-ietf-idn-dude-01.txtをご覧ください。 -
UTF-6
これも多言語ドメイン名のエンコーディング方法として提案されているものです。 詳しくはdraft-ietf-idn-utf6-00.txtをご覧ください。
また、converter
モジュールはドメイン名のエンコーディング変換のために特別に設計されたもので、
一般的なエンコーディング変換には必ずしも適しません。
例えばUTF-5、RACE、BRACE、LACE、DUDE、
UTF-6エンコーディングはドメイン名の区切り文字であるピリオドを特別に扱います。
converter
モジュールは「コード変換コンテキスト」という概念を用います。
あるエンコーディングとUTF-8との相互変換を行うには、
まずそのエンコーディングのコード変換コンテキストを作成します。
実際のコード変換にはエンコーディングを直接指定するのではなく、
このコード変換コンテキストを指定します。
コード変換コンテキストの型はmdn_converter_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_converter *mdn_converter_t;
以下にモジュールの提供するAPI関数を示します。
mdn_converter_initialize
mdn_result_t mdn_converter_initialize(void)
モジュールの初期化処理を行います。 本モジュールの他のAPI関数を呼ぶ前に 必ず呼び出してください。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_converter_create
mdn_result_t mdn_converter_create(const char *name, mdn_converter_t *ctxp, int delayedopen)
nameで指定されたエンコーディングとUTF-8との間のコード変換コンテキストを作成、 初期化し、ctxp の指す領域に格納します。 コンテキストで作成された時点では、 コンテキストの参照カウンタは1になっています。
エンコーディングとして、現在のところUTF-5
、
RACE
、BRACE
、LACE
、
DUDE
、UTF-6
の変換機能が用意されています。
これ以外のエンコーディングが指定された場合には、
システムの提供するiconv()
ユーティリティを用いて変換が行われます。
この場合、
この関数の呼び出し時にiconv_open()
の呼び出しが行われますが、
delayedopen が真ならば実際に文字列の変換が行われるまでiconv_open()
の呼び出しが遅延されます。
またmdn_converter_register
を用いて新たなローカルエンコーディングを追加することも可能です。
返される値はmdn_success
、
mdn_invalid_name
、
mdn_nomemory
、
mdn_failure
のいずれかです。
mdn_converter_destroy
void mdn_converter_destroy(mdn_converter_t ctx)
mdn_converter_create
で作成したコード変換コンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn_converter_incrref
void mdn_converter_incrref(mdn_converter_t ctx)
mdn_converter_create
で作成したコード変換コンテキストの参照カウントを一つ増やします。
mdn_converter_convert
mdn_result_t mdn_converter_convert(mdn_converter_t ctx, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
mdn_converter_create
で作成したコード変換コンテキストを用いて文字列fromをコード変換し、
結果をtoに格納します。
tolenはtoの長さです。
dirは変換の方向の指定で、
mdn_converter_l2u
- コンテキストに設定したエンコーディングからUTF-8への変換
mdn_converter_u2l
- UTF-8からコンテキストに設定したエンコーディングへの変換
となります。
指定したエンコーディングとは、
mdn_converter_create
で指定したエンコーディングのことを指します。
ISO-2022-JP
のように状態をもつエンコーディングを使用した場合、
iconv()
と異なり、
この関数の呼び出し間で状態は保存されません。
変換は毎回初期状態から始まります。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_invalid_name
、
mdn_nomemory
、
mdn_failure
のいずれかです。
mdn_converter_localencoding
char * mdn_converter_localencoding(mdn_converter_t ctx)
コード変換コンテキストctxに設定さたエンコーディング名を返します。
mdn_converter_isasciicompatible
int mdn_converter_isasciicompatible(mdn_converter_t ctx)
コード変換コンテキストctxのローカルエンコーディングがASCII互換エンコーディングかどうかを返します。 ASCII互換エンコーディングなら1が、そうでないなら0が返ります。
ASCII互換エンコーディング(ASCII-compatible Encoding)とは、 そのエンコーディングでエンコードされたドメイン名が通常のASCIIのドメイン名と区別できない、 つまり英数字およびハイフンのみで構成されるようなエンコーディングのことで、 具体的にはRACEなどが相当します。 これらのエンコーディングは一般にアプリケーションのローカルエンコーディングとして用いられることはありませんが、 DNSプロトコル上でドメイン名を表すためのエンコーディングとしては(従来のDNSサーバ等がなんの変更もなしに使えることもあって)有力視されているものです。
mdn_converter_addalias
mdn_result_t mdn_converter_addalias(const char *alias_name, const char *real_name)
エンコーディング名real_nameに対して、
alias_nameという別名を登録します。
登録した別名はmdn_converter_create
のname 引数に指定することができます。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_converter_aliasfile
mdn_result_t mdn_converter_aliasfile(const char *path)
ファイルpathで指定されるファイルを読み込み、 その内容に従って別名を登録します。 ファイルpathは次のような単純な形式の行からなるテキストファイルです。
別名 正式名
また#
で始まる行はコメントとみなされます。
返される値はmdn_success
、
mdn_nofile
、
mdn_invalid_syntax
、
mdn_nomemory
のいずれかです。
mdn_converter_resetalias
mdn_result_t mdn_converter_resetalias(void)
mdn_converter_addalias
やmdn_converter_aliasfile
で登録した別名をリセットし、
別名が全く登録されていない初期状態に戻します。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_converter_register
mdn_result_t mdn_converter_register(const char *name, mdn_converter_openproc_t open, mdn_converter_closeproc_t close, mdn_converter_convertproc_t convert, int ascii_compatible)
nameという名前のローカルエンコーディングとUTF-8との間のエンコーディング変換機能を追加します。 open、close、 convertは変換等の処理関数へのポインタです。 ascii_compatibleにはこのローカルエンコーディングがASCII互換エンコーディングなら1を、 そうでなければ0を指定します。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
debug
モジュール
debug
モジュールはデバッグ用出力のためのユーティリティモジュールです。
以下にモジュールの提供するAPI関数を示します。
mdn_debug_hexstring
char * mdn_debug_hexstring(const char *s, int maxbytes)
文字列sを16進数表示した文字列を返します。
maxbytesは表示する最大の長さで、
sがこれを超えた場合には最後に「...
」という文字列が付加されます。
返される文字列のメモリ領域は本関数の保持するスタティック変数のもので、 その内容は本関数の次の呼び出し時まで有効です。
mdn_debug_xstring
char * mdn_debug_xstring(const char *s, int maxbytes)
文字列sの中で、
コードが128以上のものを\x{HH}
形式で表示した文字列を返します。
maxbytesは表示する最大の長さで、
sがこれを超えた場合には最後に...
が追加されます。
返される文字列のメモリ領域は本関数の保持するスタティック変数のもので、 その内容は本関数の次の呼び出し時まで有効です。
mdn_debug_hexdata
char * mdn_debug_hexdata(const char *s, int length, int maxlength)
長さlengthのバイト列sを16進表示した文字列を返します。
maxbytesは表示する最大のバイト長で、
lengthがこれを超えた場合には最後に...
が追加されます。
返される文字列のメモリ領域は本関数の保持するスタティック変数のもので、 その内容は本関数の次の呼び出し時まで有効です。
mdn_debug_hexdump
void mdn_debug_hexdump(const char *s, int length)
長さlengthのバイト列sの16進ダンプを標準エラー出力に表示します。
dn
モジュール
dn
モジュールは、
DNSメッセージ内のドメイン名の展開・圧縮を行うモジュールです。
これはリゾルバライブラリのres_comp
およびres_expand
に相当する機能を提供します。
このモジュールは本ライブラリの他のモジュールからのみ利用されることを想定して設計されています。
ドメイン名の圧縮の際は、
次に示すmdn__dn_t
型のコンテキスト情報を使用します。
#define MDN_DN_NPTRS 64 typedef struct { const unsigned char *msg; int cur; int offset[MDN_DN_NPTRS]; } mdn__dn_t;
以下にモジュールの提供するAPI関数を示します。
mdn__dn_expand
mdn_result_t mdn__dn_expand(const char *msg, size_t msglen, const char *compressed, char *expanded, size_t buflen, size_t *complenp)
長さmsglenのDNSメッセージmsg中の圧縮されたドメイン名compressedを展開し、 expandedに結果を格納します。 buflenはexpandedの大きさです。 また、compressedの長さが*complenpに格納されます。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_message
のいずれかです。
mdn__dn_initcompress
void mdn__dn_initcompress(mdn__dn_t *ctx, const char *msg)
ドメイン名圧縮用のコンテキスト情報ctxを初期化します。
この関数はmdn__dn_compress
を呼び出す前に必ず呼び出す必要があります。
msgは圧縮したドメイン名を格納するDNSメッセージの先頭アドレスです。
mdn__dn_compress
mdn_result_t mdn__dn_compress(const char *name, char *sptr, size_t length, mdn__dn_t *ctx, size_t *complenp)
nameの指すドメイン名を圧縮してsptrの指す場所に格納します。 lengthはsptrの空き領域の長さです。 圧縮の際は、 ctxに入っている以前に圧縮したドメイン名の情報が参照されます。 圧縮したドメイン名の長さがcomplenpに入れられるとともに、 圧縮に必要な情報がctxに追加されます。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_name
のいずれかです。
delimitermap
モジュール
通常、ドメイン名の区切りとして用いるデリミタはピリオド(`.
')だけですが、
このdelimitermap
モジュールはピリオド以外の文字を区切りとして使用できるようにするために、
他の文字からピリオドへのマッピングを行います。
delimitermap
モジュールは「デリミタマップコンテキスト」という概念を用います。
マッピングに先立ってまずデリミタマップコンテキストを作成し、
区切りとして使用する文字を登録しておきます。
実際のマッピング処理の際にはマッピング方式ではなく、
このマップコンテキストを指定します。
マップコンテキストの型はmdn_delimitermap_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_delimitermap *mdn_delimitermap_t;
以下にモジュールの提供するAPI関数を示します。
mdn_delimitermap_create
mdn_result_t mdn_delimitermap_create(mdn_delimitermap_t *ctxp)
空のデリミタマップコンテキストを作成し、
ctxpの指す領域に格納します。
返されるコンテキストは空で、デリミタは一つも含まれていません。
デリミタを追加するにはmdn_delimitermap_add
、
mdn_delimitermap_addall
を用います。
コンテキストで作成された時点では、
コンテキストの参照カウントは 1 になっています。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_delimitermap_destroy
void mdn_delimitermap_destroy(mdn_delimitermap_t ctx)
mdn_delimitermap_create
で作成したマップコンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn_delimitermap_incrref
void mdn_delimitermap_incrref(mdn_delimitermap_t ctx)
mdn_delimitermap_create
で作成したコンテキストの参照カウントを一つ増やします。
mdn_delimitermap_add
extern mdn_result_t mdn_delimitermap_add(mdn_delimitermap_t ctx, unsigned long delimiter)
mdn_delimitermap_create
で作成したコンテキストに、
UCSコードポイントdelimiterをドメイン名のデリミタ(区切り文字)として追加します。
ただし、
mdn_delimitermap_fix
を呼ぶ前でないと、
追加することはできません。
mdn_delimitermap_fix
を既に呼んだ状態でこの関数を呼ぶと、
mdn_failure
を返します。
この関数から返される値はmdn_success
、
mdn_nomemory
、
mdn_invalid_codepoint
、
mdn_failure
のいずれかです。
mdn_delimitermap_addall
mdn_result_t mdn_delimitermap_addall(mdn_delimitermap_t ctx, const char **names, int nnames)
mdn_delimitermap_addall
は一度に複数のデリミタ(区切り文字)を追加することを除いて、
mdn_delimitermap_add
と同じです。
長さnnamesからなる配列namesの各要素をデリミタとして登録します。
すべてのデリミタの追加に成功するとmdn_success
を返します。
登録に失敗した場合、
失敗した方式より先に記述されていたデリミタだけがコンテキストctx
に登録された状態になります。
mdn_delimitermap_fix
void mdn_delimitermap_fix(mdn_delimitermap_t ctx)
コンテキスト内に格納されいてるデータの配置を、最適化します。
この関数を利用すると、
それ以降はmdn_delimitermap_add
およびmdn_delimitermap_addall
によるデリミタの登録はできなくなります。
逆に、
この関数を呼ばないとmdn_delimitermap_map
によるマッピングは行えません。
mdn_delimitermap_map
mdn_result_t mdn_delimitermap_map(mdn_delimitermap_t ctx, const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromにctxによるマッピングを適用します。
ctxに登録されているデリミタ(区切り文字)をピリオド(`.
')にマッピングし、
結果をtoとtolenで指定される領域に書き込みます。
この関数を利用するには、
あらかじめ mdn_delimitermap_fix
呼んでおかなければなりません。
mdn_delimitermap_fix
が呼ばれていない状態でこの関数を呼ぶと、
mdn_failure
を返します。
この関数から返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_failure
のいずれかです。
dude
モジュール
dude
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているDUDEエンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してDUDE
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__dude_open
mdn_result_t mdn__dude_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
DUDEエンコーディングとの変換をオープンします。 実際には何もしません。
常に mdn_success
を返します。
mdn__dude_close
mdn_result_t mdn__dude_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
DUDEエンコーディングとの変換をクローズします。 実際には何もしません。
常に mdn_success
を返します。
mdn__dude_convert
mdn_result_t mdn__dude_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
DUDEエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならDUDEエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからDUDEエンコーディングへの変換となります。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
filechecker
モジュール
filechecker
モジュールは、
ドメイン名に使用できない文字を定義したファイルを読み込み、
その定義にしたがったドメイン名を検査を行うためのモジュールです。
このモジュールはchecker
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
checker
モジュールに対してfilecset
による検査を要求すると、
このモジュールが間接的に呼び出されることになります。
ファイルの記述方法については、 セットファイルの形式の項を参照してください。
以下にモジュールの提供するAPI関数を示します。
mdn__filechecker_create
mdn_result_t mdn__filechecker_create(const char *file, mdn_filechecker_t *ctxp)
検査ファイルコンテキストを一つ作成します。 ドメイン名に使用できない文字を定義したファイルfileを読み込み、 生成した検査コンテキストに追加します。
返される値はmdn_success
、
mdn_nomemory
、
mdn_nofile
、
mdn_invalid_syntax
のいずれかです。
mdn__filechecker_destroy
void mdn__filechecker_destroy(mdn_filechecker_t ctx)
mdn__filechecker_create
で作成したコンテキストを削除し、
アロケートされたメモリを解放します。
mdn__filechecker_lookup
mdn_result_t mdn__filechecker_lookup(mdn_filechecker_t ctx, const char *utf8, const char **found)
UTF-8でエンコードされた文字列utf8をctxに指定された検査方式で検査します。
文字列が禁止文字、未割り当てコードポイントを含んでいた場合、
foundにその先頭位置を格納します。
含まれていない場合は、NULL
を返します。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
filemapper
モジュール
filemapper
モジュールは、
ドメイン名中の各文字のマッピング規則を定義したファイルを読み込み、
その定義にしたがってマッピングを行うためのモジュールです。
このモジュールはmapper
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
mapper
モジュールに対してfilecmap
による検査を要求すると、
このモジュールが間接的に呼び出されることになります。
ファイルの記述方法については、 マップファイルの形式の項を参照してください。
以下にモジュールの提供するAPI関数を示します。
mdn__filemapper_create
mdn_result_t mdn__filemapper_create(const char *file, mdn_filemapper_t *ctxp)
マップファイルコンテキストを一つ作成します。 マッピング規則を定義したファイル fileを読み込み、 生成した検査コンテキストに追加します。
返される値はmdn_success
、
mdn_nomemory
、
mdn_nofile
、
mdn_invalid_syntax
のいずれかです。
mdn__filemapper_destroy
void mdn__filemapper_destroy(mdn_filemapper_t ctx)
mdn__filemapper_create
で作成したコンテキストを削除し、
アロケートされたメモリを解放します。
mdn__filemapper_map
mdn_result_t mdn__filemapper_map(mdn__filemapper_t ctx, const char *from, char *to, size_t tolen);
UTF-8でエンコードされた文字列fromにctxで指定されるマッピングを適用し、 その結果をtoとtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
lace
モジュール
lace
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているLACEエンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してLACE
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__lace_open
mdn_result_t mdn__lace_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
LACEエンコーディングとの変換をオープンします。 実際には何もしません。
常にmdn_success
を返します。
mdn__lace_close
mdn_result_t mdn__lace_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
LACEエンコーディングとの変換をクローズします。 実際には何もしません。
常にmdn_success
を返します。
mdn__lace_convert
mdn_result_t mdn__lace_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
LACEエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならLACEエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからLACEエンコーディングへの変換となります。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
localencoding
モジュール
localencoding
モジュールはロケール情報を利用して、
アプリケーションの使用しているエンコーディングを推測するモジュールです。
以下にモジュールの提供するAPI関数を示します。
mdn_localencoding_name
const char * mdn_localencoding_name(void)
現在のロケール情報を元に、
アプリケーションの使用しているエンコーディング名(mdn_converter_create()
に渡す名前)を推測して返します。
推測は、
システムがnl_langinfo()
を備えていればそれを利用し、
そうでなければsetlocale()
や環境変数の情報から行われます。
後者の場合には必ずしも正しいエンコーディング名が得られるとは限りません。
ロケール情報から正しい推測ができない場合、 もしくはアプリケーションがロケールと異なるエンコーディングを用いて動作している場合のために、 もし環境変数MDN_LOCAL_CODESETが定義されていれば、 をアプリケーションのロケールに関わらず、 その変数の値をエンコーディング名として返すようになっています。
log
モジュール
log
モジュールはMDNライブラリのログの出力処理を制御するモジュールです。
ログはデフォルトでは標準エラー出力に書き出されますが、
ハンドラを登録することで、別の出力方法に変更することも可能です。
またログレベルを設定することも可能です。 ログレベルは次の5段階が定義されています。
enum { mdn_log_level_fatal = 0, mdn_log_level_error = 1, mdn_log_level_warning = 2, mdn_log_level_info = 3, mdn_log_level_trace = 4, mdn_log_level_dump = 5 };
以下にモジュールの提供するAPI関数を示します。
mdn_log_fatal
void mdn_log_fatal(const char *fmt, ...)
fatalレベルのログを出力します。
このレベルは、
プログラムの実行が不可能であるような致命的なエラーの際に用いられます。
引数はprintf
と同じ形式で指定します。
mdn_log_error
void mdn_log_error(const char *fmt, ...)
errorレベルのログを出力します。
このレベルは、致命的ではないエラーの際に用いられます。
引数はprintf
と同じ形式で指定します。
mdn_log_warning
void mdn_log_warning(const char *fmt, ...)
warningレベルのログを出力します。
このレベルは警告メッセージを表示するために用いられます。
引数はprintf
と同じ形式で指定します。
mdn_log_info
void mdn_log_info(const char *fmt, ...)
infoレベルのログを出力します。
このレベルはエラーではなく、
有用と思われる情報を出力するのに用いられます。
引数はprintf
と同じ形式で指定します。
mdn_log_trace
void mdn_log_trace(const char *fmt, ...)
traceレベルのログを出力します。
このレベルはAPI関数のトレース情報を出力するのに用いられます。
一般にライブラリのデバッグ目的以外でこのレベルのログを記録する必要はないでしょう。
引数はprintf
と同じ形式で指定します。
mdn_log_dump
void mdn_log_dump(const char *fmt, ...)
dumpレベルのログを出力します。
このレベルはさらにデバッグ用のパケットデータダンプなどを出力するのに用いられます。
一般にライブラリのデバッグ目的以外でこのレベルのログを記録する必要はないでしょう。
引数はprintf
と同じ形式で指定します。
mdn_log_setlevel
void mdn_log_setlevel(int level)
ログ出力のレベルを設定します。
設定したレベルを超えるレベルのログは出力されません。
この関数でログレベルを設定しない場合、
環境変数MDN_LOG_LEVEL
に設定された整数値が使用されます。
mdn_log_getlevel
int mdn_log_getlevel(void)
現在のログ出力のレベルを表す整数値を取得して返します。
mdn_log_setproc
void mdn_log_setproc(mdn_log_proc_t proc)
ログの出力ハンドラを設定します。
procはハンドラ関数へのポインタです。
もしハンドラを指定しない場合、
あるいはprocにNULL
を指定した場合には、
ログは標準エラー出力に出力されます。
ハンドラの型mdn_log_proc_t
は次のように定義されています。
typedef void (*mdn_log_proc_t)(int level, const char *msg);
levelにはログのレベルが、 またmsgには表示すべきメッセージ文字列が渡されます。
mapper
モジュール
mapper
モジュールは、
ドメイン名中の文字のマッピングを行うためのモジュールです。
現在サポートされているマッピング方式は次の通りです。
- NAMEPREPマッピング
- マッピング規則を定義したファイルを読み込み、その記述にしたがったマッピング
また、 別の新たなマッピング方式を追加登録するためのAPIも用意されています。
mapper
モジュールは「マップコンテキスト」という概念を用います。
マッピングの実行に先立ってまずマップコンテキストを作成し、
使用するマッピング方式をコンテキストに登録しておきます。
実際のマッピング処理の際にはマッピング方式ではなく、
このマップコンテキストを指定します。
マップコンテキストの型はmdn_mapper_t
型であり、
次のような opaque 型として定義されています。
typedef struct mdn_mapper *mdn_mapper_t;
以下にモジュールの提供するAPI関数を示します。
mdn_mapper_initialize
mdn_result_t mdn_mapper_initialize(void)
モジュールの初期化処理を行います。 本モジュールの他のAPI関数を呼ぶ前に必ず呼び出してください。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_mapper_create
mdn_result_t mdn_mapper_create(mdn_mapper_t *ctxp)
マッピング用の空のコンテキストを作成し、
ctxpの指す領域に格納します。
返されるコンテキストは空で、
マッピング方式は一つも含まれていません。
マッピング方式を追加するにはmdn_mapper_add
、
mdn_mapper_addall
を用います。
コンテキストで作成された時点では、
コンテキストの参照カウントは1になっています。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_mapper_destroy
void mdn_mapper_destroy(mdn_mapper_t ctx)
mdn_mapper_create
で作成したマップコンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn_mapper_incrref
void mdn_mapper_incrref(mdn_mapper_t ctx)
mdn_mapper_create
で作成したコンテキストの参照カウントを一つ増やします。
mdn_mapper_add
extern mdn_result_t mdn_mapper_add(mdn_mapper_t ctx, const char *name)
mdn_mapper_create
で作成したコンテキストに、
nameで指定されるマッピング方式を追加します。
一つのコンテキストに複数のマッピング方式を追加することができます。
マッピング方式nameの書式は次のようになります。
- <nameprep-version>
- NAMEPREPバージョン <nameprep-version>のマッピング規則。
filemap
:<path>- <path>で指定されたファイルから、 マッピング規則を読み込み、 その内容に従ってマッピングを行います。 ファイルの記述方法については、 マップファイルの形式の項を参照してください。
- <prefix>
:
<parameter> -
mdn_mapper_register
で登録したマッピング方式 <prefix>によるマッピングを行います。 <parameter>は、 登録した関数create
に対して引数<parameter>として渡されます。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
mdn_mapper_addall
mdn_result_t mdn_mapper_addall(mdn_mapper_t ctx, const char **names, int nnames)
mdn_mapper_addall
は一度に複数のマッピング方式を追加することを除いて、
mdn_mapper_add
と同じです。
長さnnamesからなる配列namesの各要素をマッピング方式として登録します。
すべての方式の追加に成功するとmdn_success
を返します。
登録に失敗した場合、
失敗した方式より先に記述されていた方式だけがコンテキストctx
に登録された状態になります。
mdn_mapper_map
mdn_result_t mdn_mapper_map(mdn_mapper_t ctx, const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromにctxで指定されるマッピング方式を適用し、
その結果をtoとtolenで指定される領域に書き込みます。
ctxに複数のマッピング方式が含まれている場合、
それらがmdn_mapper_add
で追加した順番に適用されます。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
mdn_mapper_register
mdn_result_t mdn_mapper_register(const char *prefix, mdn_mapper_createproc_t create, mdn_mapper_destroyproc_t destroy, mdn_mapper_lookupproc_t lookup)
新しいマッピング方式を登録します。
prefixには、マッピング方法の名称を指定します。
mdn_mapper_add
、
mdn_mapper_addall
でコンテキストにマッピング方式を登録する際に、
この名称でマッピング方法を指定します。
create、destroy、lookupには、
それぞれmdn_mapper_create
、
mdn_mapper_destroy
、
mdn_mapper_map
の処理が行われる際に、
呼び出してほしい関数を指定します。
それぞれの関数は、次のような引数、戻り値でなくてはなりません。
typedef mdn_result_t (*mdn_mapper_createproc_t) (const char *parameter, void **ctxp); typedef void (*mdn_mapper_destroyproc_t) (void *ctx); typedef mdn_result_t (*mdn_mapper_mapproc_t) (void *ctx, const char *utf8, const char *from, char *to, size_t tolen);
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mapselector
モジュール
mapselector
モジュールは、
mapper
モジュールと同様に、
ドメイン名中の文字のマッピングを行います。
mapselector
は、
ドメイン名のトップレベルドメイン毎に異なったマッピング規則を適当させることができるようにmapper
を拡張したものです。
mapselector
モジュールは「マップ選択コンテキスト」という概念を用います。
マッピングを行うに先立ってまずマップコンテキストを作成し、
使用するマッピング方式をコンテキストに登録しておきます。
実際のマッピング処理の際にはマッピング方式ではなく、
このマップコンテキストを指定します。
マップコンテキストの型はmdn_mapselector_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_mapselector *mdn_mapselector_t;
以下にモジュールの提供するAPI関数を示します。
mdn_mapselector_initialize
mdn_result_t mdn_mapselector_initialize(void)
モジュールの初期化処理を行います。 本モジュールの他のAPI関数を呼ぶ前に 必ず呼び出してください。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_mapselector_create
mdn_result_t mdn_mapselector_create(mdn_mapselector_t *ctxp)
マップ選択用の空のコンテキストを作成し、
ctxpの指す領域に格納します。
返されるコンテキストは空で、
マッピング方式は一つも含まれていません。
マッピング方式を追加するにはmdn_mapselector_add
、
mdn_mapselector_addall
を用います。
コンテキストで作成された時点では、
コンテキストの参照カウントは1になっています。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_mapselector_destroy
void mdn_mapselector_destroy(mdn_mapselector_t ctx)
mdn_mapselector_create
で作成したマップコンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn_mapselector_incrref
void mdn_mapselector_incrref(mdn_mapselector_t ctx)
mdn_mapselector_create
で作成したコンテキストの参照カウントを一つ増やします。
mdn_mapselector_mapper
mdn_mapper_t mdn_mapselector_mapper(mdn_mapselector_t ctx, const char *tld)
マップ選択コンテキストctxは、
マッピング規則をトップレベルドメイン毎に1個のmapper
モジュールのコンテキストに格納して管理しています。
この関数は、ctxが保持している、
トップレベルドメインtldに対するmapper
コンテキストを取り出します。
取り出したコンテキストの参照カウントは2になっています。
取り出したコンテキストを使い終わったら、
必ずmdn_mapper_destroy
を呼び出して参照カウントを減らして下さい。
mdn_mapselector_add
extern mdn_result_t mdn_mapselector_add(mdn_mapselector_t ctx, const char *tld, const char *name)
mdn_mapselector_create
で作成したコンテキストに、
トップレベルドメインがtldのドメイン名に対するマッピング方式としてnameを追加します。
一つのコンテキストの各トップドメインに対して、
複数のマッピング方式を追加することができます。
tldには.jp
や.tw
のようなトップレベルドメイン名を指定します。
(先頭の `.
' は省略可能です。)
加えて、tldに`.
'を指定すると、
マッピング規則が定義されていないトップレベルドメインに対する、
デフォルトのマッピング規則を追加します。
同様に`-
'を指定すると、
トップレベルドメインを持たないドメイン名(`.
'を含まないドメイン名)に適当するマッピング規則を追加します。
マッピング方式nameの書式は、
mdn_mapper_map
のものと変わりません。
mdn_mapper_register
で登録したマッピング方式も指定することができます。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
mdn_mapselector_addall
mdn_result_t mdn_mapselector_addall(mdn_mapselector_t ctx, const char *tld, const char **names, int nnames)
mdn_mapselector_addall
は一度に複数のマッピング方式を追加することを除いて、
mdn_mapselector_add
と同じです。
長さnnamesからなる配列namesの各要素をマッピング方式として登録します。
すべての方式の追加に成功するとmdn_success
を返します。
登録に失敗した場合、
失敗した方式より先に記述されていた方式だけがコンテキストctx
に登録された状態になります。
mdn_mapselector_map
mdn_result_t mdn_mapselector_map(mdn_mapselector_t ctx, const char *from, char *to, size_t tolen)
UTF-8でエンコードされたドメイン名fromに対して、
そのトップレベルドメインに応じてctxで指定されたマッピング方式を適用し、
その結果をtoとtolenで指定される領域に書き込みます。
ctx に、
そのトップレベルドメイン向けのマッピング方式が複数個含まれている場合、
それらがmdn_mapselector_add
で追加した順番に適用されます。
返される値はmdn_success
、
mdn_nomemory
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
msgheader
モジュール
msgheader
モジュールはDNSメッセージのヘッダの解析、
および組み立てを行うモジュールです。
解析されたヘッダ情報は、次に示す構造体に入ります。 各フィールドはDNSメッセージヘッダのフィールドにそのまま対応しているので、 説明は省略します。
typedef struct mdn_msgheader { unsigned int id; int qr; int opcode; int flags; int rcode; unsigned int qdcount; unsigned int ancount; unsigned int nscount; unsigned int arcount; } mdn_msgheader_t;
以下にモジュールの提供するAPI関数を示します。
mdn_msgheader_parse
mdn_result_t mdn_msgheader_parse(const char *msg, size_t msglen, mdn_msgheader_t *parsed)
msgとmsglenで示されるDNSメッセージのヘッダを解析し、 parsedが示す構造体に格納します。
返される値はmdn_success
、
mdn_invalid_message
のいずれかです。
mdn_msgheader_unparse
mdn_result_t mdn_msgheader_unparse(mdn_msgheader_t *parsed, char *msg, size_t msglen)
この関数はmdn_msgheader_parse
の逆の処理を行います。
つまり、parsedで指定された構造体のデータからDNSメッセージのヘッダを構成し、
msgとmsglenで示される領域に格納します。
返される値はmdn_success
、
mdn_buffer_overflow
のいずれかです。
mdn_msgheader_getid
unsigned int mdn_msgheader_getid(const char *msg)
msgで指定されるDNSメッセージからIDを取り出して返します。 この関数はヘッダ全体を解析せずにIDだけ取り出したいときに便利です。 この関数は、 msgの指すデータがDNSメッセージのヘッダ長以上あることを仮定していますので、 必ず呼び出し側で確認してから呼び出すようにしてください。
mdn_msgheader_setid
void mdn_msgheader_setid(char *msg, unsigned int id)
msgで指定されるDNSメッセージにidで指定されるID を設定します。 この関数もmsgの指すデータがDNSメッセージのヘッダ長以上あることを仮定していますので、 必ず呼び出し側で確認してから呼び出すようにしてください。
msgtrans
モジュール
msgtrans
モジュールはDNSプロキシサーバでのDNSメッセージの変換処理の大部分を提供するモジュールです。
このモジュールはconverter
モジュールやnormalizer
モジュールなど他の多くのモジュールの上位モジュールとして実現されています。
DNSプロキシサーバにおけるメッセージ変換処理はおよそ次のようなものです。
まずクライアントからDNSサーバへのメッセージの変換の場合は次のようになります。
- クライアントから受信したリクエストメッセージを解析し、クライアント側のエンコーディングを判定します。
- 判定結果を用いて、エンコーディングをUTF-8に変換します。
- 正規化処理を行います。
- エンコーディングをUTF-8からDNSサーバ側で用いられるエンコーディングに変換します。
- 以上の処理をメッセージに含まれるすべてのドメイン名に対して行い、変換結果を再びDNSメッセージ形式にまとめてDNSサーバに送信します。
次にDNSサーバからクライアントへのメッセージの変換の場合は次のようになります。
- DNSサーバから受信したリプライメッセージを解析し、含まれているすべてのドメイン名に対して、ZLDの除去、UTF-8エンコーディングへの変換を行います。
- さらにクライアント側エンコーディングに変換し、ZLDを付加します。
- 変換結果を再びDNSメッセージ形式にまとめてクライアントに送信します。
以下にモジュールの提供するAPI関数を示します。
mdn_msgtrans_translate
mdn_result_t mdn_msgtrans_translate(mdn_resconf_t resconf, const char *msg, size_t msglen, char *outbuf, size_t outbufsize, size_t *outmsglenp)
msgおよびmsglenで指定されるDNSメッセージをresconfにしたがって変換し、 結果をoutbufおよびoutbufsizeで示される領域に格納します。 outmsglenpには変換結果のメッセージ長が格納されます。
返される値はmdn_success
、
mdn_invalid_message
、
mdn_invalid_encoding
、
mdn_buffer_overflow
のいずれかです。
nameprep
モジュール
nameprep
モジュールは、
NAMEPREPの記述にしたがってドメイン名の正規化行うためのモジュールです。
現在サポートされているNAMEPREPのバージョンは次の通りです。
nameprep-02
nameprep-03
nameprep
モジュールは「NAMEPREPコンテキスト」という概念を用います。
正規化に先立ってまずNAMEPREPコンテキストを作成し、
使用するバージョンをコンテキストに登録しておきます。
実際の正規化処理の際には、NAMEPREPバージョンではなく、
コンテキストを指定します。
NAMEPREPコンテキストの型はmdn_nameprep_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_nameprep *mdn_nameprep_t;
以下にモジュールの提供するAPI関数を示します。
mdn_nameprep_create
mdn_result_t mdn_nameprep_create(const char *version, mdn_nameprep_t *ctxp)
指定されたバージョンvarsionのNAMEPREPコンテキストを作成し、ctxpの指す領域に格納します。
返される値はmdn_success
、
mdn_notfound
のいずれかです。
mdn_nameprep_destroy
void mdn_nameprep_destroy(mdn_nameprep_t ctx)
mdn_nameprep_create
で作成したNAMEPREPコンテキストを削除し、
アロケートされたメモリを解放します。
mdn_nameprep_map
mdn_result_t mdn_nameprep_map(mdn_nameprep_t ctx, const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromにctxで指定されるマッピング方式を適用し、 その結果をtoとtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
のいずれかです。
mdn_nameprep_isprohibited
mdn_result_t mdn_nameprep_isprohibited(mdn_nameprep_t ctx, const char *utf8, const char **found)
UTF-8でエンコードされた文字列utf8をctxに指定された検査方式で検査します。
文字列が使用を禁止されている文字を含んでいた場合、
foundにその先頭位置を格納します。
含まれていない場合は、NULL
を返します。
返される値はmdn_success
、
mdn_invalid_encoding
のいずれかです。
mdn_nameprep_isunassigned
mdn_result_t mdn_nameprep_isunassigned(mdn_nameprep_t ctx, const char *utf8, const char **found)
UTF-8でエンコードされた文字列utf8をctxに指定された検査方式で検査します。
文字列が未割り当てコードポイントを含んでいた場合、
foundにその先頭位置を格納します。
含まれていない場合は、NULL
を返します。
返される値はmdn_success
、
mdn_invalid_encoding
のいずれかです。
normalizer
モジュール
normalizer
モジュールは文字列の正規化を行うモジュールです。
正規化の方式としては現在次のものが用意されています。
また別の新たな正規化方式を追加登録するためのAPIも用意されています。
-
ascii-uppercase
ASCIIの小文字から大文字への変換 -
ascii-lowercase
ASCIIの大文字から小文字への変換 -
unicode-uppercase
Unicodeの文字属性を規定したCase Mappingsに記述されている小文字大文字マッピングに従った小文字から大文字への変換 -
unicode-lowercase
上記と同じ文書にしたがった大文字から小文字への変換 -
unicode-foldcase
上記と同じ文書にしたがった、大文字と小文字を区別なしに比較する際に行う変換 -
unicode-form-c
Unicodeの正規化方式を規定したUnicode Normalization Formsに記述されているNormaliztion form C
に従う正規化 -
unicode-form-kc
同文書に記述されているUnicode Normalization Form KC
に従う正規化
正規化方式は複数併用することも可能で、 この場合指定した順に適用されます。
normalizer
モジュールは「正規化コンテキスト」という概念を用います。
正規化を行うに先立ってまず正規化コンテキストを作成し、
使用する正規化方式をコンテキストに登録しておきます。
実際の正規化処理の際には正規化方式ではなく、
この正規化コンテキストを指定します。
正規化コンテキストの型はmdn_normalizer_t
型であり、
次のような opaque 型として定義されています。
typedef struct mdn_normalizer *mdn_normalizer_t;
以下にモジュールの提供するAPI関数を示します。
mdn_normalizer_initialize
mdn_result_t mdn_normalizer_initialize(void)
モジュールの初期化処理を行います。 本モジュールの他のAPI関数を呼ぶ前に必ず呼び出してください。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_normalizer_create
mdn_result_t mdn_normalizer_create(mdn_normalizer_t *ctxp)
正規化用の空のコンテキストを作成し、
ctxpの指す領域に格納します。
返されるコンテキストは空で、
正規化方式は一つも含まれていません。
正規化方式を追加するにはmdn_normalizer_add
、
mdn_normalizer_addall
を用います。
コンテキストで作成された時点では、
コンテキストの参照カウントは1になっています。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_normalizer_destroy
void mdn_normalizer_destroy(mdn_normalizer_t ctx)
mdn_normalizer_create
で作成した正規化コンテキストの参照カウントを一つ減らします。
その結果、カウントが0になれば、コンテキストを削除し、
アロケートされたメモリを解放します。
mdn__nomalizer_incrref
void mdn_normalizer_incrref(mdn_normalizer_t ctx)
mdn_normalizer_create
で作成した正規化コンテキストの参照カウントを一つ増やします。
mdn_normalizer_add
mdn_result_t mdn_normalizer_add(mdn_normalizer_t ctx, const char *scheme_name)
mdn_normalizer_create
で作成した正規化コンテキストに、
scheme_nameで指定される正規化方式を追加します。
一つのコンテキストに複数の正規化方式を追加することができます。
返される値はmdn_success
、
mdn_invalid_name
、
mdn_nomemory
のいずれかです。
mdn_normalizer_addall
mdn_result_t mdn_normalizer_addall(mdn_normalizer_t ctx, const char **scheme_names, int nschemes)
mdn_normalizer_addall
は一度に複数の正規化方式を追加することを除いて、
mdn_normalizer_add
と同じです。
長さnschemesからなる配列scheme_namesの各要素を正規化方式として登録します。
すべての方式の追加に成功するとmdn_success
が返ります。
登録に失敗した場合、
失敗した方式より先に記述されていた方式だけがコンテキストctx
に登録された状態になります。
mdn_normalizer_normalize
mdn_result_t mdn_normalizer_normalize(mdn_normalizer_t ctx, const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromにctxで指定される正規化方式を適用し、
その結果をtoとtolenで指定される領域に書き込みます。
ctxに複数の正規化方式が含まれている場合、
それらがmdn_normalizer_add
で追加した順番に適用されます。
返される値はmdn_success
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
mdn_normalizer_register
mdn_result_t mdn_normalizer_register(const char *scheme_name, mdn_normalizer_proc_t proc)
新しい正規化方式をscheme_nameという名前で登録します。 procはその正規化方式の処理関数へのポインタです。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
race
モジュール
race
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているRACEエンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してRACE
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__race_open
mdn_result_t mdn__race_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
RACEエンコーディングとの変換をオープンします。 実際には何もしません。
常に mdn_success
を返します。
mdn__race_close
mdn_result_t mdn__race_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
RACEエンコーディングとの変換をクローズします。 実際には何もしません。
常にmdn_success
を返します。
mdn__race_convert
mdn_result_t mdn__race_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
RACEエンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならRACEエンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからRACEエンコーディングへの変換となります。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
res
モジュール
res
モジュールはクライアント側(リゾルバライブラリやアプリケーション)で多言語ドメイン名の処理、
つまりドメイン名のエンコーディング変換や正規化を行う際の高レベルAPIを提供します。
このモジュールはあとで説明するresconf
モジュールとともに用いることを前提に設計されています。
これらのモジュールの提供するAPIを使用すれば、
converter
モジュールやnormalizer
モジュールなどの関数を直接呼び出す必要はありません。
以下にモジュールの提供するAPI関数を示します。
mdn_res_nameconv
mdn_result_t mdn_res_nameconv(mdn_resconf_t ctx, const char *insn, const char *from, char *to, size_t tolen)
文字列fromに対して、 多言語ドメイン名に関する変換や検査を行い、 結果をtoおよびtolenで指定された領域に格納します。 変換や検査は、 設定コンテキストctxにしたがって行われます。
具体的にどのような変換および検査を、 どういう順番で行うのかは文字列insnで指定します。 変換や検査の方法は、すべて次のように一文字で表します。 文字列insnにセットされたこれらの文字の並びは、 先頭から順に評価されていきます。
l
- ローカルエンコーディングからUTF-8に変換します。
L
- UTF-8からローカルエンコーディングに変換します。
d
- デリミタのマッピングを行います。
M
- ローカルなマッピングを適用します。
m
- マッピングを行います。
n
- 正規化を行います。
N
- `
mnp
' と等価です。 p
- 禁止文字の検査を行います。
u
- 割り当てコードポイントの検査を行います。
I
- UTF-8からIDNエンコーディングに変換します。
i
- IDNエンコーディングからUTF-8に変換します。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_invalid_name
、
mdn_invalid_action
、
mdn_invalid_nomemory
、
mdn_invalid_nomapping
、
mdn_invalid_prohibited
、
mdn_failure
のいずれかです。
mdn_res_localtoucs
mdn_result_t mdn_res_localtoucs(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列をローカルエンコーディングからUTF-8に変換します。 次の処理と等価です。
mdn_res_nameconv(ctx, "l", from, to, tolen)
mdn_res_ucstolocal
mdn_result_t mdn_res_ucstolocal(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列をUTF-8からローカルエンコーディングに変換します。 次の処理と等価です。
mdn_res_nameconv(ctx, "L", from, to, tolen)
mdn_res_delimitermap
mdn_result_t mdn_res_delimitermap(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対してデリミタのマッピングを行います。 次の処理と等価です。
mdn_res_nameconv(ctx, "d", from, to, tolen)
mdn_res_localmap
mdn_result_t mdn_res_localmap(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対してローカルなマッピングを適用します。 次の処理と等価です。
mdn_res_nameconv(ctx, "M", from, to, tolen)
mdn_res_map
mdn_result_t mdn_res_map(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対してマッピングを行います。 次の処理と等価です。
mdn_res_nameconv(ctx, "m", from, to, tolen)
mdn_res_normalize
mdn_result_t mdn_res_normalize(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対して正規化を行います。 次の処理と等価です。
mdn_res_nameconv(ctx, "n", from, to, tolen)
mdn_res_prohibitcheck
mdn_result_t mdn_res_prohibitcheck(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対して禁止文字の検査を行います。 次の処理と等価です。
mdn_res_nameconv(ctx, "p", from, to, tolen)
mdn_res_unassignedcheck
mdn_result_t mdn_res_unassignedcheck(mdn_resconf_t ctx, const char *from, char *to, size_t tolen)
文字列に対して未割り当てコードポイントの検査を行います。 次の処理と等価です。
mdn_res_nameconv(ctx, "u", from, to, tolen)
mdn_res_ucstodns
mdn_result_t mdn_res_ucstodns(mdn_resconf_t ctx, const char *from, char *to, size_t tolen);
文字列をUTF-8からIDNエンコーディングに変換します。 次の処理と等価です。
mdn_res_nameconv(ctx, "I", from, to, tolen)
mdn_res_dnstoucs
mdn_result_t mdn_res_dnstoucs(mdn_resconf_t ctx, const char *from, char *to, size_t tolen);
文字列をIDNエンコーディングからUTF-8に変換します。 次の処理と等価です。
mdn_res_nameconv(ctx, "i", from, to, tolen)
resconf
モジュール
resconf
モジュールはクライアント側(リゾルバライブラリやアプリケーション)で多言語ドメイン名の処理を行う際に参照されるmDNkit設定ファイルを読み込み、
ファイルの設定にしたがった初期化を実行します。
また設定情報を取り出す機能を提供します。
resconf
モジュールは「設定コンテキスト」という概念を用います。
設定ファイルに記述された設定はこの設定コンテキストに格納され、
このコンテキストを引数にしてAPI関数を呼び出すことによって設定された値を取り出すことができます。
設定コンテキストの型はmdn_resconf_t
型であり、
次のようなopaque型として定義されています。
typedef struct mdn_resconf *mdn_resconf_t;
このモジュールは単体でも使用できますが、
res
モジュールと組み合わせることによって、
クライアント側での多言語ドメイン名の処理を簡単に行うことができるように設計されています。
以下にモジュールの提供するAPI関数を示します。
mdn_resconf_initialize
mdn_result_t mdn_resconf_initialize(void)
多言語ドメイン名の処理を行う際に必要な初期化を実行します。 本モジュールの他のAPI関数を呼ぶ前に必ず呼び出してください。 本モジュールが使用する他のモジュールの初期化もすべて行うので、 これ以外の初期化関数を呼び出す必要はありません。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_resconf_create
mdn_result_t mdn_resconf_create(mdn_resconf_t *ctxp)
設定コンテキストを作成、初期化し、
ctxpの指す領域に格納します。
初期状態では、
まだ設定ファイルの内容は読み込まれていません。
読み込むためにはmdn_resconf_loadfile
を実行する必要があります。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_resconf_destroy
void mdn_resconf_destroy(mdn_resconf_t ctx)
mdn_resconf_loadfile
mdn_result_t mdn_resconf_loadfile(mdn_resconf_t ctx, const char *file)
fileで指定されるmDNkit設定ファイルの内容を読み込み、
設定内容を設定コンテキストctxに格納します。
fileがNULL
の場合にはデフォルトの設定ファイルの内容を読み込みます。
すでに設定ファイルが読み込まれているコンテキストに対して、 別の設定ファイルの内容を読み込むこともできます。 その場合には、 設定コンテキストに格納されていた前の設定ファイルの内容はすべて消え、 新たに読み込んだ設定ファイルの内容で置き換わります。
返される値はmdn_success
、
mdn_nofile
、
mdn_invalid_syntax
、
mdn_invalid_name
、
mdn_nomemory
のいずれかです。
mdn_resconf_defaultfile
char * mdn_resconf_defaultfile(void)
デフォルトの設定ファイルのパス名を返します。 これはmDNkitのコンパイル時の設定によって決まりますが、 特に指定しなければ
/usr/local/etc/mdn.conf
です。
mdn_resconf_getidnconverter
mdn_converter_t mdn_resconf_getidnconverter(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
IDNエンコーディングとUTF-8との間の文字コード変換を行うためのコード変換コンテキストを返します。
コンテキストにIDNエンコーディングが指定されていない場合にはNULL
を返します。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_getlocalconverter
mdn_converter_t mdn_resconf_getlocalconverter(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
ローカルエンコーディングとUTF-8との間の文字コード変換を行うためのコード変換コンテキストを返します。
ローカルエンコーディングが判別できなかった場合にはNULL
を返します。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_getalternateconverter
mdn_converter_t mdn_resconf_getalternateconverter(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
代替エンコーディングとUTF-8との間の文字コード変換を行うためのコード変換コンテキストを返します。
コンテキストに代替エンコーディングが指定されていない場合にはNULL
を返します。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_getmapper
mdn_mapper_t mdn_resconf_getmapper(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
正規化処理を行うためのマップコンテキストを返します。
コンテキストにマッピング方式が指定されていない場合にはNULL
を返します。
マップコンテキストについてはmapper
モジュールの項をご覧ください。
mdn_resconf_getnormalizer
mdn_normalizer_t mdn_resconf_getnormalizer(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
正規化処理を行うための正規化コンテキストを返します。
コンテキストに正規化方式が指定されていない場合にはNULL
を返します。
正規化変換コンテキストについてはnormalizer
モジュールの項をご覧ください。
mdn_resconf_getprohibit
mdn_checker_t mdn_resconf_getprohibit(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
禁止文字の検査処理を行うための検査コンテキストを返します。
コンテキストに禁止文字の検査方式が指定されていない場合にはNULL
を返します。
検査コンテキストについてはchecker
モジュールの項をご覧ください。
mdn_resconf_getunassigned
mdn_checker_t mdn_resconf_getunassigned(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
未割り当てコードポイントの検査処理を行うための正規化コンテキストを返します。
コンテキストに未割り当てコードポイントの検査方式が指定されていない場合にはNULL
を返します。
検査コンテキストについてはchecker
モジュールの項をご覧ください。
mdn_resconf_getdelimitermap
mdn_delimitermap_t mdn_resconf_getdelimitermap(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
デリミタのマッピングを行うためのデリミタマップコンテキストを返します。
コンテキストにデリミタが指定されていない場合にはNULL
を返します。
デリミタマップコンテキストについてはdelimitermap
モジュールの項をご覧ください。
mdn_resconf_getmapselector
mdn_mapselector_t mdn_resconf_getmapselector(mdn_resconf_t ctx)
設定コンテキストctxの情報を元に、
トップレベルドメインに応じたローカルなマッピング処理を行うためのマップ選択コンテキストを返します。
コンテキストにローカルなマッピング方式が指定されていない場合にはNULL
を返します。
マップ選択コンテキストについてはmapselector
モジュールの項をご覧ください。
mdn_resconf_setidnconverter
mdn_result_t mdn_resconf_setidnconverter(mdn_resconf_t ctx, mdn_converter_t idn_converter)
コード変換コンテキストidn_converterの情報をもとに、
IDNエンコーディングとUTF-8との間の文字コード変換を行うための変換方式を設定コンテキストctxにセットします。
idn_converterにNULL
を渡した場合、
変換方式は未指定の状態となります。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_setlocalconverter
mdn_result_t mdn_resconf_setlocalconverter(mdn_resconf_t ctx, mdn_converter_t local_converter)
コード変換コンテキストlocal_converterの情報をもとに、
ローカルエンコーディングとUTF-8との間の文字コード変換を行うための変換方式を設定コンテキストctxにセットします。
local_converterにNULL
を渡した場合、
ローカルエンコーディングには自動判別したエンコーディングが用いられます。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_setalternateconverter
mdn_result_t mdn_resconf_setalternateconverter(mdn_resconf_t ctx, mdn_converter_t alternate_converter)
コード変換コンテキストalternate_converterの情報をもとに、
代替エンコーディングとUTF-8との間の文字コード変換を行うための変換方式を設定コンテキストctxにセットします。
alaternate_converterにNULL
を渡した場合、
変換方式は未指定の状態となります。
コード変換コンテキストについてはconverter
モジュールの項をご覧ください。
mdn_resconf_setmapper
mdn_result_t mdn_resconf_setmapper(mdn_resconf_t ctx, mdn_mapper_t mapper)
マップコンテキストmapperの情報をもとに、
マッピングを行うための方式を設定コンテキストctxにセットします。
mapperにNULL
を渡した場合、
マッピング方式は未指定の状態となります。
マップコンテキストについてはmapper
モジュールの項をご覧ください。
mdn_resconf_setnormalizer
mdn_result_t mdn_resconf_setnormalizer(mdn_resconf_t ctx, mdn_normalizer_t normalizer)
正規化コンテキストnormalizerの情報をもとに、
正規化方式を設定コンテキストctxにセットします。
normalizer にNULL
を渡した場合、
正規化方式は未指定の状態となります。
正規化変換コンテキストについてはnormalizer
モジュールの項をご覧ください。
mdn_resconf_setprohibit
mdn_result_t mdn_resconf_setprohibit(mdn_resconf_t ctx, mdn_checker_t prohibit_checker)
検査コンテキストprohibit_checkerの情報をもとに、
禁止文字の検査を行うための検査方式を設定コンテキストctxにセットします。
prohibit_checkerにNULL
を渡した場合、
検査方式は未指定の状態となります。
検査コンテキストについてはchecker
モジュールの項をご覧ください。
mdn_resconf_setunassigned
mdn_result_t mdn_resconf_setunassigned(mdn_resconf_t ctx, mdn_checker_t unassigned_checker)
検査コンテキストunassigned_checkerの情報をもとに、
未割り当てコードポイントの検査を行うための検査方式を設定コンテキストctxにセットします。
unassigned_checkerにNULL
を渡した場合、
検査方式は未指定の状態となります。
検査コンテキストについてはchecker
モジュールの項をご覧ください。
mdn_resconf_setdelimitermap
mdn_result_t mdn_resconf_setdelimitermap(mdn_resconf_t ctx, mdn_delimitermap_t delimiter_mapper)
デリミタマップコンテキストdelimiter_mapperの情報をもとに、
デリミタを設定コンテキストctxにセットします。
delimiter_mapperにNULL
を渡した場合、
デリミタは未指定の状態となります。
デリミタマップコンテキストについてはdelimitermap
モジュールの項をご覧ください。
mdn_resconf_setmapselector
mdn_result_t mdn_resconf_setmapselector(mdn_resconf_t ctx, mdn_mapselector_t map_selector)
マップ選択コンテキストmap_selectorの情報をもとに、
ローカルなマッピング方式を設定コンテキストctxにセットします。
map_selectorにNULL
を渡した場合、
マッピング方式は未指定の状態となります。
マップ選択コンテキストについてはmapselector
モジュールの項をご覧ください。
mdn_resconf_setidnconvertername
mdn_result_t mdn_resconf_setidnconvertername(mdn_resconf_t ctx, const char *name, int flags)
IDNエンコーディングを設定コンテキストctxにセットします。
idn_converterにNULL
を渡した場合、
IDNエンコーディングは未指定の状態となります。
mdn_resconf_setlocalconvertername
mdn_result_t mdn_resconf_setlocalconvertername(mdn_resconf_t ctx, const char *name, int flags)
ローカルエンコーディングを設定コンテキストctxにセットします。
local_converterにNULL
を渡した場合、
自動判別したエンコーディングがセットされます。
mdn_resconf_setalternateconvertername
mdn_result_t mdn_resconf_setalternateconvertername(mdn_resconf_t ctx, const char *name, int flags)
代替エンコーディングを設定コンテキストctxにセットします。
alaternate_converterにNULL
を渡した場合、
代替エンコーディングは未指定の状態となります。
mdn_resconf_addallmappernames
mdn_result_t mdn_resconf_addallmappernames(mdn_resconf_t ctx, const char **names, int nnames)
namesとnnamesに記されたマッピング方式を、 すべて設定コンテキストctxに追加します。
mdn_resconf_addallnormalizernames
mdn_result_t mdn_resconf_addallnormalizernames(mdn_resconf_t ctx, const char **names, int nnames)
namesとnnamesに記された正規化方式を、 すべて設定コンテキストctxに追加します。
mdn_resconf_addallprohibitnames
mdn_result_t mdn_resconf_addallprohibitnames(mdn_resconf_t ctx, const char **names, int nnames)
namesとnnamesに記された禁止文字の検査方式を、 すべて設定コンテキストctxに追加します。
mdn_resconf_addallunassignednames
mdn_result_t mdn_resconf_addallunassignednames(mdn_resconf_t ctx, const char **names, int nnames)
namesとnnamesに記された未割り当てコードポイントの検査方式をすべて設定コンテキストctxに追加します。
mdn_resconf_addalldelimitermapucs
mdn_result_t mdn_resconf_addalldelimitermapucs(mdn_resconf_t ctx, unsigned long *v, int nv);
コードポイントの配列vとその長さnvで表されたデリミタをすべて設定コンテキストctxに追加します。
この関数でデリミタを追加した場合、
mdn_res_nameconv
を用いたデリミタのマッピングを行う前に必ずmdn_resconf_fixdelimitermap
を呼び出して、
デリミタの追加をこれ以上行わないことを宣言する必要があります。
mdn_resconf_fixdelimitermap
mdn_result_t mdn_resconf_fixdelimitermap(mdn_resconf_t ctx)
デリミタの追加をこれ以上行わないことを宣言します。
mdn_resconf_addalldelimitermapucs
を用いてデリミタの追加を行ったときは、
この関数を呼んでおかないとmdn_res_nameconv
によるデリミタのマッピングが成功しません。
mdn_resconf_allallmapselectornames
mdn_result_t mdn_resconf_addallmapselectornames(mdn_resconf_t ctx, const char *tld, const char **names, int nnames)
トップレベルドメインtldに対するローカルなマッピング方式として、 namesとnnamesに記されたものをすべて設定コンテキストctxに追加します。
mdn_resconf_setnameprepversion
mdn_result_t mdn_resconf_setnameprepversion(mdn_resconf_t ctx, const char *version)
設定コンテキストctxのNAMEPREPのバージョンをversionにセットします。
result
モジュール
result
モジュールはライブラリの各関数が返すmdn_result_t
型の値を扱うモジュールで、
値からそのコードに対応するメッセージへの変換を提供します。
以下にモジュールの提供するAPI関数を示します。
mdn_result_tostring
char * mdn_result_tostring(mdn_result_t result)
mdn_result_t
型の値resultに対応するメッセージ文字列を返します。
未定義のコードに対してはunknown result code
という文字列が返されます。
selectiveencode
モジュール
selectiveencode
モジュールはゾーンマスタファイル等のテキストの中から非ASCII文字を含むドメイン名を探し出すモジュールです。
もちろんテキストのどの部分がドメイン名なのかを判定することは一般的には不可能なので、
実際には次のような大きな仮定を置くことによって近似的に実現しています。
- 非ASCII文字はドメイン名の中にのみ現れる
具体的には次のようなアルゴリズムを用いてドメイン名の領域検出を行います。
- テキストを走査して、非ASCII文字を探す。
- 見つかった非ASCII文字の前後の文字を調べ、 その文字を含み、 かつ他の非ASCII文字あるいは従来の(多言語化されていない)ドメイン名として使用可能な文字だけからなる範囲を求める。
- 求めた範囲をドメイン名として返す。
以下にモジュールの提供するAPI関数を示します。
mdn_selectiveencode_findregion
mdn_result_t mdn_selectiveencode_findregion(const char *s, char **startp, char **endp)
UTF-8でエンコードされた文字列sを走査して、 最初に出現する非ASCII文字を含むドメイン名の領域を求め、 その先頭を指すポインタをstartpに、 領域の直後の文字を指すポインタをendpにそれぞれ格納します。
返される値はmdn_success
、
mdn_notfound
のいずれかです。
strhash
モジュール
strhash
モジュールは文字列をキーとするハッシュ表を実現するモジュールです。
ハッシュ表はconverter
モジュールやnormalizer
モジュールなどライブラリの他のモジュールで使用されます。
非常に一般的なハッシュ表の実装であり、
特筆すべき点はありません…一つだけあります。
登録はできますが削除の機能がありません。
本ライブラリでは必要ないからです。
ハッシュ表のサイズは要素の総数が増えるに従って大きくなります。
ハッシュ表は次に示すmdn_strhash_t
型のopaqueデータとして表されます。
typedef struct mdn_strhash *mdn_strhash_t;
以下にモジュールの提供するAPI関数を示します。
mdn_strhash_create
mdn_result_t mdn_strhash_create(mdn_strhash_t *hashp)
空のハッシュ表を作成し、 そのハンドルをhashpの指す領域に格納します。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_strhash_destroy
void mdn_strhash_destroy(mdn_strhash_t hash)
mdn_strhash_create
で作成したハッシュ表を削除し、
確保したメモリを解放します。
mdn_strhash_put
mdn_result_t mdn_strhash_put(mdn_strhash_t hash, const char *key, void *value)
mdn_strhash_create
で作成したハッシュ表hashにキーkey、
値valueの組を登録します。
文字列keyはコピーされますので、
この関数の呼び出し後keyの指すメモリを解放しても、
文字列の内容を書き換えても影響はありません。
これに対してvalueの内容はコピーされないので注意してください (もちろんよく考えてみればコピーされないことは自明ですが)。
同じキーを使用して複数回登録した場合、 最後に登録されたものだけが有効です。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn_strhash_get
mdn_result_t mdn_strhash_get(mdn_strhash_t hash, const char *key, void **valuep)
ハッシュ表hashからキーkeyを持つ要素を検索し、 対応する要素があればその値をvaluepに格納します。
返される値はmdn_success
、
mdn_noentry
のいずれかです。
mdn_strhash_exists
int mdn_strhash_exists(mdn_strhash_t hash, const char *key)
ハッシュ表hashにキーkeyを持つ要素があれば1を、 なければ0を返します。
ucsmap
モジュール
ucsmap
モジュールは、
文字のマッピング規則を登録するためのモジュールです。
このモジュールは、
filemapper
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
以下にモジュールの提供するAPI関数を示します。
mdn__ucsmap_create
mdn_result_t mdn__ucsmap_create(mdn_ucsmap_t *ctxp)
UCSマップコンテキストを一つ作成します。 ただし、作成した時点のコンテキストには、 マッピング規則は一つも登録されていません。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn__ucsmap_destroy
void mdn__ucsmap_destroy(mdn_ucsmap_t ctx)
mdn__ucsmap_create
で作成したコンテキストを削除し、
アロケートされたメモリを解放します。
mdn__ucsmap_add
void mdn__ucsmap_add(mdn_ucsmap_t ctx, unsigned long v, unsigned long *map, size_t maplen)
mdn__ucsmap_create
で作成したコンテキストにUnicodeコードポイントvのマッピング規則を登録します。
マップ後のシーケンスを map、
maplenで指定します。
ただし、mdn__ucsmap_fix
をを呼ぶ前でないと、
マッピング規則を登録することはできません。
mdn__ucsmap_fix
を既に呼んだ状態でこの関数を呼ぶと、
mdn_failure
を返します。
返される値はmdn_success
、
mdn_nomemory
、
mdn_failure
のいずれかです。
mdn__ucsmap_fix
void mdn__ucsmap_fix(mdn_ucsmap_t ctx)
コンテキスト内に格納されいてるデータの配置を、最適化します。
この関数を利用すると、
それ以降はmdn__ucsmap_add
によるマッピング規則の登録はできなくなります。
逆に、
この関数を呼ばないとmdn__ucsmap_map
による文字のマッピングは行えません。
mdn__ucsmap_map
mdn_result_t mdn_ucsmap_map(mdn_ucsmap_t ctx, unsigned long v, unsigned long *to, size_t tolen, size_t *maplenp);
Unicodeのコードポイントvのマップ後のシーケンスをtoに格納します。 領域toの大きさをtolenで渡し、 実際のマップ後のシーケンスの長さはmaplenpに格納されます。
この関数を利用するには、
あらかじめmdn__ucsmap_fix
を呼んでおかなければなりません。
mdn__ucsmap_fix
が呼ばれていない状態でこの関数を呼ぶと、
mdn_failure
を返します。
返される値はmdn_success
、
mdn_nomapping
、
mdn_failure
のいずれかです。
ucsset
モジュール
ucsset
モジュールは、
文字の登録を行うためのモジュールです。
このモジュールは、
filechecker
モジュールおよびdelimitermap
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
以下にモジュールの提供するAPI関数を示します。
mdn__ucsset_create
mdn_result_t mdn__ucsset_create(mdn_ucsset_t *ctxp)
UCSセットコンテキストを一つ作成します。 作成したばかりのコンテキストには、文字は一つも登録されていません。
返される値はmdn_success
、
mdn_nomemory
のいずれかです。
mdn__ucsset_destroy
void mdn__ucsset_destroy(mdn_ucsset_t ctx)
mdn__ucsset_create
で作成したコンテキストを削除し、
アロケートされたメモリを解放します。
mdn__ucsset_add
void mdn__ucsset_add(mdn_ucsset_t ctx, unsigned long v)
mdn__ucsset_create
で作成したコンテキストにUnicodeコードポイントvを登録します。
ただし、mdn__ucsset_fix
を呼ぶ前でないと、
文字を登録することはできません。
mdn__ucsset_fix
を既に呼んだ状態でこの関数を呼ぶと、
mdn_failure
を返します。
返される値はmdn_success
、
mdn_invalid_code
、
mdn_nomemory
、
mdn_failure
のいずれかです。
mdn__ucsset_addrange
void mdn__ucsset_addrange(mdn_ucsset_t ctx, unsigned long from, unsigned long to)
mdn__ucsset_create
で作成したコンテキストに、
fromからtoまでのUnicodeコードポイント(両端を含む) をすべて登録します。
ただし、mdn__ucsset_fix
を呼ぶ前でないと、
文字を登録することはできません。
mdn__ucsset_fix
を既に呼んだ状態でこの関数を呼ぶと、
mdn_failure
を返します。
返される値はmdn_success
、
mdn_invalid_code
mdn_nomemory
、
mdn_failure
のいずれかです。
mdn__ucsset_fix
void mdn__ucsset_fix(mdn_ucsset_t ctx)
コンテキスト内に格納されいてるデータの配置を、最適化します。
この関数を利用すると、
それ以降はmdn__ucsset_add
およびmdn__ucsset_addrange
による文字の登録はできなくなります。
逆に、この関数を呼ばないとmdn__ucsset_lookup
による文字の判定は行えません。
mdn__ucsset_lookup
mdn_result_t mdn__ucsset_lookup(mdn_ucsset_t ctx, unsigned long v, int *found)
Unicodeのコードポイントvがctx に含まれているかどうかを検査します。 含まれていれば*foundに1を、 含まれていなければ0を格納します。
この関数を利用するには、
あらかじめmdn__ucsset_fix
を呼んでおかなければなりません。
mdn__ucsset_fix
が呼ばれていない状態でこの関数を呼ぶと、
mdn_failure
を返します。
返される値はmdn_success
、
mdn_nomemory
、
mdn_failure
のいずれかです。
unicode
モジュール
unicode
モジュールは、
UnicodeData.txtに記述されている、
Unicodeの各種文字属性を取得するモジュールです。
なお、Unicode.txt に記述されているデータの意味、
およびファイル形式については
UnicodeData File Formatをご覧ください。
本ライブラリの多くのモジュールはUnicodeのデータをUTF-8エンコードされた文字列形式で扱いますが、
このモジュールはunsigned long
型のデータとして扱います。
含まれる値はUCS-4です。
このモジュールではUnicode文字の大文字小文字の相互変換機能も提供しています。 これはUnicode Technical Report #21: Case Mappingsで定義されているものです。 Unicode文字の中にはごく一部ですが大文字小文字の変換をする際に文脈情報を必要とするものがあり、 これは次のような列挙型のデータで指定します。
typedef enum { mdn__unicode_context_unknown, mdn__unicode_context_final, mdn__unicode_context_nonfinal } mdn__unicode_context_t;
文脈がFINALの場合にはmdn__unicode_context_final
を、
またNON_FINALの場合にはmdn__unicode_context_nonfinal
を指定します。
mdn__unicode_context_unknown
は文脈情報がわからない (調べていない)ことを示します。
文脈情報に関して詳しくは上記文献をご覧ください。
以下にモジュールの提供するAPI関数を示します。
mdn__unicode_canonicalclass
int mdn__unicode_canonicalclass(unsigned long c);
Unicode文字cのCanonical Combining Class
を求めます。
Canonical Combining Classが定義されていない文字については0を返します。
mdn__unicode_decompose
mdn_result_t mdn__unicode_decompose(int compat, unsigned long *v, size_t vlen, unsigned long c, int *decomp_lenp)
Unicode文字cをUnicodeData.txtのCharacter Decomposition Mapping
にしたがってdecomposeし、
その結果をvおよびvlenで指定される領域に書き込みます。
compatの値が真ならCompatibility Decomposition
を、
偽ならCanonical Decomposition
を行います。
decomposeは再帰的に行われます。 つまりCharacter Decomposition Mappingにしたがって分解した各文字についてさらにdecompose処理が行われます。
返される値はmdn_success
、
mdn_notfound
、
mdn_nomemory
のいずれかです。
mdn__unicode_compose
mdn_result_t mdn__unicode_compose(unsigned long c1, unsigned long c2, unsigned long *compp)
c1とc2の2文字のUnicode文字のシーケンスをUnicodeData.txtのCharacter Decomposition Mapping
にしたがってcomposeし、
その結果をcomppの指す領域に書き込みます。
必ずCanonical Composition
が行われます。
返される値はmdn_success
、
mdn_notfound
のいずれかです。
mdn__unicode_iscompositecandidate
int mdn__unicode_iscompositecandidate(unsigned long c)
Unicode文字cから始まるCanonical Compositionが存在するかどうかを調べ、 存在する可能性があれば1を可能性がなければ0を返します。 これはヒント情報であり、 1が返ってきたとしても実際にはCompositionが存在しないこともあり得ます。 逆に0が返ってくれば確実に存在しません。
Unicodeの全文字の中でCanonical
Composition の先頭となる文字は数少ないので、
mdn__unicode_compose
の検索のオーバヘッドを減らすためにあらかじめデータをスクリーニングする目的に使用することができます。
mdn__unicode_toupper
mdn_result_t mdn__unicode_toupper(unsigned long c, mdn__unicode_context_t ctx, unsigned long *v, size_t vlen, int *convlenp)
Unicode文字cをUnicodeData.txtのUppercase Mapping
情報およびSpecialCasing.txtの情報にしたがって大文字に変換し、
結果をvの指す領域に格納します。
vlenはあらかじめvに確保した領域の大きさです。
変換結果の文字数は*convlenpに返されます。
変換結果が複数の文字になることがあることに注意してください。
またロケール依存の変換は行いません。
ctxは文字cの出現する文脈情報です。
ほとんどの文字では変換の際に文脈情報は不要なため、
通常はmdn__unicode_context_unknown
を指定しておくことができます。
もし文脈情報が必要な場合、
本関数は戻り値としてmdn_context_required
を返すので、
文脈情報を取得してから改めて呼び出すことが可能です。
文脈情報の取得にはmdn__unicode_getcontext
を使用します。
もし対応する大文字が存在しない場合にはcがそのままvに格納されます。
返される値はmdn_success
、
mdn_context_required
、
mdn_buffer_overflow
のいずれかです。
mdn__unicode_tolower
mdn_result_t mdn__unicode_tolower(unsigned long c, mdn__unicode_context_t ctx, unsigned long *v, size_t vlen, int *convlenp)
Unicode文字cをUnicodeData.txtのUppercase Mapping
情報およびSpecialCasing.txtの情報にしたがって小文字に変換します。
使用方法は、 大文字への変換を行うmdn__unicode_toupper()と同じですので、 そちらを参照してください。
mdn__unicode_getcontext
mdn__unicode_context_t mdn__unicode_getcontext(unsigned long c)
大文字小文字変換で用いられる文脈情報を返します。
文脈情報を取得するには次のようにします。
まず大文字小文字変換の対象文字に続く次の文字を取得し、
この関数を呼び出します。
もし返される値がmdn__unicode_context_final
あるいはmdn__unicode_context_nonfinal
のいずれかであればそれが求める文脈情報です。
mdn__unicode_context_unknown
の場合にはさらに続く文字を取得し、
この関数を呼び出します。
このようにしてmdn__unicode_context_final
かmdn__unicode_context_nonfinal
かいずれかの値が得られるまで処理を繰り返します。
もし文字列の最後まで来た場合には、
文脈はmdn__unicode_context_final
となります。
具体的にはこの関数は次のような処理を行います。
Unicode文字cの"General Category"属性を参照し、
それが"Lu" "Ll" "Lt"のいずれかであればmdn__unicode_context_nonfinal
を、
"Mn"であればmdn__unicode_context_unknown
を、
それ以外であればmdn__unicode_context_final
を返します。
unormalize
モジュール
unormalize
モジュールは、
Unicodeで定義されている標準の正規化を行うモジュールです。
Unicodeの正規化はUnicode Technical Report #15: Unicode Normalization Forms で定義されています。
本モジュールはこの文書にあげられた4つの正規化形式を実装しています。
以下にモジュールの提供するAPI関数を示します。
mdn__unormalize_formc
mdn_result_t mdn__unormalize_formc(const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromに対して正規化Unicode Normalization Form C
を適用し、
その結果をtoおよびtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_invalid_encoding
、
mdn_buffer_overflow
、
mdn_nomemory
のいずれかです。
mdn__unormalize_formd
mdn_result_t mdn__unormalize_formd(const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromに対して正規化Unicode Normalization Form D
を適用し、
その結果をtoおよびtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_invalid_encoding
、
mdn_buffer_overflow
、
mdn_nomemory
のいずれかです。
mdn__unormalize_formkc
mdn_result_t mdn__unormalize_formkc(const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromに対して正規化Unicode Normalization Form KC
を適用し、
その結果をtoおよびtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_invalid_encoding
、
mdn_buffer_overflow
、
mdn_nomemory
のいずれかです。
mdn__unormalize_formkd
mdn_result_t mdn__unormalize_formkd(const char *from, char *to, size_t tolen)
UTF-8でエンコードされた文字列fromに対して正規化Unicode Normalization Form KD
を適用し、
その結果をtoおよびtolenで指定される領域に書き込みます。
返される値はmdn_success
、
mdn_invalid_encoding
、
mdn_buffer_overflow
、
mdn_nomemory
のいずれかです。
utf5
モジュール
utf5
モジュールはドメイン名のエンコーディング方式の一つとして提案されているUTF-5エンコーディングの基本処理を行うモジュールです。
以下にモジュールの提供するAPI関数を示します。
mdn_utf5_getwc
int mdn_utf5_getwc(const char *s, size_t len, unsigned long *vp)
UTF-5でエンコードされた長さlenバイトの文字列sの先頭の文字を取り出し、 UCS-4に変換してvpの指す領域に格納するとともに、 文字の(UTF-5エンコードでの)バイト数を返します。 もしlenが短すぎて文字の途中で終わっていたり、 エンコーディングが間違っている場合には0が返されます。
mdn_utf5_putwc
int mdn_utf5_putwc(char *s, size_t len, unsigned long v)
UCS-4文字vをUTF-5エンコーディングに変換し、 sおよびlenで指定される領域に書き込むとともに、 書き込んだバイト数を返します。 ただしlenが短すぎて書き込めない場合には0を返します。
書き込んだUTF-5文字列はNUL 文字で終端されていません。
utf6
モジュール
utf6
モジュールは、
多言語ドメイン名のエンコーディング方式の一つとして提案されているUTF-6エンコーディングとUTF-8との間の変換を行うモジュールです。
このモジュールはconverter
モジュールの下位モジュールとして実装されており、
アプリケーションがこのモジュールを直接呼び出すことはありません。
converter
モジュールに対してUTF-6
エンコーディングとの変換を要求すると、
このモジュールが間接的に呼び出されることになります。
以下にモジュールの提供するAPI関数を示します。
mdn__utf6_open
mdn_result_t mdn__utf6_open(mdn_converter_t ctx, mdn_converter_dir_t dir, void **privdata)
UTF-6エンコーディングとの変換をオープンします。 実際には何もしません。
常に mdn_success
を返します。
mdn__utf6_close
mdn_result_t mdn__utf6_close(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir)
UTF-6エンコーディングとの変換をクローズします。 実際には何もしません。
常にmdn_success
を返します。
mdn__utf6_convert
mdn_result_t mdn__utf6_convert(mdn_converter_t ctx, void *privdata, mdn_converter_dir_t dir, const char *from, char *to, size_t tolen)
UTF-6エンコードされた文字列とUTF-8エンコードされた文字列の相互変換を行います。
入力文字列fromを変換し、
結果をtoとtolenで指定される領域に書き込みます。
dirがmdn_converter_l2u
ならUTF-6エンコーディングからUTF-8エンコーディングへ、
mdn_converter_u2l
ならUTF-8エンコーディングからUTF-6エンコーディングへの変換となります。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、
mdn_nomemory
のいずれかです。
utf8
モジュール
utf8
モジュールはUTF-8でエンコードされた文字列の基本処理を行うモジュールです。
以下にモジュールの提供するAPI関数を示します。
mdn_utf8_mblen
int mdn_utf8_mblen(const char *s)
UTF-8文字列sの先頭文字の長さ(バイト数)を返します。 もしsが指すバイトがUTF-8の先頭バイトとして正しくないものである場合には0を返します。
この関数はsの先頭バイトのみを調べて長さを返します。 したがって2バイト目以降に不正なバイトがある可能性が存在します。 特に途中にNULバイトがある可能性もあるので、 sが正当なUTF-8文字列であることが確実ではない場合には気をつける必要があります。
mdn_utf8_getmb
int mdn_utf8_getmb(const char *s, size_t len, char *buf)
長さlenバイトのUTF-8文字列sの先頭の1文字をbuf にコピーし、 コピーしたバイト数を返します。 もしlenが短すぎたり、 sが指す文字がUTF-8として正しくない場合にはコピーは行わず、 0を返します。
bufは任意のUTF-8エンコーディングの文字が保持できる大きさでなければなりません。 すなわち、6バイト以上の長さを持っている必要があります。
書き込んだUTF-8文字列はNUL文字で終端されていません。
mdn_utf8_getwc
int mdn_utf8_getwc(const char *s, size_t len, unsigned long *vp)
mdn_utf8_getmb
とほぼ同じですが、
s から取り出した文字をUCS-4に変換してvpの指す領域に格納するところが異なります。
mdn_utf8_putwc
int mdn_utf8_putwc(char *s, size_t len, unsigned long v)
UCS-4文字vをUTF-8エンコーディングに変換して、 sおよびlenで指定される領域に書き込むとともに、 書き込んだバイト数を返します。 vの値が不正であったりlenが短すぎた場合には0を返します。
書き込んだUTF-8文字列はNUL文字で終端されていません。
mdn_utf8_isvalidstring
int mdn_utf8_isvalidstring(const char *s)
NUL文字で終端された文字列sが正しいUTF-8エンコーディングであるかどうか調べ、 正しければ1を、正しくなければ0を返します。
mdn_utf8_findfirstbyte
char * mdn_utf8_findfirstbyte(const char *s, const char *known_top)
文字列known_top中のsが指すバイトを含むUTF-8文字の先頭バイトを調べて返します。
その文字が正しいUTF-8エンコーディングではない場合、
known_topから sまでの間に先頭バイトがなかった場合にはNULL
を返します。
util
モジュール
util
モジュールは他のモジュールで使われるユーティリティー的な機能を提供するモジュールです。
大文字小文字の区別をしない文字列照合やUTF-8とUTF-16の相互変換機能などを提供しています。
以下にモジュールの提供するAPI関数を示します。
mdn_util_casematch
int mdn_util_casematch(const char *s1, const char *s2, size_t n)
文字列s1とs2の先頭から最大nバイトを比較し、
同一かどうかを判定します。
ASCII文字の大文字と小文字(つまりAからZとaからz)は同一とみなします。
同一であれば1を、違っていれば0を返します。
これは多くのシステムで用意されているstrcasencmp
と返り値の仕様を除けばほぼ同様の機能を提供する関数です。
mdn_util_domainspan
const char * mdn_util_domainspan(const char *s, const char *end)
ASCIIドメイン名として使用できる文字の範囲を求めます。 sから始めてendまで(ただしendの 指す文字は含まない)の各文字がASCIIのアルファベット、 数字、ハイフンのいずれかであるか検査していき、 そうでない文字の最初の出現位置を返します。 すべての文字がアルファベット、数字、 ハイフンのいずれかである場合には、 end を返します。
mdn_util_validstd13
int mdn_util_validstd13(const char *s, const char *end)
sとendで示される(部分)文字列が、 ASCIIドメイン名のラベル(ピリオドで区切られたそれぞれの部分)として正しい形式かどうかを検査します。 ただしendは最後の文字の次の文字を指すとします。 またendが NULLの場合にはsからNUL文字までの部分が検査対象となります。
次の条件を満たす文字列を正しい形式と判定します。
- ASCIIのアルファベット、数字、ハイフンのみから構成されていること
- 先頭の文字と最後の文字はいずれもハイフンではないこと
正しい形式であれば1を、そうでなければ0を返します。
mdn_util_utf8toutf16
mdn_result_t mdn_util_utf8toutf16(const char *utf8, size_t fromlen, unsigned short *utf16, size_t tolen, size_t *reslenp)
長さfromlenのUTF-8形式の文字列utf8をUTF-16形式(16bit整数の配列)に変換し、 結果をutf16に格納します。 tolenはutf16の指す領域の大きさ(文字数)です。 *reslenpには変換後の文字列の長さが格納されます。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、のいずれかです。
mdn_util_utf16toutf8
mdn_result_t mdn_util_utf16toutf8(const unsigned short *utf16, size_t fromlen, char *utf8, size_t tolen, size_t *reslenp)
長さfromlenのUTF-16形式のデータ(16bit整数の配列)utf8をUTF-8形式の文字列に変換し、 結果をutf8に格納します。 tolenはutf8の指す領域の大きさ(バイト数)です。 *reslenpには変換後の文字列の長さが格納されます。
返される値はmdn_success
、
mdn_buffer_overflow
、
mdn_invalid_encoding
、のいずれかです。
version
モジュール
version
モジュールは、
MDNライブラリのバージョンに関する機能を提供します。
以下にモジュールの提供するAPI関数を示します。
mdn_version_getstring
const char * mdn_version_getstring(void);
MDNライブラリのバージョン番号を表現した文字列を返します。