Apply PIE to nghttpx
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-symbol-ext / src / symbol.c
1 #include <mruby.h>
2 #include <mruby/khash.h>
3 #include <mruby/array.h>
4 #include <mruby/string.h>
5
6 /*
7  *  call-seq:
8  *     Symbol.all_symbols    => array
9  *
10  *  Returns an array of all the symbols currently in Ruby's symbol
11  *  table.
12  *
13  *     Symbol.all_symbols.size    #=> 903
14  *     Symbol.all_symbols[1,20]   #=> [:floor, :ARGV, :Binding, :symlink,
15  *                                     :chown, :EOFError, :$;, :String,
16  *                                     :LOCK_SH, :"setuid?", :$<,
17  *                                     :default_proc, :compact, :extend,
18  *                                     :Tms, :getwd, :$=, :ThreadGroup,
19  *                                     :wait2, :$>]
20  */
21 #ifdef MRB_ENABLE_ALL_SYMBOLS
22 static mrb_value
23 mrb_sym_all_symbols(mrb_state *mrb, mrb_value self)
24 {
25   mrb_sym i, lim;
26   mrb_value ary = mrb_ary_new_capa(mrb, mrb->symidx);
27
28   for (i=1, lim=mrb->symidx+1; i<lim; i++) {
29     mrb_sym sym = i<<1;
30     mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
31   }
32
33   return ary;
34 }
35 #endif
36
37 /*
38  * call-seq:
39  *   sym.length    -> integer
40  *
41  * Same as <code>sym.to_s.length</code>.
42  */
43 static mrb_value
44 mrb_sym_length(mrb_state *mrb, mrb_value self)
45 {
46   mrb_int len;
47 #ifdef MRB_UTF8_STRING
48   mrb_int byte_len;
49   const char *name = mrb_sym2name_len(mrb, mrb_symbol(self), &byte_len);
50   len = mrb_utf8_len(name, byte_len);
51 #else
52   mrb_sym2name_len(mrb, mrb_symbol(self), &len);
53 #endif
54   return mrb_fixnum_value(len);
55 }
56
57 void
58 mrb_mruby_symbol_ext_gem_init(mrb_state* mrb)
59 {
60   struct RClass *s = mrb->symbol_class;
61 #ifdef MRB_ENABLE_ALL_SYMBOLS
62   mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE());
63 #endif
64   mrb_define_method(mrb, s, "length", mrb_sym_length, MRB_ARGS_NONE());
65   mrb_define_method(mrb, s, "size", mrb_sym_length, MRB_ARGS_NONE());
66 }
67
68 void
69 mrb_mruby_symbol_ext_gem_final(mrb_state* mrb)
70 {
71 }