[#15828] Ruby/Gtk for cygwin インストールについて — otokita@...

Ruby, 本 ML には大変お世話になっております.

15 messages 1999/08/02

[#15839] Windows95 で Tk — H サイトウ <HiroshiSaito@...>

17 messages 1999/08/02

[#15944] Ruby 1.3.7 — Yukihiro Matsumoto <matz@...>

Ruby 1.3.7 is repacked, check out:

19 messages 1999/08/06

[#16002] how to know binary file — kikutani@...

あるファイルがバイナリファイルかどうか知る方法というのはたしか

38 messages 1999/08/09
[#16010] Re: how to know binary file — WATANABE Hirofumi <watanabe@...> 1999/08/10

わたなべです.

[#16013] Re: how to know binary file — kikutani@... 1999/08/10

On Tue, 10 Aug 1999 11:06:25 +0900,

[#16016] Re: how to know binary file — Yamada Kenji <kyamada@...> 1999/08/10

[#16021] Re: how to know binary file — kikutani@... 1999/08/10

On Tue, 10 Aug 1999 11:56:55 +0900,

[#16026] Re: how to know binary file — Yamada Kenji <kyamada@...> 1999/08/10

[#16040] Re: how to know binary file — kikutani@... 1999/08/10

On Tue, 10 Aug 1999 13:55:59 +0900,

[#16095] rd2html — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp>

はじめまして、Toshと申します。

32 messages 1999/08/12
[#16098] Re: rd2html — matz@... (Yukihiro Matsumoto) 1999/08/12

まつもと ゆきひろです

[#16104] Re: rd2html — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 1999/08/13

Toshです。

[#16106] Re: rd2html — gotoken@... (GOTO Kentaro) 1999/08/13

ごとけんです

[#16111] Re: rd2html — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 1999/08/13

Toshです。

[#16112] Re: rd2html — gotoken@... (GOTO Kentaro) 1999/08/13

ごとけんです

[#16115] Re: rd2html — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 1999/08/13

Toshです。

[#16118] Ruby 1.4.0 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

50 messages 1999/08/13
[#16120] Re: Ruby 1.4.0 — Katsuyuki Komatsu <komatsu@...> 1999/08/13

小松です。

[#16124] Re: Ruby 1.4.0 — matz@... (Yukihiro Matsumoto) 1999/08/13

まつもと ゆきひろです

[#16397] Re: Ruby 1.4.0 — wakou@... 1999/09/01

青山です。

[#16404] Re: Ruby 1.4.0 — hisanori@... 1999/09/01

松尾です。

[#16426] Re: Ruby 1.4.0 — matz@... (Yukihiro Matsumoto) 1999/09/01

まつもと ゆきひろです

[#16427] Re: Ruby 1.4.0 — "NAKAMURA, Hiroshi" <nakahiro@...> 1999/09/01

なひです.

[#16158] maillib? 0.5.0 — Minero Aoki <aamine@...>

あおきです。

57 messages 1999/08/15
[#16173] Re: maillib? 0.5.0 — matz@... (Yukihiro Matsumoto) 1999/08/16

まつもと ゆきひろです

[#16225] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/08/19

あおきです。とりあえずlistに送ります。

[#16254] Re: maillib? 0.5.0 — matz@... (Yukihiro Matsumoto) 1999/08/22

まつもと ゆきひろです

[#16282] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/08/24

あおきです。

[#16285] Re: maillib? 0.5.0 — matz@... (Yukihiro Matsumoto) 1999/08/24

まつもと ゆきひろです

[#16338] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/08/27

あおきです。返事遅くなってすみません。

[#16344] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/08/28

あおきです。

[#16363] Re: maillib? 0.5.0 — matz@... (Yukihiro Matsumoto) 1999/08/30

まつもと ゆきひろです

[#16440] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/09/02

あおきです。

[#16545] Re: maillib? 0.5.0 — matz@... (Yukihiro Matsumoto) 1999/09/06

まつもと ゆきひろです

[#16632] Re: maillib? 0.5.0 — Minero Aoki <aamine@...> 1999/09/08

あおきです。

[#16646] Re: maillib? 0.5.0 — wakou@... 1999/09/08

青山です。

[#16648] RD and internationalization — wakou@... 1999/09/08

青山です。

[#16663] Re: RD and internationalization — Minero Aoki <aamine@...> 1999/09/09

あおきです。

[#16679] Re: RD and internationalization — wakou@... 1999/09/09

青山です。

[#16302] printf の $ について — "HIRATA Naoto" <hirata-naoto@...>

平田です.

18 messages 1999/08/24
[#16307] Re: printf の $ について — WATANABE Hirofumi <watanabe@...> 1999/08/25

わたなべです.

[#16313] Re: printf の $ について — matz@... (Yukihiro Matsumoto) 1999/08/25

まつもと ゆきひろです

[#16359] ruby1.4.0 on BSD/OS 4.0 — Yamada Kenji <kyamada@...>

16 messages 1999/08/29

[ruby-list:16151] extinit & mkmain

From: Takashi Nishimoto <g96p0935@...>
Date: 1999-08-15 00:00:22 UTC
List: ruby-list #16151
拡張ライブラリ作成自動化ツールを作ってみました。
拡張ライブラリの Init_xxx 関数で書く内容や、ヘッダファイル(の一部)はど
の拡張ライブラリでも共通しているようです。
それに目をつけました。

まだ未完成ですが、ここに公開します。
要望、パッチなどは歓迎します。

* Usage/extinit
---------------
prev: <none>
next: <none>

書式

extinit

説明

拡張ライブラリ作成をちょっとだけ自動化する。
extconf.rb と mkmain スクリプトとヘッダファイルを生成する。すでに存在
するときは上書きされないので、生成後は自由に変更してよい。
ライブラリ名はカレントディレクトリの basename になる。

* Usage/mkmain
--------------
prev: <none>
next: <none>

書式

mkmain


説明

extinit スクリプトによって生成される。このスクリプトの定義より、 
main.c (Init_xxx が定義されているファイル) と funcs.c (Init_xxx の定義
から生成される関数定義の雛型) と variables.h (Init_xxx から生成される
大域変数定義) を生成する。すでに存在するときは上書きされる。だからこれ
らのファイルを手で修正することは勧められない。


変数

$id:シンボルの ID (rb_intern 関数によって求められる) を格納する変数の
リスト。命名規則(以下参照)に従う必要がある。

$class:クラス定義のための hash の hash

$module:モジュール定義のための hash の hash。 $class と同じ形式をとる。


ID の命名規則

ID を格納する変数名には簡単な命名規則がある。(スクリプトで自動生成する
んだから、当然だ)

  -->変数名は 「接頭辞」+「シンボル名」 の形をとる
  -->接頭辞は英字大文字
    -->I から始まるものはインスタンス変数の ID
    -->M から始まるものはメソッドの ID
    -->その他は自由に使って良い

       
$class と $module の形式

$class と $module は hash の hash である。
  -->最初のキーはクラス(モジュール)名
  -->2番目のキー
    -->prefix
      -->C関数名の接頭辞。
      -->定義されていないときは 「クラス(モジュール)名」.downcase となる。
    -->singleton_method
      -->特異メソッド定義の配列。(クラスのときはクラスメソッド)
      -->定義法
        -->0番目の要素は C 関数名
          -->実際の C 変数名は接頭辞が付加される
        -->1番目の要素は引数の個数
          -->-1 としたとき、C の配列で渡る
          -->-2 としたとき、Ruby の配列で渡る
        -->2番目の要素 (省略可能) は Ruby のメソッド名
          -->省略したときは C 関数名と同じになる
    -->method
      -->メソッド定義の配列
      -->定義法は上に同じ
    -->module_function
      -->モジュール関数定義の配列
      -->定義法は上に同じ
    -->include 
      -->インクルードするモジュール(の配列)
      -->文字列か文字列の配列で指定する

extinit スクリプト --------------------------------------------------
#!/usr/bin/ruby


Indent = '        '
Transtbl = {
  '+' => 'plus', '-' => 'minus', '*' => 'mul', '/' => 'div',
  '+@' => 'uplus', '-@' => 'uminus', '[]' => 'aref', '[]=' => 'aset'
}
VariablesFile = "variables.h"
MainFile = "main.c"
FunctionsFile = "funcs.c"
ExtconfFile = "extconf.rb"
TodoFile = "mkmain"

def write_id
  $main.puts ("#{Indent}/* ID */")
  
  $id.each{|id|
    name = if id[0,1] == 'I' then '@' else '' end + id[1 .. -1]
    $main.printf '%s%s = rb_intern("%s");' + "\n", Indent, id, name
  }
end


def method2cfunc(what, info, method)
  info['prefix'] + if what == 'singleton_method' then '_s_' else '_' end +
    Transtbl.fetch(method, method)
end

def write_methods(cname, info)
  if (i=info['include'])
    i.to_a.each{|incs|
      $main.puts(Indent + 'rb_include_module(' + info['object'] + ', rb_m' + incs + ');')
    }
  end
  $main.puts ""
  info['prefix'] = info['prefix'] || cname.downcase
  ['singleton_method', 'method', 'module_function'].each {|what|
    if info[what] then
      $main.puts "#{Indent}/* #{what} */"
      info[what].each{ |method, args, *opt| 
        cfunc = method2cfunc(what, info, method)
        method = opt[0] || method
        $main.printf '%srb_define_%s(%s, "%s", %s, %d);' + "\n",
          Indent, what, info['object'], method, cfunc, args
        
        sel = if what == 'singleton_method' then 'klass' else 'self' end
        case args
        when 0
          $funcs.printf "VALUE %s(VALUE %s)\n", cfunc, sel
        when -1
          $funcs.printf "VALUE %s(int argc, VALUE *argv, VALUE %s)\n", cfunc, sel
        when -2
          $funcs.printf "VALUE %s(VALUE %s, VALUE ary)\n", cfunc, sel
        else
          $funcs.printf "VALUE %s(VALUE %s", cfunc, sel
          0.upto(args - 1){ |i|
            $funcs.printf ", VALUE %s", ("a"[0]+i).chr
          }
          $funcs.printf ")\n"
        end
        $funcs.printf "{\n\n}\n\n"
      }
      $main.puts ""
    end
  }

end

def create_main
  libname = Dir.pwd.gsub(/^.*\/([^/]+)$/, '\1')
  $class = $class || {}
  $module = $module || {}
  $main = File.open(MainFile, "w")
  $funcs = File.open(FunctionsFile, "w")
  $funcs.puts "#include \"#{$basename}.h\""

  $main.print <<"SRC"
#define MAIN
#include "#{libname}.h"

void Init_#{libname}()
{
SRC
  
  $class.each_pair {|cname, info|
    $main.printf "%s/* class %s */\n", Indent, cname
    info['super'] = info['super'] || 'Object'
    $main.printf '%srb_c%s = rb_define_class("%s", rb_c%s);' + "\n", Indent, cname, cname, info['super']
    info['object'] = 'rb_c' + cname
    write_methods(cname, info)
  }
  
  $module.each_pair {|mname, info|
    $main.printf "%s/* %s */\n", Indent, mname
    $main.printf '%srb_m%s = rb_define_module("%s");' + "\n", Indent, mname, mname
    info['object'] = 'rb_m' + mname
    $main.puts ""
    write_methods(mname, info)
  }

  write_id
  $main.puts "}"
  puts "Create " + MainFile
  $main.close
  puts "Create " + FunctionsFile
  $funcs.close
  create_variableh
end

def create_variableh
  ids = $id.join(', ')
  objects = ($class.keys.collect{|k| $class[k]['object']} + 
             $module.keys.collect{|k| $module[k]['object']}).join(", ")
  $Variables = File.open(VariablesFile, "w")
  if ids != "" then $Variables.print <<"SRC"
#ifndef MAIN
extern
#endif
ID #{ids};
SRC
  end
  if objects != "" then $Variables.print <<"SRC"
#ifndef MAIN
extern
#endif
VALUE #{objects};
SRC
  end
  puts "Create " + VariablesFile
  $Variables.close
end

def create_file(file, contents, permission=0755)
  unless File.exist?(file) then
    fp = File.open(file, "w")
    fp.print contents
    fp.chmod permission
    fp.close
    puts "Create " + file
  end
end

#--------------------------------------------------------------------------------
$id = []
$class = {}
$module = {}
$basename = File.basename(Dir.pwd)
$klass = $basename.dup
$klass[0] = $klass[0,1].upcase

create_file(ExtconfFile, <<"SRC")
#!/usr/bin/ruby
require "mkmf"
create_makefile("#{$basename}")
SRC

create_file(TodoFile, <<"SRC")
#!/usr/bin/ruby
load "#{File.basename($0)}"
$id = %w(
)
$class = {
  '#{$klass}' => {
    'prefix' => nil,
    'singleton_method' => [
      ['new', 1, "[]"]
    ],
    'method' => [
    ],
    'module_function' => nil,
    'include' => nil
  },
}

$module = {
}

create_main
SRC

create_file($basename + ".h", <<"SRC", 0644)
#include "ruby.h"
#include "#{VariablesFile}"

/* for debug */
#define DEBUG puts("DEBUG")

#include "proto.h"
SRC
#--------------------------------------------------------------------------------
--
Takashi Nishimoto: g96p0935@mse.waseda.ac.jp
I love Emacs, zsh, and Linux!!
See ftp://ftp.misao.gr.jp/pub/tak/README
Key fingerprint = EE D7 1D 18 A9 42 C0 8A  63 E7 F2 AC 4D C7 83 6B

In This Thread

Prev Next