【SWIG】DxLibのラッパーファイルを一から作り直してみる3

トントン
記事: 100
登録日時: 14年前

【SWIG】DxLibのラッパーファイルを一から作り直してみる3

投稿記事 by トントン » 11年前

長引く日記になりそうだなと。

CODE:

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はスネークケースでサブルーチンが書かれることが多いからです。
後、重複関数の削除と全角スペースの削除。(前回中途半端な形にしてしまったなぁと)

最終的にはのヘッダファイルの中身は

CODE:

#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でいう「...」(ヤダヤダ演算子)は未実装っていう意味だしね!

コメントはまだありません。