Groonga 3.0.9 Source Code Document
Main Page
Related Pages
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
groonga
vendor
mruby-eeac4be
src
etc.c
Go to the documentation of this file.
1
/*
2
** etc.c -
3
**
4
** See Copyright Notice in mruby.h
5
*/
6
7
#include "
mruby.h
"
8
#include "
mruby/string.h
"
9
#include "
error.h
"
10
#include "
mruby/numeric.h
"
11
#include "
mruby/data.h
"
12
#include "
mruby/class.h
"
13
14
struct
RData
*
15
mrb_data_object_alloc
(
mrb_state
*mrb,
struct
RClass
*klass,
void
*ptr,
const
mrb_data_type
*
type
)
16
{
17
struct
RData
*
data
;
18
19
data = (
struct
RData
*)
mrb_obj_alloc
(mrb,
MRB_TT_DATA
, klass);
20
data->
data
= ptr;
21
data->
type
= (
mrb_data_type
*) type;
22
23
return
data
;
24
}
25
26
void
27
mrb_data_check_type
(
mrb_state
*mrb,
mrb_value
obj,
const
mrb_data_type
*
type
)
28
{
29
if
(
mrb_special_const_p
(obj) || (
mrb_type
(obj) !=
MRB_TT_DATA
)) {
30
mrb_check_type
(mrb, obj,
MRB_TT_DATA
);
31
}
32
if
(
DATA_TYPE
(obj) != type) {
33
const
mrb_data_type
*t2 =
DATA_TYPE
(obj);
34
35
if
(t2) {
36
mrb_raisef
(mrb,
E_TYPE_ERROR
,
"wrong argument type %S (expected %S)"
,
37
mrb_str_new_cstr
(mrb, t2->
struct_name
),
mrb_str_new_cstr
(mrb, type->
struct_name
));
38
}
39
else
{
40
struct
RClass
*c = mrb_class(mrb, obj);
41
42
mrb_raisef
(mrb,
E_TYPE_ERROR
,
"uninitialized %S (expected %S)"
,
43
mrb_obj_value(c),
mrb_str_new_cstr
(mrb, type->
struct_name
));
44
}
45
}
46
}
47
48
void
*
49
mrb_data_check_get_ptr
(
mrb_state
*mrb,
mrb_value
obj,
const
mrb_data_type
*
type
)
50
{
51
if
(
mrb_special_const_p
(obj) || (
mrb_type
(obj) !=
MRB_TT_DATA
)) {
52
return
NULL;
53
}
54
if
(
DATA_TYPE
(obj) != type) {
55
return
NULL;
56
}
57
return
DATA_PTR
(obj);
58
}
59
60
void
*
61
mrb_data_get_ptr
(
mrb_state
*mrb,
mrb_value
obj,
const
mrb_data_type
*
type
)
62
{
63
mrb_data_check_type
(mrb, obj, type);
64
return
DATA_PTR
(obj);
65
}
66
67
mrb_value
68
mrb_lastline_get
(
mrb_state
*mrb)
69
{
70
mrb_value
*argv;
71
int
argc;
72
73
mrb_get_args
(mrb,
"*"
, &argv, &argc);
74
if
(argc < 1) {
75
return
mrb_nil_value();
76
}
77
else
78
{
79
return
argv[0];
80
}
81
}
82
83
/* ------------------------------------------------ */
84
/*
85
* Calls func(obj, arg, recursive), where recursive is non-zero if the
86
* current method is called recursively on obj
87
*/
88
89
mrb_value
90
mrb_exec_recursive
(
mrb_state
*mrb,
mrb_value
(*func) (
mrb_state
*,
mrb_value
,
mrb_value
,
int
),
mrb_value
obj,
void
*arg)
91
{
92
return
func(mrb, obj, *(
mrb_value
*)arg, 0);
93
}
94
95
mrb_sym
96
mrb_obj_to_sym
(
mrb_state
*mrb,
mrb_value
name)
97
{
98
mrb_value
tmp;
99
mrb_sym
id;
100
101
switch
(
mrb_type
(name)) {
102
default
:
103
tmp =
mrb_check_string_type
(mrb, name);
104
if
(
mrb_nil_p
(tmp)) {
105
tmp =
mrb_inspect
(mrb, name);
106
mrb_raisef
(mrb,
E_TYPE_ERROR
,
"%S is not a symbol"
, tmp);
107
}
108
name = tmp;
109
/* fall through */
110
case
MRB_TT_STRING
:
111
name =
mrb_str_intern
(mrb, name);
112
/* fall through */
113
case
MRB_TT_SYMBOL
:
114
return
mrb_symbol
(name);
115
}
116
return
id;
117
}
118
119
/*
120
* call-seq:
121
* proc { |...| block } -> a_proc
122
*
123
* Equivalent to <code>Proc.new</code>.
124
*/
125
126
mrb_value
127
mrb_block_proc
(
void
)
128
{
129
return
mrb_nil_value();
130
}
131
132
static
mrb_int
133
float_id(
mrb_float
f)
134
{
135
const
char
*p = (
const
char
*)&f;
136
int
len =
sizeof
(f);
137
mrb_int
id
= 0;
138
139
while
(len--) {
140
id
=
id
*65599 + *p;
141
p++;
142
}
143
id
=
id
+ (
id
>>5);
144
145
return
id;
146
}
147
148
mrb_int
149
mrb_obj_id
(
mrb_value
obj)
150
{
151
mrb_int
tt =
mrb_type
(obj);
152
153
#define MakeID2(p,t) (((intptr_t)(p))^(t))
154
#define MakeID(p) MakeID2(p,tt)
155
156
switch
(tt) {
157
case
MRB_TT_FREE
:
158
case
MRB_TT_UNDEF
:
159
return
MakeID
(0);
/* not define */
160
case
MRB_TT_FALSE
:
161
if
(
mrb_nil_p
(obj))
162
return
MakeID
(1);
163
return
MakeID
(0);
164
case
MRB_TT_TRUE
:
165
return
MakeID
(1);
166
case
MRB_TT_SYMBOL
:
167
return
MakeID
(
mrb_symbol
(obj));
168
case
MRB_TT_FIXNUM
:
169
return
MakeID2
(float_id((
mrb_float
)
mrb_fixnum
(obj)),
MRB_TT_FLOAT
);
170
case
MRB_TT_FLOAT
:
171
return
MakeID
(float_id(
mrb_float
(obj)));
172
case
MRB_TT_STRING
:
173
case
MRB_TT_OBJECT
:
174
case
MRB_TT_CLASS
:
175
case
MRB_TT_MODULE
:
176
case
MRB_TT_ICLASS
:
177
case
MRB_TT_SCLASS
:
178
case
MRB_TT_PROC
:
179
case
MRB_TT_ARRAY
:
180
case
MRB_TT_HASH
:
181
case
MRB_TT_RANGE
:
182
case
MRB_TT_EXCEPTION
:
183
case
MRB_TT_FILE
:
184
case
MRB_TT_DATA
:
185
default
:
186
return
MakeID
(
mrb_ptr
(obj));
187
}
188
}
189
190
#ifdef MRB_WORD_BOXING
191
mrb_value
192
mrb_float_value(
mrb_state
*mrb,
mrb_float
f)
193
{
194
mrb_value
v;
195
196
v.
value
.
p
=
mrb_obj_alloc
(mrb,
MRB_TT_FLOAT
, mrb->
float_class
);
197
v.
value
.fp->
f
= f;
198
return
v;
199
}
200
201
mrb_value
202
mrb_cptr_value(
mrb_state
*mrb,
void
*p)
203
{
204
mrb_value
v;
205
206
v.
value
.
p
=
mrb_obj_alloc
(mrb,
MRB_TT_CPTR
, mrb->
object_class
);
207
v.
value
.vp->
p
= p;
208
return
v;
209
}
210
#endif
/* MRB_WORD_BOXING */
211
Generated on Sun Nov 10 2013 09:49:05 for Groonga 3.0.9 Source Code Document by
1.8.1.2