source: EcnlProtoTool/trunk/mruby-1.2.0/src/etc.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 4.7 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 default:
143 return MakeID(mrb_ptr(obj));
144 }
145}
146
147#ifdef MRB_WORD_BOXING
148MRB_API mrb_value
149mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
150{
151 mrb_value v;
152
153 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
154 v.value.fp->f = f;
155 return v;
156}
157
158MRB_API mrb_value
159mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
160{
161 struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
162 nf->tt = MRB_TT_FLOAT;
163 nf->c = mrb->float_class;
164 nf->f = f;
165 return mrb_obj_value(nf);
166}
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
179MRB_API mrb_bool
180mrb_regexp_p(mrb_state *mrb, mrb_value v)
181{
182 return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
183}
184
185#if defined _MSC_VER && _MSC_VER < 1900
186
187#ifndef va_copy
188static void
189mrb_msvc_va_copy(va_list *dest, va_list src)
190{
191 *dest = src;
192}
193#define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
194#endif
195
196MRB_API int
197mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
198{
199 int cnt;
200 va_list argcp;
201 va_copy(argcp, arg);
202 if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
203 cnt = _vscprintf(format, arg);
204 }
205 va_end(argcp);
206 return cnt;
207}
208
209MRB_API int
210mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
211{
212 va_list arg;
213 int ret;
214 va_start(arg, format);
215 ret = mrb_msvc_vsnprintf(s, n, format, arg);
216 va_end(arg);
217 return ret;
218}
219
220#endif /* defined _MSC_VER && _MSC_VER < 1900 */
Note: See TracBrowser for help on using the repository browser.