メインコンテンツへジャンプする

JPNICはインターネットの円滑な運営を支えるための組織です

ロゴ:JPNIC

WHOIS 検索 サイト内検索 WHOISとは? JPNIC WHOIS Gateway
WHOIS検索 サイト内検索

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モジュールは割愛してあります。

libmdn module graph

モジュール詳細

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モジュールに対してRACELACEといったエンコーディングとの変換を要求すると、 このモジュールが間接的に呼び出されることになります。

以下にモジュールの提供する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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_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;
              

dirmdn_converter_l2uの場合には次のような処理が行われます。

  1. fromで指定されるドメイン名文字列をラベルに分解し、 それぞれについて以下の2から5の処理を実行します。
  2. ctxで指定されるデータからACEのプリフィックスあるいはサフィックスを取り出し、 ラベル文字列がそれにマッチするかを調べます。 マッチしなければ変換せずにそのままコピーします。
  3. マッチすればラベルからプリフィックスあるいはサフィックスを除去し、 ctxで指定されるデコード関数を呼び出してUTF-8エンコーディングのラベル文字列に変換します。
  4. デコード結果が従来のASCIIドメイン名として正当なものかどうかを調べます。 もし正当なものなら、 そのラベルは本来ACEに変換してはならないものなのでエラーとします。
  5. デコードした文字列をctxで指定されるエンコード関数を呼び出して再度ACEに戻します。 これと元のACE文字列を比較し、マッチしなければエラーとします。
  6. ラベル毎の変換結果をドメイン名にまとめてto で指定される領域に格納します。

またdirmdn_converter_u2lの場合には次のような処理が行われます。

  1. fromで指定されるドメイン名文字列をラベルに分解し、 それぞれについて以下の2から4の処理を実行します。
  2. ラベル文字列が従来のASCIIドメイン名として正当なものかどうかを調べます。 正当なものであればACEへの変換は不要なのでそのままコピーします。
  3. ctxで指定されるエンコード関数を呼び出してACEに変換します。
  4. ctxで指定されるデータからACEのプリフィックスあるいはサフィックスを取り出し、 ACE変換結果の文字列に付加します。
  5. ラベル毎の変換結果をドメイン名にまとめてtoで指定される領域に格納します。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならAltDUDEエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからAltDUDEエンコーディングへの変換となります。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならAMC-ACE-MエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからAMC-ACE-Mエンコーディングへの変換となります。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならAMC-ACE-OエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからAMC-ACE-Oエンコーディングへの変換となります。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならAMC-ACE-RエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからAMC-ACE-Rエンコーディングへの変換となります。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_nomemoryのいずれかです。

apiモジュール

apiモジュールは、 リゾルバライブラリやアプリケーション向けに、 ドメイン名のエンコーディング変換や正規化を行うための高レベルのインタフェースを提供するモジュールです。

一般のアプリケーションはこのモジュールを使用することで、 多言語ドメインに関する一連の処理を容易に行うことができるように設計されています。 このモジュールでは対応できない特殊な処理を行いたいときは、 より低レベルなインターフェースを提供するresモジュールを使用します。

以下にモジュールの提供するAPI関数を示します。

mdn_nameinit

mdn_result_t
mdn_nameinit(void);
              

ライブラリ全体の初期化を行い、 あらかじめ決められたファイル(mdn.conf)から設定を読み込みます。 ただし、二度以上この関数を呼んでも、 初期化が行われるのは最初の呼び出し時だけです。 この関数を呼び出す前に、 後述するmdn_encodename、 あるいはmdn_decodenameが呼び出されたときは、 エンコード、デコードの処理に先だって自動的に初期化が行われます。

返される値は mdn_successmdn_nofilemdn_invalid_syntaxmdn_invalid_namemdn_nomemoryのいずれかです。

mdn_encodename

mdn_result_t
mdn_encodename(int actions, const char *from, char *to, size_t tolen);
              

