2013年8月15日木曜日

【なでしこ】プラグインを作ってみる ~設計編 その2~

では、バイト制御系の関数仕様を決めていこうと思います。

------ここから------

・バイト確保
    書式:バイト確保([int]バイト数、[int]初期値)
    戻値:[int]ハンドル
    説明:バイト数に1,2,4の何れかを指定して、変数を確保し、初期値を
       代入する。以降、戻り値のハンドルを使用して、値を読み書き
          出来る。
         
          確保されるメモリ領域は内部でunsignedで扱われる。この値は
          なでしこ側から見るとグローバルな領域になるので、関数内等
          ローカルスコープから本関数をコールした場合も、変数自体は
          グローバルに確保されていることに注意すること(つまり、
          なでしこの関数を抜けても、変数領域は解放されない)。
         
          確保が成功した場合には0以上の整数が、失敗した場合には-1
          が返される。使用が終了した場合はハンドルを解放すること。

・バイト読込
    書式:バイト読込([int]ハンドル)
    戻値:[int]変数値
    説明:バイト確保命令で取得したハンドルの、現在の値を取得する。
       戻り値は整数型になる。無効なハンドル値を指定した場合には
          常に0が返される。
         
・バイト書込
    書式:バイト書込([int]ハンドル、[int]値)
    戻値:[int]結果
    説明:バイト確保命令で取得したハンドルに対して、指定した値を
       書き込む。書き込める値の範囲は確保されている領域サイズに
          より異なり、範囲外の値を指定した場合にはエラーとなる。
         
          書込が成功した場合には0が、失敗した場合には-1が返される。

・バイト右シフト
    書式:バイト書込([int]ハンドル、[int]シフト量)
    戻値:[int]結果
    説明:ハンドルで確保されているバイトに対して、シフト量で指定
       した分、右シフトを実施する。シフト量は確保されている
          バイトのサイズにより、1byteの場合は7、2byteの場合は15、
          4byteの場合は31となる。
         
          成功した場合、シフト後の値が元の値に上書きされ、0が
          返される。失敗した場合には-1が返される。

・バイト左シフト
    書式:バイト書込([int]ハンドル、[int]シフト量)
    戻値:[int]結果
    説明:ハンドルで確保されているバイトに対して、シフト量で指定
       した分、左シフトを実施する。シフト量は確保されている
          バイトのサイズにより、1byteの場合は7、2byteの場合は15、
          4byteの場合は31となる。
         
          成功した場合、シフト後の値が元の値に上書きされ、0が
          返される。失敗した場合には-1が返される。

・エンディアン変換
    書式:エンディアン変換([int]ハンドル)
    戻値:[int]結果
    説明:バイト確保命令で取得したハンドルに対応する値のエンディアン
       変換を実施する。変換後の値はハンドル対応値に上書きされる。
         
          成功した場合は0が、無効なハンドルを指定した場合は-1が
          返される。

------ここまで------

なでしこでは、その他現代風の高級言語(スクリプト、ですかね)
に似て、変数の型を指定しなくても関数の結果を受けられますが、
「整数」「数値」など指定することも可能です。

「整数」と言うとCで言うところのintで宣言されて、サイズ的には4byte
の空間(メモリ)が確保されている様です。

バイナリデータを扱う場合は、サイズとして1,2,4byteのデータを
意識的に確保して使用することが多いので、バッファと一部被る
部分はありますが「バイト確保」関数を準備しました。

バイト制御系の関数に限らず、このDLLでは「~確保」関数を
用いてDLL内で必要なメモリ等を確保してます。メモリや構造体を
そのままなでしこに渡すことは出来ないので、なでしこに対して
渡すのは「ハンドル」値です。これはなでしこで言うところの「整数」
です。以降、このDLLのその他の関数を使用して操作を行う
場合は、引数にこの「ハンドル」を指定します。