swriter.exe - 超代筆君 MEGA-Mix
 Copyright (c) YumemiYougie-Project

 


 

ダウンロードページから「ソースを含む実用パッケージ」をダウンロード

 

使用言語

 Microsoft Visual C++ 6.0
 tools.h patol.lib(同封)が必要です。

 


機能のカスタマイズ

module フォルダ内に以下のファイルが格納されています。

 function_base.cpp ベースとなるソース
 function_base2.cpp ベースとなるソース(簡略版)

ここでは解説を簡単にするために function_base2.cpp のソースを使います。

 function_base.cpp を消去または移動して、function_base2.cpp を function_base.cpp にリネームして下さい。

パッケージをコンパイルした時点で機能「function_base」は有効になっています(基本的にモジュールファイル名と機能名は同じになっています)

 

付属している sample.swb を実行すると function_base.cpp の実行結果 res_sample.txt が出力されます。

バッチファイル sample.swb

[script]
function_base

[files]
doc\*.txt

結果 res_sample.txt

file:DOC\command.txt DOC\command.txt
file:DOC\how to use.txt DOC\how to use.txt
file:DOC\technical.txt DOC\technical.txt
Completed...

ソース function_base.cpp (元はfunction_base2.cpp)

//======================================================================================
// 変換ルーチンベースプログラム
//
// もっとも単純な構造のサンプルプログラム
//======================================================================================

//------------------------------------------------------------------
// スクリプトコマンドクラス
//------------------------------------------------------------------

class FUNCTION_BASE{
  public:
  int func(char *path,char *outname);
  void quit(int et);
};

void FUNCTION_BASE::quit(int et){}

//======================================================================================
// 変換処理部分
//======================================================================================

#define FUNCTION_BASE_OUTAREA 2 // 変換後の容量は仮に元の倍取っている 内容によって変更して下さい

//------------------------------------------------------------------
// 変換フィルターサンプル 機能:無変換(ファイルコピー)
// 変換せず調査だけなら out に関する部分は不要
//------------------------------------------------------------------

int FUNCTION_BASE::func(char *path,char *outname){
  char *mem=NULL;
  char *out=NULL;
  int i,j,len;


  // 元データ読み込み(関数内部でmemに領域を確保している)

  len = MEM_TargetRead(&mem,path);
  if(len == 0) return FALSE; // ファイルがない


  // 変換後のデータバッファを確保

  mem_alloc(char,out, len*FUNCTION_BASE_OUTAREA );



  // 変換処理部分
  i = j = 0;
  while(i < len){
  
    // 変換処理 このサンプルではただコピーしているだけ
    *(out+j++) = *(mem+i++);
  
  }

  // Infoメッセージ出力(改行コードは\r\n)
  Message_printf("file:%s %s",path,outname);


  // 変換された out を出力  出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名

  if(outname == NULL || outname[0] == 0) file_targetwrite(path,out,j); // 出力パスが指定されていない時、元のパス
  else file_targetwrite(outname,out,j); // 出力パスが指定されている

  // メモリを開放
  mem_del(mem);
  mem_del(out);

  return TRUE;
}

FUNCTION_BASE m_function_base;

function_base.cpp は単にデータをコピーして同名のファイルにそのまま上書き、結果には処理したファイルのファイル名を出力しています。

何もしない、ただデータをコピーするだけのサンプルです。

コピーの代わりに何かをする処理を挟む事で望みのフィルターに変更する事ができます。

 

メインとなる部分は func(...) の中央部分の

  // 変換処理部分
  i = j = 0;
  while(i < len){
  
    // 変換処理 このサンプルではただコピーしているだけ
    *(out+j++) = *(mem+i++);
  
  }

です。

ここで元データ mem から出力用バッファの out にそのままコピーしています。

ここを用途に合わせて修正すれば目的の機能に変更する事ができます。

 

試しにテキスト内の全角文字「あ」「い」に変えるコンバータを作ってみます。

  // 変換処理部分
  i = j = 0;
    while(i < len){
    if( _ismbblead(*(mem+i)) != 0 ){ // 全角文字だ
      if(_WCHAR(mem+i) == 'あ'){
        *(WORD*)(out+j) = swap_word('い');
        i+=2;
        j+=2;
      }else{
       *(out+j++) = *(mem+i++);
       *(out+j++) = *(mem+i++);
      }
    }else{
     *(out+j++) = *(mem+i++);
    }
  }

WCHAR()
swap_word()

tools.h で定義されているマクロです。

#define swap_word(code) (((code)&0xff)*0x100+(code)/0x100)
#define _WCHAR(ch) (*((u_char*)ch)*0x100 + *((u_char*)ch+1))

上位バイトと下位バイトを入れ代えます。

 

テキストコントロールに使うためのルーチンやマクロがいくつか組み込まれていますが、カスタマイズの際には普段利用しているライブラリを組み込むなどした方が使いやすいと思います。

 


機能の新規追加

 独自のスクリプト名の機能を追加する方法を解説します。

プロジェクトと同フォルダにある addfunc.exe を実行します。

FuncName : 「(デフォルトではsmpl_func)」 ボックスにスクリプト名。

上部の大きいボックスに機能説明(未入力でも可)を入力して「開始」ボタンを押します。

 

ソース swriter.cpp が書き換えられ、デフォルトのままの場合、smpl_func というスクリプトが追加され、moduleフォルダに smpl_func.cpp が追加されています。

(swriter.cpp に手を加えた場合、正しく追加修正されない場合があるので注意)

 

通常、取得するパラメータを変更する場合以外は swriter.cpp に変更を加える事はないかと思います。

smpl_func.cpp function_base.cpp がそのままコピーされます。

(function_base.cpp に予め修正を加えておけばそれがコピーされるので使いやすいベースを作成しておくと便利です)

 

これに「機能のカスタマイズ」解説した変更を加えれば、マイスクリプト追加の完了です。

 

即興で作成、継続して使用する事のなさそうな機能には頭に smpl_ つける等して区別すると、後で整理する時に便利ですのでお薦めです。