ドメイン名のエンコードを行います。 入力文字列fromを変換し、 結果をtotolenで指定される領域に書き込みます。

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_successmdn_invalid_encodingmdn_invalid_syntaxmdn_invalid_namemdn_invalid_actionmdn_buffer_overflowmdn_nomemorymdn_nofilemdn_prohibitedのいずれかです。

mdn_decodename

mdn_result_t
mdn_decodename(int actions, const char *from, char *to, size_t tolen);
              

ドメイン名のデコードを行います。 入力文字列fromを変換し、 結果をtotolenで指定される領域に書き込みます。

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_successmdn_invalid_encodingmdn_invalid_syntaxmdn_invalid_namemdn_invalid_actionmdn_buffer_overflowmdn_nomemorymdn_nofilemdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならBRACEエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからBRACEエンコーディングへの変換となります。

返される値は mdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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_successmdn_nomemoryのいずれかです。

mdn_checker_create

mdn_result_t
mdn_checker_create(mdn_checker_t *ctxp)
              

検査用の空のコンテキストを作成し、 ctxpの指す領域に格納します。 返されるコンテキストは空で、検査方式は一つも含まれていません。 検査方式を追加するにはmdn_checker_addmdn_checker_addallを用います。 コンテキストで作成された時点では、 コンテキストの参照カウントは1になっています。

返される値は mdn_successmdn_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_successmdn_invalid_namemdn_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でエンコードされた文字列utf8ctxに指定された検査方式で検査します。 文字列が禁止文字、 未割り当てコードポイントを含んでいた場合、 foundにその先頭位置を格納します。 含まれていない場合は、NULLを返します。

返される値は mdn_successmdn_nomemorymdn_buffer_overflowmdn_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_addmdn_checker_addallでコンテキストに検査方式を追加する際には、 この名称で検査方法を指定します。

createdestroylookupには、 それぞれmdn_checker_createmdn_checker_destroymdn_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_successmdn_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_successmdn_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-5RACEBRACELACEDUDEUTF-6の変換機能が用意されています。 これ以外のエンコーディングが指定された場合には、 システムの提供するiconv() ユーティリティを用いて変換が行われます。 この場合、 この関数の呼び出し時にiconv_open()の呼び出しが行われますが、 delayedopen が真ならば実際に文字列の変換が行われるまでiconv_open() の呼び出しが遅延されます。

またmdn_converter_registerを用いて新たなローカルエンコーディングを追加することも可能です。

返される値はmdn_successmdn_invalid_namemdn_nomemorymdn_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に格納します。 tolentoの長さです。 dirは変換の方向の指定で、

mdn_converter_l2u
コンテキストに設定したエンコーディングからUTF-8への変換
mdn_converter_u2l
UTF-8からコンテキストに設定したエンコーディングへの変換

となります。 指定したエンコーディングとは、 mdn_converter_createで指定したエンコーディングのことを指します。

ISO-2022-JPのように状態をもつエンコーディングを使用した場合、 iconv()と異なり、 この関数の呼び出し間で状態は保存されません。 変換は毎回初期状態から始まります。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_invalid_namemdn_nomemorymdn_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_createname 引数に指定することができます。

返される値はmdn_successmdn_nomemoryのいずれかです。

mdn_converter_aliasfile

mdn_result_t
mdn_converter_aliasfile(const char *path)
              

ファイルpathで指定されるファイルを読み込み、 その内容に従って別名を登録します。 ファイルpathは次のような単純な形式の行からなるテキストファイルです。

別名    正式名
              

また#で始まる行はコメントとみなされます。

返される値はmdn_successmdn_nofilemdn_invalid_syntaxmdn_nomemoryのいずれかです。

mdn_converter_resetalias

mdn_result_t
mdn_converter_resetalias(void)
              

mdn_converter_addaliasmdn_converter_aliasfileで登録した別名をリセットし、 別名が全く登録されていない初期状態に戻します。

返される値はmdn_successmdn_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との間のエンコーディング変換機能を追加します。 opencloseconvertは変換等の処理関数へのポインタです。 ascii_compatibleにはこのローカルエンコーディングがASCII互換エンコーディングなら1を、 そうでなければ0を指定します。

