use 5.14.0;
use warnings;
use utf8;
use autodie;
use FindBin;
use Encode;
use IO::File;
use Attribute::Constant;
use String::CamelCase qw/decamelize/;
my $SCRIPT_PATH : Constant("$FindBin::Bin");
my $CONTENT_PATH : Constant("$FindBin::Bin"."/content/");
my $FUNCLIST_NAME : Constant('func_list.txt');
my $HPP_NAME : Constant('funclist.h');
sub _GenerateSwigHpp::new {
my $obj = {}; $obj->{class} = shift;
$obj->{generate} = sub {
my $rfh = IO::File->new;
my $wfh = IO::File->new;
my @data_list;
$rfh->open($SCRIPT_PATH.'/'.$FUNCLIST_NAME, 'r');
$wfh->open($SCRIPT_PATH.'/'.$HPP_NAME, 'w');
$wfh->autoflush(1);
while (my $data = $rfh->getline()) {
chomp $data;
$data = decode('CP932', $data);
$data =~ s/^\s+//;
$data =~ s/(\s| )+/ /g;
$data =~ s/^MV1GetAnimIndex/int MV1GetAnimIndex/;
$data = encode('CP932', $data);
if ($data =~ m/^(const)(\s+)([\w*]+)(\s+)([\w*]+)(\s*)(\(.+)/) {
my $decamelize_data = decamelize($5);
push @data_list, ($1.$2.$3.$4.$decamelize_data.$7);
}
elsif ($data =~ m/^([\w*]+)(\s)([\w*]+)(\s*)(\(.+)/) {
my $decamelize_data = decamelize($3);
push @data_list, ($1.$2.$decamelize_data.$5);
}
}
my @new_data_list = do { my %h; grep { !$h{$_}++ } @data_list };
for (@new_data_list) {
$wfh->say($_.q(;));
}
$rfh->close;
$wfh->close;
};
$obj;
}
my $hpp = _GenerateSwigHpp->new;
$hpp->{generate}->();
__END__
前回の日記で公開した内容のfunc_list.txtから
ヘッダ用の宣言部を書くその①です。
内容としては、
【int DrawLine3D( VECTOR Pos1, VECTOR Pos2, int Color ) 】
↓
【int draw_line3d( VECTOR Pos1, VECTOR Pos2, int Color ) ;】
と変換されます。
小文字のスネークケースに変換しているのは
Perlはスネークケースでサブルーチンが書かれることが多いからです。
後、重複関数の削除と全角スペースの削除。(前回中途半端な形にしてしまったなぁと)
最終的にはのヘッダファイルの中身は
#ifndef __SWIG_DXLIB_H__
#define __SWIG_DXLIB_H__
#include
namespace StructDxLib {
typedef struct tagVECTOR
{
float x, y, z ;
}VECTOR, *LPVECTOR, XYZ, *LPXYZ ;
~略~
};
class SwigDxLib {
public:
SwigDxLib();
~SwigDxLib();
int dx_lib_init( void ) ;
int dx_lib_end( void ) ;
int draw_line3d(StructDxLib::VECTOR Pos1,StructDxLib::VECTOR Pos2, int Color ) ;
~略~
};
#endif
後、引数にある「...」がある関数は削除する感じ。
別に良いよね。Perlでいう「...」(ヤダヤダ演算子)は未実装っていう意味だしね!