Upgrade to 1.46.0
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-inline-struct / test / inline.c
1 #include <mruby.h>
2 #include <mruby/class.h>
3 #include <mruby/string.h>
4 #include <mruby/istruct.h>
5
6 static mrb_value
7 istruct_test_initialize(mrb_state *mrb, mrb_value self)
8 {
9   char *string = (char*)mrb_istruct_ptr(self);
10   mrb_int size = mrb_istruct_size();
11   mrb_value object = mrb_get_arg1(mrb);
12
13   if (mrb_fixnum_p(object)) {
14     strncpy(string, "fixnum", size-1);
15   }
16 #ifndef MRB_WITHOUT_FLOAT
17   else if (mrb_float_p(object)) {
18     strncpy(string, "float", size-1);
19   }
20 #endif
21   else if (mrb_string_p(object)) {
22     strncpy(string, "string", size-1);
23   }
24   else {
25     strncpy(string, "anything", size-1);
26   }
27
28   string[size - 1] = 0; // force NULL at the end
29   return self;
30 }
31
32 static mrb_value
33 istruct_test_to_s(mrb_state *mrb, mrb_value self)
34 {
35   return mrb_str_new_cstr(mrb, (const char*)mrb_istruct_ptr(self));
36 }
37
38 static mrb_value
39 istruct_test_length(mrb_state *mrb, mrb_value self)
40 {
41   return mrb_fixnum_value(mrb_istruct_size());
42 }
43
44 static mrb_value
45 istruct_test_test_receive(mrb_state *mrb, mrb_value self)
46 {
47   mrb_value object = mrb_get_arg1(mrb);
48
49   if (mrb_obj_class(mrb, object) != mrb_class_get(mrb, "InlineStructTest"))
50   {
51     mrb_raise(mrb, E_TYPE_ERROR, "Expected InlineStructTest");
52   }
53   return mrb_bool_value(((char*)mrb_istruct_ptr(object))[0] == 's');
54 }
55
56 static mrb_value
57 istruct_test_test_receive_direct(mrb_state *mrb, mrb_value self)
58 {
59   char *ptr;
60   mrb_get_args(mrb, "I", &ptr);
61   return mrb_bool_value(ptr[0] == 's');
62 }
63
64 static mrb_value
65 istruct_test_mutate(mrb_state *mrb, mrb_value self)
66 {
67   char *ptr = (char*)mrb_istruct_ptr(self);
68   memcpy(ptr, "mutate", 6);
69   return mrb_nil_value();
70 }
71
72 void mrb_mruby_inline_struct_gem_test(mrb_state *mrb)
73 {
74   struct RClass *cls;
75
76   cls = mrb_define_class(mrb, "InlineStructTest", mrb->object_class);
77   MRB_SET_INSTANCE_TT(cls, MRB_TT_ISTRUCT);
78   mrb_define_method(mrb, cls, "initialize", istruct_test_initialize, MRB_ARGS_REQ(1));
79   mrb_define_method(mrb, cls, "to_s", istruct_test_to_s, MRB_ARGS_NONE());
80   mrb_define_method(mrb, cls, "mutate", istruct_test_mutate, MRB_ARGS_NONE());
81   mrb_define_class_method(mrb, cls, "length", istruct_test_length, MRB_ARGS_NONE());
82   mrb_define_class_method(mrb, cls, "test_receive", istruct_test_test_receive, MRB_ARGS_REQ(1));
83   mrb_define_class_method(mrb, cls, "test_receive_direct", istruct_test_test_receive_direct, MRB_ARGS_REQ(1));
84 }