返される値はmdn_successmdn_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に結果を格納します。 buflenexpandedの大きさです。 また、compressedの長さが*complenpに格納されます。

返される値はmdn_successmdn_buffer_overflowmdn_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の指す場所に格納します。 lengthsptrの空き領域の長さです。 圧縮の際は、 ctxに入っている以前に圧縮したドメイン名の情報が参照されます。 圧縮したドメイン名の長さがcomplenpに入れられるとともに、 圧縮に必要な情報がctxに追加されます。

返される値はmdn_successmdn_buffer_overflowmdn_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_addmdn_delimitermap_addallを用います。 コンテキストで作成された時点では、 コンテキストの参照カウントは 1 になっています。

返される値はmdn_successmdn_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_successmdn_nomemorymdn_invalid_codepointmdn_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でエンコードされた文字列fromctxによるマッピングを適用します。 ctxに登録されているデリミタ(区切り文字)をピリオド(`.')にマッピングし、 結果をtotolenで指定される領域に書き込みます。

この関数を利用するには、 あらかじめ mdn_delimitermap_fix呼んでおかなければなりません。 mdn_delimitermap_fixが呼ばれていない状態でこの関数を呼ぶと、 mdn_failureを返します。

この関数から返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならDUDEエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからDUDEエンコーディングへの変換となります。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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_successmdn_nomemorymdn_nofilemdn_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でエンコードされた文字列utf8ctxに指定された検査方式で検査します。 文字列が禁止文字、未割り当てコードポイントを含んでいた場合、 foundにその先頭位置を格納します。 含まれていない場合は、NULLを返します。

返される値はmdn_successmdn_nomemorymdn_buffer_overflowmdn_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_successmdn_nomemorymdn_nofilemdn_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でエンコードされた文字列fromctxで指定されるマッピングを適用し、 その結果をtotolenで指定される領域に書き込みます。

返される値はmdn_successmdn_nomemorymdn_buffer_overflowmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならLACEエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからLACEエンコーディングへの変換となります。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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はハンドラ関数へのポインタです。 もしハンドラを指定しない場合、 あるいはprocNULLを指定した場合には、 ログは標準エラー出力に出力されます。

ハンドラの型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_successmdn_nomemoryのいずれかです。

mdn_mapper_create

mdn_result_t
mdn_mapper_create(mdn_mapper_t *ctxp)
              

マッピング用の空のコンテキストを作成し、 ctxpの指す領域に格納します。 返されるコンテキストは空で、 マッピング方式は一つも含まれていません。 マッピング方式を追加するにはmdn_mapper_addmdn_mapper_addallを用います。 コンテキストで作成された時点では、 コンテキストの参照カウントは1になっています。

返される値はmdn_successmdn_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_successmdn_nomemorymdn_buffer_overflowmdn_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でエンコードされた文字列fromctxで指定されるマッピング方式を適用し、 その結果をtotolenで指定される領域に書き込みます。 ctxに複数のマッピング方式が含まれている場合、 それらがmdn_mapper_add で追加した順番に適用されます。

返される値はmdn_successmdn_nomemorymdn_buffer_overflowmdn_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_addmdn_mapper_addallでコンテキストにマッピング方式を登録する際に、 この名称でマッピング方法を指定します。

createdestroylookupには、 それぞれmdn_mapper_createmdn_mapper_destroymdn_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_successmdn_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_successmdn_nomemoryのいずれかです。

mdn_mapselector_create

mdn_result_t
mdn_mapselector_create(mdn_mapselector_t *ctxp)
              

マップ選択用の空のコンテキストを作成し、 ctxpの指す領域に格納します。 返されるコンテキストは空で、 マッピング方式は一つも含まれていません。 マッピング方式を追加するにはmdn_mapselector_addmdn_mapselector_addallを用います。 コンテキストで作成された時点では、 コンテキストの参照カウントは1になっています。

返される値はmdn_successmdn_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_successmdn_nomemorymdn_buffer_overflowmdn_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で指定されたマッピング方式を適用し、 その結果をtotolenで指定される領域に書き込みます。 ctx に、 そのトップレベルドメイン向けのマッピング方式が複数個含まれている場合、 それらがmdn_mapselector_addで追加した順番に適用されます。

返される値はmdn_successmdn_nomemorymdn_buffer_overflowmdn_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)
              

msgmsglenで示されるDNSメッセージのヘッダを解析し、 parsedが示す構造体に格納します。

返される値はmdn_successmdn_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メッセージのヘッダを構成し、 msgmsglenで示される領域に格納します。

返される値はmdn_successmdn_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サーバへのメッセージの変換の場合は次のようになります。

  1. クライアントから受信したリクエストメッセージを解析し、クライアント側のエンコーディングを判定します。
  2. 判定結果を用いて、エンコーディングをUTF-8に変換します。
  3. 正規化処理を行います。
  4. エンコーディングをUTF-8からDNSサーバ側で用いられるエンコーディングに変換します。
  5. 以上の処理をメッセージに含まれるすべてのドメイン名に対して行い、変換結果を再びDNSメッセージ形式にまとめてDNSサーバに送信します。

次にDNSサーバからクライアントへのメッセージの変換の場合は次のようになります。

  1. DNSサーバから受信したリプライメッセージを解析し、含まれているすべてのドメイン名に対して、ZLDの除去、UTF-8エンコーディングへの変換を行います。
  2. さらにクライアント側エンコーディングに変換し、ZLDを付加します。
  3. 変換結果を再び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_successmdn_invalid_messagemdn_invalid_encodingmdn_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_successmdn_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でエンコードされた文字列fromctxで指定されるマッピング方式を適用し、 その結果をtotolenで指定される領域に書き込みます。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingのいずれかです。

mdn_nameprep_isprohibited

mdn_result_t
mdn_nameprep_isprohibited(mdn_nameprep_t ctx, const char *utf8,
        const char **found)
              

UTF-8でエンコードされた文字列utf8ctxに指定された検査方式で検査します。 文字列が使用を禁止されている文字を含んでいた場合、 foundにその先頭位置を格納します。 含まれていない場合は、NULLを返します。

返される値はmdn_successmdn_invalid_encodingのいずれかです。

mdn_nameprep_isunassigned

mdn_result_t
mdn_nameprep_isunassigned(mdn_nameprep_t ctx, const char *utf8,
        const char **found)
              

UTF-8でエンコードされた文字列utf8ctxに指定された検査方式で検査します。 文字列が未割り当てコードポイントを含んでいた場合、 foundにその先頭位置を格納します。 含まれていない場合は、NULLを返します。

返される値はmdn_successmdn_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_successmdn_nomemoryのいずれかです。

mdn_normalizer_create

mdn_result_t
mdn_normalizer_create(mdn_normalizer_t *ctxp)
              

正規化用の空のコンテキストを作成し、 ctxpの指す領域に格納します。 返されるコンテキストは空で、 正規化方式は一つも含まれていません。 正規化方式を追加するにはmdn_normalizer_addmdn_normalizer_addallを用います。 コンテキストで作成された時点では、 コンテキストの参照カウントは1になっています。

返される値はmdn_successmdn_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_successmdn_invalid_namemdn_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でエンコードされた文字列fromctxで指定される正規化方式を適用し、 その結果をtotolenで指定される領域に書き込みます。 ctxに複数の正規化方式が含まれている場合、 それらがmdn_normalizer_addで追加した順番に適用されます。

返される値はmdn_successmdn_invalid_encodingmdn_nomemoryのいずれかです。

mdn_normalizer_register

mdn_result_t
mdn_normalizer_register(const char *scheme_name,
        mdn_normalizer_proc_t proc)
              

新しい正規化方式をscheme_nameという名前で登録します。 procはその正規化方式の処理関数へのポインタです。

返される値はmdn_successmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならRACEエンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからRACEエンコーディングへの変換となります。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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_successmdn_buffer_overflowmdn_invalid_encodingmdn_invalid_namemdn_invalid_actionmdn_invalid_nomemorymdn_invalid_nomappingmdn_invalid_prohibitedmdn_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_successmdn_nomemoryのいずれかです。

mdn_resconf_create

mdn_result_t
mdn_resconf_create(mdn_resconf_t *ctxp)
              

設定コンテキストを作成、初期化し、 ctxpの指す領域に格納します。 初期状態では、 まだ設定ファイルの内容は読み込まれていません。 読み込むためにはmdn_resconf_loadfileを実行する必要があります。

返される値はmdn_successmdn_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に格納します。 fileNULLの場合にはデフォルトの設定ファイルの内容を読み込みます。

すでに設定ファイルが読み込まれているコンテキストに対して、 別の設定ファイルの内容を読み込むこともできます。 その場合には、 設定コンテキストに格納されていた前の設定ファイルの内容はすべて消え、 新たに読み込んだ設定ファイルの内容で置き換わります。

返される値はmdn_successmdn_nofilemdn_invalid_syntaxmdn_invalid_namemdn_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_converterNULLを渡した場合、 変換方式は未指定の状態となります。

コード変換コンテキストについては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_converterNULLを渡した場合、 ローカルエンコーディングには自動判別したエンコーディングが用いられます。

コード変換コンテキストについては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_converterNULLを渡した場合、 変換方式は未指定の状態となります。

コード変換コンテキストについてはconverterモジュールの項をご覧ください。

mdn_resconf_setmapper

mdn_result_t
mdn_resconf_setmapper(mdn_resconf_t ctx, mdn_mapper_t mapper)
              

マップコンテキストmapperの情報をもとに、 マッピングを行うための方式を設定コンテキストctxにセットします。 mapperNULLを渡した場合、 マッピング方式は未指定の状態となります。

マップコンテキストについてはmapperモジュールの項をご覧ください。

mdn_resconf_setnormalizer

mdn_result_t
mdn_resconf_setnormalizer(mdn_resconf_t ctx,
        mdn_normalizer_t normalizer)
              

正規化コンテキストnormalizerの情報をもとに、 正規化方式を設定コンテキストctxにセットします。 normalizerNULLを渡した場合、 正規化方式は未指定の状態となります。

正規化変換コンテキストについてはnormalizerモジュールの項をご覧ください。

mdn_resconf_setprohibit

mdn_result_t
mdn_resconf_setprohibit(mdn_resconf_t ctx,
        mdn_checker_t prohibit_checker)
              

検査コンテキストprohibit_checkerの情報をもとに、 禁止文字の検査を行うための検査方式を設定コンテキストctxにセットします。 prohibit_checkerNULLを渡した場合、 検査方式は未指定の状態となります。

検査コンテキストについてはcheckerモジュールの項をご覧ください。

mdn_resconf_setunassigned

mdn_result_t
mdn_resconf_setunassigned(mdn_resconf_t ctx,
        mdn_checker_t unassigned_checker)
              

検査コンテキストunassigned_checkerの情報をもとに、 未割り当てコードポイントの検査を行うための検査方式を設定コンテキストctxにセットします。 unassigned_checkerNULLを渡した場合、 検査方式は未指定の状態となります。

検査コンテキストについてはcheckerモジュールの項をご覧ください。

mdn_resconf_setdelimitermap

mdn_result_t
mdn_resconf_setdelimitermap(mdn_resconf_t ctx,
        mdn_delimitermap_t delimiter_mapper)
              

デリミタマップコンテキストdelimiter_mapperの情報をもとに、 デリミタを設定コンテキストctxにセットします。 delimiter_mapperNULLを渡した場合、 デリミタは未指定の状態となります。

デリミタマップコンテキストについてはdelimitermapモジュールの項をご覧ください。

mdn_resconf_setmapselector

mdn_result_t
mdn_resconf_setmapselector(mdn_resconf_t ctx,
        mdn_mapselector_t map_selector)
              

マップ選択コンテキストmap_selectorの情報をもとに、 ローカルなマッピング方式を設定コンテキストctxにセットします。 map_selectorNULLを渡した場合、 マッピング方式は未指定の状態となります。

マップ選択コンテキストについてはmapselectorモジュールの項をご覧ください。

mdn_resconf_setidnconvertername

mdn_result_t
mdn_resconf_setidnconvertername(mdn_resconf_t ctx, const char *name,
        int flags)
              

IDNエンコーディングを設定コンテキストctxにセットします。 idn_converterNULLを渡した場合、 IDNエンコーディングは未指定の状態となります。

mdn_resconf_setlocalconvertername

mdn_result_t
mdn_resconf_setlocalconvertername(mdn_resconf_t ctx, const char *name,
        int flags)
              

ローカルエンコーディングを設定コンテキストctxにセットします。 local_converterNULLを渡した場合、 自動判別したエンコーディングがセットされます。

mdn_resconf_setalternateconvertername

mdn_result_t
mdn_resconf_setalternateconvertername(mdn_resconf_t ctx, const char *name,
        int flags)
              

代替エンコーディングを設定コンテキストctxにセットします。 alaternate_converterNULLを渡した場合、 代替エンコーディングは未指定の状態となります。

mdn_resconf_addallmappernames

mdn_result_t
mdn_resconf_addallmappernames(mdn_resconf_t ctx, const char **names,
        int nnames)
              

namesnnamesに記されたマッピング方式を、 すべて設定コンテキストctxに追加します。

mdn_resconf_addallnormalizernames

mdn_result_t
mdn_resconf_addallnormalizernames(mdn_resconf_t ctx, const char **names,
        int nnames)
              

namesnnamesに記された正規化方式を、 すべて設定コンテキストctxに追加します。

mdn_resconf_addallprohibitnames

mdn_result_t
mdn_resconf_addallprohibitnames(mdn_resconf_t ctx, const char **names,
        int nnames)
              

namesnnamesに記された禁止文字の検査方式を、 すべて設定コンテキストctxに追加します。

mdn_resconf_addallunassignednames

mdn_result_t
mdn_resconf_addallunassignednames(mdn_resconf_t ctx, const char **names,
        int nnames)
              

namesnnamesに記された未割り当てコードポイントの検査方式をすべて設定コンテキスト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に対するローカルなマッピング方式として、 namesnnamesに記されたものをすべて設定コンテキスト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文字はドメイン名の中にのみ現れる

具体的には次のようなアルゴリズムを用いてドメイン名の領域検出を行います。

  1. テキストを走査して、非ASCII文字を探す。
  2. 見つかった非ASCII文字の前後の文字を調べ、 その文字を含み、 かつ他の非ASCII文字あるいは従来の(多言語化されていない)ドメイン名として使用可能な文字だけからなる範囲を求める。
  3. 求めた範囲をドメイン名として返す。

以下にモジュールの提供するAPI関数を示します。

mdn_selectiveencode_findregion

mdn_result_t
mdn_selectiveencode_findregion(const char *s,
        char **startp, char **endp)
              

UTF-8でエンコードされた文字列sを走査して、 最初に出現する非ASCII文字を含むドメイン名の領域を求め、 その先頭を指すポインタをstartpに、 領域の直後の文字を指すポインタをendpにそれぞれ格納します。

返される値はmdn_successmdn_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_successmdn_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_successmdn_nomemoryのいずれかです。

mdn_strhash_get

mdn_result_t
mdn_strhash_get(mdn_strhash_t hash,
        const char *key, void **valuep)
              

ハッシュ表hashからキーkeyを持つ要素を検索し、 対応する要素があればその値をvaluepに格納します。

返される値はmdn_successmdn_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_successmdn_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のマッピング規則を登録します。 マップ後のシーケンスを mapmaplenで指定します。 ただし、mdn__ucsmap_fixをを呼ぶ前でないと、 マッピング規則を登録することはできません。 mdn__ucsmap_fixを既に呼んだ状態でこの関数を呼ぶと、 mdn_failureを返します。

返される値はmdn_successmdn_nomemorymdn_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_successmdn_nomappingmdn_failureのいずれかです。

ucssetモジュール

ucssetモジュールは、 文字の登録を行うためのモジュールです。

このモジュールは、 filecheckerモジュールおよびdelimitermapモジュールの下位モジュールとして実装されており、 アプリケーションがこのモジュールを直接呼び出すことはありません。

以下にモジュールの提供するAPI関数を示します。

mdn__ucsset_create

mdn_result_t
mdn__ucsset_create(mdn_ucsset_t *ctxp)
              

UCSセットコンテキストを一つ作成します。 作成したばかりのコンテキストには、文字は一つも登録されていません。

返される値はmdn_successmdn_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_successmdn_invalid_codemdn_nomemorymdn_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_successmdn_invalid_code mdn_nomemorymdn_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のコードポイントvctx に含まれているかどうかを検査します。 含まれていれば*foundに1を、 含まれていなければ0を格納します。

この関数を利用するには、 あらかじめmdn__ucsset_fixを呼んでおかなければなりません。 mdn__ucsset_fixが呼ばれていない状態でこの関数を呼ぶと、 mdn_failureを返します。

返される値はmdn_successmdn_nomemorymdn_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文字cCanonical 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_successmdn_notfoundmdn_nomemoryのいずれかです。

mdn__unicode_compose

mdn_result_t
mdn__unicode_compose(unsigned long c1,
        unsigned long c2, unsigned long *compp)
              

c1c2の2文字のUnicode文字のシーケンスをUnicodeData.txtのCharacter Decomposition Mappingにしたがってcomposeし、 その結果をcomppの指す領域に書き込みます。 必ずCanonical Compositionが行われます。

返される値はmdn_successmdn_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_successmdn_context_requiredmdn_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_finalmdn__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_successmdn_invalid_encodingmdn_buffer_overflowmdn_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_successmdn_invalid_encodingmdn_buffer_overflowmdn_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_successmdn_invalid_encodingmdn_buffer_overflowmdn_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_successmdn_invalid_encodingmdn_buffer_overflowmdn_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を変換し、 結果をtotolenで指定される領域に書き込みます。 dirmdn_converter_l2uならUTF-6エンコーディングからUTF-8エンコーディングへ、 mdn_converter_u2lならUTF-8エンコーディングからUTF-6エンコーディングへの変換となります。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encodingmdn_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)
              

文字列s1s2の先頭から最大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)
              

sendで示される(部分)文字列が、 ASCIIドメイン名のラベル(ピリオドで区切られたそれぞれの部分)として正しい形式かどうかを検査します。 ただしendは最後の文字の次の文字を指すとします。 またendNULLの場合にはsからNUL文字までの部分が検査対象となります。

次の条件を満たす文字列を正しい形式と判定します。

  1. ASCIIのアルファベット、数字、ハイフンのみから構成されていること
  2. 先頭の文字と最後の文字はいずれもハイフンではないこと

正しい形式であれば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に格納します。 tolenutf16の指す領域の大きさ(文字数)です。 *reslenpには変換後の文字列の長さが格納されます。

返される値はmdn_successmdn_buffer_overflowmdn_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に格納します。 tolenutf8の指す領域の大きさ(バイト数)です。 *reslenpには変換後の文字列の長さが格納されます。

返される値はmdn_successmdn_buffer_overflowmdn_invalid_encoding、のいずれかです。

versionモジュール

versionモジュールは、 MDNライブラリのバージョンに関する機能を提供します。

以下にモジュールの提供するAPI関数を示します。

mdn_version_getstring

const char *
mdn_version_getstring(void);
              

MDNライブラリのバージョン番号を表現した文字列を返します。

このページを評価してください

このWebページは役に立ちましたか?
よろしければ回答の理由をご記入ください

それ以外にも、ページの改良点等がございましたら自由にご記入ください。

回答が必要な場合は、お問い合わせ先をご利用ください。

ロゴ:JPNIC

Copyright© 1996-2024 Japan Network Information Center. All Rights Reserved.