[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000614] Re: new proto
黒井さん
> *.fp ファイルを proto2c/proto_new 下に commit しました。また
> *.fp を使うようにした proto2c/etc/dcl_gen も commit しました。
さきほど check out しました。etc/p_init に、
<<<<<<< p_init
=======
>>>>>>> 1.7
といった行が混入してますので、取り除いて下さい。
今のところ結局は
ruby proto2c.rb proto_new/g*.fp proto_new/m*1_*.fp \
proto_new/math2_[^o]*.fp > code
cat etc/p_header > src/dcl.c
cat code >> src/dcl.c
cat etc/p_init >> src/dcl.c
によって、dcl.c という一つのファイルにしてからコンパイルするよう
になってますが、分割できませんか。
# ちなみに [^o] という表現は sh ではとおらないようです。
ひとつのやりかたとして、void Init_dcl において
rb_define_module_function(mDCL, "gropn", dcl_gropn, 1);
といった文をじかによぶのでなく、パッケージ毎に下請関数を用意して、
その中でよぶことは可能でしょうか。つまり、
void
Init_dcl()
{
mDCL = rb_define_module("DCL");
init_grph2_grpack(mDCL);
init_grph2_udpack(mDCL);
...
}
として問題なければ、そうする手があるように思います。そして、
init_grph2_grpack 等は自動生成すればよいでしょう。
自動生成は添付した cproto2init.rb のようなスクリプトで出来ます。
これを用い、p_headの最後の行(mDCLの宣言)を取り除いたものを
package_header とすると(添付)、
pack=grph2_grpack
cat etc/package_header > ${pack}.c
ruby proto2c.rb proto_new/${pack}.fp >> ${pack}.c
ruby cproto2init.rb ${pack}.c >> ${pack}.c
で、grph2_grpack.c の最後に
void
init_grph2_grpack(mDCL)
VALUE mDCL;
{
rb_define_module_function(mDCL, "gropn", dcl_gropn, 1);
rb_define_module_function(mDCL, "grfrm", dcl_grfrm, 0);
rb_define_module_function(mDCL, "grfig", dcl_grfig, 0);
rb_define_module_function(mDCL, "grcls", dcl_grcls, 0);
rb_define_module_function(mDCL, "grinit", dcl_grinit, 0);
rb_define_module_function(mDCL, "grsvpt", dcl_grsvpt, 4);
rb_define_module_function(mDCL, "grswnd", dcl_grswnd, 4);
rb_define_module_function(mDCL, "grssim", dcl_grssim, 3);
rb_define_module_function(mDCL, "grsmpl", dcl_grsmpl, 3);
rb_define_module_function(mDCL, "grstxy", dcl_grstxy, 4);
rb_define_module_function(mDCL, "grstrn", dcl_grstrn, 1);
rb_define_module_function(mDCL, "grstrf", dcl_grstrf, 0);
}
という部分が加わります。よって、さらに
#include <stdio.h>
#include "ruby.h"
VALUE mDCL;
void init_grph2_grpack(VALUE mDCL);
void init_grph2_udpack(VALUE mDCL);
...
void
Init_dcl()
{
mDCL = rb_define_module("DCL");
init_grph2_grpack(mDCL);
init_grph2_udpack(mDCL);
...
}
といったファイルを作ればパッケージ毎に初期化できます。
如何でしょう。
堀之内 武 horinout@xxxxxx
京都大学宙空電波科学研究センター (旧超高層電波研究センター)
611-0011 宇治市五ヶ庄 phone:0774-38-3812 fax:0774-31-8463
# Program: cproto2init.rb
# 2000/11/20 Takeshi Horinouchi
# Usage:
#
# % ruby cproto2init.rb cprotofile
#
# Here, cprotofile is the name of the C program obtained by,
# for example,
#
# ruby proto2c.rb grph2_grpack.fp > grph2_grpack.c
#
# The package name is determined from the file name such as
# 'grph2_grpack'.
package = $*[0].gsub('.*/','').sub('\..*','') # remove directory name
# and suffix
print ("void\n","init_",package,"(mDCL)\n","VALUE mDCL;\n","{\n")
while (line=gets)
if ( line =~ "^static VALUE" )
funcdef = gets.chop
func = funcdef.sub('\(.*$','')
nargs = funcdef.delete('^,').length
method = func.sub('dcl_','')
print (' rb_define_module_function(mDCL, "',method,
'", ',func,", ",nargs,");\n")
end
end
print "}\n"
/*
* $Id: p_header,v 1.3 2000/11/18 18:48:42 keiko Exp $
*/
#include <stdio.h>
#include "ruby.h"
#include "f2c.h"
#include "numarray.h"
#define DFLT_SIZE 32
extern char *dcl_obj2ccharary(VALUE, int, int);
extern integer *dcl_obj2cintegerary(VALUE);
extern real *dcl_obj2crealary(VALUE);
extern complex *dcl_obj2ccomplexary(VALUE);
extern logical *dcl_obj2clogicalary(VALUE);
extern VALUE dcl_ccharary2obj(char *, int, int);
extern VALUE dcl_cintegerary2obj(integer *, int, char *);
extern VALUE dcl_crealary2obj(real *, int, char *);
extern VALUE dcl_ccomplexary2obj(complex *, int, char *);
extern VALUE dcl_clogicalary2obj(logical *, int, char *);
extern void dcl_freeccharary(char *);
extern void dcl_freecintegerary(integer *);
extern void dcl_freecrealary(real *);
extern void dcl_freeccomplexary(complex *);
extern void dcl_freeclogicalary(logical *);
/* for functions which return doublereal */
extern doublereal rave_(real *, integer *, integer *);
#include <stdio.h>
#include "ruby.h"
VALUE mDCL;
void init_grph2_grpack(VALUE mDCL);
void
Init_dcl()
{
mDCL = rb_define_module("DCL");
init_grph2_grpack(mDCL);
}