[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);
}