1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
10 | ruby language support (C) Novell Inc. |
11 \----------------------------------------------------------------------/
13 Author: Duncan Mac-Vicar <dmacvicar@suse.de>
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License
17 as published by the Free Software Foundation; either version
18 2 of the License, or (at your option) any later version.
23 #include "Y2RubyTypeConv.h"
24 #include "Y2RubyTypeTerm.h"
25 #include <ycp/YCPTerm.h>
27 static VALUE ryast_cTerm;
29 struct ryast_Term_Wrapper
39 //-----------------------------------------------------------------------------
43 ryast_term_set_term( VALUE self, const YCPTerm & term )
45 ryast_Term_Wrapper *wrapper;
46 Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
51 ryast_rterm_from_yterm( const YCPTerm &term )
53 VALUE rterm_obj = rb_funcall( ryast_cTerm, rb_intern("new"), 0);
54 ryast_term_set_term( rterm_obj, term );
59 ryast_yterm_from_rterm( VALUE term )
61 ryast_Term_Wrapper *wrapper;
62 Data_Get_Struct(term, ryast_Term_Wrapper, wrapper);
67 ryast_term_mark (ryast_Term_Wrapper *r)
73 ryast_term_free (ryast_Term_Wrapper *r)
79 ryast_term_initialize( int argc, VALUE *argv, VALUE self )
81 ryast_Term_Wrapper *wrapper;
82 Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
84 // we should be using rb_scan_args here but I couldn't get it to work.
86 // we need at least the name to create a YCPTerm
87 Check_Type( argv[0], T_STRING);
88 wrapper->term = YCPTerm( RSTRING(argv[0])->ptr );
89 // add the remaining YCPTerm arguments
95 wrapper->term->add(rbvalue_2_ycpvalue(argv[i]));
102 ryast_term_add( int argc, VALUE *argv, VALUE self )
104 ryast_Term_Wrapper *wrapper;
105 Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
107 // we should be using rb_scan_args here but I couldn't get it to work.
109 // add the remaining YCPTerm arguments
113 for ( ; i<argc; ++i )
115 //std::cout << "Hi! term::add: " << TYPE(argv[i]) << std::endl;
116 YCPValue value = rbvalue_2_ycpvalue(argv[i]);
117 wrapper->term->add(value);
124 ryast_term_allocate(VALUE klass)
127 ryast_Term_Wrapper *wrapper = new ryast_Term_Wrapper();
128 // wrap and return struct
129 return Data_Wrap_Struct (klass, ryast_term_mark, ryast_term_free, wrapper);
134 ryast_term_to_s(VALUE self)
136 ryast_Term_Wrapper *wrapper;
137 Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
138 return rb_str_new2(wrapper->term.toString().c_str());
142 ryast_term_name(VALUE self)
144 ryast_Term_Wrapper *wrapper;
145 Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
146 return rb_str_new2(wrapper->term.name().c_str());
150 // ryast_term_set_name(VALUE self, VALUE name)
152 // Check_Type(name, T_STRING);
153 // ryast_Term_Wrapper *wrapper;
154 // Data_Get_Struct(self, ryast_Term_Wrapper, wrapper);
156 // wrapper->term->setName(RSTRING(name)->ptr);
161 ryast_term_init( VALUE super )
163 //std::cout << "Hi! term" << std::endl;
164 ryast_cTerm = rb_define_class_under( super, "Term", rb_cObject );
165 rb_define_alloc_func( ryast_cTerm, ryast_term_allocate );
166 rb_define_method( ryast_cTerm, "initialize", RB_METHOD( ryast_term_initialize ), -1 );
167 rb_define_method( ryast_cTerm, "add", RB_METHOD( ryast_term_add ), -1 );
168 //rb_define_method( ryast_cTerm, "name=", RB_METHOD( ryast_term_set_name ), 1 );
169 rb_define_method( ryast_cTerm, "name", RB_METHOD( ryast_term_name ), 0 );
170 rb_define_method( ryast_cTerm, "to_s", RB_METHOD( ryast_term_to_s ), 0 );