[331] | 1 | #include <mruby.h>
|
---|
| 2 | #include <mruby/khash.h>
|
---|
| 3 | #include <mruby/array.h>
|
---|
[439] | 4 | #include <mruby/string.h>
|
---|
[270] | 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 | */
|
---|
[439] | 21 | #ifdef MRB_ENABLE_ALL_SYMBOLS
|
---|
[270] | 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++) {
|
---|
[439] | 29 | mrb_sym sym = i<<1;
|
---|
| 30 | mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
|
---|
[270] | 31 | }
|
---|
| 32 |
|
---|
| 33 | return ary;
|
---|
| 34 | }
|
---|
[439] | 35 | #endif
|
---|
[270] | 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;
|
---|
[439] | 47 | #ifdef MRB_UTF8_STRING
|
---|
| 48 | mrb_int byte_len;
|
---|
| 49 | const char *name = mrb_sym_name_len(mrb, mrb_symbol(self), &byte_len);
|
---|
| 50 | len = mrb_utf8_strlen(name, byte_len);
|
---|
| 51 | #else
|
---|
| 52 | mrb_sym_name_len(mrb, mrb_symbol(self), &len);
|
---|
| 53 | #endif
|
---|
[270] | 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;
|
---|
[439] | 61 | #ifdef MRB_ENABLE_ALL_SYMBOLS
|
---|
[270] | 62 | mrb_define_class_method(mrb, s, "all_symbols", mrb_sym_all_symbols, MRB_ARGS_NONE());
|
---|
[439] | 63 | #endif
|
---|
[270] | 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 | }
|
---|