source: EcnlProtoTool/trunk/mruby-2.1.1/src/etc.c@ 439

Last change on this file since 439 was 439, checked in by coas-nagasima, 4 years ago

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 4.5 KB
Line 
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 <mruby/data.h>
10#include <mruby/class.h>
11
12MRB_API struct RData*
13mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
14{
15 struct RData *data;
16
17 data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
18 data->data = ptr;
19 data->type = type;
20
21 return data;
22}
23
24MRB_API void
25mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
26{
27 if (!mrb_data_p(obj)) {
28 mrb_check_type(mrb, obj, MRB_TT_DATA);
29 }
30 if (DATA_TYPE(obj) != type) {
31 const mrb_data_type *t2 = DATA_TYPE(obj);
32
33 if (t2) {
34 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %s (expected %s)",
35 t2->struct_name, type->struct_name);
36 }
37 else {
38 mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %t (expected %s)",
39 obj, type->struct_name);
40 }
41 }
42}
43
44MRB_API void*
45mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
46{
47 if (!mrb_data_p(obj)) {
48 return NULL;
49 }
50 if (DATA_TYPE(obj) != type) {
51 return NULL;
52 }
53 return DATA_PTR(obj);
54}
55
56MRB_API void*
57mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
58{
59 mrb_data_check_type(mrb, obj, type);
60 return DATA_PTR(obj);
61}
62
63MRB_API mrb_sym
64mrb_obj_to_sym(mrb_state *mrb, mrb_value name)
65{
66 if (mrb_symbol_p(name)) return mrb_symbol(name);
67 if (mrb_string_p(name)) return mrb_intern_str(mrb, name);
68 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a symbol nor a string", name);
69 return 0; /* not reached */
70}
71
72MRB_API mrb_int
73#ifdef MRB_WITHOUT_FLOAT
74mrb_fixnum_id(mrb_int f)
75#else
76mrb_float_id(mrb_float f)
77#endif
78{
79 const char *p = (const char*)&f;
80 int len = sizeof(f);
81 uint32_t id = 0;
82
83#ifndef MRB_WITHOUT_FLOAT
84 /* normalize -0.0 to 0.0 */
85 if (f == 0) f = 0.0;
86#endif
87 while (len--) {
88 id = id*65599 + *p;
89 p++;
90 }
91 id = id + (id>>5);
92
93 return (mrb_int)id;
94}
95
96MRB_API mrb_int
97mrb_obj_id(mrb_value obj)
98{
99 mrb_int tt = mrb_type(obj);
100
101#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
102#define MakeID(p) MakeID2(p,tt)
103
104 switch (tt) {
105 case MRB_TT_FREE:
106 case MRB_TT_UNDEF:
107 return MakeID(0); /* not define */
108 case MRB_TT_FALSE:
109 if (mrb_nil_p(obj))
110 return MakeID(1);
111 return MakeID(0);
112 case MRB_TT_TRUE:
113 return MakeID(1);
114 case MRB_TT_SYMBOL:
115 return MakeID(mrb_symbol(obj));
116 case MRB_TT_FIXNUM:
117#ifdef MRB_WITHOUT_FLOAT
118 return MakeID(mrb_fixnum_id(mrb_fixnum(obj)));
119#else
120 return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
121 case MRB_TT_FLOAT:
122 return MakeID(mrb_float_id(mrb_float(obj)));
123#endif
124 case MRB_TT_STRING:
125 case MRB_TT_OBJECT:
126 case MRB_TT_CLASS:
127 case MRB_TT_MODULE:
128 case MRB_TT_ICLASS:
129 case MRB_TT_SCLASS:
130 case MRB_TT_PROC:
131 case MRB_TT_ARRAY:
132 case MRB_TT_HASH:
133 case MRB_TT_RANGE:
134 case MRB_TT_EXCEPTION:
135 case MRB_TT_FILE:
136 case MRB_TT_DATA:
137 case MRB_TT_ISTRUCT:
138 default:
139 return MakeID(mrb_ptr(obj));
140 }
141}
142
143#ifdef MRB_WORD_BOXING
144#ifndef MRB_WITHOUT_FLOAT
145MRB_API mrb_value
146mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
147{
148 mrb_value v;
149
150 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
151 v.value.fp->f = f;
152 MRB_SET_FROZEN_FLAG(v.value.bp);
153 return v;
154}
155
156MRB_API mrb_value
157mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
158{
159 struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
160 nf->tt = MRB_TT_FLOAT;
161 nf->c = mrb->float_class;
162 nf->f = f;
163 MRB_SET_FROZEN_FLAG(nf);
164 return mrb_obj_value(nf);
165}
166#endif /* MRB_WITHOUT_FLOAT */
167
168MRB_API mrb_value
169mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
170{
171 mrb_value v;
172
173 v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
174 v.value.vp->p = p;
175 return v;
176}
177#endif /* MRB_WORD_BOXING */
178
179#if defined _MSC_VER && _MSC_VER < 1900
180
181#ifndef va_copy
182static void
183mrb_msvc_va_copy(va_list *dest, va_list src)
184{
185 *dest = src;
186}
187#define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
188#endif
189
190MRB_API int
191mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
192{
193 int cnt;
194 va_list argcp;
195 va_copy(argcp, arg);
196 if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
197 cnt = _vscprintf(format, arg);
198 }
199 va_end(argcp);
200 return cnt;
201}
202
203MRB_API int
204mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
205{
206 va_list arg;
207 int ret;
208 va_start(arg, format);
209 ret = mrb_msvc_vsnprintf(s, n, format, arg);
210 va_end(arg);
211 return ret;
212}
213
214#endif /* defined _MSC_VER && _MSC_VER < 1900 */
Note: See TracBrowser for help on using the repository browser.