[#20475] Wrapping Regexp in C++/Windows — OZAWA Sakuro <crouton@...>

さくです。

15 messages 2000/02/03

[#20534] ftpmirror-1.2.2 で @homepage へ up 不可 — Hirokazu Kiuchi <kiuchi@...>

はじめまして、きうちです。

12 messages 2000/02/07

[#20554] エスケープされていないものだけを置換 — Ayanosuke <aya@...>

 館林と申します。

35 messages 2000/02/07
[#20563] Re: エスケープされていないものだけを置換 — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/02/07

なひです.

[#20598] — "okaukio+mls" <jtz4046@...6.mnx.ne.jp>

ruby-list@netlab.co.jp のみなさん こんにちは。

126 messages 2000/02/08
[#20600] Re: — "Y Kataoka" <kataoka@...> 2000/02/09

片岡と申します。

[#20620] Re: — "okaukio+mls" <jtz4046@...6.mnx.ne.jp> 2000/02/10

おかゆきおです。

[#20623] Re: How to run ruby — Masaki Suketa<CQN02273@...> 2000/02/11

助田です.最初からこのツリーちゃんと読んでなかったんですが...

[#20630] Re: How to run ruby — "okaukio+mls" <jtz4046@...6.mnx.ne.jp> 2000/02/11

おかゆきおです。

[#20633] Re: How to run ruby — Masaki Suketa<CQN02273@...> 2000/02/12

助田です.ちょっと長いです.

[#20640] Re: How to run ruby — "okaukio+mls" <jtz4046@...6.mnx.ne.jp> 2000/02/12

おかゆきおです。

[#20645] Re: How to run ruby — WATANABE Hirofumi <eban@...> 2000/02/12

わたなべです.

[#20653] Re: How to run ruby — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/02/13

[#20655] Re: How to run ruby — OZAWA Sakuro <crouton@...> 2000/02/13

In article <38A6419D15E.469A.BXQ04723@nifty.ne.jp>,

[#20657] Re: How to run ruby — Fumitake Taniguchi <whom@...3.so-net.ne.jp> 2000/02/13

In <200002130938.SAA17120@rose.duelists.org>,

[#20658] Re: How to run ruby — OZAWA Sakuro <crouton@...> 2000/02/13

In article <200002131054.TAA09555@mail.fb3.so-net.ne.jp>,

[#20661] Re: How to run ruby — nobu.nakada@... 2000/02/13

なかだです。

[#20677] Re: How to run ruby — "Hideaki Takata" <hideakit@...3.dion.ne.jp> 2000/02/13

たかた@久しぶりの投稿です。

[#20691] Re: How to run ruby — "Hideaki Takata" <hideakit@...3.dion.ne.jp> 2000/02/14

たかたです

[#20736] Re: How to run ruby — "Hideaki Takata" <hideakit@...3.dion.ne.jp> 2000/02/15

たかたです

[#20746] Re: How to run ruby — "Hideaki Takata" <hideakit@...3.dion.ne.jp> 2000/02/15

たかたです

[#20765] Re: rbsh — rubikitch <rubikitch@...> 2000/02/16

From: "Hideaki Takata" <hideakit@d3.dion.ne.jp>

[#20783] Re: rbsh — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/02/17

[#20777] Re: Where is http-access.rb? — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/02/16

なひです.

[#20792] Re: Where is http-access.rb? — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/02/17

なひです.

[#20625] druby で 3 つのプロセス間でオブジェクトをやり取りする — 堀川 久 <vzw00011@...>

 こんにちは。

12 messages 2000/02/11
[#20628] Re: druby で 3 つのプロセス間でオブジェクトをやり取りする — Masatoshi SEKI <m_seki@...> 2000/02/11

[#20638] Re: druby で 3 つのプロセス間でオブジェクトをやり取りする — 堀川 久 <vzw00011@...> 2000/02/12

 こんにちは。

[#20722] opttest.rb of optparse-0.6 — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp>

Toshです。

15 messages 2000/02/15

[#20737] Ruby/Gtk の CList にパッチ — YASUI Kentarow <kenyasui@...>

安井です。

14 messages 2000/02/15
[#20950] Re: Ruby/Gtk の CList にパッチ — Hiroshi IGARASHI <igarashi@...> 2000/02/22

いがらしです。返答が遅くなりすみません。

[#20955] Re: Ruby/Gtk の CList にパッチ — matz@... (Yukihiro Matsumoto) 2000/02/22

まつもと ゆきひろです

[#20821] method object — thitoshi@... (TAKAHASHI Hitoshi)

45 messages 2000/02/18
[#20824] Re: method object — Masahiro Suzuki <msuzuki@...> 2000/02/18

こんにちは。鈴木@仕事中です。

[#20827] Re: method object — thitoshi@... (TAKAHASHI Hitoshi) 2000/02/18

[#20829] Re: method object — matz@... (Yukihiro Matsumoto) 2000/02/18

まつもと ゆきひろです

[#20832] Re: method object — thitoshi@... (TAKAHASHI Hitoshi) 2000/02/18

[#20885] Re: collect + find_all ==> select ? — "H.TAKEI" <takei.hideaki@...> 2000/02/21

武井です。

[#20923] CUI library available in Ruby — Hideto ISHIBASHI <s34204@...>

石橋秀仁です。

15 messages 2000/02/22

[#20944] Hash#update について — Fuyuhiko Maruyama (丸山冬彦) <fuyuhik8@...>

丸山@東工大と申します。

32 messages 2000/02/22
[#20948] Re: Hash#update について — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/02/22

[#20960] Re: Hash#update について — rubikitch <rubikitch@...> 2000/02/23

From: 中村暁史 Nakamura Akifumi <BXQ04723@nifty.ne.jp>

[#20976] Re: Hash#update について — Fuyuhiko Maruyama (丸山冬彦) <fuyuhik8@...> 2000/02/23

丸山です。

[#20977] Re: Hash#update について — matz@... (Yukihiro Matsumoto) 2000/02/23

まつもと ゆきひろです

[#20984] Re: Hash#update について — Fuyuhiko Maruyama (丸山冬彦) <fuyuhik8@...> 2000/02/23

丸山です。

[#20985] Re: Hash#update について — matz@... (Yukihiro Matsumoto) 2000/02/23

まつもと ゆきひろです

[#20959] Ruby/GTK tの動かし方 — 中村暁史 Nakamura Akifumi <BXQ04723@...>

18 messages 2000/02/23
[#21011] Re: Ruby/GTK tの動かし方 — Yasushi Abe <yasushi@...> 2000/02/24

こんにちわ、阿部です。

[#20965] cgi.rb BUG? — rubikitch <rubikitch@...>

るびきちです。

33 messages 2000/02/23
[#20978] Re: cgi.rb BUG? — nobu.nakada@... 2000/02/23

なかだです。

[#21023] Re: cgi.rb BUG? — Kazuhiro Nishiyama <nishiyama@...1.tiki.ne.jp> 2000/02/24

nobu.nakada@nifty.ne.jp wrote:

[#21025] Re: cgi.rb BUG? — nobu.nakada@... 2000/02/24

なかだです。

[#21052] tempfile.rb BUG — Kazuhiro Nishiyama <nishiyama@...1.tiki.ne.jp> 2000/02/26

nobu.nakada@nifty.ne.jp wrote:

[#20992] GPIB driver その後 — Makoto Tagusari <mtag@...2.so-net.ne.jp>

皆さん今晩は、田鎖です。

15 messages 2000/02/23
[#21012] Critical Block (Re: GPIB driver その後) — Hideto ISHIBASHI <s34204@...> 2000/02/24

石橋秀仁です。

[#21028] CGI.rb のドキュメント探してます — Takumi Nakamura <chapuni@...>

 はじめまして。福岡在住の中村と申します。

16 messages 2000/02/25
[#21054] Re: CGI.rb のドキュメント探してます — 堀川 久 <vzw00011@...> 2000/02/26

 こんにちは。

[#21093] RD with URL — rubikitch <rubikitch@...>

るびきちです。

25 messages 2000/02/29
[#21095] Re: RD with URL — nobu.nakada@... 2000/02/29

なかだです。

[#21098] Re: RD with URL — rubikitch <rubikitch@...> 2000/02/29

From: nobu.nakada@nifty.ne.jp

[#21100] Re: RD with URL — nobu.nakada@... 2000/02/29

なかだです。

[#21101] Re: RD with URL — rubikitch <rubikitch@...> 2000/02/29

From: nobu.nakada@nifty.ne.jp

[#21103] Re: RD with URL — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/02/29

Toshです。

[#21105] Re: RD with URL — rubikitch <rubikitch@...> 2000/02/29

From: Toshiro Kuwabara <toshirok@yb3.so-net.ne.jp>

[#21108] Re: RD with URL — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/02/29

Toshです。

[#21110] rubyman ? (Re: RD with URL) — Koji Arai <JCA02266@...> 2000/02/29

新井です。

[#21111] Re: rubyman ? (Re: RD with URL) — Toshiro Kuwabara <toshirok@...3.so-net.ne.jp> 2000/02/29

Toshです。

[ruby-list:20475] Wrapping Regexp in C++/Windows

From: OZAWA Sakuro <crouton@...>
Date: 2000-02-03 15:04:31 UTC
List: ruby-list #20475
さくです。

ruby-listよりはruby-extのような気もするのですが、ひとまずlistのほうへ出
します。
extって拡張ライブラリを作るためのMLだけど、rubyを埋め込むほうも可でしょ
うか?

Windows98環境でC++の正規表現クラスRegexpが欲しくなったので、rubymw.dllを
使って作ってるのですが、以下にあるメンバ関数matchを数千回呼び出すうちに、
アクセス違反が生じます。

ソースを追ってみたのですが、

gc.cのrb_gc_mark()にてobjが不正
reex.cのinit_regs()にてregsが不正

など止まるところがまちまちなので困っています。

たぶん、C++のコード中で作成したRubyオブジェクト(VALUE)の管理がうまく行え
ていなくてGCとの不整合が起こってるんじゃないかとは思うのですが……。

Regex.hはこんな感じです。現在必要なのがマッチングだけなので、以下でほぼ
全てです。
何かマズいことをやっているところがあったら指摘していただけるとありがたい
です。

namespace ruby {

#include <string>
#include <stdexcept>
using namespace std;
#include "ruby.h"

    // ruby_init()の呼び出しを隠すために作ったObjectクラス
    class Object
    {
        static bool rubyInitialized; // Object.cppにて falseに初期化
    public:
        Object()
        {
            if ( ! rubyInitialized) {
                ruby_init();
                rubyInitialized = true;
            }
        }
        virtual ~Object() { }
    }
    
    // 正規表現に関するC++例外
    class RegexpException : public runtime_error { ... };

    class Regexp : public Object
    {
        // rb_protectに渡すために引数をまとめる構造体
        struct reg_arg
        {
        public:
            reg_arg(const char* str, size_t length, int flags)
                : str_(str), length_(length), flags_(flags) { }
            const char* str_;
            size_t length_;
            int flags_;
        };
        // rb_protectに渡して正規表現オブジェクトを作る関数
        static VALUE make_reg(reg_arg* arg)
        {
            return rb_reg_new(arg->str_, arg->length_, arg->flags_);
        }
        // コンストラクタ & デストラクタ
        Regexp(const string& s, int flags=0)
        {
            reg_arg arg(s.c_str(), s.size(), flags);
            regexp_ = rb_protect((VALUE (*)())make_arg, (VALUE)&arg, 0);
            if (NIL_P(regexp_)) {
                regexp_ = 0;
                throw RegexpException(s);
            }
            rb_global_variable(&regexp_);
        }
        virtual ~Regexp() { }
    
        // string sとマッチした位置を返す。マッチしなければnpos(=-1)を返す。
        string::size_type match(const string& s)
        {
            if (regexp_) {
                VALUE str = rb_str_new2(s.c_str());
                VALUE result = rb_reg_match(regexp_, str);
                if (NIL_P(result)) {
                    return string::npos; // マッチしなかった。
                }
                return NUM2INT(result); // マッチ位置
            } else {
                return string::npos;
            }    
        }
    private:
        VALUE regexp_;
    };
} // namespace ruby

    

In This Thread

Prev Next