source: EcnlProtoTool/trunk/mruby-1.3.0/src/etc.c@ 331

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 5.0 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#include <mruby/re.h>
12#include <mruby/irep.h>
13
14MRB_API struct RData*
15mrb_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 = type;
22
23 return data;
24}
25
26MRB_API void
27mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
28{
29 if (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
48MRB_API void*
49mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
50{
51 if (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
60MRB_API void*
61mrb_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
67MRB_API mrb_sym
68mrb_obj_to_sym(mrb_state *mrb, mrb_value name)
69{
70 mrb_sym id;
71
72 switch (mrb_type(name)) {
73 default:
74 name = mrb_check_string_type(mrb, name);
75 if (mrb_nil_p(name)) {
76 name = mrb_inspect(mrb, name);
77 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", name);
78 }
79 /* fall through */
80 case MRB_TT_STRING:
81 name = mrb_str_intern(mrb, name);
82 /* fall through */
83 case MRB_TT_SYMBOL:
84 id = mrb_symbol(name);
85 }
86 return id;
87}
88
89MRB_API mrb_int
90mrb_float_id(mrb_float f)
91{
92 const char *p = (const char*)&f;
93 int len = sizeof(f);
94 mrb_int id = 0;
95
96 while (len--) {
97 id = id*65599 + *p;
98 p++;
99 }
100 id = id + (id>>5);
101
102 return id;
103}
104
105MRB_API mrb_int
106mrb_obj_id(mrb_value obj)
107{
108 mrb_int tt = mrb_type(obj);
109
110#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
111#define MakeID(p) MakeID2(p,tt)
112
113 switch (tt) {
114 case MRB_TT_FREE:
115 case MRB_TT_UNDEF:
116 return MakeID(0); /* not define */
117 case MRB_TT_FALSE:
118 if (mrb_nil_p(obj))
119 return MakeID(1);
120 return MakeID(0);
121 case MRB_TT_TRUE:
122 return MakeID(1);
123 case MRB_TT_SYMBOL:
124 return MakeID(mrb_symbol(obj));
125 case MRB_TT_FIXNUM:
126 return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
127 case MRB_TT_FLOAT:
128 return MakeID(mrb_float_id(mrb_float(obj)));
129 case MRB_TT_STRING:
130 case MRB_TT_OBJECT:
131 case MRB_TT_CLASS:
132 case MRB_TT_MODULE:
133 case MRB_TT_ICLASS:
134 case MRB_TT_SCLASS:
135 case MRB_TT_PROC:
136 case MRB_TT_ARRAY:
137 case MRB_TT_HASH:
138 case MRB_TT_RANGE:
139 case MRB_TT_EXCEPTION:
140 case MRB_TT_FILE:
141 case MRB_TT_DATA:
142 case MRB_TT_ISTRUCT:
143 default:
144 return MakeID(mrb_ptr(obj));
145 }
146}
147
148#ifdef MRB_WORD_BOXING
149MRB_API mrb_value
150mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
151{
152 mrb_value v;
153
154 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
155 v.value.fp->f = f;
156 return v;
157}
158
159MRB_API mrb_value
160mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
161{
162 struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
163 nf->tt = MRB_TT_FLOAT;
164 nf->c = mrb->float_class;
165 nf->f = f;
166 return mrb_obj_value(nf);
167}
168
169MRB_API mrb_value
170mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
171{
172 mrb_value v;
173
174 v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
175 v.value.vp->p = p;
176 return v;
177}
178#endif /* MRB_WORD_BOXING */
179
180MRB_API mrb_bool
181mrb_regexp_p(mrb_state *mrb, mrb_value v)
182{
183 if (mrb->flags & MRB_STATE_NO_REGEXP) {
184 return FALSE;
185 }
186 if ((mrb->flags & MRB_STATE_REGEXP) || mrb_class_defined(mrb, REGEXP_CLASS)) {
187 mrb->flags |= MRB_STATE_REGEXP;
188 return mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
189 }
190 else {
191 mrb->flags |= MRB_STATE_REGEXP;
192 mrb->flags |= MRB_STATE_NO_REGEXP;
193 }
194 return FALSE;
195}
196
197#if defined _MSC_VER && _MSC_VER < 1900
198
199#ifndef va_copy
200static void
201mrb_msvc_va_copy(va_list *dest, va_list src)
202{
203 *dest = src;
204}
205#define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
206#endif
207
208MRB_API int
209mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
210{
211 int cnt;
212 va_list argcp;
213 va_copy(argcp, arg);
214 if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
215 cnt = _vscprintf(format, arg);
216 }
217 va_end(argcp);
218 return cnt;
219}
220
221MRB_API int
222mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
223{
224 va_list arg;
225 int ret;
226 va_start(arg, format);
227 ret = mrb_msvc_vsnprintf(s, n, format, arg);
228 va_end(arg);
229 return ret;
230}
231
232#endif /* defined _MSC_VER && _MSC_VER < 1900 */
Note: See TracBrowser for help on using the repository browser.