/
term.c
112 lines (97 loc) · 2.74 KB
/
term.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "term.h"
VALUE IntruderTerm = Qnil;
/* internal methods */
void free_intruder_term(void *term){
INTRUDER_TERM *iterm = term;
erl_free_compound(iterm->eterm);
free(term);
}
INTRUDER_TERM * new_intruder_term(){
INTRUDER_TERM *iterm = malloc(sizeof(INTRUDER_TERM));
return iterm;
}
/* instance methods */
VALUE intruder_term_to_s(VALUE self){
INTRUDER_TERM *iterm;
Data_Get_Struct(self, INTRUDER_TERM, iterm);
ETERM *eterm = iterm->eterm;
VALUE ret = rb_str_new2("");
fill_string(&ret, eterm);
return ret;
}
VALUE rb_value_from_eterm(ETERM *eterm)
{
VALUE rubyObject;
INTRUDER_TERM *iterm = new_intruder_term();
iterm->eterm = eterm;
if (ERL_IS_LIST(eterm))
{
rubyObject = rb_value_from_list(iterm);
}
else if (ERL_IS_TUPLE(eterm))
{
rubyObject = rb_value_from_tuple(iterm);
}
else if (ERL_IS_ATOM(eterm))
{
rubyObject = rb_value_from_atom(iterm);
}
else
{
rubyObject = Data_Wrap_Struct(IntruderTerm, 0, free_intruder_term, iterm);
}
/* for now just return the term object. later return the right one ;) */
return rubyObject;
/* figure out the type of the eterm (more to come) */
/* if (ERL_IS_BINARY(eterm)) */
/* rb_value_from_binary(eterm); */
/* erl_free_compound(eterm); */
/* return Qnil; */
}
VALUE rb_value_from_list(INTRUDER_TERM *iterm){
VALUE rValue;
iterm->type = INTRUDER_TYPE_LIST;
rValue = Data_Wrap_Struct(IntruderList, 0, free_intruder_term, iterm);
return rValue;
}
VALUE rb_value_from_tuple(INTRUDER_TERM *iterm){
VALUE rValue;
iterm->type = INTRUDER_TYPE_TUPLE;
rValue = Data_Wrap_Struct(IntruderTuple, 0, free_intruder_term, iterm);
return rValue;
}
VALUE rb_value_from_atom(INTRUDER_TERM *iterm){
VALUE rValue;
iterm->type = INTRUDER_TYPE_ATOM;
rValue = Data_Wrap_Struct(IntruderAtom, 0, free_intruder_term, iterm);
return rValue;
}
VALUE rb_value_from_binary(INTRUDER_TERM *iterm){
return Qnil;
}
VALUE intruder_term_encode(VALUE self, VALUE ruby_object){
VALUE ret = Qnil;
ETERM *eterm;
switch(TYPE(ruby_object))
{
case T_SYMBOL :
eterm = erl_format("~a", rb_id2name(rb_to_id(ruby_object)));
break;
case T_ARRAY :
if (RARRAY_LEN(ruby_object)== 0) /* empty array -> empty list */
{
eterm = erl_format("[]");
}
break;
default :
rb_raise(IntruderException, "unable to convert that ruby object to an erlang term");
}
ret = rb_value_from_eterm(eterm);
return ret;
}
void Init_intruder_term(){
IntruderTerm = rb_define_class_under(IntruderModule, "Term", rb_cObject);
/* instance methods */
rb_define_method(IntruderTerm, "to_s", intruder_term_to_s, 0);
rb_define_singleton_method(IntruderTerm, "encode", intruder_term_encode, 1);
}